Innholdsfortegnelse:
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-13 06:58
For å løse problemene ovenfor foreslår dette prosjektet å utvikle en smart bilnøkkel som kan lede folk dit de parkerte bilen. Og planen min er å integrere en GPS i bilnøkkelen. Det er ikke nødvendig å bruke smarttelefonappen for å spore bilen, all veiledning vil bare vises på bilnøkkelen.
Trinn 1: Papirskisse
Når folk trykker på knappen for å låse bilen, kan posisjonsinformasjonen registreres i mikrokontrolleren automatisk. Når folk begynner å navigere til bilen, lyser den forskjellige LED -en for å direkte til posisjonen til bilen, og blinkende frekvens viser avstanden til bilen. De kan enkelt følge den blinkende LED -en og raskt finne bilen.
Trinn 2: Maskinvareliste
Dette er komponentene som brukes i dette prosjektet. Noen er fra partikkelsettene (brødbrett, knapp, overskrifter), andre er kjøpt fra Adafruit offisielle nettsted (Adafruit Feather M0, Adafruit Ultimate GPS -modul, Lpoly batteri og myntcellebatteri) og Amazon (NeoPixel Ring - 12 RGB LED).
Trinn 3: Kretsdesign
Neopixel_LED er koblet til PIN 6 til Feather M0
Button_Unlock er koblet til PIN 12 til Feather M0
Button_Lock er koblet til PIN 13 til Feather M0
Trinn 4: Maskinvaretilkobling
Lodde hodene med Adafruit M0 Feather, Adafruit Ultimate GPS Featherwing. Stabel de to brettene sammen. GPS FeatherWing kobles direkte til Feather M0 -kortet uten flere ledninger.
Trinn 5: Programvaredesign
Testkomponenter
Les en FIX
ugyldig oppsett () {
Serial.println ("GPS -ekkotest"); Serial.begin (9600); Serial1.begin (9600); // standard NMEA GPS -baud}
void loop () {
if (Serial.available ()) {char c = Serial.read (); Serial1.write (c); } hvis (Serial1.available ()) {char c = Serial1.read (); Serial.write (c); }}
Blinkende LED -ring
Se Adafruit NeoPixel -eksempler.
GPS -beregningsfunksjoner
Beregn Azimuth
// Beregn Azimuth
dobbel asimut (dobbel lat_a, dobbel lon_a, dobbel lat_b, dobbel lon_b) {
dobbel 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; retur d; }
Beregn tiden på LED -klokken, som også er kjøretøyets retning
// Beregn tiden på LED -klokken
int led_time (dobbel vinkel) {
int flagg = 0; hvis (vinkel = 15) {vinkel_tid = vinkel_tid + 1; } hvis (flagg == 1) {vinkel_tid = 12 - vinkel_tid; } returvinkel_tid; }
Beregn avstanden mellom personen og bilen hans
// Beregn avstanden
dobbel avstand (dobbel lat_a, dobbel lon_a, dobbel lat_b, dobbel lon_b) {
dobbelt EARTH_RADIUS = 6378137,0; dobbel radLat1 = (lat_a * PI / 180,0); dobbel radLat2 = (lat_b * PI / 180,0); dobbelt a = radLat1 - radLat2; dobbelt b = (lon_a - lon_b) * PI / 180,0; dobbel s = 2 * asin (sqrt (pow (sin (a / 2), 2) + cos (radLat1) * cos (radLat2) * pow (sin (b / 2), 2))); s = s * EARTH_RADIUS / 10000000; retur s; }
LED -skjermfunksjoner
Lys opp lysdioder i en sirkel som viser at den begynner å navigere
// LED -ringbelysning en etter en viser at navigasjonen begynner
void colorWipe (uint32_t c, uint8_t wait) {
for (uint16_t i = 0; i strip.setPixelColor (i, c); strip.show (); forsinkelse (vent);}}
Få LED -frekvensen på grunnlag av avstanden
// Få LED -frekvens
int frekvens (dobbel avstand) {
int f = (int) avstand * 20; retur f; }
Blink den bestemte LED -en som indikerer bilens retning
// Display på LED
strip.clear ();
strip.show (); forsinkelse (frekvens (bil_person_avstand)); // forsinkelse (500); strip.setPixelColor (vinkel_tid, strip. Color (0, 0, 255)); strip.show (); forsinkelse (frekvens (bil_person_avstand)); // forsinkelse (500);
// Deaktiver LED
hvis (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flag = 1; strip.clear (); strip.show (); }
Hoved
#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 strip = Adafruit_NeoPixel (Neopixel_LED_NUM, Neopixel_LED_PIN, NEO_GRB + NEO_KHZ800); Button button_lock (Button_Lock_PIN); Button button_unlock (Button_Unlock_PIN); int button_flag = 0; int led_flag = 1; uint32_t timer = millis (); dobbel bil_lat, bil_lon; dobbel bil_person_avstand; dobbel move_direction; dobbel bil_azimuth; dobbelt car_person_angle; int vinkel_tid;
ugyldig oppsett () {
Serial.begin (115200); // Serial1.begin (9600); GPS.begynner (9600); // standard NMEA GPS baud strip.begin (); // kommenter denne linjen for å slå på RMC (anbefalt minimum) og GGA (fikse data) inkludert høyde GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); // Angi oppdateringshastigheten GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz oppdateringshastighet // Be om oppdateringer om antennestatus, kommenter for å holde stille // GPS.sendCommand (PGCMD_ANTENNA); forsinkelse (1000);}
void loop () {// if (Serial.available ()) {
// char c = Serial.read (); // Serial1.write (c); //} // if (Serial1.available ()) {char c = GPS.read (); if (GPSECHO) if (c) Serial.print (c); // hvis en setning mottas, kan vi sjekke kontrollsummen, analysere den … hvis (GPS.newNMEAreceived ()) {// en vanskelig ting her er hvis vi skriver ut NMEA -setningen, eller data // vi ender opp med å ikke lytte og fange andre setninger! // så vær veldig forsiktig hvis du bruker OUTPUT_ALLDATA og prøver å skrive ut data Serial.println (GPS.lastNMEA ()); // dette setter også det nyeNMEAreceived () flagget til false hvis (! GPS.parse (GPS.lastNMEA ())) // dette setter også det nyeNMEAreceived () flagget til falsk retur; // vi klarer ikke å analysere en setning. I så fall bør vi bare vente på en annen} // hvis millis () eller tidtaker brytes rundt, vi vil bare tilbakestille den hvis (timer> millis ()) timer = millis (); if (millis () - timer> 2000) {timer = millis (); // tilbakestill timeren Serial.print ("\ nTid:"); Serial.print (GPS.hour, DEC); Serial.print (':'); Serial.print (GPS.minute, DEC); Serial.print (':'); Serial.print (GPS.seconds, DEC); Serial.print ('.'); Serial.println (GPS.millisekunder); Serial.print ("Dato:"); Serial.print (GPS.day, DEC); Serial.print ('/'); Serial.print (GPS.month, DEC); Serial.print ("/20"); Serial.println (GPS.år, DEC); Serial.print ("Fix:"); Serial.print ((int) GPS.fix); Serial.print ("kvalitet:"); Serial.println ((int) GPS.fixquality); if (GPS.fix) {Serial.print ("Location:"); Serial.print (GPS.breddegrad, 4); Serial.print (GPS.lat); Serial.print (","); Serial.print (GPS.longitude, 4); Serial.println (GPS.lon); Serial.print ("Plassering (i grader, fungerer med Google Maps):"); Serial.print (GPS.latitudeDegrees, 4); Serial.print (","); Serial.println (GPS.longitudeDegrees, 4); Serial.print ("Hastighet (knop):"); Serial.println (GPS.speed); Serial.print ("Vinkel:"); Serial.println (GPS.angle); Serial.print ("Høyde:"); Serial.println (GPS.altitude); Serial.print ("Satellitter:"); Serial.println ((int) GPS.satellites); // Lagre bilens GPS hvis (button_lock.read ()) {car_lat = GPS.latitudeDegrees; car_lon = GPS.longitudeDegrees; // for feilsøking Serial.print ("carLatitude:"); Serial.println (car_lat); Serial.print ("carLongitude:"); Serial.println (car_lon); } // Begynn å finne bilen hvis (button_flag == 0) {button_flag = button_unlock.read (); } if (button_flag == 1 && led_flag == 1) {colorWipe (strip. Color (0, 255, 0), 500); led_flag = 0; } if (button_flag == 1) {car_person_distance = distance (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // Beregn avstanden // bil_person_distans = avstand (100.0005, 100.0005, 100.0, 100.0); // for feilsøking Serial.println (car_person_distance); move_direction = GPS.angle; // Registrer bevegelsesretningen (vinkel) // move_direction = 100.0; // Registrer Azimuth (vinkel) car_azimuth = azimuth (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // car_azimuth = azimut (100.0005, 100.0005, 100.0, 100.0); // Beregn tiden på LED -klokken car_person_angle = car_azimuth - move_direction; angle_time = led_time (car_person_angle); // Display på LED strip.clear (); strip.show (); // forsinkelse (frekvens (bil_person_avstand)); forsinkelse (500); strip.setPixelColor (vinkel_tid, strip. Color (0, 0, 255)); strip.show (); // forsinkelse (frekvens (bil_person_avstand)); forsinkelse (500); // Deaktiver LED hvis (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flag = 1; strip.clear (); strip.show (); }}} //}}}
Trinn 6: Debug på Breadboard
Trinn 7: Maskinvaremontasje
Trinn 8: Elektronikkhusdesign i Adobe Illustrator
Trinn 9: Kartongprototype
Dette trinnet brukes til å bekrefte størrelsen på huset og hvert stykke av modellen, og sørg for at boksens størrelse, knappestilling og LED -posisjon passer til de monterte elektroniske komponentene.
Trinn 10: Prototype av bjørkfiner
Dette var den første prototypen. Et firkantet hull for tilkobling til en lader ble til slutt lagt til en av delene.