Cuprins:

FinduCar: o cheie inteligentă pentru mașină care ghidează oamenii către locul unde este parcată mașina: 11 pași (cu imagini)
FinduCar: o cheie inteligentă pentru mașină care ghidează oamenii către locul unde este parcată mașina: 11 pași (cu imagini)

Video: FinduCar: o cheie inteligentă pentru mașină care ghidează oamenii către locul unde este parcată mașina: 11 pași (cu imagini)

Video: FinduCar: o cheie inteligentă pentru mașină care ghidează oamenii către locul unde este parcată mașina: 11 pași (cu imagini)
Video: Голубая стрела (1958) фильм 2024, Septembrie
Anonim
FinduCar: o cheie inteligentă pentru mașină care ghidează oamenii către locul unde este parcată mașina
FinduCar: o cheie inteligentă pentru mașină care ghidează oamenii către locul unde este parcată mașina

Pentru a rezolva problemele de mai sus, acest proiect propune dezvoltarea unei chei de mașină inteligentă care ar putea direcționa oamenii către locul în care au parcat mașina. Și planul meu este integrarea unui GPS în cheia mașinii. Nu este nevoie să utilizați aplicația smartphone pentru a urmări mașina, toate indicațiile vor fi afișate doar pe cheia mașinii.

Pasul 1: Schiță de hârtie

Schiță de hârtie
Schiță de hârtie

Când oamenii apasă butonul pentru a bloca mașina, informațiile despre locație ar putea fi înregistrate automat în microcontroler. Apoi, când oamenii încep să navigheze către mașină, diferitele leduri sunt aprinse pentru a fi direcționate către poziția mașinii, iar frecvența intermitentă arată distanța față de mașină. Aceștia pot urmări cu ușurință LED-ul intermitent și pot găsi rapid mașina.

Pasul 2: Lista hardware

Lista hardware
Lista hardware

Acestea sunt componentele utilizate în acest proiect. Unele provin din seturile de particule (panou, buton, anteturi), altele sunt achiziționate de pe site-ul oficial Adafruit (Adafruit Feather M0, Adafruit Ultimate GPS module, Lpoly Battery and Coin Cell Battery) și Amazon (NeoPixel Ring - 12 RGB LED).

Pasul 3: Proiectarea circuitului

Proiectarea circuitului
Proiectarea circuitului

Neopixel_LED este conectat la PIN-ul 6 al Feather M0

Button_Unlock este conectat la PIN-ul 12 al Feather M0

Button_Lock este conectat la PIN-ul 13 al Feather M0

Pasul 4: Conexiune hardware

Conexiune hardware
Conexiune hardware
Conexiune hardware
Conexiune hardware
Conexiune hardware
Conexiune hardware

Lipiți anteturile cu Adafruit M0 Feather, Adafruit Ultimate GPS Featherwing. Stivați cele două scânduri împreună. GPS-ul FeatherWing se conectează direct la placa dvs. Feather M0 fără alte fire.

Pasul 5: Proiectare software

Proiectare software
Proiectare software

Componente de testare

Citiți un FIX

configurare nulă () {

Serial.println („test de ecou GPS”); Serial.begin (9600); Serial1.begin (9600); // implicit NMEA GPS baud}

bucla nulă () {

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

Clipește inelul LED

Vezi Exemple Adafruit NeoPixel.

Funcții de calcul GPS

Calculați azimutul

// Calculați azimutul

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

dublu 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; }

Calculați ora de pe ceasul cu LED, care este și direcția vehiculului

// Calculați ora pe ceasul LED

int led_time (unghi dublu) {

int flag = 0; if (angle = 15) {angle_time = angle_time + 1; } if (flag == 1) {angle_time = 12 - angle_time; } return_time angle; }

Calculați distanța dintre persoană și vehiculul său

// Calculați distanța

distanță dublă (lat_a dublă, lon_a dublă, lat_b dublă, lon_b dublă) {

dublu EARTH_RADIUS = 6378137.0; radLat1 dublu = (lat_a * PI / 180.0); radLat2 dublu = (lat_b * PI / 180.0); dublu a = radLat1 - radLat2; dublu 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 * EARTH_RADIUS / 10000000; se intoarce; }

Funcții de afișare cu LED

Aprindeți LED-urile într-un cerc care arată că începe să navigheze

// Iluminarea cu inel cu LED una câte una arată că începe navigarea

void colorWipe (uint32_t c, uint8_t așteptați) {

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

Obțineți frecvența LED pe baza distanței

// Obțineți frecvența cu LED-uri

frecvența int (distanță dublă) {

int f = (int) distanță * 20; retur f; }

Clipiți anumite LED-uri care indică direcția mașinii

// Afișare pe LED

strip.clear ();

strip.show (); întârziere (frecvență (distanța_persoană_car)); // întârziere (500); strip.setPixelColor (angle_time, strip. Color (0, 0, 255)); strip.show (); întârziere (frecvență (distanța_persoană_car)); // întârziere (500);

// Dezactivează LED-ul

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); Buton button_lock (Button_Lock_PIN); Buton button_unlock (Button_Unlock_PIN); int button_flag = 0; int led_flag = 1; uint32_t timer = millis (); car_lat dublu, car_lon; dublă_dimensiune_persoană; dublă mișcare_direcție; double_azimuth car; double_person_angle; int angle_time;

configurare nulă () {

Serial.begin (115200); // Serial1.begin (9600); GPS.begin (9600); // implicit NMEA GPS baud strip.begin (); // decomentați această linie pentru a activa RMC (minim recomandat) și GGA (date de remediere), inclusiv altitudine GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); // Setați rata de actualizare GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); // Rata de actualizare 1 Hz // Solicitați actualizări privind starea antenei, comentați pentru a păstra liniștea // GPS.sendCommand (PGCMD_ANTENNA); întârziere (1000);}

bucla void () {// if (Serial.available ()) {

// char c = Serial.read (); // Serial1.write (c); //} // if (Serial1.available ()) {char c = GPS.read (); if (GPSECHO) if (c) Serial.print (c); // dacă se primește o propoziție, putem verifica suma de control, o analizăm … dacă (GPS.newNMEAreceived ()) {// un lucru dificil aici este dacă tipărim propoziția NMEA sau datele // ajungem să nu ascultăm și prinzând alte propoziții! // deci fii foarte precaut dacă folosești OUTPUT_ALLDATA și încearcă să tipărești datele Serial.println (GPS.lastNMEA ()); // aceasta setează, de asemenea, steagul newNMEAreceived () la fals dacă (! GPS.parse (GPS.lastNMEA ())) // acesta stabilește, de asemenea, steagul newNMEAreceived () la returnare falsă; // nu reușim să analizăm o propoziție, caz în care ar trebui să așteptăm altul} // dacă millis () sau timer se încheie, o vom reseta doar dacă (timer> millis ()) timer = millis (); if (millis () - timer> 2000) {timer = millis (); // resetați temporizatorul Serial.print ("\ nTime:"); Serial.print (GPS.hour, DEC); Serial.print (':'); Serial.print (GPS.minute, DEC); Serial.print (':'); Serial.print (GPS.seconds, DEC); Serial.print ('.'); Serial.println (GPS.milisecunde); 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 ("Remediere:"); Serial.print ((int) GPS.fix); Serial.print ("calitate:"); Serial.println ((int) GPS.fixquality); if (GPS.fix) {Serial.print ("Locație:"); Serial.print (GPS.latitude, 4); Serial.print (GPS.lat); Serial.print (","); Serial.print (GPS.longitude, 4); Serial.println (GPS.lon); Serial.print („Locație (în grade, funcționează cu Google Maps):”); Serial.print (GPS.latitudeDegrees, 4); Serial.print (","); Serial.println (GPS.longitudeDegrees, 4); Serial.print ("Viteză (noduri):"); Serial.println (GPS.speed); Serial.print ("Unghi:"); Serial.println (GPS.angle); Serial.print ("Altitudine:"); Serial.println (GPS.altitude); Serial.print ("Sateliți:"); Serial.println ((int) GPS.satellites); // Salvați GPS-ul vehiculului dacă (button_lock.read ()) {car_lat = GPS.latitudeDegrees; car_lon = GPS.longitudeDegrees; // pentru depanare Serial.print ("carLatitude:"); Serial.println (car_lat); Serial.print ("carLongitude:"); Serial.println (car_lon); } // Începeți să găsiți mașina dacă (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); // Calculați distanța // distanță_persoană_car = distanță (100.0005, 100.0005, 100.0, 100.0); // pentru depanare Serial.println (car_person_distance); move_direction = GPS.angle; // Înregistrați direcția de mișcare (unghiul) // move_direction = 100.0; // Înregistrați azimutul (unghiul) car_azimuth = azimut (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // car_azimut = azimut (100.0005, 100.0005, 100.0, 100.0); // Calculați ora pe ceasul LED car_person_angle = car_azimuth - move_direction; time_angle = led_time (car_person_angle); // Afișare pe bandă LED.clear (); strip.show (); // întârziere (frecvență (distanța_persoană_car)); întârziere (500); strip.setPixelColor (angle_time, strip. Color (0, 0, 255)); strip.show (); // întârziere (frecvență (distanța_persoană_car)); întârziere (500); // Dezactivați LED-ul dacă (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flag = 1; strip.clear (); strip.show (); }}} //}}}

Pasul 6: Depanare pe Breadboard

Depanare pe Breadboard
Depanare pe Breadboard
Depanare pe Breadboard
Depanare pe Breadboard
Depanare pe Breadboard
Depanare pe Breadboard

Pasul 7: Asamblare hardware

Asamblare hardware
Asamblare hardware
Asamblare hardware
Asamblare hardware
Asamblare hardware
Asamblare hardware

Pasul 8: Proiectarea carcasei electronice în Adobe Illustrator

Proiectare carcase electronice în Adobe Illustrator
Proiectare carcase electronice în Adobe Illustrator

Pasul 9: Prototip de carton

Prototip de carton
Prototip de carton
Prototip de carton
Prototip de carton

Acest pas este utilizat pentru a confirma dimensiunea carcasei și a fiecărei piese a modelului, asigurându-vă că dimensiunea cutiei, poziția butonului și poziția LED se potrivesc componentelor electronice asamblate.

Pasul 10: Prototip de placaj de mesteacăn

Prototip de placaj de mesteacăn
Prototip de placaj de mesteacăn
Prototip de placaj de mesteacăn
Prototip de placaj de mesteacăn

Acesta a fost prototipul inițial. În cele din urmă a fost adăugată o gaură pătrată pentru conectarea la un încărcător.

Recomandat: