Kazalo:

Prototip HUD pametnega motornega kolesa (navigacija od zavoja in še veliko več): 9 korakov
Prototip HUD pametnega motornega kolesa (navigacija od zavoja in še veliko več): 9 korakov

Video: Prototip HUD pametnega motornega kolesa (navigacija od zavoja in še veliko več): 9 korakov

Video: Prototip HUD pametnega motornega kolesa (navigacija od zavoja in še veliko več): 9 korakov
Video: Tesla Franz Von Holzhausen Keynote Address 2017 Audio Only W / Subs 2024, Julij
Anonim
Prototip pametnega motornega kolesa HUD (navigacija po korakih in še veliko več)
Prototip pametnega motornega kolesa HUD (navigacija po korakih in še veliko več)
Prototip pametnega motornega kolesa HUD (navigacija po korakih in še veliko več)
Prototip pametnega motornega kolesa HUD (navigacija po korakih in še veliko več)
Prototip pametnega motornega kolesa HUD (navigacija po korakih in še veliko več)
Prototip pametnega motornega kolesa HUD (navigacija po korakih in še veliko več)
Prototip pametnega motornega kolesa HUD (navigacija po korakih in še veliko več)
Prototip pametnega motornega kolesa HUD (navigacija po korakih in še veliko več)

Živjo!

Ta Instructables je zgodba o tem, kako sem zasnoval in zgradil platformo HUD (Heads-Up Display), namenjeno za namestitev na čelade za motorna kolesa. Napisana je bila v okviru natečaja "zemljevidi". Na žalost tega projekta do roka za natečaj nisem mogel dokončati v celoti, vendar sem vseeno želel deliti svoj napredek pri tem in dokumentirati vse poskuse in napake, ki sem jih dobil pri izdelavi.

Ideja za ta projekt se mi je prvič porodila pred nekaj leti, ko sem se lotil motornih koles, in začel sem razmišljati, kakšno opremo bi moral kupiti, da bi mi vožnja postala prijetnejša. Takrat me je zmedlo, da je najboljši način za osnovno navigacijo GPS med vožnjo v bistvu pritrditev pametnega telefona na krmilo vašega kolesa. Mislim pa, da bi zagotovo obstajal boljši način, da do takšnih informacij pridem na hitro.

Takrat sem prišel do mene: zaslon na glavo je lahko način za navigacijo med vožnjo, ne da bi izpraznili baterijo telefona in jo izpostavili elementom.

Sčasoma je ta ideja dozorela v mojih mislih in pomislil sem, da bi imel pred seboj vedno HUD, ki bi omogočal veliko več uporabe kot preprosto krmarjenje. Zato je moj načrt, da platformo naredim javno in modularno, tako da lahko vsak ustvari modul, ki prikazuje lastne podatke v HUD -u.

Čeprav obstajajo komercialno dostopni izdelki, ki izpolnjujejo to nalogo, ni nobenih, ki bi bili tako modularni kot moja platforma in so tudi nekoliko dražji. Kakorkoli, dobrodošli v tem projektu.

Kaj deluje zaenkrat

Kot rečeno, je ta projekt še vedno v zelo razvojnem stanju in to je tisto, kar trenutno deluje.

- Komunikacija med pametnim telefonom in ploščo na osnovi ESP32 (telefon v budnem stanju)

- Končana zasnova optike (na dolgi rok bodo morda potrebne majhne prilagoditve)

- Navigacijska aplikacija za Android, ki uporablja navigacijski SDK za Mapbox:

- Sposoben izračunati in prikazati uporabnikov položaj na zemljevidu ter pot od njega do cilja

- Možnost povezovanja z napravo Bluetooth (naslov MAC naprave je trenutno trdo kodiran)

- Sposobnost navigacije v realnem času, vključno z pridobivanjem in pošiljanjem informacij o prihajajočem manevru prek serijskega Bluetootha (zaenkrat podpira samo zavoje)

Kaj potrebuje delo

Ta seznam vsebuje elemente, ki so nujno potrebni za predvideno uporabo HUD -a, vendar še niso pripravljeni za izvajanje.

- Celotna zasnova (nastavek za čelado, mehanizem za nastavitev kota reflektorja,..)

- aplikacija za Android:

- Izvedite odkrivanje in popravljanje off-route

- Sposobnost uporabnika, da vnese ciljni naslov

- Točke poti?

- Ergonomija / Estetika

Zaloge:

Osnove

- razvojna plošča, ki temelji na esp32

- Vsak nekoliko novejši pametni telefon Android (Bluetooth je omogočen)

- SSD1306 ali drug 96 -palčni zaslon OLED (moj je bil 128x64 slikovnih pik, glejte del "možgani: mikrokrmilnik in zaslon")

- reflektor (primeren je kateri koli kos akrila/stekla/pleksi stekla)

- Fresnelova leča (moja je imela F. dolžino približno 13 cm, glej del "Izbira objektiva")

Orodja

- spajkalnik

- Ogledna plošča

- Nekaj mostičnih kablov

- 3D tiskalnik / storitev 3D tiskanja

1. korak: Kako vse deluje: Razložene oblikovalske izbire

Kako vse to deluje: Razložene oblikovalske izbire
Kako vse to deluje: Razložene oblikovalske izbire
Kako vse to deluje: Razložene oblikovalske izbire
Kako vse to deluje: Razložene oblikovalske izbire
Kako vse to deluje: Razložene oblikovalske izbire
Kako vse to deluje: Razložene oblikovalske izbire

Osnovna ideja Heads Up zaslona je prikazati sliko pred očmi nekoga, zato mu ni treba gledati stran od tega, kar počnejo (pa naj bo to pilotiranje letala ali vožnja z motorjem, kar bo naš primer primera).

Optika

Tehnično je to mogoče doseči tako, da zaslon postavite naravnost pred oči uporabnika. Vendar zaslon ni pregleden in bi zato oviral vid uporabnika. Zaslon bi lahko postavili pred odsevno površino, ki bi zrcalila vsebino zaslona, hkrati pa bi bila dovolj pregledna, da bi uporabnik lahko videl, kaj je pred njim.

Vendar ima ta pristop veliko pomanjkljivost: dejanski zaslon je običajno bližje očem uporabnika kot tisto, na kar se mora uporabnik dejansko osredotočiti (npr. Pot pred njim). To pomeni, da bi se morale uporabnikove oči, da bi prebrale, kaj je na odsevni površini, prilagoditi razdalji zaslona od njegovih oči (recimo 20 cm), nato pa bi se morale znova prilagoditi, da bi se osredotočile na cesto naprej (~ 2/5 metrov). Čas, potreben za vso to operacijo, je dragocen čas, ki ga je treba porabiti za ogled ceste, pogosto prilagajanje pa bi lahko bilo uporabniku neprijetno že po nekaj minutah.

Zato sem se odločil, da med zaslon in reflektor dodam lečo. Če je ta objektiv skrbno izbran, bi moral omogočiti ustvarjanje navidezne podobe zaslona (glej shemo zgoraj), ki bi bila potem videti bolj oddaljena od oči uporabnika, kot je v resnici, kar bi zahtevalo manj nenadne prilagoditve (oz. sploh nič, v popolnem scenariju). Ta zasnova omogoča uporabniku, da hitro pogleda v reflektor, dobi potrebne informacije in takoj pogleda nazaj na cesto.

Vloga pametnega telefona

Ker je bilo nerealno poskusiti implementirati celotno navigacijsko aplikacijo samo na ESP32, sem se odločil, da bom naredil aplikacijo za Android, ki bo za to poskrbela. Aplikacija bi nato morala samo povedati ESP32, kaj mora uporabnik narediti, da pride do cilja, ESP32 pa te informacije posreduje prek HUD (glejte sliko "Kako deluje modul").

2. korak: Deli - možgani: mikrokrmilnik in zaslon

Deli - možgani: mikrokrmilnik in zaslon
Deli - možgani: mikrokrmilnik in zaslon
Deli - možgani: mikrokrmilnik in zaslon
Deli - možgani: mikrokrmilnik in zaslon

Kot je navedeno zgoraj, sem načrtoval, da bo moj modul prikazal informacije o navigaciji, pri čemer dejansko ne bo izračunal dejanskega pozicioniranja, sledenja in navigacije v realnem času. uporabnikov telefon bi namesto tega komuniciral z modulom in mu poslal podatke, da se nato prikaže na HUD -u.

Za lažjo komunikacijo med uporabniškim telefonom in modulom sem se za ta projekt odločil uporabiti ploščo na osnovi ESP32. Ta izbira je bila posledica tega, da ima ta poseben modul vgrajene zmogljivosti Bluetooth, pa tudi nekaj drugih zanimivih specifikacij (enostaven za uporabo nehlapne shrambe, dvojedrni CPE, dovolj RAM-a za dejansko vožnjo po zaslonu OLED prek I2C,…). Oblikovanje PCB -jev na osnovi ESP32 je razmeroma preprosto, kar sem upošteval. Prav tako imam strokovne izkušnje z uporabo in oblikovanjem vezij z ESP32, kar je vsekakor vplivalo na mojo izbiro.

Izbira zaslona se je v bistvu nanašala na vse, kar sem ugotovil, da bi bil vendarle dovolj svetel za uporabo, hkrati pa bi bil čim manjši. Število slikovnih pik zaslona me ni zelo skrbelo, saj je bil moj cilj imeti zelo minimalističen in preprost uporabniški vmesnik.

Upoštevati je treba, da mora gonilnik zaslona podpirati knjižnica, ki omogoča zrcaljenje slike. To je zato, ker se prikazana slika obrne, ko pride skozi lečo in se pojavi na reflektorju, in ker nam kot gradbenikom ni treba ročno obrniti prikazanega, je to velika teža.

3. korak: Deli - Optika: Iskanje kompromisa

Deli - Optika: iskanje kompromisa
Deli - Optika: iskanje kompromisa
Deli - Optika: iskanje kompromisa
Deli - Optika: iskanje kompromisa
Deli - Optika: iskanje kompromisa
Deli - Optika: iskanje kompromisa

Optiki za ta projekt je bilo precej težko pristopiti, saj nisem vedel, kaj sploh iščem, ko sem prvič začel s tem projektom. Po nekaj raziskavah sem razumel, da želim ustvariti "virtualno podobo" svojega zaslona OLED, ki bo videti bolj oddaljena od očesa, kot je v resnici. Idealna razdalja za oblikovanje te navidezne podobe bi bila približno 2-5 metrov pred voznikom, zdi se, da je to razdalja do predmetov, na katere se osredotočamo med vožnjo (drugi avtomobili, neravnine na cesti itd.)).

Za dosego tega cilja sem se odločil za uporabo Fresnelove leče, saj so te precej velike, poceni, zdelo se je, da ponujajo dovolj dobro goriščno razdaljo za moj projekt, in jih je mogoče razrezati s preprostimi škarjami (kar pa ne velja za bolj izpopolnjene steklene leče okrogle oblike). Fresnelove leče lahko najdemo imena, kot sta "žepna lupa" ali "lupa za bralne kartice", saj so zelo primerne za pomoč ljudem s slabim vidom pri branju.

V bistvu je bil trik tukaj iskanje pravega kompromisa med:

- razumno razdaljo navidezne slike (to je, kako daleč se bo uporabniku zdel HUD ali kako daleč bo moral uporabnik prilagoditi oči, da vidi, kaj je na HUD -u)

- Leča (ki je v bistvu lupa) besedila na zaslonu ne sme preveč povečati

- razumna razdalja med zaslonom OLED in lečo, kar bi sicer privedlo do zelo obsežnega modula

Osebno sem naročil nekaj različnih objektivov na amazonu in določil njihove goriščne razdalje, preden sem izbral enega z dolžino F. približno 13 cm. Ugotovil sem, da mi je ta dolžina F. z razdaljo OLED-objektiva 9 cm dala zadovoljivo podobo na reflektorju (glej zadnjih nekaj slik zgoraj).

Kot boste videli na mojih ilustracijah, se mora fotoaparat, da se pravilno osredotoči na prikazano besedilo, prilagoditi, kot da se osredotoča na oddaljeni predmet, zaradi česar je vse na isti ravnini kot reflektor zamegljeno. Ravno to želimo našemu HUD -u.

3D datoteke za držalo objektiva najdete tukaj.

4. korak: Deli - zabojnik, ki jih drži vse

Deli - zabojnik, ki jih drži vse
Deli - zabojnik, ki jih drži vse
Deli - zabojnik, ki jih drži vse
Deli - zabojnik, ki jih drži vse

Ko pišem ta navodila, dejanski vsebnik, ki bo vseboval vsak kos head-up zaslona, ni povsem oblikovan. Imam pa nekaj idej o njegovi splošni obliki in o tem, kako pristopiti k določenim težavam (na primer, kako reflektor držati pri miru in ga vzdržati vetra 100+ km/h). To je še vedno veliko dela v teku.

5. korak: Ustvarjanje protokola za naš modul

Za pošiljanje navodil za navigacijo iz telefona na razvojno ploščo sem moral pripraviti lasten komunikacijski protokol, ki bi mi omogočal preprosto pošiljanje zahtevanih podatkov iz telefona, hkrati pa bi olajšal njihovo obdelavo, ko jih prejmem.

V času pisanja tega navodila so bile informacije, ki jih je bilo treba posredovati iz telefona za navigacijo po modulu, naslednje:

- Vrsta prihajajočega manevra (preprost zavoj, krožišče, združevanje na drugo cesto, …)

- natančna navodila prihajajočega manevra (odvisno od vrste manevra: desno/levo za zavoj; kateri izhod za krožišče,…)

- Preostala razdalja pred prihajajočim manevrom (zaenkrat v metrih)

Odločil sem se, da bom te podatke organiziral po naslednji strukturi okvirja:

: tip.navodila, razdalja;

Čeprav ni lepa rešitev, nam ta omogoča enostavno ločevanje in razlikovanje vsakega polja našega protokola, kar je olajšalo kodiranje na strani ESP32.

Pomembno je vedeti, da bo za prihodnje funkcije temu protokolu morda treba dodati še druge podatke (na primer točen dan in uro ali glasbo, ki se predvaja na uporabnikovem telefonu), kar bi bilo z isto uporabo enostavno izvedljivo. gradnjo logike kot zdaj.

6. korak: Koda: ESP32 stran

Koda: ESP32 stran
Koda: ESP32 stran
Koda: ESP32 stran
Koda: ESP32 stran

Koda za ESP32 je trenutno precej preprosta. Uporablja knjižnico U8g2lib, ki omogoča enostaven nadzor nad zaslonom OLED (hkrati pa omogoča zrcaljenje prikazane slike).

V bistvu vse, kar ESP32 naredi, je, da prek Bluetootha prejme serijske podatke, ko jih aplikacija pošlje, jih razčleni in prikaže te podatke ali slike na podlagi teh podatkov (tj. Prikaže puščico namesto stavka "zavijte levo/desno"). Tukaj je koda:

/*Program za nadzor HUD iz aplikacije za Android prek serijskega bluetootha*/#include "BluetoothSerial.h" // Datoteka glave za serijski Bluetooth bo privzeto dodana v Arduino#include #include #ifdef U8X8_HAVE_HW_SPI#include#endif# ifdef U8X8_HAVE_HW_I2C #include #endif // OLED konstruktor knjižnice, ga je treba ustrezno spremeniti v vaš zaslon U8G2_SSD1306_128X64_ALT0_F_HW_I2C u8g2 (U8G2_MIRROR,/* reset =*/U8X8_PIN); // Vrednost polja polja_prepoznanega polja + spremenljivka#definiraj manevriranje Polje 1#definiraj navodila Polje 2#določi razdaljo Polje 3#določi endOfFrame 4int zaznano_polje = endOfFrame; BluetoothSerial serialBT; // Objekt za Bluetoothchar incoming_char; manever char [10]; navodila char [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); // Zagon serijskega monitorja v 9600 baudih u8g2.begin (); // Init OLED control serialBT.begin ("ESP32_BT"); // Ime zakasnitve signala Bluetooth (20); Serial.println ("Naprava Bluetooth je pripravljena za seznanjanje");} void loop () {if (serialBT.available () &&! Fullsentence) // Znaki, ki jih sprejemamo prek zaporedja Bluetooth {incoming_char = serialBT.read (); Serial.print ("Prejeto:"); Serial.println (vhodni_znak); } stikalo (zaznano_polje) {primer manevra Polje: Serial.println ("Zaznano polje: manever"); if (incoming_char == '.') // Zaznano naslednje polje {detektirano_polje = navodilaField; } else {// Izpolnite informacijski niz vrste manevra manever [nbr_char_maneuver] = dohodni_char; nbr_char_maneuver ++; } prelom; navodila za primer Polje: Serial.println ("Zaznano polje: navodila"); if (incoming_char == ',') // Zaznano naslednje polje {detected_field = distanceField; } else {// Izpolnite navodila za informacijsko polje [nbr_char_instructions] = incoming_char; nbr_char_instructions ++; } prelom; case distanceField: Serial.println ("Zaznano polje: razdalja"); if (incoming_char == ';') // Zaznan konec okvira {detected_field = endOfFrame; Serial.print ("manever:"); Serial.println (manever); Serial.print ("navodila:"); Serial.println (navodila); Serial.print ("razdalja:"); Serial.println (razdalja); polna izrek = res; update_Display (); // Celoten okvir je prejet, ga razčlenimo in prikažemo podatke sprejemnika} else {// Izpolnite razdaljo podatkovnega niza o razdalji [nbr_char_distance] = incoming_char; nbr_char_distance ++; } prelom; primer endOfFrame: if (dohodni_char == ':') zaznano_polje = manevrsko polje; // Nov okvir zaznan prelom; privzeto: // Ne pokvari ničesar; } delay (20);} void update_Display () {// Predpomni vsak niz znakov, da se izognemo morebitnim konfliktom memcpy (tempManeuver, manevriranje, nbr_char_maneuver); memcpy (tempInstructions, navodila, nbr_char_instructions); memcpy (tempDistance, distance, nbr_char_distance); parseCache (); // Razčlenjevanje in obdelava nizov char fullsentence = false; // Stavek obdelan, pripravljen za naslednjo} void parseCache () {u8g2.clearBuffer (); // počistimo notranji pomnilnik u8g2.setFont (u8g2_font_ncenB10_tr); // izberemo primerno pisavo // char nizov -> niz je obvezen za uporabo funkcije substring () String maneuverString = tempManeuver; Niz navodila: String = tempInstructions; // Tukaj izvajamo protokol. Zaenkrat podpira le zavoje. if (maneuverString.substring (0, 4) == "turn") {// Preverite, ali je tip manevra Serial.print ("TURN DETECTED"); if (directionsString.substring (0, 5) == "right") {// Preverite posebna navodila in jih ustrezno prikažite u8g2.drawStr (5, 15, "-"); } else if (directionsString.substring (0, 4) == "left") {// Preverite posebna navodila in jih ustrezno prikažite u8g2.drawStr (5, 15, "<---"); } else u8g2.drawStr (5, 15, "Napaka."); // Neveljavno polje navodil}/ * Izvedite druge vrste manevrov (krožna križišča itd.) * Else if (tempManeuver == "rdbt") { * *] */ u8g2.drawStr (5, 30, tempDistance); // Prikaz preostale razdalje u8g2.sendBuffer (); // prenos notranjega pomnilnika na zaslon // Ponastavitev vseh nizov znakov pred naslednjim branjem memset (manever, 0, 10); memset (navodila, 0, 10); memset (razdalja, 0, 10); memset (tempManeuver, 0, 10); memset (tempInstructions, 0, 10); memset (tempDistance, 0, 10); // Ponastavi število elementov v matrikah nbr_char_distance = 0; nbr_char_instructions = 0; nbr_char_maneuver = 0;}

7. korak: Koda: Android stran

Koda: Android stran
Koda: Android stran
Koda: Android stran
Koda: Android stran
Koda: Android stran
Koda: Android stran

Za aplikacijo za pametne telefone sem se odločil uporabiti navigacijski SDK Mapbox, saj ponuja veliko uporabnih funkcij pri gradnji navigacijskega zemljevida iz nič. Omogoča tudi uporabo številnih uporabnih poslušalcev, kar zagotovo pomaga pri delovanju tega modula. Uporabil sem tudi harry1453's android-bluetooth-serijsko knjižnico za android, saj je veliko olajšalo sestavo serijske komunikacije Bluetooth.

Če želite to aplikacijo zgraditi doma, boste morali dobiti žeton za dostop do Mapbox, ki je brezplačen do določenega števila zahtev na mesec. Ta žeton boste morali vnesti v kodo in na svoji strani zgraditi aplikacijo. Prav tako boste morali kodirati v svojem MAC -naslovu Bluetooth svojega ESP32.

Taka, kot je, vas lahko vodi od trenutne lokacije do katere koli lokacije, na kateri lahko kliknete na zemljevidu. Kot je bilo omenjeno v uvodu, pa ne podpira nobenega drugega manevra razen zavojev in še ne obravnava izven smeri.

Celotno izvorno kodo najdete na mojem githubu.

8. korak: Kaj sledi?

Zdaj, ko je aplikacija dovolj funkcionalna, da dejansko vodi svojega uporabnika na določeno pot (če ni odstopanj od nastavljene poti), se bom osredotočila predvsem na izboljšanje aplikacije za pametni telefon in izvajanje nekaj zmožnosti, zaradi katerih bi bil modul sposobna navigacijska naprava. To vključuje omogočanje komunikacije Bluetooth prek telefona, tudi ko je zaslon izklopljen, pa tudi podporo za druge vrste manevrov (krožna križišča, spajanje,…). Izvedel bom tudi funkcijo preusmeritve, če uporabnik odstopa od prvotne poti.

Ko bo vse to narejeno, bom izboljšal vsebnik in njegov mehanizem za pritrditev, ga 3D natisnil in poskusil vzeti modul za prvi zagon.

Če bo vse v redu, je moj dolgoročni cilj oblikovanje tiskanega vezja po meri za vgrajeno elektroniko tega projekta, ki bi prihranilo veliko prostora pri končnem izdelku.

Temu modulu bi lahko v prihodnosti dodal še nekatere druge funkcije, vključno s prikazom časa in alarmom za obvestilo v telefonu, zaradi katerega bi se lahko prikazala ikona, ko uporabnik prejme besedilno sporočilo ali klic. Nazadnje bi rad v ta modul kot velik oboževalec glasbe dodal zmogljivosti Spotify. Vendar je to v tem trenutku le lepo imeti.

9. korak: Zaključek in posebna hvala

Zaključek in posebna hvala!
Zaključek in posebna hvala!

Kot je navedeno v uvodu, čeprav ta projekt še zdaleč ni končan, sem ga resnično želel deliti s svetom, v upanju, da bo navdihnil koga drugega. Prav tako sem želel dokumentirati svoje raziskave na to temo, saj v resnici ni veliko zanimanja za AR in HUD, kar se mi zdi škoda.

Rad bi se zahvalil Awall99 in Danelu Quintani, katerih projekt pri razširjeni resničnosti me je zelo navdušil pri izdelavi tega modula.

Hvala vsem za pozornost, zagotovo bom objavil posodobitev, ko se bo ta projekt v bližnji prihodnosti izboljšal. Medtem se vidimo vse kasneje!

Priporočena: