Tartalomjegyzék:

Intelligens motorkerékpár HUD prototípus (részletes navigáció és még sok más): 9 lépés
Intelligens motorkerékpár HUD prototípus (részletes navigáció és még sok más): 9 lépés

Videó: Intelligens motorkerékpár HUD prototípus (részletes navigáció és még sok más): 9 lépés

Videó: Intelligens motorkerékpár HUD prototípus (részletes navigáció és még sok más): 9 lépés
Videó: 🟡 POCO X5 PRO - САМЫЙ ДЕТАЛЬНЫЙ ОБЗОР и ТЕСТЫ 2024, Július
Anonim
Intelligens motorkerékpár HUD prototípus (részletes navigáció és még sok más)
Intelligens motorkerékpár HUD prototípus (részletes navigáció és még sok más)
Intelligens motorkerékpár HUD prototípus (részletes navigáció és még sok más)
Intelligens motorkerékpár HUD prototípus (részletes navigáció és még sok más)
Intelligens motorkerékpár HUD prototípus (részletes navigáció és még sok más)
Intelligens motorkerékpár HUD prototípus (részletes navigáció és még sok más)
Intelligens motorkerékpár HUD prototípus (részletes navigáció és még sok más)
Intelligens motorkerékpár HUD prototípus (részletes navigáció és még sok más)

Szia !

Ez az Instructables a története annak, hogyan terveztem és építettem egy HUD (Heads-Up Display) platformot, amelyet motorkerékpáros sisakokra szereltek fel. A "térképek" verseny keretében íródott. Sajnos nem tudtam teljesen befejezni ezt a projektet a verseny határidejéig, de továbbra is meg akartam osztani az előrehaladásomat, valamint dokumentálni minden kísérletet és hibát, amellyel elkészültem.

Ennek a projektnek az ötlete először néhány évvel ezelőtt merült fel bennem, amikor motorokba szálltam, és elkezdtem vizsgálódni, hogy milyen felszerelést kell vásárolnom, hogy élvezetesebbé tegyem a túráimat. Abban az időben megdöbbentett, hogy a legjobb módja annak, hogy néhány alapvető GPS navigációt szerezzen lovaglás közben, ha alapvetően az okostelefonját rögzíti a kerékpár kormányához. Bár magamban biztos vagyok benne, hogy biztosan van egy jobb módja annak, hogy menet közben szerezzen ilyen információkat.

Ekkor jutott eszembe: egy heads-up kijelző lehet az út a navigációhoz menet közben, anélkül, hogy lemerítené a telefon akkumulátorát, és kitenné az elemeknek.

Idővel ez az ötlet érlelődött a fejemben, és bár azt gondoltam, hogy ha mindig egy HUD van előttem, sokkal több felhasználást tesz lehetővé, mint az egyszerű navigációt. Ezért tervezem, hogy a platformot nyilvánossá és modulárisá tegyem, így bárki létrehozhat egy modult, amely megjeleníti a szükséges információkat a saját HUD -ján

Bár vannak kereskedelmi forgalomban kapható termékek, amelyek teljesítik ezt a feladatot, nincs olyan moduláris, mint az én platformom, és általában drágábbak is. Mindenesetre üdvözöljük ebben a projektben.

Ami egyelőre működik

Mint már említettük, ez a projekt még nagyon fejlettségi állapotban van, és jelenleg ez működik.

- Kommunikáció okostelefon és ESP32 alapú kártya között (telefon ébren)

- Megtörtént az optika tervezése (hosszú távon apró kiigazításokra lehet szükség)

- Android navigációs alkalmazás a Mapbox navigációs SDK használatával:

- Képes kiszámítani és megjeleníteni a felhasználó pozícióját a térképen, valamint egy útvonalat attól a célig

- Képes csatlakozni Bluetooth -eszközhöz (az eszköz MAC -címe jelenleg kemény kódolású)

- Valós idejű navigációra képes, beleértve a soron következő Bluetooth -on keresztül a következő manőver adatainak kinyerését és elküldését (egyelőre csak a fordulókat támogatja)

Amire dolgozni kell

Ez a lista olyan elemeket tartalmaz, amelyek feltétlenül szükségesek a HUD rendeltetésszerű használatához, de még nem állnak készen a megvalósításra.

- Általános kialakítás (sisakrögzítés, reflektor szögbeállító mechanizmus,..)

- Android alkalmazás:

- Az útvonalon kívüli észlelés és korrekció végrehajtása

- A felhasználó képessége a célcím megadására

- Útpontok?

- Ergonómia / esztétika

Kellékek:

Essentials

- Esp32 alapú fejlesztőlap

- Bármilyen friss Android okostelefon (Bluetooth -kompatibilis)

- SSD1306 vagy más engedélyezett 96 "-os OLED képernyő (az enyém 128x64 képpontos volt, lásd" Az agy: mikrokontroller és képernyő "részt)

- reflektor (bármilyen akril/üveg/plexi darab megfelel)

- Fresnel lencse (az enyém F. hossza körülbelül 13 cm volt, lásd az „Objektívválasztás” részt)

Eszközök

- Forrasztópáka

- Kenyeretábla

- Néhány áthidaló kábel

- 3D nyomtató / 3D nyomtatási szolgáltatás

1. lépés: Hogyan működik ez: a tervezési lehetőségek magyarázata

Hogyan működik mindez: a tervezési lehetőségek magyarázata
Hogyan működik mindez: a tervezési lehetőségek magyarázata
Hogyan működik mindez: a tervezési lehetőségek magyarázata
Hogyan működik mindez: a tervezési lehetőségek magyarázata
Hogyan működik mindez: a tervezési lehetőségek magyarázata
Hogyan működik mindez: a tervezési lehetőségek magyarázata

A Heads Up Display alapötlete az, hogy képet jelenítsen meg valaki látása előtt, így nem kell elfordítania tekintetét attól, amit csinál (legyen szó akár repülőgép pilótázásáról, akár motorkerékpár vezetéséről). példa eset).

Optika

Technikailag ezt úgy lehet elérni, hogy egyenesen felhelyezünk egy képernyőt a felhasználó szeme elé. A képernyő azonban nem átlátszó, ezért akadályozza a felhasználó látását. Ezután a képernyőt egy fényvisszaverő felület elé helyezheti, amely tükrözi a képernyő tartalmát, ugyanakkor elég átlátszó is, hogy a felhasználó láthassa, mi van előtte.

Ennek a megközelítésnek azonban van egy hatalmas hibája: a tényleges képernyő általában közelebb áll a felhasználó szeméhez, mint amire a felhasználónak ténylegesen összpontosítania kell (pl. Az előtte álló út). Ez azt jelenti, hogy ahhoz, hogy el lehessen olvasni, mi van a fényvisszaverő felületen, a felhasználó szemének alkalmazkodnia kell a kijelző és a szeme közötti távolsághoz (mondjuk 20 cm), majd újra alkalmazkodnia kell ahhoz, hogy az előttünk álló útra összpontosítson (~ 2/5 méter). Ez az egész művelet drága időt igényel, amelyet az útra kell nézni, és a gyakori alkalmazkodás néhány perc múlva kényelmetlen lehet a felhasználó számára.

Ezért úgy döntöttem, hogy lencsét helyezek a képernyő és a reflektor közé. Ennek az objektívnek, ha gondosan választja ki, lehetővé kell tennie a képernyő virtuális képének létrehozását (lásd a fenti vázlatot), amely ezután úgy tűnik, hogy a felhasználó szeme távolabb van, mint amilyen valójában, és így kevésbé hirtelen alkalmazásokat igényel (vagy egyáltalán nincs, tökéletes forgatókönyv szerint). Ez a kialakítás lehetővé teszi a felhasználó számára, hogy gyorsan ránézzen a reflektorra, megszerezze a szükséges információkat, és azonnal visszanézzen az útra.

Az okostelefon szerepe

Mivel irreális volt egy egész navigációs alkalmazást egyedül az ESP32 -en megvalósítani, úgy döntöttem, hogy elkészítem az androidos alkalmazást, amely ezt megoldja. Az alkalmazásnak ezután csak meg kell mondania az ESP32 -nek, hogy a felhasználónak mit kell tennie, hogy eljusson az úticéljához, és az ESP32 továbbítja ezeket az információkat a HUD -n keresztül (lásd a „Hogyan működik a modul” ábra).

2. lépés: Alkatrészek - Agy: mikrokontroller és képernyő

Alkatrészek - Agy: Mikrokontroller és képernyő
Alkatrészek - Agy: Mikrokontroller és képernyő
Alkatrészek - Agy: Mikrokontroller és képernyő
Alkatrészek - Agy: Mikrokontroller és képernyő

Amint fentebb említettem, úgy terveztem, hogy a modulom megjeleníti a navigációs információkat, miközben valójában nem számítottam ki a tényleges helymeghatározást, nyomkövetést és valós idejű navigációt. a felhasználó telefonja ehelyett kommunikálna a modullal, és elküldené az információt, hogy megjelenjen a HUD -n.

A felhasználó telefonja és a modul közötti kommunikáció megkönnyítése érdekében úgy döntöttem, hogy ehhez a projekthez ESP32 alapú táblát használok. Ez a választás annak köszönhető, hogy ez a modul integrált Bluetooth-képességekkel rendelkezik, valamint néhány más érdekes specifikáció (könnyen használható nem illékony tároló, kétmagos CPU, elegendő RAM az OLED kijelző I2C-n keresztüli meghajtásához, stb.). Viszonylag egyszerű az ESP32 -en alapuló PCB -k tervezése, amit figyelembe is vettem. Szakmai tapasztalataim vannak az ESP32 áramkörök használatában és tervezésében is, ami határozottan befolyásolta a választásomat.

A képernyő kiválasztása alapvetően az volt, hogy bármit is találtam, bár elég fényes lennék y használatra, ugyanakkor a lehető legkisebb is. Nem nagyon aggódtam a képernyő pixeleinek száma miatt, mivel a célom egy nagyon minimalista és egyszerű felhasználói felület volt.

Meg kell jegyezni, hogy a képernyő -illesztőprogramot olyan könyvtárnak kell támogatnia, amely lehetővé teszi a képek tükrözését. Ennek az az oka, hogy a megjelenített kép elfordul, amikor átjut az objektíven, és megjelenik a reflektoron, és ha nem kell manuálisan megfordítani a megjelenített dolgokat, óriási súly nehezedik a vállunkra, mint építőkre.

3. lépés: Alkatrészek - optika: kompromisszum megtalálása

Alkatrészek - Optika: kompromisszum megtalálása
Alkatrészek - Optika: kompromisszum megtalálása
Alkatrészek - Optika: kompromisszum megtalálása
Alkatrészek - Optika: kompromisszum megtalálása
Alkatrészek - Optika: kompromisszum megtalálása
Alkatrészek - Optika: kompromisszum megtalálása

Ennek a projektnek az optikáját meglehetősen nehéz volt megközelíteni, mivel fogalmam sem volt, mit keresek, amikor először elkezdtem ezt a projektet. Némi kutatás után megértettem, hogy az a célom, hogy létrehozzak egy "virtuális képet" az OLED képernyőmről, amely úgy tűnik, messzebb van a szemtől, mint amilyen valójában. Az ideális távolság a virtuális kép kialakításához körülbelül 2-5 méter a vezető előtt, ez úgy tűnik, hogy ez a távolság azoktól a tárgyaktól, amelyekre vezetés közben összpontosítunk (más autók, dudorok az úton stb.)).

E cél elérése érdekében a Fresnel lencse használatát választottam, mivel ezek meglehetősen nagyok, olcsók, úgy tűnt, hogy elég jó gyújtótávolságot kínálnak a projektemhez, és egyszerű ollóval vághatók (ami nem így van kifinomultabb, kerek alakú üveglencsék). A Fresnel lencsék nevei „zsebnagyító” vagy „olvasókártya -nagyító”, mivel nagyon alkalmasak a rossz látású emberek olvasására.

Alapvetően a trükk itt az volt, hogy megtaláljuk a megfelelő kompromisszumot:

- Megfelelő virtuális képtávolsággal rendelkezik (azaz milyen messze lesz a HUD a felhasználótól, vagy milyen messzire kell beállítania a szemét, hogy lássa, mi van a HUD -on)

- Ha a szöveget a képernyőn nem túl nagyítja az objektív (ami alapvetően nagyító)

- Megfelelő távolság az OLED képernyő és az objektív között, ami egyébként nagyon terjedelmes modulhoz vezetne

Én személy szerint rendeltem néhány különböző lencsét az amazonon, és meghatároztam a megfelelő gyújtótávolságot, mielőtt körülbelül 13 cm -es F. hosszúságú objektívet választottam. Azt találtam, hogy ez a F.hosszúság, 9 cm-es OLED-objektív távolsággal, kielégítő képet adott a reflektoromon (lásd a fenti néhány utolsó képet).

Amint az illusztrációimon látható, a megjelenített szöveg megfelelő fókuszálására a képek készítéséhez használt kamerának úgy kell beállítania, mintha egy távoli tárgyra fókuszálna, ami homályossá teszi a fényvisszaverővel azonos síkon mindent. Pontosan ezt akarjuk a HUD -nál.

Az objektívtartó 3D fájljait itt találja.

4. lépés: Alkatrészek - konténer az összes tárolására

Alkatrészek - konténer, amely mindet megtartja
Alkatrészek - konténer, amely mindet megtartja
Alkatrészek - egy tartály, amely mindet megtartja
Alkatrészek - egy tartály, amely mindet megtartja

Miközben ezt az utasításokat írom, a heads-up kijelző minden darabját tartalmazó tároló nem teljesen megtervezett. Van azonban néhány ötletem annak általános alakjáról és arról, hogyan lehet bizonyos problémákat megközelíteni (például hogyan kell a reflektorokat mozdulatlanul tartani és 100+ km/h szélnek ellenállni). Ez még nagyon folyamatban lévő munka.

5. lépés: Protokoll létrehozása modulunkhoz

Ahhoz, hogy elküldhessem a navigációs utasításokat a telefonról a fejlesztőpulthoz, ki kellett dolgoznom egy saját kommunikációs protokollt, amely lehetővé teszi számomra, hogy könnyen elküldjem a szükséges adatokat a telefonról, ugyanakkor megkönnyítsem a feldolgozást, miután megkaptam.

A jelen útmutató megírásakor a modulból való navigáláshoz a telefonról továbbítandó információk a következők voltak:

- A közelgő manőver típusa (egyszerű kanyar, körforgalom, másik útra való beolvadás,…)

- A közelgő manőver pontos utasításai (a manővertípustól függően: jobbra/balra egy kanyarhoz; melyik kijáraton kell a körforgalomhoz fordulni,…)

- A közelgő manőver előtt hátralévő távolság (egyelőre méterben)

Úgy döntöttem, hogy ezeket az adatokat a következő keretstruktúrával rendszerezem:

: típus.utasítások, távolság;

Bár nem szép megoldás, ez lehetővé teszi számunkra, hogy könnyen elkülönítsük és megkülönböztessük a protokoll minden egyes mezőjét, ami megkönnyítette a kódolást az ESP32 oldalon.

Fontos szem előtt tartani, hogy a jövőbeni funkciókhoz más információkat is hozzá kell adni ehhez a protokollhoz (például a pontos napot és időt, vagy a felhasználó telefonján lejátszott zenét), ami könnyen megvalósítható ugyanazzal a protokollal logika építése, mint most.

6. lépés: A kód: ESP32 oldal

A kód: ESP32 Side
A kód: ESP32 Side
A kód: ESP32 Side
A kód: ESP32 Side

Az ESP32 kódja jelenleg meglehetősen egyszerű. Az U8g2lib könyvtárat használja, amely lehetővé teszi az OLED képernyő egyszerű vezérlését (miközben lehetővé teszi a megjelenített kép tükrözését).

Alapvetően az ESP32 csak annyit tesz, hogy soros adatokat fogad Bluetooth -on keresztül, amikor az alkalmazás elküldi, elemzi és megjeleníti ezeket az adatokat vagy képeket ezen adatok alapján (azaz nyíl jelenik meg a "balra/jobbra" mondat helyett). Itt a kód:

/*A HUD vezérlésére szolgáló program androidos alkalmazásból soros Bluetooth -on keresztül*/#tartalmazza a „BluetoothSerial.h” // fejlécfájlt a soros Bluetooth -hoz, alapértelmezés szerint hozzáadódik az Arduino -hoz#include #include #ifdef U8X8_HAVE_HW_SPI#include#endif# ifdef U8X8_HAVE_HW_I2C #include #endif // OLED könyvtárkonstruktor, a képernyőnek megfelelően kell megváltoztatni // Állapotgép észlelt_mezőértékek + változó#definíciós manőverField 1#utasítások definiálása // Objektum Bluetoothchar bejövő_száma; char manőver [10]; char utasítások [10]; char távolság [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; logikai teljes mondat = false; void setup () {Serial.begin (9600); // Indítsa el a soros monitort 9600 baudban u8g2.begin (); // Init OLED vezérlő serialBT.begin ("ESP32_BT"); // A Bluetooth jel késleltetésének neve (20); Serial.println ("A Bluetooth -eszköz párosításra kész");} void loop () {if (serialBT.available () &&! Fullsentence) // Karakterek fogadása Bluetooth -on keresztül soros {bejövő_char = serialBT.read (); Serial.print ("Fogadott:"); Serial.println (bejövő_száma); } switch (észlelt_mező) {case manőverField: Serial.println ("Észlelt mező: manőver"); if (bejövő_száma == '.') // Következő mező észlelve {észlelt_mező = utasításokMező; } else {// Töltse ki a manővertípus információs tömb manőverét [nbr_char_maneuver] = bejövő_szén; nbr_char_maneuver ++; } szünet; eset utasításokField: Serial.println ("Észlelt mező: utasítások"); if (bejövő_száma == ',') // Következő mező észlelve {észlelt mező = távolságField; } else {// Töltse ki az utasításokat info tömb utasítások [nbr_char_instructions] = bejövő_char; nbr_char_instructions ++; } szünet; eset távolságField: Serial.println ("Észlelt mező: távolság"); if (bejövő_char == ';') // A képkocka vége észlelve {észlelt_mező = endOfFrame; Serial.print ("manőver:"); Serial.println (manőver); Serial.print ("utasítások:"); Serial.println (utasítások); Serial.print ("távolság:"); Soros.println (távolság); teljes mondat = igaz; update_Display (); // Teljes keret fogadva, elemezni és megjeleníteni a vevő adatait} else {// Töltse ki a távolságinformációs tömb távolságát [nbr_char_distance] = bejövő_száma; nbr_char_distance ++; } szünet; eset endOfFrame: if (bejövő_száma == ':') észlelt_mező = manőverField; // Új keret törést észlelt; alapértelmezett: // Ne törj semmit; } delay (20);} void update_Display () {// Gyorsítótárba helyezi az egyes karakterek tömbjét az esetleges konfliktusok elkerülése érdekében memcpy (tempManeuver, manever, nbr_char_maneuver); memcpy (tempInstructions, utasítások, nbr_char_instructions); memcpy (tempDistance, distance, nbr_char_distance); parseCache (); // Karakter tömbök elemzése és feldolgozása fullsentence = false; // A mondat feldolgozva, készen áll a következőre} void parseCache () {u8g2.clearBuffer (); // a belső memória törlése u8g2.setFont (u8g2_font_ncenB10_tr); // megfelelő betűtípus kiválasztása // char tömbök -> karakterlánc kötelező az substring () függvény használatához String manőverString = tempManeuver; String utasításokString = tempInstructions; // A protokoll végrehajtása itt. Egyelőre csak a fordulókat támogatja. if (maneuverString.substring (0, 4) == "turn") {// Ellenőrizze, hogy van -e manővertípus Serial.print ("TURN DETECTED"); if (utasításokString.substring (0, 5) == "right") {// Ellenőrizze a konkrét utasításokat, és ennek megfelelően jelenítse meg u8g2.drawStr (5, 15, "-"); } else if (utasításokString.substring (0, 4) == "left") {// Ellenőrizze a konkrét utasításokat, és ennek megfelelően jelenítse meg u8g2.drawStr (5, 15, "<---"); } else u8g2.drawStr (5, 15, "Hiba"); // Érvénytelen utasítások mező}/ * Más manővertípusok végrehajtása (körforgalom, stb.) * Else if (tempManeuver == "rdbt") { * *] */ u8g2.drawStr (5, 30, tempDistance); // A hátralévő távolság megjelenítése u8g2.sendBuffer (); // belső memória átvitele a kijelzőre // Az összes char tömb visszaállítása a következő olvasás előtt memset (manőver, 0, 10); memset (utasítások, 0, 10); memset (távolság, 0, 10); memset (tempManeuver, 0, 10); memset (tempInstructions, 0, 10); memset (tempDistance, 0, 10); // Az elemek számának visszaállítása a tömbökben nbr_char_distance = 0; nbr_char_instructions = 0; nbr_char_maneuver = 0;}

7. lépés: A kód: Android Side

A kód: Android Side
A kód: Android Side
A kód: Android Side
A kód: Android Side
A kód: Android Side
A kód: Android Side

Az okostelefonos alkalmazáshoz úgy döntöttem, hogy a Mapbox navigációs SDK -ját használom, mivel sok hasznos funkciót kínál, amikor a nulláról kell navigációs térképet készíteni. Ezenkívül számos hasznos hallgató használatát is lehetővé teszi, ami mindenképpen segít a modul működésében. A harry1453 android-bluetooth-serial könyvtárát is használtam androidra, mivel sokkal könnyebbé tette a Bluetooth soros kommunikációt.

Ha otthon szeretné létrehozni ezt az alkalmazást, be kell szereznie egy Mapbox hozzáférési jogkivonatot, amely havonta bizonyos számú kérésig ingyenes. Ezt a tokent be kell helyeznie a kódba, és fel kell építenie az alkalmazást az Ön oldalán. A saját ESP32 Bluetooth MAC -címében is kódolnia kell.

Jelenlegi állapotában az alkalmazás elvezetheti Önt az aktuális tartózkodási helyéről bármely olyan helyre, amelyre kattinthat a térképen. Amint a bevezetőben említettük, ez azonban nem támogat más manővereket, mint a kanyarokat, és még nem kezeli az off-route-okat.

A teljes forráskódot megtalálod a githubomon.

8. lépés: Mi a következő lépés?

Most, hogy az alkalmazás elég funkcionális ahhoz, hogy ténylegesen elvezesse a felhasználót egy meghatározott útvonalon (ha nincs eltérés a beállított útvonaltól), a fő hangsúlyom az okostelefonos alkalmazás fejlesztése és azon néhány képesség megvalósítása lesz, amelyek a modult a életképes navigációs eszköz. Ez magában foglalja a Bluetooth -kommunikáció engedélyezését a telefonról, még akkor is, ha a képernyő ki van kapcsolva, valamint más típusú manőverek támogatását (körforgalom, egyesítés stb.). Ha a felhasználó eltér az eredeti útvonaltól, akkor átirányítási funkciót is megvalósítok.

Ha mindez megtörtént, javítani fogom a tartályt és a rögzítési mechanizmust, 3D -ben kinyomtatom, és megpróbálom a modult első futtatásra vinni.

Ha minden jól megy, hosszú távú célom egy egyedi PCB tervezése a projekt beágyazott elektronikájához, ami sok helyet takaríthat meg a végterméken.

A jövőben néhány további funkciót is hozzáadhatok ehhez a modulhoz, beleértve az időkijelzést, valamint a telefonos értesítési riasztást, amely megjeleníthet egy ikont, amikor a felhasználó szöveges üzenetet vagy hívást kap. Végül szeretném hozzáadni a Spotify képességeit ehhez a modulhoz, hatalmas zenei rajongóként. Azonban ebben a pillanatban ez csak szép dolog.

9. lépés: Következtetés és külön köszönet

Következtetés és külön köszönet!
Következtetés és külön köszönet!

Amint a bevezetőben is szerepel, bár ez a projekt még korántsem fejeződött be, nagyon meg akartam osztani a világgal, remélve, hogy ez inspirálhat valakit. Szerettem volna dokumentálni a témában végzett kutatásaimat is, mivel az AR és a HUD nem igazán érdeklődik a hobbisták iránt, ami szerintem szégyen.

Hatalmas köszönetet szeretnék mondani Awall99 -nek és Danel Quintanának, akiknek a kibővített valóság projektje nagyon inspirált engem a modul elkészítésében.

Köszönöm mindenkinek a figyelmét, biztosan közzéteszek egy frissítést, ha a közeljövőben javul ez a projekt. Addig is találkozunk később!

Ajánlott: