Sommario:

FinduCar: una chiave per auto intelligente che guida le persone dove è parcheggiata l'auto: 11 passaggi (con immagini)
FinduCar: una chiave per auto intelligente che guida le persone dove è parcheggiata l'auto: 11 passaggi (con immagini)

Video: FinduCar: una chiave per auto intelligente che guida le persone dove è parcheggiata l'auto: 11 passaggi (con immagini)

Video: FinduCar: una chiave per auto intelligente che guida le persone dove è parcheggiata l'auto: 11 passaggi (con immagini)
Video: Сериал - "Сваты" (1-й сезон 1-я серия) фильм комедия для всей семьи 2024, Dicembre
Anonim
FinduCar: una chiave per auto intelligente che guida le persone dove è parcheggiata l'auto
FinduCar: una chiave per auto intelligente che guida le persone dove è parcheggiata l'auto

Per risolvere i problemi di cui sopra, questo progetto propone di sviluppare una chiave per auto intelligente che possa indirizzare le persone verso dove hanno parcheggiato l'auto. E il mio piano è integrare un GPS nella chiave della macchina. Non è necessario utilizzare l'app per smartphone per tracciare l'auto, tutte le indicazioni verranno visualizzate solo sulla chiave dell'auto.

Passaggio 1: schizzo su carta

Schizzo di carta
Schizzo di carta

Quando le persone premono il pulsante per bloccare l'auto, le informazioni sulla posizione potrebbero essere registrate automaticamente nel microcontrollore. Quindi, quando le persone iniziano a navigare verso l'auto, il diverso LED si accende per dirigersi verso la posizione dell'auto e la frequenza lampeggiante mostra la distanza dall'auto. Possono facilmente seguire il LED lampeggiante e trovare rapidamente l'auto.

Passaggio 2: elenco hardware

Elenco hardware
Elenco hardware

Questi sono i componenti utilizzati in questo progetto. Alcuni provengono dai kit di particelle (breadboard, pulsante, intestazioni), altri sono acquistati dal sito Web ufficiale di Adafruit (Adafruit Feather M0, modulo GPS Adafruit Ultimate, batteria Lpoly e batteria a bottone) e Amazon (anello NeoPixel - 12 LED RGB).

Passaggio 3: progettazione del circuito

Progettazione di circuiti
Progettazione di circuiti

Neopixel_LED è connesso al PIN 6 di Feather M0

Button_Unlock è connesso al PIN 12 di Feather M0

Button_Lock è connesso al PIN 13 di Feather M0

Passaggio 4: connessione hardware

Connessione hardware
Connessione hardware
Connessione hardware
Connessione hardware
Connessione hardware
Connessione hardware

Saldare le intestazioni con Adafruit M0 Feather, Adafruit Ultimate GPS Featherwing. Impila le due tavole insieme. Il GPS FeatherWing si collega direttamente alla tua scheda Feather M0 senza più fili.

Passaggio 5: progettazione del software

Progettazione software
Progettazione software

Componenti di prova

Leggi un FIX

void setup() {

Serial.println("Test eco GPS"); Serial.begin(9600); Serial1.begin(9600); // baud GPS NMEA predefinito }

ciclo vuoto() {

if (Serial.available()) { char c = Serial.read(); Serial1.write(c); } if (Serial1.available()) { char c = Serial1.read(); Serial.write(c); } }

Anello LED lampeggiante

Vedi esempi di Adafruit NeoPixel.

Funzioni di calcolo GPS

Calcola l'Azimut

// Calcola l'Azimut

doppio azimut(doppio lat_a, doppio lon_a, doppio lat_b, doppio lon_b) {

doppio 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; ritorno d; }

Calcola l'ora sull'orologio a LED, che è anche la direzione del veicolo

// Calcola l'ora sull'orologio LED

int led_time(doppio angolo){

int flag = 0; if (angolo = 15) { tempo_angolo = tempo_angolo + 1; } if (flag == 1){ tempo_angolo = 12 - tempo_angolo; } return tempo_angolo; }

Calcola la distanza tra la persona e il suo veicolo

// Calcola la distanza

doppia distanza(doppio lat_a, doppio lon_a, doppio lat_b, doppio lon_b) {

doppio RAGGIO_TERRA = 6378137.0; double radLat1 = (lat_a * PI / 180.0); double radLat2 = (lat_b * PI / 180.0); doppia a = radLat1 - radLat2; doppia b = (lon_a - lon_b) * PI / 180.0; double s = 2 * asin(sqrt(pow(sin(a / 2), 2) + cos(radLat1) * cos(radLat2) * pow(sin(b / 2), 2))); s = s * RAGGIO_TERRA / 10000000; ritorna; }

Funzioni di visualizzazione a LED

Accendi i LED in un cerchio che mostrano che inizia a navigare

// L'illuminazione circolare a LED mostra l'inizio della navigazione

void colorWipe(uint32_t c, uint8_t wait) {

for(uint16_t i=0; i strip.setPixelColor(i, c); strip.show(); delay(wait); } }

Ottieni la frequenza del LED in base alla distanza

// Ottieni la frequenza del LED

frequenza int (distanza doppia){

int f = (int)distanza * 20; ritorno f; }

Lampeggia il certo LED che indica la direzione dell'auto

//Display su LED

strip.clear();

strip.show(); delay(frequency(car_person_distance)); // ritardo(500); strip.setPixelColor(angle_time, strip. Color(0, 0, 255)); strip.show(); delay(frequency(car_person_distance)); // ritardo(500);

//Disabilita LED

if (button_flag == 1 && car_person_distance < 5.0){ button_flag = 0; led_flag = 1; strip.clear(); strip.show(); }

Principale

#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);Strip Adafruit_NeoPixel = Adafruit_NeoPixel(Neopixel_LED_NUM, Neopixel_LED_PIN, NEO_GRB + NEO_KHZ800); Pulsante button_lock(Button_Lock_PIN); Pulsante button_unlock(Button_Unlock_PIN); int flag_pulsante = 0; int led_flag = 1; uint32_t timer = millis(); doppio car_lat, car_lon; doppia distanza_persona_auto; doppia direzione_movimento; doppio auto_azimut; doppio car_person_angle; int tempo_angolo;

void setup() {

Serial.begin(115200); // Serial1.begin(9600); GPS.begin(9600); // default NMEA GPS baud strip.begin(); // toglie il commento a questa riga per attivare RMC (minimo consigliato) e GGA (dati corretti) inclusa l'altitudine GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // Imposta la frequenza di aggiornamento GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // Frequenza di aggiornamento di 1 Hz // Richiedi aggiornamenti sullo stato dell'antenna, commenta per tacere // GPS.sendCommand(PGCMD_ANTENNA); ritardo(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); // se viene ricevuta una frase, possiamo controllare il checksum, analizzarla… if (GPS.newNMEAreceived()) { // una cosa complicata qui è se stampiamo la frase NMEA, o i dati // finiamo per non ascoltare e catturando altre frasi! // quindi fai molta attenzione se usi OUTPUT_ALLDATA e provi a stampare i dati Serial.println(GPS.lastNMEA()); // questo imposta anche il flag newNMEAreceived() su false if (!GPS.parse(GPS.lastNMEA())) // imposta anche il flag newNMEAreceived() su false return; // possiamo fallire nell'analizzare una frase, nel qual caso dovremmo solo aspettare un altro } // se millis() o il timer si avvolge, lo reimposteremo semplicemente if (timer > millis()) timer = millis(); if (millis() - timer > 2000) { timer = millis(); // resetta il timer Serial.print("\nTime: "); Serial.print(GPS.hour, DEC); Serial.print(':'); Serial.print(GPS.minuto, DEC); Serial.print(':'); Serial.print(GPS.secondi, DEC); Serial.print('.'); Serial.println(GPS.millisecondi); Serial.print("Data: "); Serial.print(GPS.day, DEC); Serial.print('/'); Serial.print(GPS.mese, DEC); Serial.print("/20"); Serial.println(GPS.anno, DEC); Serial.print("Correggi: "); Serial.print((int)GPS.fix); Serial.print(" qualità: "); Serial.println((int)GPS.fixquality); if (GPS.fix) { Serial.print("Posizione: "); Serial.print(GPS.latitude, 4); Serial.print(GPS.lat); Serial.print(", "); Serial.print(GPS.longitudine, 4); Serial.println(GPS.lon); Serial.print("Posizione (in gradi, funziona con Google Maps): "); Serial.print(GPS.latitudeDegrees, 4); Serial.print(", "); Serial.println(GPS.longitudeDegrees, 4); Serial.print("Velocità (nodi): "); Serial.println(GPS.velocità); Serial.print("Angolo: "); Serial.println(GPS.angolo); Serial.print("Altitudine: "); Serial.println(GPS.altitudine); Serial.print("Satelliti: "); Serial.println((int)GPS.satellites); // Salva il GPS del veicolo if (button_lock.read()) { car_lat = GPS.latitudeDegrees; car_lon = GPS.longitudeDegrees; //per debug Serial.print("carLatitude: "); Serial.println(car_lat); Serial.print("CarLongitude: "); Serial.println(car_lon); } // Inizia a trovare l'auto if (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); //Calcola la distanza //car_person_distance = distance(100.0005, 100.0005, 100.0, 100.0); //per il debug Serial.println(car_person_distance); move_direction = GPS.angle;//Registra la direzione del movimento (angolo) //move_direction = 100.0; // Registra l'Azimut(angolo) car_azimuth = azimuth(GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); //auto_azimut = azimut(100.0005, 100.0005, 100.0, 100.0); // Calcola l'ora sull'orologio LED car_person_angle = car_azimuth - move_direction; angolo_tempo = led_time(car_person_angle); //Visualizza sulla striscia LED.clear(); strip.show(); // delay(frequency(car_person_distance)); ritardo (500); strip.setPixelColor(angle_time, strip. Color(0, 0, 255)); strip.show(); // delay(frequency(car_person_distance)); ritardo (500); //Disabilita il LED if (button_flag == 1 && car_person_distance < 5.0){ button_flag = 0; led_flag = 1; strip.clear(); strip.show(); } } } // } } }

Passaggio 6: eseguire il debug su breadboard

Debug su Breadboard
Debug su Breadboard
Debug su Breadboard
Debug su Breadboard
Debug su Breadboard
Debug su Breadboard

Passaggio 7: assemblaggio dell'hardware

Assemblaggio hardware
Assemblaggio hardware
Assemblaggio hardware
Assemblaggio hardware
Assemblaggio hardware
Assemblaggio hardware

Passaggio 8: progettazione dell'alloggiamento dell'elettronica in Adobe Illustrator

Progettazione di alloggiamenti elettronici in Adobe Illustrator
Progettazione di alloggiamenti elettronici in Adobe Illustrator

Passaggio 9: prototipo in cartone

Prototipo in cartone
Prototipo in cartone
Prototipo in cartone
Prototipo in cartone

Questo passaggio viene utilizzato per confermare le dimensioni dell'alloggiamento e di ogni pezzo del modello, assicurandosi che le dimensioni della scatola, la posizione del pulsante e la posizione del LED si adattino ai componenti elettronici assemblati.

Passaggio 10: prototipo in compensato di betulla

Prototipo in compensato di betulla
Prototipo in compensato di betulla
Prototipo in compensato di betulla
Prototipo in compensato di betulla

Questo era il prototipo iniziale. Infine, a uno dei pezzi è stato aggiunto un foro quadrato per il collegamento a un caricabatterie.

Consigliato: