Sisukord:
- Samm: paberi visand
- Samm: riistvara loend
- 3. samm: vooluahela kujundus
- Samm: riistvaraühendus
- Samm 5: Tarkvara projekteerimine
- 6. samm: silumine leivaplaadil
- 7. samm: riistvara kokkupanek
- 8. samm: elektroonika korpuse projekteerimine Adobe Illustratoris
- 9. samm: papist prototüüp
- 10. samm: kasevineeri prototüüp
2025 Autor: John Day | [email protected]. Viimati modifitseeritud: 2025-01-13 06:57
Ülaltoodud probleemide lahendamiseks tehakse selles projektis ettepanek välja töötada nutikas autovõti, mis suunaks inimesed sinna, kuhu nad auto parkisid. Ja minu plaan on integreerida GPS autovõtmesse. Auto jälgimiseks pole vaja nutitelefoni rakendust kasutada, kõik juhised kuvatakse lihtsalt autovõtmel.
Samm: paberi visand
Kui inimesed vajutavad auto lukustamiseks nuppu, võidakse asukohaandmed mikrokontrollerisse automaatselt salvestada. Siis, kui inimesed hakkavad auto juurde navigeerima, süttib eri LED, et suunata auto asendisse ja vilkuv sagedus näitab kaugust autoni. Nad saavad hõlpsalt vilkuvat LED -i jälgida ja auto kiiresti üles leida.
Samm: riistvara loend
Neid komponente kasutatakse selles projektis. Mõned on osakeste komplektidest (leivaplaat, nupp, päised), teised on ostetud Adafruit'i ametlikult veebisaidilt (Adafruit Feather M0, Adafruit Ultimate GPS -moodul, Lpoly aku ja mündipatarei aku) ja Amazonist (NeoPixel Ring - 12 RGB LED).
3. samm: vooluahela kujundus
Neopixel_LED on ühendatud Feather M0 PIN -koodiga 6
Button_Unlock on ühendatud Feather M0 PIN -koodiga 12
Button_Lock on ühendatud Feather M0 PIN -koodiga 13
Samm: riistvaraühendus
Jootke päised Adafruit M0 Feather, Adafruit Ultimate GPS Featherwing abil. Pange kaks lauda kokku. GPS FeatherWing ühendatakse otse teie Feather M0 plaadiga ilma juhtmeteta.
Samm 5: Tarkvara projekteerimine
Katsekomponendid
Lugege parandust
tühine seadistus () {
Serial.println ("GPS kaja test"); Seriaalne algus (9600); Seriaal1.algus (9600); // vaikimisi NMEA GPS baud}
void loop () {
if (Serial.available ()) {char c = Serial.read (); Seeria1.kirjutage (c); } if (Serial1.available ()) {char c = Serial1.read (); Serial.write (c); }}
Vilkuv LED -rõngas
Vaadake Adafruit NeoPixeli näiteid.
GPS -i arvutusfunktsioonid
Arvutage asimuut
// Asimuudi arvutamine
topeltasimuut (kahekordne lat_a, kahekordne lon_a, kahekordne lat_b, kahekordne lon_b) {
kahekordne d = 0; lat_a = lat_a*PI/180; lon_a = lon_a*PI/180; lat_b = lat_b*PI/180; lon_b = lon_b*PI/180; d = sin (lat_a)*sin (lat_b)+cos (lat_a)*cos (lat_b)*cos (lon_b-lon_a); d = sqrt (1-d*d); d = cos (lat_b)*sin (lon_b-lon_a)/d; d = asin (d)*180/PI; tagasitulek d; }
Arvutage LED -kellalt aeg, mis on ka sõiduki suund
// Arvutage LED -kella aeg
int led_time (topeltnurk) {
int lipp = 0; kui (nurk = 15) {nurgaaeg = nurgaaeg + 1; } if (lipp == 1) {nurgaaeg = 12 - nurgaaeg; } tagasinurga_aeg; }
Arvutage inimese ja tema sõiduki vaheline kaugus
// Arvutage kaugus
topeltkaugus (kahekordne lat_a, kahekordne lon_a, kahekordne lat_b, kahekordne lon_b) {
kahekordne EARTH_RADIUS = 6378137,0; kahekordne radLat1 = (lat_a * PI / 180,0); kahekordne radLat2 = (lat_b * PI / 180,0); kahekordne a = radLat1 - radLat2; kahekordne b = (lon_a - lon_b) * PI / 180,0; topelt s = 2 * asin (sqrt (pow (sin (a / 2), 2) + cos (radLat1) * cos (radLat2) * pow (sin (b / 2), 2))); s = s * EARTH_RADIUS / 10000000; tagasitulek s; }
LED -ekraani funktsioonid
Sütti ringis valgusdioodid, mis näitavad, et see hakkab navigeerima
// LED -rõnga valgustus ükshaaval näitab, et navigeerimine algab
void colorWipe (uint32_t c, uint8_t wait) {
for (uint16_t i = 0; i strip.setPixelColor (i, c); strip.show (); delay (wait);}}
Hankige LED -sagedus kauguse alusel
// Hangi LED -sagedus
int sagedus (kahekordne vahemaa) {
int f = (int) kaugus * 20; tagasitulek f; }
Vilgub teatud LED, mis näitab auto suunda
// LED -ekraan
riba.selge ();
strip.show (); viivitus (sagedus (auto_isiku_distants)); // viivitus (500); strip.setPixelColor (nurga_aeg, riba. Värv (0, 0, 255)); strip.show (); viivitus (sagedus (auto_isiku_distants)); // viivitus (500);
// Keela LED
if (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_lipp = 1; riba.selge (); strip.show (); }
Peamine
#include Adafruit_GPS.h #include Adafruit_NeoPixel.h #include HardwareSerial.h #include Button.h #include math.h
#define Neopixel_LED_PIN 6
#define Neopixel_LED_NUM 12 #define Button_Lock_PIN 13 #define Button_Unlock_PIN 12 #define GPSSerial Serial1
#define GPSECHO false
Adafruit_GPS GPS (& GPSSerial); Adafruit_NeoPixel riba = Adafruit_NeoPixel (Neopixel_LED_NUM, Neopixel_LED_PIN, NEO_GRB + NEO_KHZ800); Nupp nuppude lukk (Button_Lock_PIN); Button button_unlock (Button_Unlock_PIN); int nupu_lipp = 0; int led_flag = 1; uint32_t taimer = millis (); kahekordne auto_lat, auto_lon; topelt auto_isiku_distants; double move_direction; topelt auto_asimuut; topelt auto_isiku_nurk; int nurga_aeg;
tühine seadistus () {
Seriaalne algus (115200); // Seriaal1.algus (9600); GPS.algus (9600); // vaikimisi NMEA GPS baudriba.begin (); // tühistage see rida, et lülitada sisse RMC (soovitatav miinimum) ja GGA (parandage andmed), sealhulgas kõrguse GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); // Määra värskenduskiirus GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz värskendussagedus // Taotlege värskendusi antenni oleku kohta, kommenteerige vaikimiseks // GPS.sendCommand (PGCMD_ANTENNA); viivitus (1000);}
void loop () {// if (Serial.available ()) {
// char c = Serial.read (); // Sarja1. Kirjutamine (c); //} // if (Serial1.available ()) {char c = GPS.read (); kui (GPSECHO) kui (c) jadatrükk (c); // kui lause on laekunud, saame kontrollida kontrollsummat, sõeluda seda… kui (GPS.newNMEAreceived ()) {// siin on keeruline asi, kui prindime NMEA lause või andmed // me lõpuks ei kuula ja püüda teisi lauseid! // seega olge väga ettevaatlik, kui kasutate andmete printimiseks OUTPUT_ALLDATA ja proovite Serial.println (GPS.lastNMEA ()); // see määrab ka lipu newNMEAreceived () väärtuseks vale, kui (! GPS.parse (GPS.lastNMEA ()))) // see määrab ka newNMEAreceived () lipu valele tagastamisele; // me ei suuda lauset parsida, sel juhul peaksime lihtsalt ootama teist} // kui millis () või taimer ümber keerleb, lähtestame selle lihtsalt, kui (timer> millis ()) timer = millis (); if (millis () - taimer> 2000) {taimer = millis (); // lähtesta taimer Serial.print ("\ nAeg:"); Serial.print (GPS.hour, DEC); Serial.print (':'); Jadaprint (GPS.minute, DEC); Serial.print (':'); Serial.print (GPS.seconds, DEC); Serial.print ('.'); Serial.println (GPS.millisekundit); Serial.print ("Kuupäev:"); Serial.print (GPS.päev, DEC); Serial.print ('/'); Serial.print (GPS.kuu, DEC); Serial.print ("/20"); Serial.println (GPS.aasta, DEC); Serial.print ("Parandus:"); Serial.print ((int) GPS.fix); Serial.print ("kvaliteet:"); Serial.println ((int) GPS.fixquality); if (GPS.fix) {Serial.print ("Asukoht:"); Jadajälg (GPS.laiuskraad, 4); Serial.print (GPS.lat); Serial.print (","); Jadaprint (GPS.pikkus, 4); Serial.println (GPS.lon); Serial.print ("Asukoht (kraadides, töötab Google Mapsiga):"); Seeriaprint (GPS.latitudeDegrees, 4); Serial.print (","); Serial.println (GPS.pikkuskraadid, 4); Serial.print ("Kiirus (sõlmed):"); Serial.println (GPS.kiirus); Serial.print ("Nurk:"); Serial.println (GPS.nurk); Serial.print ("Kõrgus:"); Serial.println (GPS.altitude); Serial.print ("Satelliidid:"); Serial.println ((int) GPS.satellites); // Salvesta sõiduki GPS, kui (button_lock.read ()) {car_lat = GPS.latitudeDegrees; auto_lon = GPS.pikkuskraadid; // silumiseks Serial.print ("carLatitude:"); Serial.println (auto_lat); Serial.print ("carLongitude:"); Seeria.println (auto_lon); } // Alusta auto leidmist, kui (button_flag == 0) {button_flag = button_unlock.read (); } if (button_flag == 1 && led_flag == 1) {colorWipe (strip. Color (0, 255, 0), 500); led_lipp = 0; } kui (nupu_lipp == 1) {auto_isiku_distants = kaugus (GPS.laiuskraadid, GPS.pikkuskraadid, auto_lat, auto_lon); // Arvuta vahemaa // auto_isik_kaugus = vahemaa (100.0005, 100.0005, 100.0, 100.0); // silumiseks Serial.println (auto_isiku_kaugus); move_direction = GPS.angle; // Salvesta liikumissuund (nurk) // move_direction = 100.0; // Salvestage asimuut (nurk) car_azimuth = asimuth (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // auto_asimuut = asimuut (100 0005, 100 0005, 100,0, 100,0); // Arvuta aeg LED -kellal car_person_angle = car_azimuth - move_direction; nurga_aeg = led_aeg (auto_isiku_nurk); // Kuva LED -ribal.clear (); strip.show (); // viivitus (sagedus (auto_isiku_kaugus)); viivitus (500); strip.setPixelColor (nurga_aeg, riba. Värv (0, 0, 255)); strip.show (); // viivitus (sagedus (auto_isiku_kaugus)); viivitus (500); // Keela LED, kui (nupu_lipp == 1 && auto_isiku_kaugus <5,0) {nupu_lipp = 0; led_lipp = 1; riba.selge (); strip.show (); }}} //}}}
6. samm: silumine leivaplaadil
7. samm: riistvara kokkupanek
8. samm: elektroonika korpuse projekteerimine Adobe Illustratoris
9. samm: papist prototüüp
Seda sammu kasutatakse korpuse ja mudeli iga osa kinnitamiseks, veendudes, et karbi suurus, nuppude asukoht ja LED -asend sobivad kokku pandud elektroonikakomponentidega.
10. samm: kasevineeri prototüüp
See oli esialgne prototüüp. Lõpuks lisati ühele tükile ruudukujuline auk laadijaga ühendamiseks.