Innholdsfortegnelse:
- Trinn 1: Hvordan det hele fungerer: Designvalg forklart
- Trinn 2: Deler - Brains: Microcontroller & Screen
- Trinn 3: Deler - Optikk: Å finne et kompromiss
- Trinn 4: Deler - en beholder for å holde dem alle
- Trinn 5: Opprette en protokoll for modulen vår
- Trinn 6: Koden: ESP32 Side
- Trinn 7: Koden: Android Side
- Trinn 8: Hva er neste?
- Trinn 9: Konklusjon og spesiell takk
Video: Smart motorsykkel HUD-prototype (sving-for-sving-navigasjon og så mye mer): 9 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:20
Hei!
Denne instruksen er historien om hvordan jeg designet og bygde en HUD-plattform (Heads-Up Display) designet for montering på motorsykkelhjelmer. Den ble skrevet i sammenheng med "kart" -konkurransen. Dessverre var jeg ikke i stand til å fullføre dette prosjektet i tide til konkurransens frist, men jeg ønsket fortsatt å dele fremgangen min med det, samt dokumentere alt prøving og feiling jeg fikk gjennom det.
Ideen til dette prosjektet kom først til meg for noen år siden, da jeg satte meg inn i motorsykler, og jeg begynte å se på hvilket utstyr jeg måtte kjøpe for å gjøre turene mine morsommere. På det tidspunktet forvirret det meg at den beste måten å få grunnleggende GPS -navigasjon mens du sykler, var å i utgangspunktet feste smarttelefonen til sykkelens styre. Jeg tenker for meg selv at det sikkert kan være en bedre måte å få den slags informasjon på farten.
Det var da det kom til meg: En head-up-skjerm kan være måten å få navigasjon mens du sykler, uten å tømme telefonens batteri og eksponere den for elementene.
Over tid modnet denne ideen i tankene mine, og jeg skjønte at det å ha en HUD foran meg hele tiden ville tillate mange flere bruksområder enn enkel navigering. Det er derfor min plan er å gjøre plattformen offentlig og modulær, slik at alle kan lage en modul som viser informasjonen de trenger på sin egen HUD
Selv om det er kommersielt tilgjengelige produkter som oppfyller denne oppgaven, er det ikke noen som er like modulære som min plattform, og de pleier også å være litt dyre. Uansett, velkommen til dette prosjektet.
Det som fungerer nå
Som sagt er dette prosjektet fremdeles veldig i utviklingstilstand, og det er det som jobber for tiden.
- Kommunikasjon mellom en smarttelefon og et ESP32 -basert kort (telefon våken)
- Optikkdesign gjort (kan trenge små justeringer på sikt)
- Android -navigasjonsapp som bruker Mapbox -navigasjons -SDK:
- Kan beregne og vise brukerens posisjon på et kart, samt en rute fra den til destinasjonen
- Kan koble til en Bluetooth -enhet (enhetens MAC -adresse er hardkodet fra nå)
- Kan navigere i sanntid, inkludert å trekke ut og sende informasjon om den kommende manøveren via seriell Bluetooth (støtter bare svinger for øyeblikket)
Hva trenger arbeid
Denne listen inneholder elementer som er absolutt nødvendige for HUDs tiltenkte bruk, men som ikke er klare til å bli implementert ennå.
- Overordnet design (hjelmfeste, reflektorens vinkeljusteringsmekanisme,..)
- Android -app:
- Implementere oppdagelse og korrigering utenfor ruten
- Mulighet for brukeren å skrive inn destinasjonsadressen
- Veipunkter?
- Ergonomi / estetikk
Rekvisita:
Essentials
- Et esp32 -basert utviklingstavle
- Enhver nylig Android -smarttelefon (Bluetooth -aktivert)
- En SSD1306 eller en annen aktivert 96 "OLED -skjerm (min var 128x64 piksler, se delen" Hjernen: mikrokontroller og skjerm ")
- En reflektor (ethvert stykke akryl/glass/plexiglass vil gjøre)
- Et Fresnel -objektiv (mitt hadde en F.lengde på ca 13 cm, se delen "Lens valg")
Verktøy
- Loddejern
- Brødbrett
- Noen hoppekabler
- 3d -skriver / 3d -utskriftstjeneste
Trinn 1: Hvordan det hele fungerer: Designvalg forklart
Den grunnleggende ideen med en Heads Up Display er å vise et bilde foran noens visjon, slik at de ikke trenger å se bort fra det de gjør (det være seg å styre et fly eller kjøre en motorsykkel, som blir vår eksempel tilfelle).
Optikk
Teknisk sett kan dette oppnås ved å sette opp en skjerm rett foran brukerens øyne. Imidlertid er en skjerm ikke gjennomsiktig, og vil derfor hindre brukerens syn. Du kan deretter plassere skjermen foran en reflekterende overflate, som speiler skjermens innhold samtidig som den er gjennomsiktig nok til at brukeren kan se hva som er foran ham.
Imidlertid har denne tilnærmingen en stor feil: den faktiske skjermen er vanligvis nærmere brukerens øyne enn det brukeren faktisk må fokusere på (f.eks. Veien foran ham). Dette betyr at for å lese hva som er på den reflekterende overflaten, må brukerens øyne tilpasse seg skjermens avstand til øynene (la oss si 20 cm), og deretter måtte tilpasse seg igjen for å fokusere på veien videre (~ 2/5 meter). Tiden hele denne operasjonen tar er dyrebar tid som bør brukes på å se på veien, og tilpasning ofte kan være ubehagelig for brukeren etter bare noen minutter.
Derfor bestemte jeg meg for å legge til et objektiv mellom skjermen og reflektoren. Dette objektivet, hvis det er valgt med omhu, bør tillate å lage et virtuelt bilde av skjermen (se skjemaet ovenfor), som da ser ut til å være lenger borte fra brukerens øyne som det faktisk er, og krever dermed mindre brå tilpasninger (eller ingen i det hele tatt, i et perfekt scenario). Denne designen gjør at brukeren raskt kan se på reflektoren, få informasjonen han trenger og umiddelbart se tilbake på veien.
Smarttelefonens rolle
Fordi det var urealistisk å prøve å implementere en hel navigasjonsapplikasjon på ESP32 alene, bestemte jeg meg for å lage en Android -app som skulle ta seg av dette. Appen trenger da bare å fortelle ESP32 hva brukeren må gjøre for å komme til målet, og ESP32 videresender denne informasjonen til HUD (se figuren "Hvordan modulen fungerer").
Trinn 2: Deler - Brains: Microcontroller & Screen
Som nevnt ovenfor, planla jeg å få modulen min til å vise navigasjonsinformasjon, mens jeg faktisk ikke lot den beregne den faktiske posisjoneringen, sporing og sanntidsnavigasjon. brukerens telefon ville i stedet kommunisere med modulen, og sende den informasjonen for deretter å bli vist på HUD.
For å lette kommunikasjonen mellom brukerens telefon og modulen, valgte jeg å bruke et ESP32 -basert kort for dette prosjektet. Dette valget skyldtes at denne spesifikke modulen hadde integrerte Bluetooth-muligheter, i tillegg til noen andre interessante spesifikasjoner (enkel å bruke ikke-flyktig lagring, dual-core CPU, nok RAM til å faktisk kjøre OLED-skjermen via I2C, …). Det er relativt enkelt å designe PCB basert på ESP32, som jeg tok i betraktning. Jeg har også profesjonell erfaring med å bruke og designe kretser med ESP32, noe som definitivt påvirket valget mitt.
Valget av skjermen kom i utgangspunktet til det jeg kunne finne på at jeg skjønt ville være lys nok til å bruke, samtidig som den var så liten som mulig. Jeg var ikke veldig bekymret for antall piksler på skjermen, ettersom målet mitt var å ha et veldig minimalistisk og enkelt brukergrensesnitt.
Det bør bemerkes at skjermdriveren bør støttes av et bibliotek som gir mulighet for bildespeiling. Det er fordi det viste bildet blir snudd når det kommer gjennom linsen og vises på reflektoren, og det å ikke måtte manuelt reversere det som vises, er en stor vekt på skuldrene våre som byggherrer.
Trinn 3: Deler - Optikk: Å finne et kompromiss
Optikken for dette prosjektet var ganske vanskelig å nærme seg, ettersom jeg ikke ante hva jeg så etter da jeg først startet dette prosjektet. Etter litt undersøkelse forsto jeg at det jeg ønsket å gjøre var å lage et "virtuelt bilde" av OLED -skjermen min, som ser ut til å være lenger borte fra øyet enn det faktisk er. Den ideelle avstanden for dette virtuelle bildet som skal dannes, vil være på rundt 2-5 meter foran sjåføren, a dette ser ut til å være avstanden til objektene vi fokuserer på når vi kjører (andre biler, støt på veien osv …).
For å nå det målet valgte jeg å bruke et Fresnel -objektiv, ettersom disse er ganske store, billige, de syntes å tilby en god nok brennvidde for prosjektet mitt, og de kan klippes med en enkel saks (noe som ikke er tilfelle for mer raffinerte runde glasslinser). Fresnel -objektiver kan finnes navn som "lommeforstørrelsesglass" eller "lesekortforstørrelse", ettersom de er veldig passende for å hjelpe mennesker med dårlig syn å lese.
I utgangspunktet handlet trikset her om å finne det riktige kompromisset mellom:
- Å ha en rimelig virtuell bildeavstand (det vil si hvor langt HUD ser ut til å være for brukeren, eller hvor langt brukeren må justere øynene for å se hva som er på HUD)
- Å ha teksten på skjermen ikke bli for forstørret av linsen (som i utgangspunktet er en forstørrelsesglass)
- Å ha en rimelig avstand mellom OLED -skjermen og objektivet, noe som ellers ville føre til en veldig klumpete modul
Jeg bestilte personlig et par forskjellige objektiver på amazon, og bestemte de respektive brennvidder, før jeg valgte et med en F.lengde på ca 13 cm. Jeg fant denne F.lengden, med en OLED-linse avstand på 9 cm, ga meg et tilfredsstillende bilde på reflektoren min (se de siste bildene ovenfor).
Som du vil se på illustrasjonene mine, må kameraet som brukes til å ta disse bildene for å kunne fokusere på teksten som vises, justeres som om det fokuserer på et fjernt objekt, noe som gjør at alt på samme plan som reflektoren virker uklart. Dette er akkurat det vi ønsker for vår HUD.
Du finner 3d -filene for objektivholderen her.
Trinn 4: Deler - en beholder for å holde dem alle
Mens jeg skriver denne instruksen, er ikke selve beholderen som vil inneholde hvert stykke av heads-up-skjermen, helt designet. Jeg har imidlertid noen ideer om den generelle formen og hvordan jeg skal nærme meg visse problemer (for eksempel hvordan du holder en reflektor i ro og får den til å motstå 100+ km/t vind). Dette er fremdeles et pågående arbeid.
Trinn 5: Opprette en protokoll for modulen vår
For å sende navigasjonsinstruksjonene fra telefonen til utviklingsbordet, måtte jeg komme med en egen kommunikasjonsprotokoll som ville tillate meg å enkelt sende de nødvendige dataene fra telefonen, samtidig som jeg lettere kunne behandle den en gang mottatt.
Da jeg skrev denne instruksen, var informasjonen som måtte overføres fra telefonen for å navigere med modulen:
- Den kommende manøverens type (enkel sving, rundkjøring, sammenslåing til en annen vei, …)
- Den kommende manøverens presise instruksjoner (avhengig av manøvertype: høyre/venstre for en sving; hvilken avkjørsel for å ta en rundkjøring, …)
- Avstanden som gjenstår før den kommende manøveren (i meter for nå)
Jeg bestemte meg for å organisere disse dataene ved å bruke følgende rammestruktur:
: type.instruksjoner, avstand;
Selv om det ikke er en vakker løsning, lar denne oss enkelt skille og skille hvert felt i protokollen vår, noe som muliggjorde kodingen på ESP32 -siden.
Det er viktig å huske på at for fremtidige funksjoner kan det hende at annen informasjon må legges til i denne protokollen (for eksempel nøyaktig dag og klokkeslett, eller musikken som spilles av på brukerens telefon), noe som lett kan gjennomføres med den samme bygge logikk som nå.
Trinn 6: Koden: ESP32 Side
Koden for ESP32 er for tiden ganske enkel. Den bruker U8g2lib -biblioteket, som gjør det enkelt å kontrollere OLED -skjermen (samtidig som det muliggjør speiling av det viste bildet).
I utgangspunktet er alt ESP32 gjør å motta serielle data via Bluetooth når appen sender den, analyserer den og viser disse dataene eller bildene basert på disse dataene (dvs. viser en pil i stedet for setningen "sving til venstre/høyre"). Her er koden:
/*Program for å kontrollere en HUD fra en Android -app via seriell bluetooth*/#inkluderer "BluetoothSerial.h" // Header File for Serial Bluetooth, blir som standard lagt til i Arduino#include #include #ifdef U8X8_HAVE_HW_SPI#include#endif# ifdef U8X8_HAVE_HW_I2C #include #endif // OLED bibliotekskonstruktør, må endres tilsvarende til skjermen U8G2_SSD1306_128X64_ALT0_F_HW_I2C u8g2 (U8G2_MIRROR,/* reset =*/U8X8_PIN_NONE;) // Statemaskin detekterte_feltverdier + variabel#definere manøvreFelt 1#definere instruksjonerFelt 2#definere avstandFelt 3#definere endOfFrame 4int detect_field = endOfFrame; BluetoothSerial serialBT; // Objekt for Bluetoothchar incoming_char; røye manøver [10]; røyeinstruksjoner [10]; røyeavstand [10]; røyte tempManeuver [10]; røyke tempInstruksjoner [10]; røyke tempDistans [10]; int nbr_char_maneuver = 0; int nbr_char_instructions = 0; int nbr_char_distance = 0; boolsk fullsyn = feil; ugyldig oppsett () {Serial.begin (9600); // Start seriell skjerm i 9600 bauds u8g2.begin (); // Init OLED -kontroll serialBT.begin ("ESP32_BT"); // Navn på forsinkelse av Bluetooth -signal (20); Serial.println ("Bluetooth Device is Ready to Pair");} void loop () {if (serialBT.available () &&! Fullsentence) // Characters being received via Bluetooth serial {incoming_char = serialBT.read (); Serial.print ("Mottatt:"); Serial.println (innkommende_char); } switch (detect_field) {case maneuverField: Serial.println ("Detected field: maneuver"); if (incoming_char == '.') // Neste felt oppdaget {detect_field = instructionField; } annet {// Fyll manøvretypen info array maneuver [nbr_char_maneuver] = incoming_char; nbr_char_maneuver ++; } gå i stykker; case instructionsField: Serial.println ("Oppdaget felt: instruksjoner"); if (incoming_char == ',') // Neste felt oppdaget {detect_field = distanceField; } annet {// Fyll instruksjonene info array -instruksjoner [nbr_char_instructions] = innkommende_char; nbr_char_instructions ++; } gå i stykker; case distanceField: Serial.println ("Oppdaget felt: avstand"); if (innkommende_char == ';') // Slutt på ramme oppdaget {detect_field = endOfFrame; Serial.print ("manøver:"); Serial.println (manøver); Serial.print ("instruksjoner:"); Serial.println (instruksjoner); Serial.print ("avstand:"); Serial.println (avstand); fullsyn = sant; update_Display (); // Full ramme mottatt, analyser den og vis gjenopprettende data} annet {// Fyll avstanden info array array distance [nbr_char_distance] = incoming_char; nbr_char_distance ++; } gå i stykker; case endOfFrame: if (incoming_char == ':') detect_field = maneuverField; // Ny ramme oppdaget brudd; standard: // Ikke bryt noe; } forsinkelse (20);} ugyldig oppdaterings_Display () {// Bufrer hvert char -array for å unngå mulige konflikter memcpy (tempManeuver, maneuver, nbr_char_maneuver); memcpy (tempInstruksjoner, instruksjoner, nbr_char_instructions); memcpy (tempDistance, distance, nbr_char_distance); parseCache (); // Analyse og prosessering av char -arrays fullsentence = false; // Setning behandlet, klar for neste}} void parseCache () {u8g2.clearBuffer (); // tøm det interne minnet u8g2.setFont (u8g2_font_ncenB10_tr); // velg en passende skrift // char -matriser -> streng obligatorisk for å bruke substring () -funksjon String maneuverString = tempManeuver; String instructionsString = tempInstructions; // Implementere protokoll her. Støtter bare svinger foreløpig. if (maneuverString.substring (0, 4) == "turn") {// Se etter manøvertype Serial.print ("TURN DETECTED"); if (instructionsString.substring (0, 5) == "right") {// Sjekk spesifikke instruksjoner og vis deretter u8g2.drawStr (5, 15, "-"); } annet hvis (instructionString.substring (0, 4) == "venstre") {// Sjekk spesifikke instruksjoner og vis deretter u8g2.drawStr (5, 15, "<---"); } annet u8g2.drawStr (5, 15, "Err."); // Ugyldig instruksjonsfelt}/ * Implementere andre manøvretyper (rundkjøringer osv.) * Else if (tempManeuver == "rdbt") { * *] */ u8g2.drawStr (5, 30, tempDistance); // Vis gjenværende avstand u8g2.sendBuffer (); // overfør internminnet til displayet // Tilbakestill alle ble -matriser før neste leseminne (manøver, 0, 10); memset (instruksjoner, 0, 10); memset (avstand, 0, 10); memset (tempManeuver, 0, 10); memset (tempInstructions, 0, 10); memset (tempDistance, 0, 10); // Tilbakestill antall elementer i matriser nbr_char_distance = 0; nbr_char_instructions = 0; nbr_char_maneuver = 0;}
Trinn 7: Koden: Android Side
For smarttelefonappen bestemte jeg meg for å bruke Mapbox navigasjons -SDK, ettersom den tilbyr mange nyttige funksjoner når det gjelder å bygge et navigasjonskart fra bunnen av. Det tillater også bruk av mange nyttige lyttere, noe som definitivt hjelper til med å få denne modulen til å fungere. Jeg brukte også harry1453s android-bluetooth-serielle bibliotek for android, da det gjorde Bluetooth seriell kommunikasjon mye enklere å sette sammen.
Hvis du vil bygge denne appen hjemme, må du få et Mapbox -tilgangstoken, som er gratis opp til et visst antall forespørsler per måned. Du må sette dette tokenet i koden og bygge appen på din side. Du må også kode i din egen ESP32s Bluetooth MAC -adresse.
Slik den er, kan appen lede deg fra din nåværende posisjon til hvilken som helst plassering du kan klikke på på kartet. Som nevnt i introen, støtter den imidlertid ingen annen manøver enn svinger, og håndterer ikke off-ruter ennå.
Du finner hele kildekoden på min github.
Trinn 8: Hva er neste?
Nå som appen er funksjonell nok til å faktisk veilede brukeren på en bestemt rute (hvis det ikke er noen avvik fra den angitte ruten), vil hovedfokuset mitt være å forbedre smarttelefonappen og implementere de få mulighetene som ville gjøre modulen til en levedyktig navigasjonsenhet. Dette inkluderer å aktivere Bluetooth -kommunikasjon fra telefonen selv når skjermen er slått av, samt støtte for andre typer manøvrer (rundkjøringer, sammenslåing, …). Jeg vil også implementere en omdirigeringsfunksjon hvis brukeren avviker fra den opprinnelige ruten.
Når alt dette er gjort, vil jeg forbedre beholderen og festemekanismen, 3d -skrive den ut og prøve å ta modulen for en første runde.
Hvis alt går bra, er mitt langsiktige mål å designe en tilpasset PCB for den innebygde elektronikken i dette prosjektet, noe som vil spare mye plass på sluttproduktet.
Jeg kan også legge til noen andre funksjoner i denne modulen i fremtiden, inkludert en tidsvisning, samt en telefonvarselalarm, som kan få et ikon til å vises når brukeren mottar en tekstmelding eller et anrop. Til slutt vil jeg gjerne legge til Spotify -evner til denne modulen, som en stor musikkfan. På dette tidspunktet er dette imidlertid bare hyggelig å ha.
Trinn 9: Konklusjon og spesiell takk
Som nevnt i introen, selv om dette prosjektet langt fra er ferdig, ønsket jeg virkelig å dele det med verden, i håp om at det kan inspirere noen andre. Jeg ønsket også å dokumentere forskningen min om dette emnet, da det egentlig ikke er mye hobbyinteresse for AR og HUD, noe jeg synes er synd.
Jeg vil rette en stor takk til Awall99 og Danel Quintana, hvis respektive augmented reality -prosjekt inspirerte meg mye i utformingen av denne modulen.
Takk alle for oppmerksomheten, jeg kommer til å legge ut en oppdatering når dette prosjektet blir forbedret i nær fremtid. I mellomtiden sees vi alle senere!
Anbefalt:
Fantastisk drivhus med automatisk vanning, internettforbindelse og mye mer: 7 trinn (med bilder)
Fantastisk drivhus med automatisk vanning, internettforbindelse og mye mer: Velkommen til denne instruksen. I begynnelsen av mars var jeg i en hagebutikk og så noen drivhus. Og siden jeg ønsket å lage et prosjekt med planter og elektronikk lenge lenge, gikk jeg videre og kjøpte et: https://www.instagram.com/p
Voksende mer salat på mindre plass eller voksende salat i verdensrommet, (mer eller mindre) .: 10 trinn
Voksende mer salat på mindre plass eller … Voksende salat i verdensrommet, (mer eller mindre) .: Dette er en profesjonell innsending til Growing Beyond Earth, Maker Contest, sendt gjennom Instructables. Jeg kunne ikke vært mer begeistret for å designe for produksjon av romfrukter og legge ut min første Instructable.Til å begynne ba konkurransen oss om å
Pulsoksymeter med mye forbedret presisjon: 6 trinn (med bilder)
Pulsoksymeter med mye forbedret presisjon: Hvis du nylig besøkte en lege, er sjansen stor for at de grunnleggende vitale tegnene dine ble undersøkt av en sykepleier. Vekt, høyde, blodtrykk, samt puls (HR) og oksygenmetning i perifert blod (SpO2). Kanskje ble de to siste hentet fra
Lag et spill i Notisblokk og mye mye mer: 10 trinn
Lag et spill i Notisblokk og mye mye mer: Dette er min første instruerbare. Så hvis du har noen forslag, vennligst kommenter. La oss komme i gang! Når vi alle hører ordet notisblokk, tenker vi på noen kjedelige, ubrukelige applikasjoner for å notere ting. Vel notatblokk er mye mer enn det. Vi kan kontrollere siden vår
Slik slår du ganske mye av en iPod Nano 1. generasjon: 6 trinn
Hvordan slå ganske mye av en iPod Nano 1. generasjon: Jeg hater det når jeg går tom for batterilevetid på min nano …. dette vil vise deg hvordan du avslutter det …… også dette er min første instruerbare