Taula de continguts:

Prototip HUD de motocicleta intel·ligent (navegació pas a pas i molt més): 9 passos
Prototip HUD de motocicleta intel·ligent (navegació pas a pas i molt més): 9 passos

Vídeo: Prototip HUD de motocicleta intel·ligent (navegació pas a pas i molt més): 9 passos

Vídeo: Prototip HUD de motocicleta intel·ligent (navegació pas a pas i molt més): 9 passos
Vídeo: BMW Motorrad présente un prototype de casque avec affichage tête haute HUD 2024, Juliol
Anonim
Prototip HUD de motocicleta intel·ligent (navegació pas a pas i molt més)
Prototip HUD de motocicleta intel·ligent (navegació pas a pas i molt més)
Prototip HUD de motocicleta intel·ligent (navegació pas a pas i molt més)
Prototip HUD de motocicleta intel·ligent (navegació pas a pas i molt més)
Prototip HUD de motocicleta intel·ligent (navegació pas a pas i molt més)
Prototip HUD de motocicleta intel·ligent (navegació pas a pas i molt més)
Prototip HUD de motocicleta intel·ligent (navegació pas a pas i molt més)
Prototip HUD de motocicleta intel·ligent (navegació pas a pas i molt més)

Hola!

Aquest Instructables és la història de com vaig dissenyar i construir una plataforma HUD (Heads-Up Display) dissenyada per muntar-se en cascos de moto. Va ser escrit en el context del concurs de "mapes". Malauradament, no vaig poder acabar completament aquest projecte a temps fins a la data límit del concurs, però encara volia compartir els meus avenços, així com documentar totes les proves i errors que he tingut en fer-lo.

La idea d’aquest projecte em va venir per primera vegada fa uns anys, quan em vaig posar en motocicletes, i començava a examinar quins equips hauria de comprar per fer més agradables les meves atraccions. En aquell moment, em va desconcertar que la millor manera d’obtenir una navegació GPS bàsica mentre conduïa era bàsicament connectar el telèfon intel·ligent al manillar de la vostra bicicleta. Per a mi, segurament, podria haver-hi una manera millor d’obtenir aquest tipus d’informació sobre la marxa.

Va ser llavors quan em va arribar a mi: una pantalla capçalera podria ser la manera d’obtenir navegació mentre conduïu, sense buidar la bateria del telèfon i exposar-la als elements.

Amb el pas del temps, aquesta idea va madurar a la meva ment, i encara que tenir un HUD al davant sempre permetria molts més usos que la simple navegació. És per això que el meu pla és fer que la plataforma sigui pública i modular, perquè tothom pugui crear un mòdul que mostri la informació que necessita al seu propi HUD

Tot i que hi ha productes disponibles comercialment que compleixen aquesta tasca, no n’hi ha cap que sigui tan modular com la meva plataforma i també solen ser una mica cars. De tota manera, benvingut a aquest projecte.

Què funciona a partir d’ara

Com es va dir, aquest projecte encara es troba en un estat de desenvolupament, i això és el que està funcionant actualment.

- Comunicació entre un telèfon intel·ligent i una placa basada en ESP32 (telèfon despert)

- Disseny d'òptica realitzat (pot ser que calgui fer petits ajustaments a la llarga)

- Aplicació de navegació d'Android que utilitza l'SDK de navegació Mapbox:

- Capaç de calcular i mostrar la posició de l'usuari en un mapa, així com una ruta des d'aquest fins a la destinació

- Capaç de connectar-se a un dispositiu Bluetooth (l'adreça MAC del dispositiu està codificada a partir d'ara)

Capaç de navegar en temps real, incloent-hi l'extracció i l'enviament de la informació de la propera maniobra mitjançant Bluetooth en sèrie (per ara només admet girs)

El que necessita funcionar

Aquesta llista conté elements que són absolutament necessaris per a l’ús previst de l’HUD, però que encara no estan preparats per implementar-se.

- Disseny general (fixació del casc, mecanisme d’ajust de l’angle del reflector,..)

- Aplicació per a Android:

- Implementar detecció i correcció fora de ruta

- Possibilitat per a l'usuari d'introduir l'adreça de destinació

- Punts de ruta?

- Ergonomia / Estètica

Subministraments:

Fonaments bàsics

- Una placa de desenvolupament basada en esp32

- Qualsevol telèfon intel·ligent Android una mica recent (compatible amb Bluetooth)

- Un SSD1306 o una altra pantalla OLED de 96 "habilitada (la meva tenia 128x64 píxels, vegeu la part" El cervell: Microcontrolador i pantalla ")

- Un reflector (qualsevol peça d’acrílic / vidre / plexiglàs farà)

- Un objectiu Fresnel (el meu tenia una longitud F. aproximada de 13 cm, vegeu la part "Elecció de l'objectiu")

Eines

- Soldador

- Taula de pa

- Uns quants cables de pont

- Impressora 3D / servei d’impressió 3d

Pas 1: Com funciona tot: s'expliquen les opcions de disseny

Com funciona tot: s’expliquen les opcions de disseny
Com funciona tot: s’expliquen les opcions de disseny
Com funciona tot: s’expliquen les opcions de disseny
Com funciona tot: s’expliquen les opcions de disseny
Com funciona tot: s’expliquen les opcions de disseny
Com funciona tot: s’expliquen les opcions de disseny

La idea bàsica d’una pantalla Heads Up és mostrar una imatge davant de la visió d’algú, de manera que no hagi de desviar la mirada del que fa (ja sigui pilotant un avió o conduint una motocicleta, que serà la nostra exemple de cas).

Icsptica

Tècnicament, això es podria aconseguir posant una pantalla davant dels ulls de l'usuari cap amunt. Tot i això, una pantalla no és transparent i, per tant, dificultaria la visió del seu usuari. A continuació, podríeu col·locar la pantalla davant d’una superfície reflectant, que reflectiria el contingut de la pantalla, alhora que tindria prou transparència perquè l’usuari pogués veure el que tenia al davant.

Tanmateix, aquest enfocament té un enorme defecte: la pantalla real sol estar més a prop dels ulls de l'usuari que en el que s'ha de centrar (per exemple, la carretera que té davant). Això vol dir que, per llegir el que hi ha a la superfície reflectant, els ulls de l'usuari haurien d'adaptar-se a la distància de la pantalla dels seus ulls (diguem-ne 20 cm) i haurien d'adaptar-se de nou per centrar-se en la carretera (~ 2/5 metres). El temps que triga tota aquesta operació és un temps preciós que s’ha de dedicar a mirar la carretera i adaptar-se amb freqüència pot resultar incòmode per a l’usuari al cap de pocs minuts.

Per això, vaig decidir afegir una lent entre la pantalla i el reflector. Aquest objectiu, si es tria acuradament, hauria de permetre la creació d’una imatge virtual de la pantalla (vegeu l’esquema anterior), que semblaria estar més allunyada dels ulls de l’usuari tal com és realment, requerint així adaptacions menys brusques (o cap, en un escenari perfecte). Aquest disseny permet a l’usuari mirar ràpidament el reflector, obtenir la informació que necessita i mirar instantàniament cap enrere cap a la carretera.

El paper del telèfon intel·ligent

Com que no era realista intentar implementar tota una aplicació de navegació només a l’ESP32, vaig decidir crear una aplicació per a Android que s’encarregés d’això. L'aplicació només hauria de dir a l'ESP32 què ha de fer l'usuari per arribar al seu destí, i l'ESP32 retransmet aquesta informació mitjançant el HUD (vegeu la figura "Com funciona el mòdul").

Pas 2: Parts: els cervells: microcontrolador i pantalla

Parts: els cervells: microcontrolador i pantalla
Parts: els cervells: microcontrolador i pantalla
Parts: els cervells: microcontrolador i pantalla
Parts: els cervells: microcontrolador i pantalla

Com s’ha dit anteriorment, tenia previst que el meu mòdul mostri informació de navegació, tot i que realment no el calculés el posicionament real, el seguiment i la navegació en temps real. el telèfon de l'usuari es comunicaria amb el mòdul i li enviaria la informació per mostrar-la al HUD.

Per facilitar la comunicació entre el telèfon de l'usuari i el mòdul, vaig optar per utilitzar una placa basada en ESP32 per a aquest projecte. Aquesta elecció es va deure a que aquest mòdul específic tenia funcions Bluetooth integrades, així com algunes altres especificacions interessants (emmagatzematge no volàtil fàcil d'utilitzar, CPU de doble nucli, memòria RAM suficient per conduir la pantalla OLED mitjançant I2C, …). És relativament senzill dissenyar PCB basats al voltant de l’ESP32, cosa que sí vaig tenir en compte. També tinc experiència professional utilitzant i dissenyant circuits amb l’ESP32, cosa que va influir definitivament en la meva elecció.

L’elecció de la pantalla es va limitar bàsicament a tot allò que pogués trobar que, tot i que seria prou brillant per al seu ús, alhora que seria el més petit possible. No em preocupava molt el nombre de píxels de la pantalla, ja que el meu objectiu era tenir una interfície d’usuari molt minimalista i senzilla.

Cal tenir en compte que el controlador de pantalla hauria de ser compatible amb una biblioteca que permeti la rèplica d'imatges. Això es deu al fet que la imatge visualitzada es capgira quan travessa l'objectiu i apareix al reflector, i no haver de revertir manualment el que es mostra suposa un pes enorme de les nostres espatlles com a constructors.

Pas 3: Parts - icsptica: trobar un compromís

Parts - icsptica: trobar un compromís
Parts - icsptica: trobar un compromís
Parts - icsptica: trobar un compromís
Parts - icsptica: trobar un compromís
Parts - icsptica: trobar un compromís
Parts - icsptica: trobar un compromís

L’òptica d’aquest projecte era força difícil d’abordar, ja que no tenia ni idea del que fins i tot buscava quan vaig començar aquest projecte. Després d'algunes investigacions, vaig entendre que el que volia fer era crear una "imatge virtual" de la pantalla OLED, que semblés estar més lluny de la vista del que és realment. La distància ideal perquè es formi aquesta imatge virtual estaria a uns 2-5 metres per davant del conductor, a aquesta sembla ser la distància als objectes en què ens centrem quan conduïm (altres cotxes, sots a la carretera, etc.)).

Per assolir aquest objectiu, vaig optar per utilitzar un objectiu Fresnel, ja que són bastant grans, barats, semblaven oferir una distància focal suficient per al meu projecte i es poden tallar amb unes tisores simples (cosa que no és el cas de lents de vidre de forma rodona més refinades). Els objectius Fresnel es poden trobar amb noms com "lupa de butxaca" o "lupa de lectura", ja que són molt adequats per ajudar a llegir persones amb mala vista.

Bàsicament, el truc aquí consistia a trobar el compromís correcte entre:

- Tenir una distància d’imatge virtual raonable (és a dir, fins a quin punt l’HUD semblarà arribar a l’usuari o fins a quin punt l’usuari haurà d’ajustar els ulls per veure què hi ha a l’HUD)

- Que el text a la pantalla no s'amplii massa amb l'objectiu (que bàsicament és una lupa)

- Disposar d’una distància raonable entre la pantalla OLED i l’objectiu, cosa que donaria lloc a un mòdul molt voluminós

Personalment, vaig demanar uns quants objectius diferents a Amazon i vaig determinar les respectives distàncies focals abans d’escollir-ne un amb una longitud F. d’uns 13 cm. Vaig trobar que aquesta longitud F., amb una distància OLED-Lens de 9 cm, em va donar una imatge satisfactòria al reflector (vegeu les darreres imatges més amunt).

Com veureu a les meves il·lustracions, per tal d’enfocar correctament el text que es mostra, la càmera que s’utilitza per fer aquestes fotografies s’ha d’ajustar com si estigués enfocant un objecte llunyà, cosa que fa que tot el mateix pla que el reflector sembli borrós. Això és exactament el que volem per al nostre HUD.

Aquí podeu trobar els fitxers en 3D per al portaobjectius.

Pas 4: parts: un contenidor per contenir-les totes

Parts: un contenidor per contenir-los tots
Parts: un contenidor per contenir-los tots
Parts: un contenidor per contenir-los tots
Parts: un contenidor per contenir-los tots

Mentre escric aquest Instructables, el contenidor real que contindrà cada tros de la pantalla frontal no està del tot dissenyat. Tinc, però, algunes idees sobre la seva forma general i sobre com abordar certs problemes (com mantenir un reflector quiet i fer-lo suportar vents de més de 100 km / h). Això segueix sent molt en curs.

Pas 5: Creació d'un protocol per al nostre mòdul

Per tal d’enviar les instruccions de navegació des del telèfon a la placa de desenvolupament, vaig haver de presentar un protocol de comunicació propi que em permetés enviar fàcilment les dades necessàries des del telèfon, alhora que facilitava el seu processament un cop rebudes.

En el moment d’escriure aquest Instructables, la informació que calia transmetre des del telèfon per navegar amb el mòdul era:

- El tipus de la pròxima maniobra (gir senzill, rotonda, fusió en una altra carretera, …)

- Instruccions precises de la propera maniobra (depenent del tipus de maniobra: dreta / esquerra per fer un gir; quina sortida agafar per una rotonda, …)

- La distància restant abans de la propera maniobra (en metres per ara)

Vaig decidir organitzar aquestes dades mitjançant la següent estructura de marcs:

: type.instructions, distància;

Tot i que no és una solució bonica, aquesta ens permet separar i distingir fàcilment cada camp del nostre protocol, cosa que va facilitar la codificació a la banda ESP32.

És important tenir en compte que, per a futures funcions, és possible que calgui afegir altra informació a aquest protocol (com ara el dia i l’hora exactes o la música que es reprodueix al telèfon de l’usuari), cosa que seria fàcilment factible utilitzant el mateix construint lògica com ara.

Pas 6: el codi: lateral ESP32

El codi: lateral ESP32
El codi: lateral ESP32
El codi: lateral ESP32
El codi: lateral ESP32

Actualment, el codi de l’ESP32 és bastant senzill. Utilitza la biblioteca U8g2lib, que permet un control fàcil de la pantalla OLED (alhora que permet la rèplica de la imatge visualitzada).

Bàsicament, tot el que fa l’ESP32 és rebre dades de sèrie a través de Bluetooth quan l’envia l’aplicació, analitzar-les i mostrar aquestes dades o imatges a partir d’aquestes dades (és a dir, mostrar una fletxa en lloc de la frase "gire a l'esquerra / dreta"). Aquí teniu el codi:

/ * Programa per controlar un HUD des d'una aplicació per a Android mitjançant bluetooth en sèrie * / # include "BluetoothSerial.h" // Fitxer de capçalera per a Bluetooth de sèrie, s'afegirà per defecte a Arduino # include #include #ifdef U8X8_HAVE_HW_SPI # include # endif # ifdef U8X8_HAVE_HW_I2C # include # endif // Constructor de biblioteca OLED, s’ha de canviar en conseqüència a la pantalla U8G2_SSD1306_128X64_ALT0_F_HW_I2C u8g2 (U8G2_MIRROR, / * reset = * / U8X8_PIN_NONE); // Estat de la màquina detectat camps_valors + variable # define maneuverField 1 # define instructionsField 2 # define distanceField 3 # define endOfFrame 4intected_field = endOfFrame; BluetoothSerial serialBT; // Objecte per Bluetoothchar incoming_char; char maneuver [10]; char instructions [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; fullsentence booleana = false; void setup () {Serial.begin (9600); // Inicieu el monitor sèrie en 9600 bauds u8g2.begin (); // Inicieu el control OLED serialBT.begin ("ESP32_BT"); // Nom del retard del senyal Bluetooth (20); Serial.println ("El dispositiu Bluetooth està a punt per emparellar-se");} void loop () {if (serialBT.available () &&! Fullsentence) // Caràcters que es reben mitjançant Bluetooth serial {incoming_char = serialBT.read (); Serial.print ("Rebut:"); Serial.println (incoming_char); } commutador (camp_detectat) {case maneuverField: Serial.println ("Camp detectat: maniobra"); if (incoming_char == '.') // Següent camp detectat {Detectat_camp = instruccionsCamp; } else {// Empleneu el tipus de maniobra info array maneuver [nbr_char_maneuver] = incoming_char; nbr_char_maneuver ++; } trencar; case instructionsField: Serial.println ("Camp detectat: instruccions"); if (incoming_char == ',') // Següent camp detectat {Detected_field = distanceField; } else {// Empleneu les instruccions info array instructions [nbr_char_instructions] = incoming_char; nbr_char_instructions ++; } trencar; case distanceField: Serial.println ("Camp detectat: distància"); if (incoming_char == ';') // Final del fotograma detectat {Detectat_camp = endOfFrame; Serial.print ("maniobra:"); Serial.println (maniobra); Serial.print ("instruccions:"); Serial.println (instruccions); Serial.print ("distància:"); Serial.println (distància); fullsentence = cert; update_Display (); // Fotograma complet rebut, analitzeu-lo i mostreu dades de recuperació} else {// Empleneu la informació de la distància array distance [nbr_char_distance] = incoming_char; nbr_char_distance ++; } trencar; case endOfFrame: if (incoming_char == ':') detect_field = maneuverField; // Es va detectar un trencament del nou marc; per defecte: // No es trenqui res; } delay (20);} void update_Display () {// Memòria cau de cada matriu de caràcters per evitar possibles conflictes memcpy (tempManeuver, maneuver, nbr_char_maneuver); memcpy (tempInstructions, instruccions, nbr_char_instructions); memcpy (tempDistance, distance, nbr_char_distance); parseCache (); // Analitzar i processar matrius char completesentence = false; // Sentència processada, llesta per a la següent} void parseCache () {u8g2.clearBuffer (); // esborreu la memòria interna u8g2.setFont (u8g2_font_ncenB10_tr); // trieu un tipus de lletra adequat // matrius de caràcters -> cadena obligatòria per utilitzar la funció substring () String maneuverString = tempManeuver; String instructionsString = tempInstructions; // Implementació del protocol aquí. De moment només admet torns. if (maneuverString.substring (0, 4) == "turn") {// Comproveu si hi ha maniobra tipus Serial.print ("GIR DETECTAT"); if (instructionsString.substring (0, 5) == "right") {// Consulteu instruccions específiques i mostreu-les en conseqüència u8g2.drawStr (5, 15, "-"); } else if (instructionsString.substring (0, 4) == "left") {// Consulteu instruccions específiques i mostreu-les en conseqüència u8g2.drawStr (5, 15, "<---"); } else u8g2.drawStr (5, 15, "Err."); // Camp d'instruccions no vàlid} / * Implementar altres tipus de maniobra (rotondes, etc.) * else if (tempManeuver == "rdbt") {* *] * / u8g2.drawStr (5, 30, tempDistance); // Mostra la distància restant u8g2.sendBuffer (); // transferir memòria interna a la pantalla // Restablir totes les matrius de caràcters abans de la propera lectura del memset (maniobra, 0, 10); memset (instruccions, 0, 10); memset (distància, 0, 10); memset (tempManeuver, 0, 10); memset (tempInstructions, 0, 10); memset (tempDistance, 0, 10); // Restableix el nombre d'elements de les matrius nbr_char_distance = 0; nbr_char_instructions = 0; nbr_char_maneuver = 0;}

Pas 7: el codi: costat d'Android

El Codi: Android Side
El Codi: Android Side
El Codi: Android Side
El Codi: Android Side
El Codi: Android Side
El Codi: Android Side

Per a l’aplicació per a telèfons intel·ligents, vaig decidir utilitzar l’SDK de navegació de Mapbox, ja que ofereix moltes funcions útils a l’hora de construir un mapa de navegació des de zero. També permet l'ús de molts oients útils, que sens dubte ajuden a fer funcionar aquest mòdul. També he utilitzat la biblioteca serial-android-bluetooth de harry1453 per a Android, ja que va fer que la comunicació serial Bluetooth sigui molt més fàcil de muntar.

Si voleu crear aquesta aplicació a casa, haureu d’obtenir un testimoni d’accés a Mapbox, que és gratuït fins a un nombre determinat de sol·licituds al mes. Haureu de posar aquest testimoni al codi i crear l’aplicació al vostre costat. També haureu de codificar a la vostra adreça MAC Bluetooth del vostre ESP32.

Tal com està, l'aplicació us pot guiar des de la vostra ubicació actual fins a qualsevol ubicació on podeu fer clic al mapa. Com es va esmentar a la introducció, però, no admet cap altra maniobra que els girs i encara no maneja fora de ruta.

Podeu trobar tot el codi font al meu github.

Pas 8: què hi ha a continuació?

Ara que l’aplicació és prou funcional per guiar realment el seu usuari en una ruta determinada (si no hi ha desviacions de la ruta establerta), el meu objectiu principal serà millorar l’aplicació per a telèfons intel·ligents i implementar les poques funcions que faran del mòdul un dispositiu de navegació viable. Això inclou habilitar la comunicació Bluetooth des del telèfon fins i tot quan la pantalla està apagada, així com el suport per a altres tipus de maniobres (rotondes, fusió, …). També implementaré una funció de redireccionament si l'usuari es desvia de la ruta original.

Quan acabi tot això, milloraré el contenidor i el seu mecanisme de fixació, l’imprimiré en 3D i provaré de treure el mòdul per a una primera tirada.

Si tot va bé, el meu objectiu a llarg termini és dissenyar un PCB personalitzat per a l'electrònica incrustada d'aquest projecte, que estalviaria molt espai al producte final.

També podria afegir altres funcions a aquest mòdul en el futur, inclosa una visualització d’hora, així com una alarma de notificació del telèfon, que podria fer que aparegui una icona quan l’usuari rep un missatge de text o una trucada. Finalment, m'encantaria afegir funcions de Spotify a aquest mòdul, com a gran fan de la música. No obstant això, en aquest moment, això només és bo tenir-lo.

Pas 9: Conclusió i gràcies especials

Conclusió i gràcies especials
Conclusió i gràcies especials

Com s’indica a la introducció, tot i que aquest projecte està lluny d’estar acabat, volia compartir-lo amb el món amb l’esperança que pogués inspirar algú més. També volia documentar la meva investigació sobre aquest tema, ja que no hi ha realment un gran interès dels aficionats a AR i HUD, cosa que crec que és una pena.

Vull donar un enorme agraïment a Awall99 i Danel Quintana, els respectius projectes de realitat augmentada dels quals em van inspirar molt en la realització d’aquest mòdul.

Gràcies a tots per la vostra atenció, segur que publicaré una actualització quan aquest projecte millori en un futur proper. Mentrestant, ens veiem a tots més tard!

Recomanat: