İçindekiler:
- Adım 1: Kağıt Eskiz
- 2. Adım: Donanım Listesi
- Adım 3: Devre Tasarımı
- Adım 4: Donanım Bağlantısı
- Adım 5: Yazılım Tasarımı
- 6. Adım: Breadboard'da Hata Ayıklama
- Adım 7: Donanım Montajı
- Adım 8: Adobe Illustrator'da Elektronik Muhafaza Tasarımı
- Adım 9: Karton Prototip
- Adım 10: Huş Kontrplak Prototipi
- Adım 11: Nihai Montaj Prototipi
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
Bu proje, yukarıdaki sorunları çözmek için insanları arabayı park ettikleri yere yönlendirebilecek bir akıllı araba anahtarı geliştirmeyi önermektedir. Ve planım araba anahtarına bir GPS entegre etmek. Arabayı takip etmek için akıllı telefon uygulamasını kullanmaya gerek yoktur, tüm yönlendirmeler sadece araba anahtarında gösterilir.
Adım 1: Kağıt Eskiz
İnsanlar arabayı kilitlemek için düğmeye bastığında, konum bilgisi otomatik olarak mikrodenetleyiciye kaydedilebilir. Daha sonra, insanlar araca gitmeye başladığında, aracın konumuna yönlendirmek için farklı LED yanar ve yanıp sönme frekansı araca olan mesafeyi gösterir. Yanıp sönen LED'i kolayca takip edebilir ve arabayı hızlı bir şekilde bulabilirler.
2. Adım: Donanım Listesi
Bunlar bu projede kullanılan bileşenlerdir. Bazıları parçacık kitlerinden (breadboard, düğme, başlıklar), diğerleri Adafruit resmi web sitesinden (Adafruit Feather M0, Adafruit Ultimate GPS modülü, Lpoly Pil ve Madeni Para Pili) ve Amazon'dan (NeoPixel Ring - 12 RGB LED) satın alınır.
Adım 3: Devre Tasarımı
Neopixel_LED, Feather M0'ın PIN 6'sına bağlı
Button_Unlock, Feather M0'ın PIN 12'sine bağlı
Button_Lock, Feather M0'ın PIN 13'üne bağlı
Adım 4: Donanım Bağlantısı
Başlıkları Adafruit M0 Feather, Adafruit Ultimate GPS Featherwing ile lehimleyin. İki tahtayı birlikte istifleyin. GPS FeatherWing, daha fazla kablo olmadan Feather M0 kartınıza takılır.
Adım 5: Yazılım Tasarımı
Test Bileşenleri
Bir FIX okuyun
geçersiz kurulum() {
Serial.println("GPS yankı testi"); Seri.başla(9600); Seri1.başlangıç(9600); // varsayılan NMEA GPS baud }
boşluk döngüsü () {
if (Serial.available()) { char c = Seri.read(); Seri1.write(c); } if (Serial1.available()) { char c = Serial1.read(); Seri.write(c); } }
Yanıp Sönen LED Halka
Adafruit NeoPixel Örneklerine bakın.
GPS Hesaplama Fonksiyonları
Azimutu hesaplayın
// Azimutu hesapla
çift azimut(çift lat_a, çift lon_a, çift lat_b, çift lon_b) {
çift 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 = günah(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; dönüş d; }
Aynı zamanda aracın yönü olan LED saat üzerindeki zamanı hesaplayın
// LED saatteki zamanı hesapla
int led_time(çift açı){
int bayrak = 0; if (angle = 15) { angle_time = angle_time + 1; } if (bayrak == 1){ angle_time = 12 - angle_time; } açı_zamanını döndür; }
Kişi ve aracı arasındaki mesafeyi hesaplayın
// Mesafeyi Hesapla
çift mesafe(çift lat_a, çift lon_a, çift lat_b, çift lon_b) {
çift EARTH_RADIUS = 6378137.0; çift radLat1 = (lat_a * PI / 180.0); çift radLat2 = (lat_b * PI / 180.0); çift a = radLat1 - radLat2; çift 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; İadeler; }
LED Ekran Fonksiyonları
Gezinmeye başladığını gösteren bir daire içinde LED'leri yak
// LED halka aydınlatma tek tek navigasyonun başladığını gösterir
void colorWipe(uint32_t c, uint8_t bekleyin) {
for(uint16_t i=0; i strip.setPixelColor(i, c); strip.show(); delay(bekle); } }
LED frekansını mesafeye göre alın
// LED Frekansını Al
int frekans(çift mesafe){
int f = (int)mesafe * 20; dönüş f; }
Arabanın yönünü gösteren belirli LED'i yanıp sönün
// LED'de göster
strip.clear();
şerit.göster(); gecikme(frekans(araba_kişi_mesafe)); // gecikme(500); strip.setPixelColor(angle_time, strip. Color(0, 0, 255); şerit.göster(); gecikme(frekans(araba_kişi_mesafe)); // gecikme(500);
//LED'i devre dışı bırak
if (button_flag == 1 && car_person_mesafe < 5.0){ button_flag = 0; led_flag = 1; strip.clear(); şerit.göster(); }
Ana
#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 Seri1
#define GPSECHO yanlış
Adafruit_GPS GPS(&GPSSerial);Adafruit_NeoPixel şeridi = 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 zamanlayıcı = millis(); çift car_lat, car_lon; çift araba_kişi_mesafesi; çift hareket_yön; çift araba_azimut; double car_person_angle; int açı_zamanı;
geçersiz kurulum() {
Seri.başla(115200); // Seri1.begin(9600); GPS.başlangıç(9600); // varsayılan NMEA GPS baud strip.begin(); // yükseklik GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ) güncelleme hızını ayarlayın; // 1 Hz güncelleme hızı // Anten durumu hakkında güncelleme talep edin, sessiz kalmak için yorum yapın // GPS.sendCommand(PGCMD_ANTENNA); gecikme(1000);}
void loop() {// if (Serial.available()) {
// char c = Seri.read(); // Seri1.write(c); // } // if (Serial1.available()) { char c = GPS.read(); if (GPSECHO) if (c) Serial.print(c); // eğer bir cümle alınırsa, sağlama toplamını kontrol edebilir, onu ayrıştırabiliriz… if (GPS.newNMEAreceived()) { // burada zor olan şey, NMEA cümlesini veya veriyi yazdırıp yazdırmamamızdır // sonunda dinlemez ve diğer cümleleri yakalamak! // OUTPUT_ALLDATA kullanıyorsanız ve verileri yazdırmaya çalışıyorsanız çok dikkatli olun Serial.println(GPS.lastNMEA()); // bu ayrıca newNMEAreceived() bayrağını false if (!GPS.parse(GPS.lastNMEA())) değerine ayarlar // bu ayrıca newNMEArecated() bayrağını false döndürmeye ayarlar; // bir cümleyi ayrıştırmada başarısız olabiliriz, bu durumda başka bir cümle için beklememiz gerekir } // millis() veya zamanlayıcı dolanırsa, onu sıfırlayacağız if (timer > millis()) timer = millis(); if (millis() - zamanlayıcı > 2000) { zamanlayıcı = millis(); // zamanlayıcıyı sıfırla Serial.print("\nZaman: "); Seri.print(GPS.saat, Aralık); Seri.print(':'); Seri.print(GPS.dakika, Aralık); Seri.print(':'); Seri.baskı(GPS.saniye, Aralık); Seri.print('.'); Seri.println(GPS.milisaniye); Serial.print("Tarih: "); Seri.print(GPS.day, Aralık); Seri.print('/'); Seri.print(GPS.ay, Aralık); Seri.print("/20"); Seri.println(GPS.yıl, Aralık); Serial.print("Düzeltme: "); Seri.print((int)GPS.fix); Seri.print(" kalite: "); Serial.println((int)GPS.fixquality); if (GPS.fix) { Serial.print("Yer: "); Seri.print(GPS.latitude, 4); Serial.print(GPS.lat); Seri.print(", "); Seri.print(GPS.boylam, 4); Seri.println(GPS.lon); Serial.print("Konum (derece olarak, Google Haritalar ile çalışır): "); Serial.print(GPS.latitudeDegrees, 4); Seri.print(", "); Serial.println(GPS.boylamDereceler, 4); Serial.print("Hız (düğüm): "); Seri.println(GPS.hız); Serial.print("Açı: "); Seri.println(GPS.açı); Serial.print("Yükseklik: "); Serial.println(GPS.altitude); Serial.print("Uydular: "); Serial.println((int)GPS.satellites); // Aracın GPS'ini kaydedin if (button_lock.read()) { car_lat = GPS.latitudeDegrees; car_lon = GPS.longitudeDerece; //hata ayıklamak için Serial.print("carLatitude: "); Serial.println(car_lat); Serial.print("araba Boylam: "); Serial.println(car_lon); } // Arabayı bulmaya başla 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); //Mesafeyi hesapla //car_person_mesafe = mesafe(100.0005, 100.0005, 100.0, 100.0); //hata ayıklamak için Serial.println(car_person_mesafe); move_direction = GPS.angle;//Hareket yönünü kaydedin(açı) //move_direction = 100.0; // Azimut(açı) kaydedin car_azimut = azimut(GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); //car_azimut = azimut(100.0005, 100.0005, 100.0, 100.0); // LED saatindeki zamanı hesapla car_person_angle = car_azimut - move_direction; angle_time = led_time(car_person_angle); //LED şeridinde göster.clear(); şerit.göster(); // gecikme(frekans(araba_kişi_mesafe)); gecikme(500); strip.setPixelColor(angle_time, strip. Color(0, 0, 255); şerit.göster(); // gecikme(frekans(araba_kişi_mesafe)); gecikme(500); //(button_flag == 1 && car_person_distance < 5.0) ise LED'i devre dışı bırakın{ button_flag = 0; led_flag = 1; strip.clear(); şerit.göster(); } } } // } } }
6. Adım: Breadboard'da Hata Ayıklama
Adım 7: Donanım Montajı
Adım 8: Adobe Illustrator'da Elektronik Muhafaza Tasarımı
Adım 9: Karton Prototip
Bu adım, kutu boyutunun, düğme konumunun ve LED konumunun monte edilmiş elektronik bileşenlere uyduğundan emin olarak gövdenin boyutunu ve modelin her bir parçasını doğrulamak için kullanılır.
Adım 10: Huş Kontrplak Prototipi
Bu ilk prototipti. Son olarak parçalardan birine şarj cihazına takmak için kare bir delik eklendi.