Turinys:
- 1 žingsnis: popieriaus eskizas
- 2 žingsnis: Aparatūros sąrašas
- 3 žingsnis: grandinės projektavimas
- 4 žingsnis: aparatinės įrangos prijungimas
- 5 žingsnis: programinės įrangos projektavimas
- 6 veiksmas: derinkite „Breadboard“
- 7 žingsnis: Aparatūros surinkimas
- 8 veiksmas: elektronikos būsto projektavimas „Adobe Illustrator“
- 9 žingsnis: kartono prototipas
- 10 žingsnis: beržo faneros prototipas
2025 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2025-01-13 06:57
Siekiant išspręsti aukščiau išvardytas problemas, šiame projekte siūloma sukurti išmanųjį automobilio raktą, kuris galėtų nukreipti žmones ten, kur jie pastatė automobilį. Ir mano planas yra integruoti GPS į automobilio raktą. Automobiliui sekti nereikia naudoti išmaniojo telefono programos, visi nurodymai bus rodomi tik ant automobilio rakto.
1 žingsnis: popieriaus eskizas
Kai žmonės paspaudžia mygtuką, norėdami užrakinti automobilį, vietos informacija gali būti automatiškai įrašoma į mikrovaldiklį. Tada, kai žmonės pradeda naršyti prie automobilio, užsidega skirtingas šviesos diodas, kuris nukreipia į automobilio padėtį, o mirksėjimo dažnis rodo atstumą iki automobilio. Jie gali lengvai sekti mirksintį šviesos diodą ir greitai rasti automobilį.
2 žingsnis: Aparatūros sąrašas
Tai yra šiame projekte naudojami komponentai. Kai kurie yra iš dalelių rinkinių (duonos lentos, mygtukas, antraštės), kiti - iš oficialios „Adafruit“svetainės („Adafruit Feather M0“, „Adafruit Ultimate GPS“modulis, „Lpoly Battery“ir „Coin Cell Battery“) ir „Amazon“(„NeoPixel Ring“- 12 RGB LED).
3 žingsnis: grandinės projektavimas
„Neopixel_LED“prijungtas prie „Feather M0“PIN 6
„Button_Unlock“yra prijungtas prie „Feather M0“PIN 12
„Button_Lock“prijungtas prie „Feather M0“PIN 13
4 žingsnis: aparatinės įrangos prijungimas
Lituokite antraštes naudodami „Adafruit M0 Feather“, „Adafruit Ultimate GPS Featherwing“. Sudėkite dvi lentas kartu. „GPS FeatherWing“prijungiamas tiesiai prie „Feather M0“plokštės be jokių laidų.
5 žingsnis: programinės įrangos projektavimas
Bandymo komponentai
Skaitykite FIX
void setup () {
Serial.println („GPS aido testas“); Serial.begin (9600); Serial1.begin (9600); // numatytasis NMEA GPS baudas}
void loop () {
if (Serial.available ()) {char c = Serial.read (); Serial1.write (c); } if (Serial1.available ()) {char c = Serial1.read (); Serial.write (c); }}
Mirksi LED žiedas
Žr. „Adafruit NeoPixel“pavyzdžius.
GPS skaičiavimo funkcijos
Apskaičiuokite azimutą
// Apskaičiuokite azimutą
dvigubas azimutas (dvigubas lat_a, dvigubas lon_a, dvigubas lat_b, dvigubas lon_b) {
dvigubas 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; grįžti d; }
Apskaičiuokite LED laikrodžio laiką, kuris taip pat yra transporto priemonės kryptis
// Apskaičiuokite laiką pagal LED laikrodį
int led_time (dvigubas kampas) {
int vėliava = 0; if (kampas = 15) {kampo_ laikas = kampo_ laikas + 1; } if (vėliava == 1) {kampo_ laikas = 12 - kampo_ laikas; } return kampas_laikas; }
Apskaičiuokite atstumą tarp žmogaus ir jo transporto priemonės
// Apskaičiuokite atstumą
dvigubas atstumas (dvigubas lat_a, dvigubas lon_a, dvigubas lat_b, dvigubas lon_b) {
dvigubas EARTH_RADIUS = 6378137,0; dvigubas radLat1 = (lat_a * PI / 180.0); dvigubas radLat2 = (lat_b * PI / 180.0); dvigubas a = radLat1 - radLat2; dvigubas b = (lon_a - lon_b) * PI / 180,0; dvigubas s = 2 * asin (sqrt (pow (sin (a / 2), 2) + cos (radLat1) * cos (radLat2) * pow (sin (b / 2), 2))); s = s * EARTH_RADIUS / 10000000; grįžti s; }
LED ekrano funkcijos
Apskritime užsidega šviesos diodai, rodantys, kad jis pradeda naršyti
// LED žiedo apšvietimas po vieną rodo, kad navigacija prasideda
void colorWipe (uint32_t c, uint8_t palaukti) {
for (uint16_t i = 0; i strip.setPixelColor (i, c); strip.show (); delay (wait);}}
Gaukite šviesos diodų dažnį pagal atstumą
// Gaukite LED dažnį
int dažnis (dvigubas atstumas) {
int f = (int) atstumas * 20; grįžti f; }
Mirksi tam tikras šviesos diodas, rodantis automobilio kryptį
// Rodyti LED
strip.clear ();
strip.show (); vėlavimas (dažnis (automobilio_žmonės_distansas)); // uždelsimas (500); strip.setPixelColor (kampo laikas, juostelė. Spalva (0, 0, 255)); strip.show (); vėlavimas (dažnis (automobilio_žmonės_distansas)); // uždelsimas (500);
// Išjungti šviesos diodą
if (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_ vėliava = 1; strip.clear (); strip.show (); }
Pagrindinis
#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 laikmatis = milis (); double car_lat, car_lon; dvigubas automobilis_žmogus_distance; double move_direction; dvigubas automobilis_azimutas; dvigubas automobilis_žmogus_kampis; int kampas_laikas;
void setup () {
Serial.begin (115200); // Serial1.begin (9600); GPS.pradis (9600); // numatytoji NMEA GPS baudos juosta.begin (); // atšaukite komentarą iš šios eilutės, kad įjungtumėte RMC (rekomenduojamas minimumas) ir GGA (fiksuoti duomenis), įskaitant aukščio GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); // Nustatykite atnaujinimo greitį GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz atnaujinimo dažnis // Prašykite atnaujinti antenos būseną, pakomentuokite, kad tylėtumėte // GPS.sendCommand (PGCMD_ANTENNA); vėlavimas (1000);}
void loop () {// if (Serial.available ()) {
// char c = Serial.read (); // Serial1.write (c); //} // if (Serial1.available ()) {char c = GPS.read (); jei (GPSECHO), jei (c) serijinis atspaudas (c); // jei gautas sakinys, galime patikrinti kontrolinę sumą, ją išanalizuoti … jei (GPS.newNMEAreceived ()) {// čia sudėtinga, jei išspausdinsime NMEA sakinį arba duomenis // galiausiai neklausysime ir pagauti kitus sakinius! // todėl būkite labai atsargūs, jei naudojate OUTPUT_ALLDATA ir bandote spausdinti duomenis Serial.println (GPS.lastNMEA ()); // tai taip pat nustato newNMEAreceived () vėliavą į false, jei (! GPS.parse (GPS.lastNMEA ()))) // tai taip pat nustato newNMEAreceived () vėliavą į false return; // mes negalime išanalizuoti sakinio, tokiu atveju turėtume tiesiog laukti kito} // jei „millis“() arba laikmatis apsisuks, mes jį iš naujo nustatysime, jei (timer> millis ()) timer = millis (); if (milis () - laikmatis> 2000) {laikmatis = milis (); // iš naujo nustatyti laikmatį Serial.print ("\ nLaikas:"); Serial.print (GPS.hour, DEC); Serial.print (':'); Serijinis atspaudas (GPS minutė, DEC); Serial.print (':'); Serijinis spaudinys (GPS.sekundės, DEC); Serial.print ('.'); Serial.println (GPS.milisekundės); Serial.print ("Data:"); Serijinis atspaudas (GPS diena, DEC); Serial.print ('/'); Serijinis atspaudas (GPS mėnuo, DEC); Serijinis atspaudas ("/20"); Serial.println (GPS.metai, DEC); Serial.print („Pataisymas:“); Serial.print ((int) GPS.fix); Serial.print ("kokybė:"); Serial.println ((int) GPS.fixquality); if (GPS.fix) {Serial.print ("Vieta:"); Serijinis atspaudas (GPS platuma, 4); Serijinis atspaudas (GPS.lat); Serial.print (","); Serijinis atspaudas (GPS.ilguma, 4); Serial.println (GPS.lon); Serial.print ("Vieta (laipsniais, veikia su" Google "žemėlapiais):"); Serijinis atspaudas (GPS.latitudeDegrees, 4); Serial.print (","); Serial.println (GPS.longitudeDegrees, 4); Serial.print ("Greitis (mazgai):"); Serial.println (GPS.speed); Serial.print ("Angle:"); Serial.println (GPS.angle); Serial.print ("Aukščio aukštis:"); Serial.println (GPS.altitude); Serial.print („Palydovai:“); Serial.println ((int) GPS.satellites); // Išsaugokite transporto priemonės GPS, jei (button_lock.read ()) {car_lat = GPS.latitudeDegrees; automobilis_lonas = GPS.longitudeDegrees; // derinimui Serial.print ("carLatitude:"); Serial.println (car_lat); Serial.print ("carLongitude:"); Serial.println (car_lon); } // Pradėkite ieškoti automobilio, jei (button_flag == 0) {button_flag = button_unlock.read (); } if (button_flag == 1 && led_flag == 1) {colorWipe (strip. Color (0, 255, 0), 500); led_ vėliava = 0; } if (button_flag == 1) {car_person_distance = atstumas (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // Apskaičiuokite atstumą // automobilio_žmonės_distansas = atstumas (100.0005, 100.0005, 100.0, 100.0); // derinimui Serial.println (car_person_distance); move_direction = GPS.angle; // Įrašyti judėjimo kryptį (kampą) // move_direction = 100,0; // Įrašyti azimutą (kampą) car_azimuth = azimuth (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // car_azimuth = azimutas (100.0005, 100.0005, 100.0, 100.0); // Skaičiuoti laiką ant LED laikrodžio car_person_angle = car_azimuth - move_direction; kampo laikas = šviesos diodo laikas (automobilio_žmogus_kampis); // Rodyti ant LED juostos.clear (); strip.show (); // uždelsimas (dažnis (automobilio_žmonės_distance)); vėlavimas (500); strip.setPixelColor (kampo laikas, juostelė. Spalva (0, 0, 255)); strip.show (); // uždelsimas (dažnis (automobilio_žmonės_distance)); vėlavimas (500); // Išjungti šviesos diodą, jei (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_ vėliava = 1; strip.clear (); strip.show (); }}} //}}}
6 veiksmas: derinkite „Breadboard“
7 žingsnis: Aparatūros surinkimas
8 veiksmas: elektronikos būsto projektavimas „Adobe Illustrator“
9 žingsnis: kartono prototipas
Šis žingsnis naudojamas patvirtinti korpuso ir kiekvieno modelio gabalo dydį, įsitikinant, kad dėžutės dydis, mygtuko padėtis ir LED padėtis atitinka surinktus elektroninius komponentus.
10 žingsnis: beržo faneros prototipas
Tai buvo pradinis prototipas. Galiausiai prie vienos iš dalių buvo pridėta kvadratinė skylė, skirta prijungti prie įkroviklio.