Innehållsförteckning:
- Steg 1: Papperskiss
- Steg 2: Hårdvarulista
- Steg 3: Kretsdesign
- Steg 4: Maskinvaruanslutning
- Steg 5: Programvarudesign
- Steg 6: Debug på Breadboard
- Steg 7: Hårdvarumontage
- Steg 8: Elektronikhusdesign i Adobe Illustrator
- Steg 9: Kartongprototyp
- Steg 10: Prototyp av björkplywood
- Steg 11: Slutmonteringsprototyp
2025 Författare: John Day | [email protected]. Senast ändrad: 2025-01-13 06:58
För att lösa problemen ovan föreslår detta projekt att utveckla en smart bilnyckel som kan leda människor dit de parkerade bilen. Och min plan är att integrera en GPS i bilnyckeln. Det finns ingen anledning att använda smartphone -appen för att spåra bilen, all vägledning visas bara på bilnyckeln.
Steg 1: Papperskiss
När folk trycker på knappen för att låsa bilen kan platsinformationen registreras i mikrokontrollen automatiskt. När folk sedan börjar navigera till bilen tänds de olika lysdioderna för att rikta till bilens position och blinkande frekvens visar avståndet till bilen. De kan enkelt följa den blinkande lysdioden och snabbt hitta bilen.
Steg 2: Hårdvarulista
Det här är komponenterna som används i detta projekt. Vissa är från partikelsatser (brödbräda, knapp, rubriker), andra köps från Adafruit officiella webbplats (Adafruit Feather M0, Adafruit Ultimate GPS -modul, Lpoly Battery och Coin Cell Battery) och Amazon (NeoPixel Ring - 12 RGB LED).
Steg 3: Kretsdesign
Neopixel_LED är ansluten till PIN 6 för Feather M0
Button_Unlock är ansluten till PIN 12 för Feather M0
Button_Lock är ansluten till PIN 13 för Feather M0
Steg 4: Maskinvaruanslutning
Löd huvudet med Adafruit M0 Feather, Adafruit Ultimate GPS Featherwing. Stapla ihop de två brädorna. GPS FeatherWing ansluts direkt till ditt Feather M0 -kort utan några fler ledningar.
Steg 5: Programvarudesign
Testkomponenter
Läs en FIX
void setup () {
Serial.println ("GPS -ekotest"); Serial.begin (9600); Serial1.start (9600); // standard NMEA GPS -baud}
void loop () {
if (Serial.available ()) {char c = Serial.read (); Serial1.write (c); } if (Serial1.available ()) {char c = Serial1.read (); Serial.write (c); }}
Blinkande LED -ring
Se Adafruit NeoPixel Exempel.
GPS -beräkningsfunktioner
Beräkna Azimuth
// Beräkna Azimuth
dubbel azimut (dubbel lat_a, dubbel lon_a, dubbel lat_b, dubbel lon_b) {
dubbel 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; }
Beräkna tiden på LED -klockan, som också är fordonets riktning
// Beräkna tiden på LED -klockan
int led_time (dubbel vinkel) {
int flagga = 0; om (vinkel = 15) {vinkel_tid = vinkel_tid + 1; } om (flagga == 1) {vinkel_tid = 12 - vinkel_tid; } returvinkel_tid; }
Beräkna avståndet mellan personen och hans fordon
// Beräkna avståndet
dubbel distans (dubbel lat_a, dubbel lon_a, dubbel lat_b, dubbel lon_b) {
dubbel EARTH_RADIUS = 6378137,0; dubbel radLat1 = (lat_a * PI / 180,0); dubbel radLat2 = (lat_b * PI / 180,0); dubbel a = radLat1 - radLat2; dubbel b = (lon_a - lon_b) * PI / 180,0; dubbel 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 -displayfunktioner
Tänd lysdioder i en cirkel som visar att den börjar navigera
// LED -ringbelysning en efter en visar att navigeringen börjar
void colorWipe (uint32_t c, uint8_t wait) {
för (uint16_t i = 0; i strip.setPixelColor (i, c); strip.show (); fördröjning (vänta);}}
Få LED -frekvensen baserat på avståndet
// Få LED -frekvens
int frekvens (dubbel distans) {
int f = (int) avstånd * 20; retur f; }
Blinkar viss lysdiod som indikerar bilens riktning
// Display på LED
strip.clear ();
strip.show (); fördröjning (frekvens (bil_person_avstånd)); // fördröjning (500); strip.setPixelColor (vinkel_tid, strip. Color (0, 0, 255)); strip.show (); fördröjning (frekvens (bil_person_avstånd)); // fördröjning (500);
// Inaktivera LED
if (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flagg = 1; strip.clear (); strip.show (); }
Main
#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 (); dubbel bil_lat, bil_lon; dubbel bil_person_avstånd; dubbel move_direction; dubbel bil_azimut; dubbel bil_person_vinkel; int vinkel_tid;
void setup () {
Serial.begin (115200); // Serial1.begin (9600); GPS.start (9600); // standard NMEA GPS baud strip.begin (); // avmarkera den här raden för att slå på RMC (rekommenderat minimum) och GGA (fixa data) inklusive höjd GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); // Ställ in uppdateringshastigheten GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz uppdateringshastighet // Begär uppdateringar om antennstatus, kommentera för att hålla tyst // GPS.sendCommand (PGCMD_ANTENNA); fördröjning (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); // om en mening tas emot kan vi kontrollera kontrollsummen, analysera den … om (GPS.newNMEAreceived ()) {// en knepig sak här är om vi skriver ut NMEA -meningen, eller data // vi slutar inte lyssna och fånga andra meningar! // så var mycket försiktig om du använder OUTPUT_ALLDATA och försöker skriva ut data Serial.println (GPS.lastNMEA ()); // detta sätter också flaggan newNMEAreceived () till false om (! GPS.parse (GPS.lastNMEA ())) // detta ställer också in flaggan newNMEAreceived () till falsk retur; // vi kan misslyckas med att analysera en mening, i så fall bör vi bara vänta på en annan} // om millis () eller timer går runt, vi återställer den bara om (timer> millis ()) timer = millis (); if (millis () - timer> 2000) {timer = millis (); // återställ timern 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 ("Datum:"); 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.latitude, 4); Serial.print (GPS.lat); Serial.print (","); Serial.print (GPS.longitude, 4); Serial.println (GPS.lon); Serial.print ("Plats (i grader, fungerar 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 ("Altitude:"); Serial.println (GPS.altitude); Serial.print ("Satelliter:"); Serial.println ((int) GPS.satellites); // Spara fordonets GPS om (button_lock.read ()) {car_lat = GPS.latitudeDegrees; car_lon = GPS.longitudeDegrees; // för felsökning av Serial.print ("carLatitude:"); Serial.println (car_lat); Serial.print ("carLongitude:"); Serial.println (car_lon); } // Börja hitta bilen om (button_flag == 0) {button_flag = button_unlock.read (); } if (button_flag == 1 && led_flag == 1) {colorWipe (strip. Color (0, 255, 0), 500); led_flagg = 0; } if (button_flag == 1) {car_person_distance = distance (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // Beräkna avståndet // bil_person_distans = avstånd (100.0005, 100.0005, 100.0, 100.0); // för felsökning av Serial.println (car_person_distance); move_direction = GPS.angle; // Spela in rörelseriktningen (vinkel) // move_direction = 100,0; // Spela in Azimuth (vinkel) car_azimuth = azimut (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // bil_azimut = azimut (100.0005, 100.0005, 100.0, 100.0); // Beräkna tiden på LED -klockan car_person_angle = car_azimuth - move_direction; angle_time = led_time (car_person_angle); // Display på LED strip.clear (); strip.show (); // fördröjning (frekvens (bil_person_avstånd)); fördröjning (500); strip.setPixelColor (vinkel_tid, strip. Color (0, 0, 255)); strip.show (); // fördröjning (frekvens (bil_person_avstånd)); fördröjning (500); // Inaktivera LED om (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flag = 1; strip.clear (); strip.show (); }}} //}}}
Steg 6: Debug på Breadboard
Steg 7: Hårdvarumontage
Steg 8: Elektronikhusdesign i Adobe Illustrator
Steg 9: Kartongprototyp
Detta steg används för att bekräfta storleken på höljet och varje del av modellen, se till att lådans storlek, knappens läge och LED -läge passar de monterade elektroniska komponenterna.
Steg 10: Prototyp av björkplywood
Detta var den första prototypen. Ett fyrkantigt hål för anslutning till en laddare tillsattes slutligen i en av bitarna.