Obsah:

Prototyp chytrého motocyklu HUD (podrobná navigace a mnohem více): 9 kroků
Prototyp chytrého motocyklu HUD (podrobná navigace a mnohem více): 9 kroků

Video: Prototyp chytrého motocyklu HUD (podrobná navigace a mnohem více): 9 kroků

Video: Prototyp chytrého motocyklu HUD (podrobná navigace a mnohem více): 9 kroků
Video: HUD prototype 1 2024, Červenec
Anonim
Prototyp chytrého motocyklu HUD (podrobná navigace a mnoho dalšího)
Prototyp chytrého motocyklu HUD (podrobná navigace a mnoho dalšího)
Prototyp chytrého motocyklu HUD (podrobná navigace a mnoho dalšího)
Prototyp chytrého motocyklu HUD (podrobná navigace a mnoho dalšího)
Prototyp chytrého motocyklu HUD (podrobná navigace a mnoho dalšího)
Prototyp chytrého motocyklu HUD (podrobná navigace a mnoho dalšího)
Prototyp chytrého motocyklu HUD (podrobná navigace a mnoho dalšího)
Prototyp chytrého motocyklu HUD (podrobná navigace a mnoho dalšího)

Ahoj!

Tento Instructables je příběh o tom, jak jsem navrhl a postavil platformu HUD (Heads-Up Display) navrženou pro montáž na motocyklové helmy. Bylo to napsáno v kontextu soutěže „mapy“. Je smutné, že jsem nebyl schopen tento projekt úplně dokončit včas do uzávěrky soutěže, ale přesto jsem se chtěl podělit o svůj pokrok v něm, stejně jako zdokumentovat všechny pokusy a omyly, kterých jsem se dopracoval.

Nápad na tento projekt mě poprvé napadl před několika lety, když jsem se dostal k motocyklům, a začínal jsem pátrat po tom, jaké vybavení bych si potřeboval koupit, abych si jízdu zpříjemnil. V té době mě zaráželo, že nejlepší způsob, jak získat základní GPS navigaci při jízdě, je v zásadě připojit smartphone k řídítkům vašeho kola. Myslím si, že určitě by mohl existovat lepší způsob, jak získat takové informace za běhu.

Tehdy mě to dostalo: heads-up displej by mohl být způsob, jak získat navigaci při jízdě, aniž byste museli vybíjet baterii telefonu a vystavovat ji živlům.

Časem tato myšlenka dozrála v mé mysli a já jsem si myslel, že mít neustále HUD před sebou by umožnilo mnohem více použití než jednoduchá navigace. Z tohoto důvodu je mým plánem učinit platformu veřejnou a modulární, aby kdokoli mohl vytvořit modul, který na svém HUDu zobrazí potřebné informace

Ačkoli existují komerčně dostupné produkty, které splňují tento úkol, nejsou žádné, které by byly tak modulární jako moje platforma, a také bývají trochu drahé. Každopádně vítejte v tomto projektu.

Co zatím funguje

Jak bylo uvedeno, tento projekt je stále velmi ve stavu vývoje a to je to, co v současné době funguje.

- Komunikace mezi smartphonem a deskou založenou na ESP32 (telefon vzhůru)

- Návrh optiky hotový (z dlouhodobého hlediska může vyžadovat malé úpravy)

- Navigační aplikace pro Android využívající navigační SDK Mapbox:

- Schopný vypočítat a zobrazit polohu uživatele na mapě, stejně jako trasu z ní do cíle

- Možnost připojení k zařízení Bluetooth (MAC adresa zařízení je nyní pevně zakódována)

- Možnost navigace v reálném čase, včetně extrahování a odesílání informací o nadcházejícím manévru prostřednictvím sériového Bluetooth (prozatím podporuje pouze zatáčky)

Co potřebuje práci

Tento seznam obsahuje položky, které jsou naprosto nezbytné pro zamýšlené použití HUD, ale ještě nejsou připraveny k implementaci.

- Celkový design (připevnění helmy, mechanismus nastavení úhlu reflektoru,..)

- aplikace pro Android:

- Implementujte detekci a opravu mimo trasu

- Možnost pro uživatele zadat cílovou adresu

- Trasové body?

- Ergonomie / Estetika

Zásoby:

Základy

- Vývojová deska založená na esp32

- Jakýkoli nedávný smartphone se systémem Android (povoleno Bluetooth)

- SSD1306 nebo jiná povolená 96 "OLED obrazovka (moje měla 128 x 64 pixelů, viz část" Mozky: Mikrokontrolér a obrazovka ")

- Reflektor (postačí jakýkoli kus akrylu/skla/plexiskla)

- Fresnelova čočka (moje měla délku F asi 13 cm, viz část „Volba objektivu“)

Nástroje

- Páječka

- prkénko

- Několik propojovacích kabelů

- 3D tiskárna / služba 3D tisku

Krok 1: Jak to všechno funguje: Vysvětleny možnosti designu

Jak to všechno funguje: Vysvětleny možnosti designu
Jak to všechno funguje: Vysvětleny možnosti designu
Jak to všechno funguje: Vysvětleny možnosti designu
Jak to všechno funguje: Vysvětleny možnosti designu
Jak to všechno funguje: Vysvětleny možnosti designu
Jak to všechno funguje: Vysvětleny možnosti designu

Základní myšlenkou Heads Up Display je zobrazit obrázek před zrakem někoho, aby nemusel odvracet zrak od toho, co dělá (ať už jde o pilotování letadla nebo řízení motocyklu, což bude naše příklad).

Optika

Technicky toho lze dosáhnout přímým umístěním obrazovky před oči uživatele. Obrazovka však není průhledná, a proto by uživateli bránila ve výhledu. Poté byste mohli obrazovku umístit před reflexní povrch, který by zrcadlil obsah obrazovky a zároveň byl dostatečně průhledný, aby uživatel viděl, co je před ním.

Tento přístup má však obrovskou chybu: skutečná obrazovka je obvykle bližší očím uživatele, než na jaké se uživatel ve skutečnosti musí soustředit (např. Cesta před ním). To znamená, že aby bylo možné přečíst, co je na reflexním povrchu, oči uživatele by se musely přizpůsobit vzdálenosti displeje od očí (řekněme 20 cm) a poté by se musely znovu přizpůsobit, aby se mohly soustředit na cestu před sebou (~ 2/5 metrů). Čas, který celá tato operace zabere, je drahocenný čas, který byste měli věnovat pohledu na silnici, a časté přizpůsobování může být uživateli už po několika minutách nepříjemné.

Proto jsem se rozhodl přidat mezi obrazovku a reflektor čočku. Pokud je tento objektiv zvolen pečlivě, měl by umožnit vytvoření virtuálního obrazu na obrazovce (viz schéma výše), který by se pak zdál být dále od očí uživatele, jak ve skutečnosti je, což vyžaduje méně náhlé úpravy (nebo vůbec žádný, v dokonalém scénáři). Tento design umožňuje uživateli rychle se podívat na reflektor, získat informace, které potřebuje, a okamžitě se podívat zpět na silnici.

Role smartphonu

Protože bylo nereálné pokusit se implementovat celou navigační aplikaci pouze na ESP32, rozhodl jsem se vytvořit aplikaci pro Android, která se o to postará. Aplikaci by pak stačilo říct ESP32, co musí uživatel udělat, aby se dostal do cíle, a ESP32 předává tyto informace přes HUD (viz obrázek "Jak modul funguje").

Krok 2: Díly - Mozky: Mikrokontrolér a obrazovka

Díly - Mozky: Mikrokontrolér a obrazovka
Díly - Mozky: Mikrokontrolér a obrazovka
Díly - Mozky: Mikrokontrolér a obrazovka
Díly - Mozky: Mikrokontrolér a obrazovka

Jak bylo uvedeno výše, plánoval jsem, aby můj modul zobrazoval navigační informace, aniž by ve skutečnosti měl vypočítat skutečné určování polohy, sledování a navigaci v reálném čase. uživatelský telefon by místo toho komunikoval s modulem a odeslal mu informace, které se pak zobrazí na HUD.

Abych usnadnil komunikaci mezi telefonem uživatele a modulem, rozhodl jsem se pro tento projekt použít desku založenou na ESP32. Tato volba byla dána tímto konkrétním modulem, který má integrované možnosti Bluetooth, a několika dalšími zajímavými specifikacemi (snadno použitelné Non-Volatile Storage, dvoujádrový procesor, dostatek RAM pro skutečné ovládání OLED displeje přes I2C, …). Je poměrně jednoduché navrhnout desky plošných spojů založené na ESP32, což jsem vzal v úvahu. Mám také profesionální zkušenosti s používáním a navrhováním obvodů s ESP32, což rozhodně ovlivnilo můj výběr.

Výběr obrazovky se v zásadě snížil na to, co jsem zjistil, že bych byl dostatečně jasný pro použití y a zároveň byl co nejmenší. Neměl jsem velké obavy z počtu pixelů obrazovky, protože mým cílem bylo mít velmi minimalistické a jednoduché uživatelské rozhraní.

Je třeba poznamenat, že ovladač obrazovky by měl být podporován knihovnou, která umožňuje zrcadlení obrazu. Důvodem je, že zobrazený obraz je převrácen, když se dostane přes objektiv a objeví se na reflektoru, a to, že nemusíme ručně měnit to, co se zobrazuje, je obrovská váha z našich ramen jako stavitelů.

Krok 3: Díly - Optika: Hledání kompromisu

Díly - Optika: Hledání kompromisu
Díly - Optika: Hledání kompromisu
Díly - Optika: Hledání kompromisu
Díly - Optika: Hledání kompromisu
Díly - Optika: Hledání kompromisu
Díly - Optika: Hledání kompromisu

Optika pro tento projekt byla docela obtížně přístupná, protože jsem vůbec netušil, co jsem hledal, když jsem s tímto projektem poprvé začínal. Po nějakém výzkumu jsem pochopil, že to, co chci udělat, je vytvořit „virtuální obraz“mé OLED obrazovky, který se bude zdát být vzdálenější od oka, než ve skutečnosti je. Ideální vzdálenost pro vytvoření tohoto virtuálního obrazu by byla přibližně 2–5 metrů před řidičem, což se zdá být vzdálenost od předmětů, na které se při řízení zaměřujeme (jiná auta, nerovnosti na silnici atd.)).

Abych toho dosáhl, rozhodl jsem se použít Fresnelovu čočku, protože tyto jsou poměrně velké, levné, zdálo se, že nabízejí dostatečně dobrou ohniskovou vzdálenost pro můj projekt a lze je stříhat jednoduchými nůžkami (což není případ jemnější kulaté skleněné čočky). Fresnelovy čočky najdeme pod názvy jako „kapesní lupa“nebo „lupa na čtečku karet“, protože jsou velmi vhodné pro čtení lidem se špatným zrakem.

V zásadě šlo o nalezení správného kompromisu mezi:

- Mít rozumnou vzdálenost virtuálního obrazu (to znamená, jak daleko se bude HUD uživateli zdát, nebo jak daleko bude muset uživatel upravit oči, aby viděl, co je na HUD)

- Nechat text na obrazovce objektivem příliš nezvětšit (což je v podstatě lupa)

- Mít přiměřenou vzdálenost mezi obrazovkou OLED a objektivem, což by jinak vedlo k velmi objemnému modulu

Osobně jsem si na Amazonu objednal několik různých objektivů a určil jejich příslušné ohniskové vzdálenosti, než jsem si vybral ten s délkou F asi 13 cm. Zjistil jsem, že tato délka F. se vzdáleností čočky OLED 9 cm mi poskytla uspokojivý obraz na mém reflektoru (viz několik posledních obrázků výše).

Jak uvidíte na mých ilustracích, aby se fotoaparát správně zaostřil na zobrazený text, musí se přizpůsobit tak, jako by zaostřil na vzdálený předmět, takže vše ve stejné rovině jako reflektor vypadá rozmazaně. Přesně to chceme pro náš HUD.

3D soubory pro držák objektivu najdete zde.

Krok 4: Díly - kontejner, který je všechny pojme

Díly - kontejner, který je všechny pojme
Díly - kontejner, který je všechny pojme
Díly - kontejner, který je všechny pojme
Díly - kontejner, který je všechny pojme

Když píšu tento Instructables, skutečný kontejner, který pojme každý kus heads-up displeje, není zcela navržen. Mám však několik představ o jeho obecném tvaru a o tom, jak přistupovat k určitým problémům (například jak držet reflektor v klidu a vydržet vítr nad 100 km/h). Toto je stále velmi nedokončená práce.

Krok 5: Vytvoření protokolu pro náš modul

Aby bylo možné odeslat navigační pokyny z telefonu na vývojovou desku, musel jsem vymyslet vlastní komunikační protokol, který mi umožní snadno odeslat požadovaná data z telefonu a zároveň usnadní jeho zpracování, jakmile bude přijat.

V době psaní tohoto Instructables byly informace, které bylo třeba přenášet z telefonu, aby bylo možné navigovat pomocí modulu:

- Typ nadcházejícího manévru (jednoduchá zatáčka, kruhový objezd, sloučení na jinou silnici, …)

- Přesné pokyny nadcházejícího manévru (v závislosti na typu manévru: doprava/doleva pro odbočení; který výjezd pro kruhový objezd, …)

- Zbývající vzdálenost před nadcházejícím manévrem (prozatím v metrech)

Rozhodl jsem se uspořádat tato data pomocí následující rámcové struktury:

: typ. instrukce, vzdálenost;

I když to není krásné řešení, toto nám umožňuje snadno oddělit a rozlišit každé pole našeho protokolu, což usnadnilo kódování na straně ESP32.

Je důležité mít na paměti, že pro budoucí funkce bude možná nutné do tohoto protokolu přidat další informace (například přesný den a čas nebo hudbu přehrávanou na telefonu uživatele), což by bylo snadno proveditelné pomocí stejného stavební logika jako nyní.

Krok 6: Kód: ESP32 Side

Kód: ESP32 Side
Kód: ESP32 Side
Kód: ESP32 Side
Kód: ESP32 Side

Kód pro ESP32 je v současné době poměrně jednoduchý. Využívá knihovnu U8g2lib, která umožňuje snadné ovládání OLED obrazovky (a zároveň umožňuje zrcadlení zobrazeného obrázku).

V zásadě vše, co ESP32 dělá, je přijímat sériová data přes Bluetooth, když je aplikace odešle, analyzovat a zobrazit tato data nebo obrázky na základě těchto dat (tj. Zobrazení šipky místo věty „odbočit vlevo/vpravo“). Zde je kód:

/*Program pro ovládání HUD z aplikace pro Android pomocí sériového bluetooth*/#include "BluetoothSerial.h" // Soubor záhlaví pro sériové Bluetooth, bude ve výchozím nastavení přidán do Arduina#include #include #ifdef U8X8_HAVE_HW_SPI#include#endif# ifdef U8X8_HAVE_HW_I2C #include #endif // konstruktor knihovny OLED, je třeba změnit podle vaší obrazovkyU8G2_SSD1306_128X64_ALT0_F_HW_I2C u8g2 (U8G2_MIRROR,/* reset =*/U8X8_PIN_NONE); // Stav stroje detekován_pole hodnoty + proměnná#definovat manévr Pole 1#definovat instrukce Pole 2#definovat vzdálenost Pole 3#definovat endOfFrame 4int detekováno pole = endOfFrame; BluetoothSerial serialBT; // Objekt pro Bluetoothchar incoming_char; char maneuver [10]; instrukce char [10]; char vzdálenost [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); // Spuštění sériového monitoru při 9600 baudech u8g2.begin (); // Init OLED control serialBT.begin ("ESP32_BT"); // Název zpoždění Bluetooth signálu (20); Serial.println ("Zařízení Bluetooth je připraveno k párování");} void loop () {if (serialBT.available () &&! Fullsentence) // Znaky přijímané přes Bluetooth serial {incoming_char = serialBT.read (); Serial.print ("Přijato:"); Serial.println (incoming_char); } přepínač (detekované_pole) {case maneuverField: Serial.println ("Detekované pole: manévr"); if (incoming_char == '.') // Bylo detekováno další pole {detekované pole = instrukceField; } else {// Vyplňte manévr pole typu manévru [nbr_char_maneuver] = incoming_char; nbr_char_maneuver ++; } přestávka; případ instrukcePole: Serial.println ("Detekované pole: instrukce"); if (incoming_char == ',') // Bylo detekováno další pole {detekované_pole = distanceField; } else {// Vyplňte pokyny pole informací [nbr_char_instructions] = incoming_char; nbr_char_instructions ++; } přestávka; case distanceField: Serial.println ("Detekované pole: vzdálenost"); if (incoming_char == ';') // Konec rámce detekován {detekované pole = endOfFrame; Serial.print ("manévr:"); Serial.println (manévr); Serial.print ("instrukce:"); Serial.println (pokyny); Serial.print ("vzdálenost:"); Serial.println (vzdálenost); plná věta = pravda; update_Display (); // Byl přijat celý snímek, analyzujte jej a zobrazte data přijímače} else {// Vyplňte vzdálenost pole informací o vzdálenosti [nbr_char_distance] = incoming_char; nbr_char_distance ++; } přestávka; case endOfFrame: if (incoming_char == ':') detekované_pole = maneuverField; // Přerušení detekováno novým rámcem; výchozí: // Nedělejte nic; } delay (20);} void update_Display () {// Ukládání mezipaměti do každého pole char, aby se předešlo možným konfliktům memcpy (tempManeuver, maneuver, nbr_char_maneuver); memcpy (tempInstructions, instructions, nbr_char_instructions); memcpy (tempDistance, vzdálenost, nbr_char_distance); parseCache (); // Analyzujte a zpracovávejte char pole fullsentence = false; // Věta zpracována, připravena na další} void parseCache () {u8g2.clearBuffer (); // vymazání vnitřní paměti u8g2.setFont (u8g2_font_ncenB10_tr); // vyberte vhodné písmo // char pole -> řetězec povinný pro použití funkce substring () String maneuverString = tempManeuver; Řetězec instrukceString = tempInstructions; // Implementační protokol zde. Zatím podporuje pouze zatáčky. if (maneuverString.substring (0, 4) == "turn") {// Zkontrolujte typ manévru Serial.print ("TURN DETECTED"); if (guidelinesString.substring (0, 5) == "right") {// Zkontrolujte konkrétní pokyny a podle toho zobrazte u8g2.drawStr (5, 15, "-"); } else if (guidelinesString.substring (0, 4) == "left") {// Zkontrolujte konkrétní pokyny a podle toho zobrazte u8g2.drawStr (5, 15, "<---"); } else u8g2.drawStr (5, 15, "Chyba"); // Neplatné pole pokynů}/ * Implementujte další typy manévrů (kruhové objezdy atd.) * Else if (tempManeuver == "rdbt") { * *] */ u8g2.drawStr (5, 30, tempDistance); // Zobrazení zbývající vzdálenosti u8g2.sendBuffer (); // přenos interní paměti na displej // Resetujte všechna pole znaků před dalším čtením memset (manévr, 0, 10); memset (instrukce, 0, 10); memset (vzdálenost, 0, 10); memset (tempManeuver, 0, 10); memset (tempInstructions, 0, 10); memset (tempDistance, 0, 10); // Reset počtu prvků v polích nbr_char_distance = 0; nbr_char_instructions = 0; nbr_char_maneuver = 0;}

Krok 7: Kód: Android Side

Kód: Android Side
Kód: Android Side
Kód: Android Side
Kód: Android Side
Kód: Android Side
Kód: Android Side

Pro aplikaci pro smartphony jsem se rozhodl použít navigační SDK Mapboxu, protože nabízí spoustu užitečných funkcí, pokud jde o vytváření navigační mapy od nuly. Umožňuje také použití mnoha užitečných posluchačů, kteří rozhodně pomáhají při fungování tohoto modulu. Také jsem použil android-bluetooth-sériovou knihovnu harry1453 pro Android, protože to usnadnilo sestavení sériové komunikace Bluetooth.

Pokud si chcete tuto aplikaci postavit doma, budete potřebovat přístupový token Mapbox, který je zdarma až do určitého počtu požadavků za měsíc. Tento token budete muset vložit do kódu a vytvořit aplikaci na své straně. Budete také muset zadat kód MAC MAC vašeho vlastního ESP32.

Aplikace vás ve skutečnosti dovede z vašeho aktuálního umístění na jakékoli místo, na které můžete na mapě kliknout. Jak již bylo zmíněno v úvodu, nepodporuje však žádný jiný manévr než zatáčky a zatím nezvládá cesty mimo.

Celý zdrojový kód najdete na mém githubu.

Krok 8: Co bude dál?

Nyní, když je aplikace dostatečně funkční, aby skutečně vedla svého uživatele po stanovené trase (pokud neexistují žádné odchylky od nastavené trasy), zaměřím se především na vylepšení aplikace pro chytré telefony a implementaci několika funkcí, díky nimž bude modul životaschopné navigační zařízení. To zahrnuje povolení komunikace Bluetooth z telefonu, i když je obrazovka vypnutá, a podpora dalších typů manévrů (kruhové objezdy, sloučení, …). Pokud se uživatel odchýlí od původní trasy, implementuji také funkci přesměrování.

Až bude tohle všechno hotové, vylepším kontejner a jeho připevňovací mechanismus, vytisknu ho 3D a zkusím vzít modul na první spuštění.

Pokud vše půjde dobře, mým dlouhodobým cílem je navrhnout vlastní desku plošných spojů pro vestavěnou elektroniku tohoto projektu, která by ušetřila spoustu místa na konečném produktu.

Do tohoto modulu bych mohl v budoucnu přidat i některé další funkce, včetně zobrazení času, stejně jako upozornění na upozornění telefonu, díky kterému by se ikona mohla zobrazit, když uživatel obdrží textovou zprávu nebo hovor. Nakonec bych jako velký hudební fanoušek rád do tohoto modulu přidal funkce Spotify. V tuto chvíli je to však jen příjemné.

Krok 9: Závěr a zvláštní poděkování

Závěr a zvláštní poděkování!
Závěr a zvláštní poděkování!

Jak je uvedeno v úvodu, přestože tento projekt není zdaleka dokončen, opravdu jsem se o něj chtěl podělit se světem v naději, že by mohl inspirovat někoho jiného. Chtěl jsem také zdokumentovat svůj výzkum na toto téma, protože o AR a HUD není opravdu velký zájem fanoušků, což je podle mě škoda.

Chci moc poděkovat Awall99 a Danelovi Quintanovi, jehož projekt rozšířené reality mě při tvorbě tohoto modulu hodně inspiroval.

Děkuji vám všem za pozornost, určitě zveřejním aktualizaci, až se tento projekt v blízké budoucnosti zlepší. Mezitím se uvidíme všichni později!

Doporučuje: