Spisu treści:

FinduCar: inteligentny kluczyk samochodowy prowadzący ludzi do miejsca zaparkowania samochodu: 11 kroków (ze zdjęciami)
FinduCar: inteligentny kluczyk samochodowy prowadzący ludzi do miejsca zaparkowania samochodu: 11 kroków (ze zdjęciami)

Wideo: FinduCar: inteligentny kluczyk samochodowy prowadzący ludzi do miejsca zaparkowania samochodu: 11 kroków (ze zdjęciami)

Wideo: FinduCar: inteligentny kluczyk samochodowy prowadzący ludzi do miejsca zaparkowania samochodu: 11 kroków (ze zdjęciami)
Wideo: А вот Булли заценил!😾 #симбочка #симба #тигра 2024, Listopad
Anonim
FinduCar: inteligentny kluczyk samochodowy prowadzący ludzi do miejsca zaparkowania samochodu
FinduCar: inteligentny kluczyk samochodowy prowadzący ludzi do miejsca zaparkowania samochodu

Aby rozwiązać powyższe problemy, w ramach tego projektu proponuje się opracowanie inteligentnego kluczyka do samochodu, który mógłby kierować ludzi do miejsca, w którym zaparkowali samochód. A mój plan to zintegrowanie GPS z kluczykiem samochodowym. Nie ma potrzeby korzystania z aplikacji na smartfona do śledzenia samochodu, wszystkie wskazówki pojawią się tylko na kluczyku samochodowym.

Krok 1: Szkic papierowy

Szkic papieru
Szkic papieru

Gdy ludzie naciskają przycisk, aby zablokować samochód, informacje o lokalizacji mogą być automatycznie rejestrowane w mikrokontrolerze. Następnie, gdy ludzie zaczynają nawigować do samochodu, zapalają się różne diody LED, aby skierować się do pozycji samochodu, a częstotliwość migania pokazuje odległość do samochodu. Mogą łatwo śledzić migającą diodę LED i szybko znaleźć samochód.

Krok 2: Lista sprzętu

Lista sprzętu
Lista sprzętu

To są komponenty użyte w tym projekcie. Niektóre pochodzą z zestawów cząstek (płytka do krojenia chleba, przycisk, nagłówki), inne są kupowane na oficjalnej stronie internetowej Adafruit (Adafruit Feather M0, moduł Adafruit Ultimate GPS, bateria Lpoly i bateria monetowa) oraz Amazon (pierścień NeoPixel - 12 RGB LED).

Krok 3: Projekt obwodu

Projekt obwodu
Projekt obwodu

Neopixel_LED jest podłączony do PIN 6 Feather M0

Button_Unlock jest połączony z PIN 12 Feather M0

Button_Lock jest połączony z PIN 13 Feather M0

Krok 4: Połączenie sprzętowe

Połączenie sprzętowe
Połączenie sprzętowe
Połączenie sprzętowe
Połączenie sprzętowe
Połączenie sprzętowe
Połączenie sprzętowe

Przylutuj nagłówki za pomocą Adafruit M0 Feather, Adafruit Ultimate GPS Featherwing. Ułóż dwie deski razem. GPS FeatherWing podłącza się bezpośrednio do płyty Feather M0 bez żadnych dodatkowych przewodów.

Krok 5: Projektowanie oprogramowania

Projektowanie Oprogramowania
Projektowanie Oprogramowania

Komponenty testowe

Przeczytaj FIX

pusta konfiguracja () {

Serial.println("Test echa GPS"); Serial.początek(9600); Serial1.początek(9600); // domyślna prędkość NMEA GPS }

pusta pętla () {

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

Migający pierścień LED

Zobacz przykłady Adafruit NeoPixel.

Funkcje obliczania GPS

Oblicz azymut

// Oblicz azymut

podwójny azymut(podwójny łat_a, podwójny lon_a, podwójny łat_b, podwójny lon_b) {

podwójne 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; powrót d; }

Oblicz czas na zegarze LED, który jest również kierunkiem pojazdu

// Oblicz czas na zegarze LED

int led_time (podwójny kąt){

flaga int = 0; if (kąt = 15) { kąt_czas = kąt_czas + 1; } if (flaga == 1){ kąt_czas = 12 - kąt_czas; } zwróć kąt_czasu; }

Oblicz odległość między osobą a jej pojazdem

// Oblicz odległość

podwójna odległość(podwójna długość_a, podwójna długość_a, podwójna długość_b, podwójna długość_b) {

podwójny EARTH_RADIUS = 6378137,0; podwójny radLat1 = (lat_a * PI / 180,0); podwójny radLat2 = (lat_b * PI / 180,0); podwójne a = radLat1 - radLat2; podwójne 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 * PROMIEŃ_ZIEMI / 10000000; zwroty; }

Funkcje wyświetlacza LED

Zapalają się diody LED w kółku pokazujące, że zaczyna nawigować

// Podświetlenie pierścienia LED jeden po drugim pokazuje, że rozpoczyna się nawigacja

void colorWipe(uint32_t c, uint8_t czekaj) {

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

Uzyskaj częstotliwość LED na podstawie odległości

// Uzyskaj częstotliwość LED

częstotliwość int (podwójna odległość){

int f = (int)odległość * 20; powrót f; }

Migaj określoną diodę LED wskazującą kierunek samochodu;

//Wyświetlacz na LED

pasek.wyczyść();

strip.pokaż(); opóźnienie(częstotliwość(car_person_distance)); // opóźnienie(500); strip.setPixelColor(angle_time, strip. Color(0, 0, 255)); strip.pokaż(); opóźnienie(częstotliwość(car_person_distance)); // opóźnienie(500);

//Wyłącz diodę LED

if (flaga_przycisku == 1 && odległość_osoby_samochodu < 5.0){ flaga_przycisku = 0; led_flaga = 1; pasek.wyczyść(); strip.pokaż(); }

Główny

#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 fałszywe

Adafruit_GPS GPS(&GPSSerial);Adafruit_NeoPixel pasek = Adafruit_NeoPixel(Neopixel_LED_NUM, Neopixel_LED_PIN, NEO_GRB + NEO_KHZ800); Przycisk button_lock(Button_Lock_PIN); Przycisk button_unlock(Button_Unlock_PIN); int flaga_przycisku = 0; int flaga_led = 1; uint32_t timer = millis(); podwójny samochód_lat, samochód_lon; podwójny samochód_osoba_odległość; podwójny kierunek_ruchu; podwójny samochód_azymut; podwójny samochód_osoba_kąt; int kąt_czas;

pusta konfiguracja () {

Serial.początek(115200); // Serial1.begin(9600); GPS.początek (9600); // domyślna transmisja NMEA GPS strip.begin(); // odkomentuj tę linię, aby włączyć RMC (zalecane minimum) i GGA (stałe dane), w tym wysokość GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // Ustaw częstotliwość aktualizacji GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // Częstotliwość aktualizacji 1 Hz // Żądaj aktualizacji statusu anteny, skomentuj, aby zachować spokój // GPS.sendCommand(PGCMD_ANTENNA); opóźnienie(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); // jeśli zdanie zostanie odebrane, możemy sprawdzić sumę kontrolną, przeanalizować ją… if (GPS.newNMEAreceived()) { // trudną rzeczą jest to, że jeśli wydrukujemy zdanie lub dane NMEA // nie słuchamy i łapanie innych zdań! // więc bądź bardzo ostrożny używając OUTPUT_ALLDATA i próbując wydrukować dane Serial.println(GPS.lastNMEA()); // ustawia to również flagę newNMEAreceived() na false if (!GPS.parse(GPS.lastNMEA())) // ustawia to również flagę newNMEAreceived() na false return; // możemy nie przetworzyć zdania, w takim przypadku powinniśmy po prostu poczekać na następne } // jeśli millis() lub timer zawija, po prostu je zresetujemy if (timer > millis()) timer = millis(); if (millis() - timer > 2000) { timer = millis(); // zresetuj licznik Serial.print("\nTime: "); Serial.print(GPS.godzina, DEC); Serial.print(':'); Serial.print(GPS.minuta, DEC); Serial.print(':'); Serial.print(GPS.sekundy, DEC); Serial.print('.'); Serial.println(GPS.milisekundy); Serial.print("Data: "); Serial.print(GPS.day, DEC); Serial.print('/'); Serial.print(GPS.miesiąc, grudzień); Serial.print("/20"); Serial.println(GPS.rok, grudzień); Serial.print("Poprawka: "); Serial.print((int)GPS.fix); Serial.print("jakość:"); Serial.println((int)GPS.fixquality); if (GPS.fix) { Serial.print("Lokalizacja: "); Serial.print(GPS.szerokość, 4); druk.seryjny(GPS.lat); Serial.print(", "); Serial.print(GPS.długość, 4); Serial.println(GPS.lon); Serial.print("Lokalizacja (w stopniach, współpracuje z Mapami Google): "); Serial.print(GPS.latitudeDegrees, 4); Serial.print(", "); Serial.println(GPS.longitudeDegrees, 4); Serial.print("Prędkość (węzły): "); Serial.println(prędkość. GPS); Serial.print("Kąt: "); Serial.println(kąt. GPS); Serial.print("Wysokość: "); Serial.println(GPS.wysokość); Serial.print("Satelity: "); Serial.println((int)GPS.satelity); // Zapisz GPS pojazdu if (button_lock.read()) { car_lat = GPS.latitudeDegrees; samochód_lon = GPS.długośćStopnie; //dla debugowania Serial.print("carLatitude: "); Serial.println(samochód_lat); Serial.print("carLongitude: "); Serial.println(samochód_lon); } // Rozpocznij wyszukiwanie samochodu if (button_flag == 0){ button_flag = button_unlock.read(); } if(button_flag == 1 && led_flag == 1){ colorWipe(strip. Color(0, 255, 0), 500); led_flaga = 0; } if (button_flag == 1) { car_person_distance = distance(GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); //Oblicz odległość //car_person_distance = distance(100.0005, 100.0005, 100.0, 100.0); //dla debugowania Serial.println(car_person_distance); move_direction = GPS.angle;//Zapisz kierunek ruchu (kąt) //move_direction = 100.0; // Zapisz Azymut(kąt) car_azimuth = azymut(GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); //azymut_samochodu = azymut(100.0005, 100.0005, 100.0, 100.0); // Oblicz czas na zegarze LED car_person_angle = car_azimuth - move_direction; angle_time = led_time(car_person_angle); //Wyświetlacz na pasku LED.clear(); strip.pokaż(); // opóźnienie(częstotliwość(car_person_distance)); opóźnienie (500); strip.setPixelColor(angle_time, strip. Color(0, 0, 255)); strip.pokaż(); // opóźnienie(częstotliwość(car_person_distance)); opóźnienie (500); //Wyłącz diodę LED, jeśli (button_flag == 1 && car_person_distance < 5.0){ button_flag = 0; led_flaga = 1; pasek.wyczyść(); strip.pokaż(); } } } // } } }

Krok 6: Debuguj na tablicy prototypowej

Debuguj na tablicy prototypowej
Debuguj na tablicy prototypowej
Debuguj na tablicy prototypowej
Debuguj na tablicy prototypowej
Debuguj na tablicy prototypowej
Debuguj na tablicy prototypowej

Krok 7: Montaż sprzętu

Montaż sprzętu
Montaż sprzętu
Montaż sprzętu
Montaż sprzętu
Montaż sprzętu
Montaż sprzętu

Krok 8: Projekt obudowy elektroniki w programie Adobe Illustrator

Projektowanie obudowy elektroniki w programie Adobe Illustrator
Projektowanie obudowy elektroniki w programie Adobe Illustrator

Krok 9: Prototyp kartonu

Kartonowy prototyp
Kartonowy prototyp
Kartonowy prototyp
Kartonowy prototyp

Ten krok służy do potwierdzenia rozmiaru obudowy i każdego elementu modelu, upewniając się, że rozmiar pudełka, położenie przycisku i położenie diody LED pasują do zmontowanych elementów elektronicznych.

Krok 10: Prototyp sklejki brzozowej

Prototyp sklejki brzozowej
Prototyp sklejki brzozowej
Prototyp sklejki brzozowej
Prototyp sklejki brzozowej

To był pierwszy prototyp. Ostatecznie do jednego z kawałków dodano kwadratowy otwór do podłączenia ładowarki.

Zalecana: