Taula de continguts:
- Pas 1: esbós de paper
- Pas 2: llista de maquinari
- Pas 3: Disseny de circuits
- Pas 4: connexió de maquinari
- Pas 5: disseny de programari
- Pas 6: depuració a Breadboard
- Pas 7: Muntatge de maquinari
- Pas 8: disseny d'habitatges electrònics a Adobe Illustrator
- Pas 9: prototip de cartró
- Pas 10: prototip de fusta contraxapada de bedoll
2025 Autora: John Day | [email protected]. Última modificació: 2025-01-13 06:57
Per resoldre els problemes anteriors, aquest projecte proposa desenvolupar una clau de cotxe intel·ligent que pugui dirigir les persones cap a on estacionaven el cotxe. I el meu pla és integrar un GPS a la clau del cotxe. No cal que utilitzeu l’aplicació per a telèfons intel·ligents per fer un seguiment del cotxe, totes les indicacions només es mostraran a la tecla del cotxe.
Pas 1: esbós de paper
Quan la gent prem el botó per bloquejar el cotxe, la informació d’ubicació es podria enregistrar automàticament al microcontrolador. Aleshores, quan la gent comença a navegar cap al cotxe, els diferents LED s’encenen per dirigir-se a la posició del cotxe i la freqüència de parpelleig mostra la distància al cotxe. Poden seguir fàcilment el LED parpellejant i trobar ràpidament el cotxe.
Pas 2: llista de maquinari
Aquests són els components utilitzats en aquest projecte. Alguns provenen dels kits de partícules (taulers de suport, botons, capçaleres), d'altres es compren al lloc web oficial d'Adafruit (Adafruit Feather M0, mòdul Adafruit Ultimate GPS, bateria Lpoly i bateria Coin Cell) i Amazon (NeoPixel Ring - 12 RGB LED).
Pas 3: Disseny de circuits
Neopixel_LED està connectat al PIN 6 de Feather M0
Button_Unlock està connectat al PIN 12 de Feather M0
Button_Lock està connectat al PIN 13 de Feather M0
Pas 4: connexió de maquinari
Soldeu les capçaleres amb Adafruit M0 Feather, Adafruit Ultimate GPS Featherwing. Apileu els dos taulers junts. El GPS FeatherWing es connecta directament a la vostra placa Feather M0 sense més cables.
Pas 5: disseny de programari
Components de la prova
Llegiu un FIX
configuració nul·la () {
Serial.println ("prova de ressò GPS"); Serial.begin (9600); Serial1.begin (9600); // transmissió GPS per defecte NMEA}
bucle buit () {
if (Serial.available ()) {char c = Serial.read (); Serial1.write (c); } if (Serial1.available ()) {char c = Serial1.read (); Serial.write (c); }}
Anell LED parpellejant
Vegeu els exemples d’Adafruit NeoPixel.
Funcions de càlcul GPS
Calculeu l’azimut
// Calculeu l’azimut
doble azimut (doble lat_a, doble lon_a, doble lat_b, doble lon_b) {
doble 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; tornar d; }
Calculeu el temps del rellotge LED, que també és la direcció del vehicle
// Calculeu l'hora del rellotge LED
int led_time (doble angle) {
int flag = 0; if (angle = 15) {angle_time = angle_time + 1; } if (flag == 1) {angle_time = 12 - angle_time; } retorn angle_temps; }
Calculeu la distància entre la persona i el seu vehicle
// Calculeu la distància
doble distància (doble lat_a, doble lon_a, doble lat_b, doble lon_b) {
doble EARTH_RADIUS = 6378137,0; doble radLat1 = (lat_a * PI / 180.0); doble radLat2 = (lat_b * PI / 180.0); doble a = radLat1 - radLat2; doble b = (lon_a - lon_b) * PI / 180.0; doble s = 2 * asin (sqrt (pow (sin (a / 2), 2) + cos (radLat1) * cos (radLat2) * pow (sin (b / 2), 2))); s = s * EARTH_RADIUS / 10000000; retorn s; }
Funcions de pantalla LED
Enceneu els LED en un cercle que demostri que comença a navegar
// La il·luminació de l'anell LED un per un mostra que comença la navegació
void colorWipe (uint32_t c, uint8_t espera) {
for (uint16_t i = 0; i strip.setPixelColor (i, c); strip.show (); delay (espera);}}
Obteniu la freqüència del LED en funció de la distància
// Obtén la freqüència del LED
freqüència int (doble distància) {
int f = (int) distància * 20; tornar f; }
Parpelleja el LED que indica la direcció del cotxe
// Visualització en LED
strip.clear ();
strip.show (); retard (freqüència (car_person_distance)); // retard (500); strip.setPixelColor (angle_time, strip. Color (0, 0, 255)); strip.show (); retard (freqüència (car_person_distance)); // retard (500);
// Desactiva el LED
if (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flag = 1; strip.clear (); strip.show (); }
Principal
#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); Botó button_unlock (Button_Unlock_PIN); int button_flag = 0; int led_flag = 1; uint32_t temporitzador = millis (); car_lat doble, car_lon; doble distància_persona_carro; doble moviment_direcció; doble car_azimut; doble cotxe_person_angle; int angle_time;
configuració nul·la () {
Serial.begin (115200); // Serial1.begin (9600); GPS.begin (9600); // per defecte NMEA GPS baud strip.begin (); // descomenteu aquesta línia per activar RMC (mínim recomanat) i GGA (correcció de dades), inclosa l'altitud GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); // Estableix la velocitat d’actualització GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); // Velocitat d’actualització a 1 Hz // Sol·liciteu actualitzacions sobre l’estat de l’antena, feu un comentari per guardar silenci // GPS.sendCommand (PGCMD_ANTENNA); retard (1000);}
bucle buit () {// if (Serial.available ()) {
// char c = Serial.read (); // Serial1.write (c); //} // if (Serial1.available ()) {char c = GPS.read (); if (GPSECHO) if (c) Serial.print (c); // si es rep una frase, podem comprovar la suma de comprovació, analitzar-la … si (GPS.newNMEAreceived ()) {// aquí és complicat imprimir la frase NMEA o dades // acabem sense escoltar i agafant altres frases! // per tant, tingueu molta precaució si utilitzeu OUTPUT_ALLDATA i intenteu imprimir les dades Serial.println (GPS.lastNMEA ()); // això també estableix el senyal newNMEAreceived () a false si (! GPS.parse (GPS.lastNMEA ())) // també estableix el senyal newNMEAreceived () a false return; // no podem analitzar una frase; en aquest cas, només hauríem d’esperar una altra} // si millis () o temporitzador s’acaben, només el restablirem si (temporitzador> millis ()) timer = millis (); if (millis () - temporitzador> 2000) {temporitzador = millis (); // restableix el temporitzador Serial.print ("\ nHora:"); Serial.print (GPS.hour, DEC); Serial.print (':'); Serial.print (GPS.minute, DEC); Serial.print (':'); Serial.print (GPS.seconds, DEC); Serial.print ('.'); Serial.println (GPS.millisegons); Serial.print ("Data:"); Serial.print (GPS.day, DEC); Serial.print ('/'); Serial.print (GPS.month, DEC); Serial.print ("/ 20"); Serial.println (GPS.year, DEC); Serial.print ("Solució:"); Serial.print ((int) GPS.fix); Serial.print ("qualitat:"); Serial.println ((int) GPS.fixquality); if (GPS.fix) {Serial.print ("Ubicació:"); Serial.print (GPS.latitude, 4); Serial.print (GPS.lat); Serial.print (","); Serial.print (GPS.longitude, 4); Serial.println (GPS.lon); Serial.print ("Ubicació (en graus, funciona amb Google Maps):"); Serial.print (GPS.latitudeDegrees, 4); Serial.print (","); Serial.println (GPS.longitudeDegrees, 4); Serial.print ("Velocitat (nusos):"); Serial.println (GPS.speed); Serial.print ("Angle:"); Serial.println (GPS.angle); Serial.print ("Altitud:"); Serial.println (GPS.altitude); Serial.print ("Satèl·lits:"); Serial.println ((int) GPS.satellites); // Deseu el GPS del vehicle si (button_lock.read ()) {car_lat = GPS.latitudeDegrees; car_lon = GPS.longitudeDegrees; // per a la depuració Serial.print ("carLatitude:"); Serial.println (car_lat); Serial.print ("carLongitude:"); Serial.println (car_lon); } // Comenceu a trobar el cotxe si (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); // Calculeu la distància // distància_persona_car = distància (100.0005, 100.0005, 100.0, 100.0); // per depurar Serial.println (car_person_distance); move_direction = GPS.angle; // Grava la direcció de moviment (angle) // move_direction = 100,0; // Grava l’azimut (angle) car_azimuth = azimut (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // car_azimut = azimut (100.0005, 100.0005, 100.0, 100.0); // Calculeu l'hora del rellotge LED car_person_angle = car_azimuth - move_direction; angle_time = led_time (auto_person_angle); // Visualització al LED strip.clear (); strip.show (); // delay (freqüència (car_person_distance)); retard (500); strip.setPixelColor (angle_time, strip. Color (0, 0, 255)); strip.show (); // delay (freqüència (car_person_distance)); retard (500); // Desactiva el LED si (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flag = 1; strip.clear (); strip.show (); }}} //}}}
Pas 6: depuració a Breadboard
Pas 7: Muntatge de maquinari
Pas 8: disseny d'habitatges electrònics a Adobe Illustrator
Pas 9: prototip de cartró
Aquest pas s'utilitza per confirmar la mida de la carcassa i de cada peça del model, assegurant-se que la mida de la caixa, la posició del botó i la posició del LED s'adaptin als components electrònics muntats.
Pas 10: prototip de fusta contraxapada de bedoll
Aquest va ser el prototip inicial. Finalment, es va afegir a una de les peces un forat quadrat per connectar-lo a un carregador.