Sisukord:

Nutika mootorratta HUD prototüüp (samm-sammult navigeerimine ja palju muud): 9 sammu
Nutika mootorratta HUD prototüüp (samm-sammult navigeerimine ja palju muud): 9 sammu

Video: Nutika mootorratta HUD prototüüp (samm-sammult navigeerimine ja palju muud): 9 sammu

Video: Nutika mootorratta HUD prototüüp (samm-sammult navigeerimine ja palju muud): 9 sammu
Video: Мороженщик 6 🍦 ПОЛНОЕ ПРОХОЖДЕНИЕ и КОНЦОВКА Ice Scream 6 Friends: Charlie 🍦 Просто Никита 2024, November
Anonim
Nutikas mootorratta HUD prototüüp (samm-sammult navigeerimine ja palju muud)
Nutikas mootorratta HUD prototüüp (samm-sammult navigeerimine ja palju muud)
Nutikas mootorratta HUD prototüüp (samm-sammult navigeerimine ja palju muud)
Nutikas mootorratta HUD prototüüp (samm-sammult navigeerimine ja palju muud)
Nutikas mootorratta HUD prototüüp (samm-sammult navigeerimine ja palju muud)
Nutikas mootorratta HUD prototüüp (samm-sammult navigeerimine ja palju muud)
Nutikas mootorratta HUD prototüüp (samm-sammult navigeerimine ja palju muud)
Nutikas mootorratta HUD prototüüp (samm-sammult navigeerimine ja palju muud)

Tere !

See juhend on lugu sellest, kuidas ma projekteerisin ja ehitasin HUD (Heads-Up Display) platvormi, mis on mõeldud mootorrattakiivritele kinnitamiseks. See oli kirjutatud konkursi "kaardid" kontekstis. Kahjuks ei suutnud ma seda projekti konkursi tähtajaks lõpuni viia, kuid tahtsin siiski oma edusamme selles osas jagada ning dokumenteerida kõiki selle katse ja eksituse tulemusi.

Selle projekti idee tekkis mul esmakordselt paar aastat tagasi, kui hakkasin mootorratastega tegelema, ja hakkasin uurima, milliseid käiku mul vaja oleks, et oma sõitu nauditavamaks muuta. Toona pani mind hämmelduma, et parim viis GPS -i põhilise navigeerimise saamiseks sõidu ajal oli põhimõtteliselt oma nutitelefoni kinnitamine jalgratta lenksu külge. Ma arvasin endale, et kindlasti võiks olla parem viis sellise teabe saamiseks käigu pealt.

Siis jõudis see minuni: heads-up-ekraan võib olla viis navigeerimiseks sõidu ajal, ilma telefoni akut tühjendamata ja elementidele paljastamata.

Aja jooksul küpses see mõte mu peas ja ma arvasin, et kui HUD on alati minu ees, võimaldab see palju rohkem kasutada kui lihtne navigeerimine. Seetõttu on minu plaan muuta platvorm avalikuks ja modulaarseks, nii et igaüks saab luua mooduli, mis kuvab vajaliku teabe oma HUD -is

Kuigi selle ülesande täitmiseks on kaubanduslikult saadaval tooteid, pole ühtegi sellist, mis oleks nii modulaarne kui minu platvorm, ja need kipuvad olema ka pisut kallid. Igatahes tere tulemast sellesse projekti.

Mis töötab praegu

Nagu öeldud, on see projekt veel väga arendusjärgus ja see töötab praegu.

- Side nutitelefoni ja ESP32 -põhise plaadi vahel (telefon on ärkvel)

- Optika disain on tehtud (võib -olla vajab pikemas perspektiivis väikeseid kohandusi)

- Androidi navigeerimisrakendus, mis kasutab Mapboxi navigeerimise SDK -d:

- Võimalik arvutada ja kuvada kasutaja asukoht kaardil, samuti marsruut sellest sihtkohta

- Võimalik ühendada Bluetooth -seadmega (seadme MAC -aadress on praegu kõvasti kodeeritud)

- Võimalus reaalajas navigeerimiseks, sealhulgas eelseisva manöövri teabe väljavõtmiseks ja saatmiseks jada Bluetoothi kaudu (toetab praegu ainult pöördeid)

Mis vajab tööd

See loend sisaldab elemente, mis on HUDi kavandatud otstarbeks hädavajalikud, kuid pole veel rakendamiseks valmis.

- Üldine disain (kiivri kinnitus, helkuri nurga reguleerimise mehhanism,..)

- Androidi rakendus:

- Rakendada teekonnavälist avastamist ja parandamist

- Võimalus kasutajal sisestada sihtkoha aadress

- Teekonnapunktid?

- Ergonoomika / esteetika

Tarvikud:

Oluline

- Esp32 põhinev arendusplaat

- mõni mõnevõrra hiljutine Android -nutitelefon (Bluetooth on lubatud)

- SSD1306 või muu lubatud 96 -tolline OLED -ekraan (minu oma oli 128x64 pikslit, vt osa "Ajud: mikrokontroller ja ekraan")

- helkur (sobib iga akrüül/klaas/pleksiklaas)

- Fresneli lääts (minu oma F. pikkus oli umbes 13 cm, vt osa „Objektiivi valik”)

Tööriistad

- Jootekolb

- Leivalaud

- paar hüppajakaablit

- 3D printer / 3D printimisteenus

Samm: kuidas see kõik toimib: selgitatakse disainivalikuid

Kuidas see kõik toimib: selgitatakse disainivalikuid
Kuidas see kõik toimib: selgitatakse disainivalikuid
Kuidas see kõik toimib: selgitatakse disainivalikuid
Kuidas see kõik toimib: selgitatakse disainivalikuid
Kuidas see kõik töötab: selgitatakse disainivalikuid
Kuidas see kõik töötab: selgitatakse disainivalikuid

Heads -up -ekraani põhiidee on kuvada pilt kellegi nägemise ees, nii et ta ei peaks vaatama eemale kõigest, mida ta teeb (olgu selleks lennuki juhtimine või mootorratta juhtimine, mis on meie näitejuhtum).

Optika

Tehniliselt oleks seda võimalik saavutada ekraani sirge asetamisega kasutaja silme ette. Ekraan ei ole aga läbipaistev ja takistab seetõttu selle kasutaja nägemist. Seejärel saate ekraani asetada peegeldava pinna ette, mis peegeldaks ekraani sisu, olles samal ajal piisavalt läbipaistev, et kasutaja näeks, mis on tema ees.

Sellel lähenemisviisil on aga suur viga: tegelik ekraan on tavaliselt kasutaja silmadele lähemal kui see, millele kasutaja tegelikult keskenduma peab (nt tee tema ees). See tähendab, et peegeldaval pinnal oleva sisu lugemiseks peavad kasutaja silmad kohanema ekraani kaugusega silmadest (oletame, et 20 cm) ja peavad seejärel uuesti kohanema, et keskenduda eesolevale teele. (~ 2/5 meetrit). Kogu selle toimingu tegemiseks kuluv aeg on väärtuslik aeg, mida tuleks kulutada teele vaatamiseks, ning sagedane kohanemine võib mõne minuti pärast olla kasutajale ebamugav.

Seetõttu otsustasin lisada ekraani ja helkuri vahele objektiivi. Kui see objektiiv on hoolikalt valitud, peaks see võimaldama luua ekraanilt virtuaalse pildi (vt ülaltoodud skeemi), mis näib siis olevat kasutaja silmadest kaugemal, nagu see tegelikult on, nõudes seega vähem järske kohandusi (või üldse mitte, ideaalse stsenaariumi korral). See disain võimaldab kasutajal kiiresti helkurile pilgu heita, vajaliku teabe hankida ja teele koheselt tagasi vaadata.

Nutitelefoni roll

Kuna oli ebareaalne proovida üksi ESP32 -l tervet navigeerimisrakendust rakendada, otsustasin teha Androidi rakenduse, mis selle eest hoolitseks. Rakendus peaks lihtsalt ESP32 -le ütlema, mida kasutaja peab oma sihtkohta jõudmiseks tegema, ja ESP32 edastab selle teabe HUD -i kaudu (vt joonis "Kuidas moodul töötab").

2. samm: osad - ajud: mikrokontroller ja ekraan

Osad - ajud: mikrokontroller ja ekraan
Osad - ajud: mikrokontroller ja ekraan
Osad - ajud: mikrokontroller ja ekraan
Osad - ajud: mikrokontroller ja ekraan

Nagu eespool öeldud, kavatsesin oma moodulil kuvada navigeerimisteabe, kuid tegelikult ei lasknud see arvutada tegelikku positsioneerimist, jälgimist ja reaalajas navigeerimist. selle asemel suhtleks kasutaja telefon mooduliga ja saadaks selle teabe, mida seejärel kuvada HUD -il.

Kasutaja telefoni ja mooduli vahelise suhtluse hõlbustamiseks otsustasin selle projekti jaoks kasutada ESP32 -põhist tahvlit. See valik tulenes sellest konkreetsest moodulist, millel on integreeritud Bluetooth-funktsioonid, ja mõnest muust huvitavast spetsifikatsioonist (lihtne kasutada mittelenduvat salvestusruumi, kahetuumaline protsessor, piisavalt RAM-i, et OLED-ekraani tegelikult I2C kaudu juhtida, jne). ESP32 põhjal PCB -de kujundamine on suhteliselt lihtne, mida ma ka arvesse võtsin. Samuti on mul töökogemus ESP32 -ga vooluahelate kasutamisel ja projekteerimisel, mis kindlasti mõjutas minu valikut.

Ekraani valik taandus põhimõtteliselt sellele, mida ma leidsin, et oleksin siiski piisavalt hele, et seda kasutada, kuid samas ka võimalikult väike. Ma ei olnud väga mures ekraani pikslite arvu pärast, kuna minu eesmärk oli väga minimalistlik ja lihtne kasutajaliides.

Tuleb märkida, et ekraanidraiverit peaks toetama raamatukogu, mis võimaldab piltide peegeldamist. Selle põhjuseks on asjaolu, et kuvatav pilt pööratakse objektiivist läbi ja ilmub helkurile ning kui me ei pea kuvatavat käsitsi ümber pöörama, on meie kui ehitajate õlgadel tohutu raskus.

3. samm: osad - optika: kompromissi leidmine

Osad - optika: kompromissi leidmine
Osad - optika: kompromissi leidmine
Osad - optika: kompromissi leidmine
Osad - optika: kompromissi leidmine
Osad - optika: kompromissi leidmine
Osad - optika: kompromissi leidmine

Selle projekti optikale oli üsna raske läheneda, kuna mul polnud selle projektiga alustades aimugi, mida ma isegi otsisin. Pärast mõningaid uuringuid mõistsin, et soovin luua oma OLED -ekraanilt "virtuaalse pildi", mis näib olevat silmast kaugemal kui see tegelikult on. Ideaalne kaugus selle virtuaalse pildi moodustamiseks oleks juhi ees umbes 2–5 meetrit, see näib olevat kaugus objektidest, millele me sõidu ajal keskendume (muud autod, muhud teel jne).).

Selle eesmärgi saavutamiseks otsustasin kasutada Fresneli objektiivi, kuna need on üsna suured ja odavad, tundusid pakkuvat minu projekti jaoks piisavalt head fookuskaugust ning neid saab lõigata lihtsate kääridega (mis pole rafineeritud ümara kujuga klaasist läätsed). Fresneli läätsedelt võib leida selliseid nimesid nagu "tasku luup" või "lugemiskaardi suurendusklaas", kuna need on väga sobivad halva nägemisega inimeste lugemiseks.

Põhimõtteliselt oli trikk siin õige kompromissi leidmine:

- Mõistliku virtuaalse kujutise kauguse olemasolu (st kui kaugel HUD kasutaja jaoks tundub olevat või kui kaugel peab kasutaja oma silmi reguleerima, et näha HUD -i sisu)

- Objektiiv (mis on põhimõtteliselt suurendusklaas) ei suurendaks ekraanil olevat teksti

- Oluline kaugus OLED -ekraani ja objektiivi vahel, mis muidu tooks kaasa väga mahuka mooduli

Ma isiklikult tellisin Amazonist paar erinevat läätse ja määrasin nende fookuskaugused, enne kui valisin ühe, mille F. pikkus on umbes 13 cm. Leidsin, et see F. pikkus, mille OLED-objektiivi kaugus on 9 cm, andis mulle helkuril rahuldava pildi (vt ülaltoodud viimaseid pilte).

Nagu näete minu illustratsioonidel, peab kuvatud tekstile õigesti keskendumiseks nende piltide tegemiseks kasutatav kaamera kohanduma nii, nagu teravustaks see kauget objekti, mistõttu tundub helkuriga samal tasapinnal kõik hägune. See on täpselt see, mida me soovime oma HUDile.

Siit leiate objektiivihoidiku 3D -failid.

4. samm: osad - konteiner nende kõigi hoidmiseks

Osad - konteiner nende kõigi hoidmiseks
Osad - konteiner nende kõigi hoidmiseks
Osad - konteiner nende kõigi hoidmiseks
Osad - konteiner nende kõigi hoidmiseks

Seda juhendit kirjutades ei ole tegelik konteiner, mis mahutab kõik head-up-ekraani tükid, päris välja mõeldud. Siiski on mul mõned ideed selle üldise kuju ja teatud probleemidele lähenemise kohta (näiteks kuidas helkurit paigal hoida ja 100+ km/h tuulele vastu panna). See on ikka veel pooleli.

Samm: meie mooduli jaoks protokolli loomine

Selleks, et navigeerimisjuhised telefonist arendusplaadile saata, pidin välja mõtlema oma suhtlusprotokolli, mis võimaldaks mul hõlpsalt nõutud andmed telefonist saata, hõlbustades samal ajal ka nende töötlemist.

Selle juhendi kirjutamise ajal oli mooduliga navigeerimiseks telefonist edastatav teave järgmine:

- eelseisva manöövri tüüp (lihtne pööre, ringristmik, teisele teele sulandumine,…)

- eelseisva manöövri täpsed juhised (sõltuvalt manöövritüübist: pööre paremale/vasakule; milline väljapääs ringteele,…)

- eelseisva manöövrini jäänud vahemaa (praegu meetrites)

Otsustasin need andmed korraldada järgmise kaadristruktuuri abil:

: tüüp.juhised, kaugus;

Kuigi see pole ilus lahendus, võimaldab see meil hõlpsasti eraldada ja eristada meie protokolli iga valdkonda, mis hõlbustas kodeerimist ESP32 poolel.

Oluline on meeles pidada, et tulevaste funktsioonide jaoks võib olla vaja sellele protokollile lisada muud teavet (nt täpne päev ja kellaaeg või kasutaja telefonis esitatav muusika), mis oleks sama rakenduse abil hõlpsasti teostatav loogika ehitamine nagu praegu.

6. samm: kood: ESP32 külg

Kood: ESP32 Side
Kood: ESP32 Side
Kood: ESP32 Side
Kood: ESP32 Side

ESP32 kood on praegu üsna lihtne. See kasutab U8g2lib raamatukogu, mis võimaldab OLED -ekraani hõlpsat juhtimist (võimaldades samal ajal kuvatava pildi peegeldamist).

Põhimõtteliselt võtab ESP32 vastu ainult Bluetoothi kaudu jadaandmeid, kui rakendus selle saadab, parsib ja kuvab need andmed või pildid, mis põhinevad nendel andmetel (st lause "pööra vasakule/paremale" asemel noole kuvamine). Siin on kood:

/*Programm HUD juhtimiseks android -rakenduse kaudu jada Bluetoothi kaudu*/#sisaldab "BluetoothSerial.h" // Päisefail jadase Bluetoothi jaoks, lisatakse vaikimisi Arduino'sse#include #include #ifdef U8X8_HAVE_HW_SPI#include#endif# ifdef U8X8_HAVE_HW_I2C #include #endif // OLED raamatukogu konstruktor, tuleb vastavalt teie ekraanile muutaU8G2_SSD1306_128X64_ALT0_F_HW_I2C u8g2 (U8G2_MIRROR,/* reset =*/U8X8_PIN_NONE); // Olekumasina tuvastatud_välja väärtused + muutuja#defineeri manööverVäli 1#defineeri juhisedVäli 2#defineeri kaugusVäli 3#define endOfFrame 4int tuvastatud_väli = endOfFrame; BluetoothSerial serialBT; // Objekt Bluetooth -sissetuleva_signaali jaoks; char -manööver [10]; char -juhised [10]; char -kaugus [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); // Käivita jadamonitor 9600 baudiga u8g2.begin (); // Init OLED juhtseeria serialBT.begin ("ESP32_BT"); // Bluetooth -signaali viivituse nimi (20); Serial.println ("Bluetooth -seade on sidumiseks valmis");} void loop () {if (serialBT.available () &&! Fullsentence) // Märgid, mis võetakse vastu Bluetooth -seeria kaudu {inputing_char = serialBT.read (); Serial.print ("Vastuvõetud:"); Serial.println (sissetulev_süsi); } lüliti (tuvastatud_väli) {case manööverField: Serial.println ("Tuvastatud väli: manööver"); if (input_char == '.') // Järgmine väli tuvastati {tuvastatud_väli = juhisedVäli; } else {// Täida manöövritüübi info massiivi manööver [nbr_char_maneuver] = sissetulev_süsi; nbr_char_maneuver ++; } murda; juhtumi juhisedVäli: Serial.println ("Tuvastatud väli: juhised"); if (sissetulev_märk == ',') // Järgmine väli tuvastati {tuvastatud_väli = kaugusväli; } else {// Täida juhiste info massiivi juhised [nbr_char_instructions] = sissetulev_saak; nbr_char_instructions ++; } murda; juhtumi kaugusVäli: Serial.println ("Tuvastatud väli: kaugus"); if (input_char == ';') // Kaadri lõpp tuvastatud {tuvastatud_väli = endOfFrame; Serial.print ("manööver:"); Serial.println (manööver); Serial.print ("juhised:"); Serial.println (juhised); Serial.print ("kaugus:"); Serial.println (kaugus); täieline lause = tõene; update_Display (); // Täiskaader vastu võetud, sõeluda ja kuvada vastuvõtja andmed} else {// Täida kaugusteabe massiivi kaugus [nbr_char_distance] = sissetulev_süsteem; nbr_char_distance ++; } murda; juhtum endOfFrame: kui (sissetulev_märk == ':') tuvastatud_väli = manööverväli; // Uus kaader tuvastas purunemise; vaikimisi: // Ära murra midagi; } delay (20);} void update_Display () {// Vahemälu iga sümboli massiiv, et vältida võimalikke konflikte memcpy (tempManeuver, manööver, nbr_char_maneuver); memcpy (tempInstruktsioonid, juhised, nbr_char_instructions); memcpy (tempDistance, distance, nbr_char_distance); parseCache (); // Sõeluda ja töödelda char massiive fullsentence = false; // Lause töödeldud, järgmiseks valmis} void parseCache () {u8g2.clearBuffer (); // sisemälu tühjendamine u8g2.setFont (u8g2_font_ncenB10_tr); // vali sobiv font // char array -> string kohustuslik alamstringi () funktsiooni kasutamiseks String manööverString = tempManeuver; String juhisedString = tempInstructions; // Rakendusprotokoll siin. Toetab praegu ainult pöördeid. if (maneuverString.substring (0, 4) == "turn") {// Kontrollige manöövritüüpi Serial.print ("TURN DETECTED"); if (instructionString.substring (0, 5) == "right") {// Kontrolli konkreetseid juhiseid ja kuva vastavalt u8g2.drawStr (5, 15, "-"); } else if (instructionString.substring (0, 4) == "left") {// Kontrollige konkreetseid juhiseid ja kuvage vastavalt u8g2.drawStr (5, 15, "<---"); } else u8g2.drawStr (5, 15, "Viga"); // Kehtetu juhiste väli}/ * Rakenda teisi manöövritüüpe (ringristmikud jne..) * else if (tempManeuver == "rdbt") { * *] */ u8g2.drawStr (5, 30, tempDistance); // Kuva allesjäänud vahemaa u8g2.sendBuffer (); // sisemälu ülekandmine ekraanile // Lähtesta kõik sümbolmassiivid enne järgmist lugemist memset (manööver, 0, 10); memset (juhised, 0, 10); memset (kaugus, 0, 10); memset (tempManeuver, 0, 10); memset (tempInstructions, 0, 10); memset (tempDistance, 0, 10); // Lähtesta massiivides elementide arv nbr_char_distance = 0; nbr_char_instructions = 0; nbr_char_maneuver = 0;}

Samm: kood: Androidi pool

Kood: Androidi pool
Kood: Androidi pool
Kood: Androidi pool
Kood: Androidi pool
Kood: Androidi pool
Kood: Androidi pool

Nutitelefonirakenduse jaoks otsustasin kasutada Mapboxi navigeerimise SDK -d, kuna see pakub palju kasulikke funktsioone navigeerimiskaardi nullist koostamisel. Samuti võimaldab see kasutada paljusid kasulikke kuulajaid, mis kindlasti aitavad selle mooduli toimima saada. Kasutasin androidile ka harry1453 android-bluetooth-jadakogu, kuna see muutis Bluetoothi jadaühenduse palju lihtsamaks.

Kui soovite seda rakendust kodus luua, peate hankima Mapboxi juurdepääsuloa, mis on tasuta kuni teatud arvu taotluste korral kuus. Peate selle märgi koodi sisestama ja rakenduse oma poolele üles ehitama. Samuti peate kodeerima oma ESP32 Bluetoothi MAC -aadressis.

Praegusel kujul võib rakendus suunata teid teie praegusest asukohast mis tahes kohta, mida saate kaardil klõpsata. Kuid nagu sissejuhatuses mainitud, ei toeta see ühtegi muud manöövrit peale pöörete ja ei tegele veel väliste marsruutidega.

Kogu lähtekoodi leiate minu githubist.

8. samm: mis saab edasi?

Nüüd, kui rakendus on piisavalt funktsionaalne, et tegelikult oma kasutajat teatud marsruudil juhendada (kui määratud marsruudist kõrvalekaldeid ei esine), keskendun põhiliselt nutitelefoni rakenduse täiustamisele ja rakendan vähesed võimalused, mis muudaksid mooduli elujõuline navigatsiooniseade. See hõlmab Bluetooth -ühenduse lubamist telefonist isegi siis, kui ekraan on välja lülitatud, ning muud tüüpi manöövrite (ringristmikud, ühendamine jne) toetamist. Rakendan ka ümbersuunamise funktsiooni, kui kasutaja kaldub algsest marsruudist kõrvale.

Kui see kõik on tehtud, parandan konteinerit ja selle kinnitusmehhanismi, prindin selle 3D -vormingusse ja proovin mooduli esmakordselt kasutusele võtta.

Kui kõik läheb hästi, on minu pikaajaline eesmärk kavandada selle projekti sisseehitatud elektroonika jaoks kohandatud trükkplaat, mis säästaks lõpptootel palju ruumi.

Võimalik, et lisan sellele moodulile tulevikus ka muid funktsioone, sealhulgas kellaaja kuvamise, samuti telefoni märguande alarmi, mis võib kuvada ikooni, kui kasutaja saab tekstisõnumi või kõne. Lõpuks tahaksin tohutu muusikafännina lisada sellele moodulile Spotify võimalused. Praegusel ajahetkel on see aga ainult tore.

Samm: kokkuvõte ja eriline tänu

Kokkuvõte ja eriline tänu!
Kokkuvõte ja eriline tänu!

Nagu sissejuhatuses öeldud, tahtsin seda projekti maailmaga jagada, kuigi see projekt pole veel kaugeltki lõppenud, lootuses, et see võib kedagi teist inspireerida. Tahtsin ka dokumenteerida oma selleteemalisi uuringuid, kuna tegelikult pole AR -i ja HUD -i vastu suur harrastajate huvi, mis on minu arvates häbi.

Tahan väga tänada Awall99 ja Danel Quintana, kelle vastav liitreaalsuse projekt inspireeris mind selle mooduli loomisel palju.

Tänan teid kõiki tähelepanu eest, postitan kindlasti värskenduse, kui see projekt lähitulevikus paraneb. Seniks aga näeme kõiki hiljem!

Soovitan: