Sadržaj:

HUD prototip pametnog motocikla (detaljna navigacija i još mnogo toga): 9 koraka
HUD prototip pametnog motocikla (detaljna navigacija i još mnogo toga): 9 koraka

Video: HUD prototip pametnog motocikla (detaljna navigacija i još mnogo toga): 9 koraka

Video: HUD prototip pametnog motocikla (detaljna navigacija i još mnogo toga): 9 koraka
Video: Использование кнопки скорости шагового двигателя 28BYJ-48 с 8 проектами: Ultimate Video Tutorial, урок 107 2024, Decembar
Anonim
HUD prototip pametnog motocikla (detaljna navigacija i još mnogo toga)
HUD prototip pametnog motocikla (detaljna navigacija i još mnogo toga)
HUD prototip pametnog motocikla (detaljna navigacija i još mnogo toga)
HUD prototip pametnog motocikla (detaljna navigacija i još mnogo toga)
HUD prototip pametnog motocikla (detaljna navigacija i još mnogo toga)
HUD prototip pametnog motocikla (detaljna navigacija i još mnogo toga)
HUD prototip pametnog motocikla (detaljna navigacija i još mnogo toga)
HUD prototip pametnog motocikla (detaljna navigacija i još mnogo toga)

Zdravo!

Ovaj Instructables je priča o tome kako sam dizajnirao i izgradio HUD (Heads-Up Display) platformu dizajniranu za postavljanje na kacige za motocikle. Napisano je u kontekstu takmičenja "mape". Nažalost, nisam uspio u potpunosti završiti ovaj projekt na vrijeme do isteka roka za konkurs, ali sam ipak želio podijeliti svoj napredak u tome, kao i dokumentirati sve pokušaje i greške koje sam postigao tokom izrade.

Ideja za ovaj projekt prvi put mi je pala na pamet prije nekoliko godina, kada sam se bavila motociklima, i počela sam razmišljati o tome koju bih opremu trebala kupiti kako bi mi vožnja bila ugodnija. U to vrijeme me zbunjivalo da je najbolji način da dobijete osnovnu GPS navigaciju za vrijeme vožnje bilo da u osnovi pričvrstite svoj pametni telefon na upravljač vašeg bicikla. Uvjeren sam da bi mogao postojati bolji način za dobijanje takve informacije u hodu.

Tada mi je palo na pamet: head-up ekran bi mogao biti način za navigaciju tokom vožnje, bez pražnjenja baterije telefona i izlaganja elementima.

Vremenom je ova ideja sazrela u mom umu, pa sam pomislio da bi HUD ispred mene u svakom trenutku omogućio mnogo više upotreba od jednostavne navigacije. Zato je moj plan učiniti platformu javnom i modularnom, tako da svatko može stvoriti modul koji prikazuje potrebne informacije na vlastitom HUD -u

Iako postoje komercijalno dostupni proizvodi koji ispunjavaju ovaj zadatak, ne postoje modularni kao moja platforma, a također su i skupi. U svakom slučaju, dobrodošli u ovaj projekat.

Šta funkcioniše za sada

Kako je navedeno, ovaj projekt je još uvijek u razvoju, a to je ono što trenutno radi.

- Komunikacija između pametnog telefona i ploče zasnovane na ESP32 (telefon u budnom stanju)

- Dizajn optike urađen (možda će trebati mala prilagođavanja na duži rok)

- Android navigacijska aplikacija koja koristi navigacijski SDK za Mapbox:

- Sposobnost izračunavanja i prikaza korisnikovog položaja na karti, kao i rute od nje do odredišta

- Mogućnost povezivanja na Bluetooth uređaj (MAC adresa uređaja je od sada tvrdo kodirana)

- Sposobno za navigaciju u stvarnom vremenu, uključujući izdvajanje i slanje informacija o predstojećem manevru putem serijskog Bluetootha (za sada podržava samo skretanja)

Šta treba raditi

Ovaj popis sadrži stavke koje su apsolutno neophodne za namjeravanu upotrebu HUD -a, ali još nisu spremne za implementaciju.

- Celokupan dizajn (dodatak za kacigu, mehanizam za podešavanje ugla reflektora,..)

- Android aplikacija:

- Implementirajte otkrivanje i ispravljanje van rute

- Sposobnost korisnika da unese odredišnu adresu

- Međutočke?

- Ergonomija / Estetika

Potrošni materijal:

Essentials

- Razvojna ploča zasnovana na esp32

- Bilo koji noviji Android pametni telefon (omogućen Bluetooth)

- SSD1306 ili drugi omogućeni OLED ekran od 96 "(moj je imao 128x64 piksela, pogledajte dio" Mozak: Mikrokontroler i ekran ")

- Reflektor (prikladan je bilo koji komad akrila/stakla/pleksiglasa)

- Fresnelovo sočivo (moje je imalo F. dužinu od oko 13 cm, pogledajte dio "Izbor objektiva")

Alati

- Lemilica

- Oglasna ploča

- Nekoliko kratkospojnih kabela

- 3D štampač / usluga 3D štampanja

Korak 1: Kako sve to funkcionira: Objašnjeni izbori dizajna

Kako sve to funkcionira: Objašnjeni izbori dizajna
Kako sve to funkcionira: Objašnjeni izbori dizajna
Kako sve to funkcionira: Objašnjeni izbori dizajna
Kako sve to funkcionira: Objašnjeni izbori dizajna
Kako sve to funkcionira: Objašnjeni izbori dizajna
Kako sve to funkcionira: Objašnjeni izbori dizajna

Osnovna ideja Heads Up zaslona je prikazati sliku ispred nečijeg vida, tako da ne moraju skretati pogled s onoga što rade (bilo da pilotiraju avionom ili voze motocikl, što će biti naš primjer slučaja).

Optika

Tehnički, to se može postići izravnim postavljanjem ekrana ispred očiju korisnika. Međutim, ekran nije proziran i stoga bi ometao vid korisnika. Zatim biste mogli postaviti ekran ispred reflektirajuće površine, koja bi odražavala sadržaj ekrana, a istovremeno bila dovoljno prozirna da korisnik može vidjeti šta je ispred njega.

Međutim, ovaj pristup ima veliku manu: stvarni ekran je obično bliže očima korisnika od onoga na šta se korisnik zapravo mora fokusirati (npr. Put ispred sebe). To znači da bi se, kako bi se pročitalo ono što je na reflektirajućoj površini, oči korisnika morale prilagoditi udaljenosti ekrana od njegovih očiju (recimo 20 cm), a zatim bi se trebale ponovo prilagoditi kako bi se fokusirale na put ispred sebe (~ 2/5 metara). Vrijeme potrebno za cijelu ovu operaciju je dragocjeno vrijeme koje treba provesti gledajući na cestu, a često prilagođavanje može biti neugodno za korisnika nakon samo nekoliko minuta.

Zato sam odlučio dodati sočivo između ekrana i reflektora. Ovaj objektiv, ako se pažljivo odabere, trebao bi omogućiti stvaranje virtualne slike ekrana (vidi gornju shemu), koja bi tada izgledala dalje od očiju korisnika onakvom kakva uistinu jest, pa zahtijeva manje nagle adaptacije (ili nikako, u savršenom scenariju). Ovaj dizajn omogućava korisniku da brzo pogleda reflektor, dobije potrebne informacije i odmah pogleda natrag na cestu.

Uloga pametnog telefona

Budući da je bilo nerealno pokušati implementirati cijelu navigacijsku aplikaciju samo na ESP32, odlučio sam napraviti android aplikaciju koja će to riješiti. Aplikacija bi tada samo trebala reći ESP32 šta korisnik treba učiniti da dođe do svog odredišta, a ESP32 prenosi te informacije putem HUD -a (pogledajte sliku "Kako modul radi").

Korak 2: Dijelovi - mozak: mikrokontroler i ekran

Dijelovi - mozak: mikrokontroler i ekran
Dijelovi - mozak: mikrokontroler i ekran
Dijelovi - mozak: mikrokontroler i ekran
Dijelovi - mozak: mikrokontroler i ekran

Kao što je gore rečeno, planirao sam da moj modul prikazuje navigacijske informacije, a da zapravo ne izračunava stvarno pozicioniranje, praćenje i navigaciju u stvarnom vremenu. korisnički telefon bi umjesto toga komunicirao s modulom i slao mu podatke kako bi se zatim prikazao na HUD -u.

Da bih olakšao komunikaciju između korisnikovog telefona i modula, odlučio sam za ovaj projekat koristiti ploču zasnovanu na ESP32. Ovaj izbor je nastao zbog toga što ovaj specifični modul ima integrirane Bluetooth mogućnosti, kao i nekoliko drugih zanimljivih specifikacija (Jednostavna memorijska jedinica, dvojezgreni CPU, dovoljno RAM-a za pokretanje OLED ekrana putem I2C, …). Relativno je jednostavno dizajnirati štampane ploče zasnovane na ESP32, što sam uzeo u obzir. Takođe imam profesionalno iskustvo u korišćenju i projektovanju kola sa ESP32, što je definitivno uticalo na moj izbor.

Izbor ekrana u osnovi se svodio na sve što sam mogao otkriti da bih ipak bio dovoljno svijetao za upotrebu, a istovremeno bio i što manji. Nisam bio jako zabrinut zbog broja piksela ekrana, jer mi je cilj bio imati vrlo minimalističko i jednostavno korisničko sučelje.

Treba napomenuti da upravljački program ekrana treba podržati biblioteka koja omogućava preslikavanje slike. To je zato što se prikazana slika preokreće kada prođe kroz objektiv i pojavi se na reflektoru, a to što ne moramo ručno preokrenuti ono što se prikazuje ogromna je težina za nas graditelje.

Korak 3: Dijelovi - Optika: Pronalaženje kompromisa

Dijelovi - optika: pronalaženje kompromisa
Dijelovi - optika: pronalaženje kompromisa
Dijelovi - optika: pronalaženje kompromisa
Dijelovi - optika: pronalaženje kompromisa
Dijelovi - optika: pronalaženje kompromisa
Dijelovi - optika: pronalaženje kompromisa

Optici za ovaj projekt bilo je prilično teško pristupiti, jer nisam imao pojma što uopće tražim kad sam tek započeo ovaj projekt. Nakon nekog istraživanja, shvatio sam da želim stvoriti "virtualnu sliku" svog OLED ekrana, koja će izgledati dalje od oka nego što zapravo jest. Idealna udaljenost za formiranje ove virtualne slike bila bi oko 2-5 metara ispred vozača, a čini se da je to udaljenost do objekata na koje se fokusiramo tokom vožnje (drugi automobili, neravnine na cesti itd.)).

Da bih postigao taj cilj, odabrao sam korištenje Fresnelovog objektiva, budući da su prilično veliki, jeftini, činilo se da nude dovoljno dobru žižnu daljinu za moj projekt, a mogu se rezati jednostavnim škarama (što nije slučaj za profinjenije staklene leće okruglog oblika). Fresnelova sočiva mogu se naći pod nazivima poput "džepne lupe" ili "lupe za čitanje kartica", jer su vrlo prikladna za pomoć osobama sa slabim vidom u čitanju.

U osnovi, trik je bio u pronalaženju pravog kompromisa između:

- Imati razumnu udaljenost virtualne slike (to jest, koliko će HUD izgledati korisniku ili koliko će korisnik morati namjestiti oči da vidi što je na HUD -u)

- Objektiv ne smije previše povećavati tekst na ekranu (što je u osnovi lupa)

- Imati razumnu udaljenost između OLED ekrana i objektiva, što bi inače dovelo do vrlo glomaznog modula

Osobno sam na Amazonu naručio nekoliko različitih objektiva i odredio njihove žarišne duljine, prije nego što sam odabrao jedan s F. dužinom od oko 13 cm. Otkrio sam da mi ova F. dužina, sa udaljenošću OLED-objektiva od 9 cm, daje zadovoljavajuću sliku na reflektoru (pogledajte nekoliko posljednjih slika gore).

Kao što ćete vidjeti na mojim ilustracijama, da bi se pravilno fokusirala na prikazani tekst, kamera koja se koristi za snimanje ovih slika mora se prilagoditi kao da se fokusira na udaljeni objekt, zbog čega sve na istoj ravnini s reflektorom izgleda zamućeno. To je upravo ono što želimo za naš HUD.

3D datoteke za držač objektiva možete pronaći ovdje.

Korak 4: Dijelovi - spremnik za sve njih

Dijelovi - kontejner za sve njih
Dijelovi - kontejner za sve njih
Dijelovi - kontejner za sve njih
Dijelovi - kontejner za sve njih

Dok pišem ovaj Instructables, stvarni spremnik koji će držati svaki komad head-up ekrana nije sasvim dizajniran. Imam, međutim, nekoliko ideja o njegovom općem obliku i o tome kako pristupiti određenim problemima (poput toga kako držati reflektor mirno i natjerati ga da izdrži vjetrove veće od 100 km/h). Ovo je još uvijek u tijeku.

Korak 5: Kreiranje protokola za naš modul

Da bih poslao navigacijske upute s telefona na razvojnu ploču, morao sam smisliti vlastiti komunikacijski protokol koji bi mi omogućio jednostavno slanje potrebnih podataka s telefona, a ujedno i olakšao njihovu obradu nakon što ih primim.

U vrijeme pisanja ovog uputstva, informacije koje je trebalo prenijeti s telefona za navigaciju po modulu bile su:

- Vrsta predstojećeg manevra (jednostavno skretanje, kružni tok, spajanje na drugu cestu, …)

- Precizne upute za predstojeći manevar (ovisno o vrsti manevra: desno/lijevo za skretanje; koji izlaz treba uzeti za kružni tok, …)

- Preostala udaljenost prije predstojećeg manevra (u metrima za sada)

Odlučio sam organizirati ove podatke koristeći sljedeću strukturu okvira:

: tip.upute, udaljenost;

Iako nije lijepo rješenje, ovo nam omogućuje lako razdvajanje i razlikovanje svakog polja našeg protokola, što je olakšalo kodiranje na strani ESP32.

Važno je imati na umu da će za buduće funkcije ovom protokolu možda trebati dodati i druge informacije (poput tačnog dana i vremena ili muzike koja se svira na korisnikovom telefonu), što bi bilo lako izvodljivo koristeći iste gradi logiku kao i sada.

Korak 6: Kod: ESP32 strana

Kod: ESP32 strana
Kod: ESP32 strana
Kod: ESP32 strana
Kod: ESP32 strana

Kod za ESP32 je trenutno prilično jednostavan. Koristi biblioteku U8g2lib koja omogućava jednostavnu kontrolu OLED ekrana (uz omogućavanje preslikavanja prikazane slike).

U osnovi, sve što ESP32 radi je primanje serijskih podataka putem Bluetootha kada ih aplikacija pošalje, njihovo raščlanjivanje i prikaz ovih podataka ili slika na osnovu ovih podataka (tj. Prikaz strelice umjesto rečenice "okrenite lijevo/desno"). Evo koda:

/*Program za kontrolu HUD -a iz android aplikacije putem serijskog bluetootha*/#include "BluetoothSerial.h" // Datoteka zaglavlja za serijski Bluetooth, standardno će se dodati u Arduino#include #include #ifdef U8X8_HAVE_HW_SPI#include#endif# ifdef U8X8_HAVE_HW_I2C #include #endif // Konstruktor OLED biblioteke, potrebno je promijeniti u skladu sa vašim ekranom U8G2_SSD1306_128X64_ALT0_F_HW_I2C u8g2 (U8G2_MIRROR,/* reset =*/U8X8_PIN_; // Vrijednost polja polja otkrivenog polja + varijabla#definiraj maneuverField 1#definiraj uputeField 2#definiraj distanceField 3#definiraj endOfFrame 4int detektirano_polje = endOfFrame; BluetoothSerial serialBT; // Objekt za Bluetoothchar incoming_char; manevar char [10]; char instrukcije [10]; char distance [10]; char tempManeuver [10]; char tempInstructions [10]; char tempDistance [10]; int nbr_char_maneuver = 0; int nbr_char_instructions = 0; int nbr_char_distance = 0; boolean fullsentence = false; void setup () {Serial.begin (9600); // Pokretanje serijskog monitora u 9600 bauda u8g2.begin (); // Pokretanje OLED kontrole serialBT.begin ("ESP32_BT"); // Naziv kašnjenja Bluetooth signala (20); Serial.println ("Bluetooth uređaj je spreman za uparivanje");} void loop () {if (serialBT.available () &&! Fullsentence) // Znakovi koji se primaju putem Bluetooth serije {incoming_char = serialBT.read (); Serial.print ("Primljeno:"); Serial.println (incoming_char); } prekidač (otkriveno_polje) {slučaj manevra Polje: Serial.println ("Otkriveno polje: manevar"); if (incoming_char == '.') // Otkriveno sljedeće polje {detektirano_polje = uputstvoField; } else {// Ispunite vrstu manevra nizom informacija manevar [nbr_char_maneuver] = incoming_char; nbr_char_maneuver ++; } break; upute za slučaj Polje: Serial.println ("Otkriveno polje: upute"); if (incoming_char == ',') // Otkriveno sljedeće polje {detektirano_polje = distanceField; } else {// Ispunite upute u nizu s uputama [nbr_char_instructions] = incoming_char; nbr_char_instructions ++; } break; case distanceField: Serial.println ("Otkriveno polje: udaljenost"); if (incoming_char == ';') // Otkriven kraj okvira {detektirano_polje = endOfFrame; Serial.print ("manevar:"); Serial.println (manevar); Serial.print ("upute:"); Serial.println (upute); Serial.print ("udaljenost:"); Serial.println (udaljenost); fullsentence = true; update_Display (); // Cijeli okvir je primljen, raščlanite ga i prikažite podatke o prijemniku} else {// Popunite udaljenost polja informacija o udaljenosti [nbr_char_distance] = incoming_char; nbr_char_distance ++; } break; slučaj endOfFrame: if (dolazni_char == ':') otkriveno_polje = manevarsko polje; // Novi okvir otkrio prekid; default: // Ne radi ništa; } delay (20);} void update_Display () {// Keširaj svaki niz znakova kako bi se izbjegli mogući sukobi memcpy (tempManeuver, maneuver, nbr_char_maneuver); memcpy (tempInstructions, instrukcije, nbr_char_instructions); memcpy (tempDistance, distance, nbr_char_distance); parseCache (); // Raščlanjivanje i obrada nizova znakova fullsentence = false; // Rečenica obrađena, spremna za sljedeću} void parseCache () {u8g2.clearBuffer (); // brisanje interne memorije u8g2.setFont (u8g2_font_ncenB10_tr); // odabir odgovarajućeg fonta // char nizovi -> niz obavezan za upotrebu funkcije podniz () funkcija String maneuverString = tempManeuver; Instrukcije nizaString = tempInstructions; // Ovdje se implementira protokol. Za sada podržava samo skretanja. if (maneuverString.substring (0, 4) == "turn") {// Provjerite tip manevra Serial.print ("TURN DETECTED"); if (directionsString.substring (0, 5) == "right") {// Provjerite određene upute i prikazajte ih u8g2.drawStr (5, 15, "-"); } else if (instructionsString.substring (0, 4) == "left") {// Provjerite određene upute i prikazajte ih u8g2.drawStr (5, 15, "<---"); } else u8g2.drawStr (5, 15, "Err."); // Nevažeće polje s uputama}/ * Implementirajte druge vrste manevara (kružni tok itd.) * Else if (tempManeuver == "rdbt") { * *] */ u8g2.drawStr (5, 30, tempDistance); // Prikaz preostale udaljenosti u8g2.sendBuffer (); // prijenos interne memorije na zaslon // Resetiranje svih nizova znakova prije sljedećeg čitanja memset (manevar, 0, 10); memset (upute, 0, 10); memset (udaljenost, 0, 10); memset (tempManeuver, 0, 10); memset (tempInstructions, 0, 10); memset (tempDistance, 0, 10); // Resetiranje broja elemenata u nizovima nbr_char_distance = 0; nbr_char_instructions = 0; nbr_char_maneuver = 0;}

Korak 7: Kod: Android strana

Kod: Android strana
Kod: Android strana
Kod: Android strana
Kod: Android strana
Kod: Android strana
Kod: Android strana

Za aplikaciju za pametne telefone odlučio sam koristiti Mapbox -ov navigacijski SDK, jer nudi puno korisnih funkcija kada je u pitanju izrada navigacijske karte od nule. Omogućava i korištenje mnogih korisnih slušatelja, što definitivno pomaže u radu ovog modula. Koristio sam i harry1453 android-bluetooth-serijsku biblioteku za android jer je znatno olakšala sastavljanje Bluetooth serijske komunikacije.

Ako želite napraviti ovu aplikaciju kod kuće, morat ćete nabaviti pristupni token za Mapbox, koji je besplatan do određenog broja zahtjeva mjesečno. Morat ćete staviti ovaj token u kôd i sagraditi aplikaciju na svojoj strani. Takođe ćete morati da kodirate svoju Bluetooth MAC adresu svog ESP32.

Ovako kako stoji, aplikacija vas može voditi od vaše trenutne lokacije do bilo koje lokacije na koju možete kliknuti na karti. Kao što je spomenuto u uvodu, međutim, on ne podržava bilo koji drugi manevar osim skretanja, te još ne upravlja van ruta.

Cijeli izvorni kod možete pronaći na mom githubu.

Korak 8: Šta je sljedeće?

Sada kada je aplikacija dovoljno funkcionalna da zapravo vodi svog korisnika na zadatu rutu (ako nema odstupanja od zadane rute), moj glavni fokus bit će poboljšanje aplikacije za pametni telefon i implementacija nekoliko mogućnosti koje bi učinile modul održivi navigacijski uređaj. Ovo uključuje omogućavanje Bluetooth komunikacije sa telefona čak i kada je ekran isključen, kao i podršku za druge vrste manevara (kružni tok, spajanje, …). Također ću implementirati funkciju preusmjeravanja ako korisnik odstupi od izvorne rute.

Kad sve ovo bude učinjeno, poboljšat ću spremnik i mehanizam za pričvršćivanje, 3d ispisati ga i pokušati uzeti modul za prvo pokretanje.

Ako sve prođe u redu, moj dugoročni cilj je dizajnirati prilagođenu PCB za ugrađenu elektroniku ovog projekta, čime bi se uštedjelo puno prostora na finalnom proizvodu.

Mogao bih ubuduće dodati i neke druge funkcije ovom modulu, uključujući prikaz vremena, kao i alarm za obavještenje telefona, zbog čega bi se ikona mogla pojaviti kada korisnik primi tekstualnu poruku ili poziv. Na kraju, želio bih dodati Spotify mogućnosti ovom modulu, kao veliki ljubitelj muzike. Međutim, u ovom trenutku ovo je samo lijepo imati.

Korak 9: Zaključak i posebna hvala

Zaključak i posebna hvala!
Zaključak i posebna hvala!

Kao što je navedeno u uvodu, iako ovaj projekt još uvijek nije završen, zaista sam ga želio podijeliti sa svijetom, u nadi da bi mogao inspirirati nekoga drugog. Također sam želio dokumentirati svoje istraživanje o ovoj temi, jer nema baš velikog interesa hobista za AR i HUD, što je šteta.

Želim se zahvaliti Awall99 -u i Danelu Quintani, čiji me je projekat u okviru proširene stvarnosti jako inspirirao pri izradi ovog modula.

Hvala svima na pažnji, obavezno ću objaviti ažuriranje kada se ovaj projekat poboljša u bliskoj budućnosti. U međuvremenu, vidimo se kasnije!

Preporučuje se: