Съдържание:

Прототип на интелигентен мотоциклет HUD (навигация от завой до завой и много други): 9 стъпки
Прототип на интелигентен мотоциклет HUD (навигация от завой до завой и много други): 9 стъпки

Видео: Прототип на интелигентен мотоциклет HUD (навигация от завой до завой и много други): 9 стъпки

Видео: Прототип на интелигентен мотоциклет HUD (навигация от завой до завой и много други): 9 стъпки
Видео: Как СТРОИЛАСЬ ЛЕГЕНДА Берта Монро. Путь от 89 до 331км/ч. 2024, Юли
Anonim
Прототип на интелигентен HUD мотоциклет (навигация от завой до завой и много други)
Прототип на интелигентен HUD мотоциклет (навигация от завой до завой и много други)
Прототип на интелигентен HUD мотоциклет (навигация от завой до завой и много други)
Прототип на интелигентен HUD мотоциклет (навигация от завой до завой и много други)
Прототип на интелигентен HUD мотоциклет (навигация от завой до завой и много други)
Прототип на интелигентен HUD мотоциклет (навигация от завой до завой и много други)
Прототип на интелигентен мотоциклет HUD (навигация от завой до завой и много други)
Прототип на интелигентен мотоциклет HUD (навигация от завой до завой и много други)

Здравейте!

Тази инструкция е историята за това как проектирах и изградих платформа HUD (Heads-Up Display), предназначена за монтиране на мотоциклетни каски. Написано е в контекста на конкурса „карти“. За съжаление, не успях да завърша напълно този проект навреме за крайния срок на конкурса, но все пак исках да споделя моя напредък по него, както и да документирам всички опити и грешки, които получих, като го направих.

Идеята за този проект ми дойде за първи път преди няколко години, когато се качих на мотоциклети и започнах да преценявам каква екипировка ще трябва да си купя, за да направя пътуванията си по -приятни. По онова време ме обърка, че най -добрият начин да се сдобиете с основна GPS навигация по време на каране е основно да прикрепите смартфона си към кормилото на мотора. Мисля, че със сигурност може да има по -добър начин да получа такава информация в движение.

Тогава стигнах до мен: хедс-ъп дисплеят може да бъде начинът да получите навигация по време на каране, без да изпразвате батерията на телефона си и да я излагате на елементите.

С течение на времето тази идея узря в съзнанието ми и си помислих, че наличието на HUD пред себе си по всяко време ще позволи много повече приложения, отколкото проста навигация. Ето защо моят план е да направя платформата публична и модулна, така че всеки да може да създаде модул, който да показва необходимата им информация в собствения HUD

Въпреки че има продукти на пазара, които изпълняват тази задача, няма такива, които са толкова модулни, колкото моята платформа, и също така са склонни да бъдат малко скъпи. Както и да е, добре дошли в този проект.

Какво работи към момента

Както бе посочено, този проект все още е в състояние на развитие и това е, което работи в момента.

- Комуникация между смартфон и платка, базирана на ESP32 (телефонът е буден)

- направен дизайн на оптиката (може да се наложи малки корекции в дългосрочен план)

- Приложение за навигация за Android, използващо навигационния SDK на Mapbox:

- Възможност за изчисляване и показване на позицията на потребителя на карта, както и маршрут от нея до дестинацията

- Възможност за свързване с Bluetooth устройство (MAC адресът на устройството е твърдо кодиран към момента)

- Възможност за навигация в реално време, включително извличане и изпращане на информация за предстоящата маневра чрез сериен Bluetooth (за момента поддържа само завои)

Какво има нужда от работа

Този списък съдържа елементи, които са абсолютно необходими за предназначението на HUD, но все още не са готови за изпълнение.

- Цялостен дизайн (закрепване на каска, механизъм за регулиране на ъгъла на отражателя,..)

- Приложение за Android:

- Прилагане на откриване и корекция извън маршрута

- Възможност за потребителя да въведе адреса на местоназначението

- Пътни точки?

- Ергономия / естетика

Консумативи:

Основни неща

- ЕСП 32 базирана дъска за разработка

- Всеки малко по -нов Android смартфон (с Bluetooth)

- SSD1306 или друг 96 -инчов OLED екран (моят беше 128x64 пиксела, вижте "Мозъците: Микроконтролер и екран")

- Отражател (всяко парче акрил/стъкло/плексиглас ще е подходящо)

- Френелова леща (моята имаше дължина F. около 13 см, вижте частта „Избор на обектив“)

Инструменти

- поялник

- Платформа

- Няколко джъмперни кабела

- 3d принтер / услуга за 3d печат

Стъпка 1: Как всичко работи: Обяснен избор на дизайн

Как работи всичко: Обяснен избор на дизайн
Как работи всичко: Обяснен избор на дизайн
Как работи всичко: Обяснен избор на дизайн
Как работи всичко: Обяснен избор на дизайн
Как работи всичко: Обяснен избор на дизайн
Как работи всичко: Обяснен избор на дизайн

Основната идея на Heads Up Display е да показва изображение пред очите на някого, така че да не се налага да отклоняват поглед от всичко, което правят (било то пилотиране на самолет или шофиране на мотоциклет, което ще бъде нашето примерен случай).

Оптика

Технически това може да се постигне чрез изправяне на екран пред очите на потребителя. Екранът обаче не е прозрачен и следователно би възпрепятствал визията на потребителя. След това можете да поставите екрана пред отразяваща повърхност, която да отразява съдържанието на екрана, като същевременно е достатъчно прозрачна, за да може потребителят да види какво е пред него.

Този подход обаче има огромен недостатък: действителният екран обикновено е по -близо до очите на потребителя от това, върху което потребителят действително трябва да се съсредоточи (напр. Пътят пред него). Това означава, че за да прочетете какво има върху отразяващата повърхност, очите на потребителя трябва да се адаптират към разстоянието на дисплея от очите му (да речем 20 см) и след това трябва да се адаптират отново, за да се съсредоточат върху пътя пред себе си (~ 2/5 метра). Времето, което отнема цялата тази операция, е ценно време, което трябва да се отдели за разглеждане на пътя, а честото адаптиране може да е неудобно за потребителя само след няколко минути.

Ето защо реших да добавя обектив между екрана и рефлектора. Този обектив, ако бъде избран внимателно, трябва да позволи създаването на виртуално изображение на екрана (вижте схемата по -горе), което след това ще изглежда по -далеч от очите на потребителя, както е в действителност, като по този начин изисква по -малко резки адаптации (или изобщо няма, при перфектен сценарий). Този дизайн позволява на потребителя бързо да погледне към отражателя, да получи необходимата му информация и незабавно да погледне назад към пътя.

Ролята на смартфона

Тъй като беше нереалистично да се опитам да внедря цяло приложение за навигация само на ESP32, реших да направя приложение за Android, което да се погрижи за това. След това приложението просто трябва да каже на ESP32 какво трябва да направи потребителят, за да стигне до местоназначението си, а ESP32 предава тази информация чрез HUD (вижте фигурата „Как работи модулът“).

Стъпка 2: Части - мозъкът: Микроконтролер и екран

Части - мозъкът: Микроконтролер и екран
Части - мозъкът: Микроконтролер и екран
Части - мозъкът: Микроконтролер и екран
Части - мозъкът: Микроконтролер и екран

Както бе посочено по-горе, планирах модулът ми да показва навигационна информация, като в действителност няма да изчислява действителното позициониране, проследяване и навигация в реално време. вместо това телефонът на потребителя ще комуникира с модула и ще му изпрати информацията, която след това да се покаже на HUD.

За да улесня комуникацията между телефона на потребителя и модула, избрах да използвам платка, базирана на ESP32, за този проект. Този избор се дължи на това, че този специфичен модул има вградени Bluetooth възможности, както и няколко други интересни спецификации (лесен за използване енергонезависим хранилище, двуядрен процесор, достатъчно RAM, за да управлява OLED дисплея чрез I2C, …). Сравнително лесно е да се проектират печатни платки, базирани на ESP32, което взех предвид. Имам и професионален опит с използването и проектирането на схеми с ESP32, което определено повлия на моя избор.

Изборът на екрана основно се свежда до всичко, което мога да открия, че въпреки това ще бъда достатъчно ярък за използване, като същевременно ще бъда възможно най -малък. Не се притеснявах много за пикселите на екрана, тъй като целта ми беше да имам много минималистичен и прост потребителски интерфейс.

Трябва да се отбележи, че драйверът на екрана трябва да се поддържа от библиотека, която позволява дублиране на изображението. Това е така, защото показаното изображение се преобръща, когато проникне през обектива и се появи на рефлектора, а това, че не се налага ръчно да обърнем това, което се показва, е огромно тегло за нашите строители.

Стъпка 3: Части - оптика: Намиране на компромис

Части - оптика: намиране на компромис
Части - оптика: намиране на компромис
Части - оптика: намиране на компромис
Части - оптика: намиране на компромис
Части - оптика: намиране на компромис
Части - оптика: намиране на компромис

Оптиката за този проект беше доста трудна за подход, тъй като нямах представа какво дори търся, когато за първи път започнах този проект. След известно проучване разбрах, че това, което искам да направя, е да създам „виртуално изображение“на моя OLED екран, което да изглежда по -далеч от окото, отколкото е в действителност. Идеалното разстояние за формиране на това виртуално изображение би било на около 2-5 метра пред водача, а това изглежда е разстоянието до обектите, върху които се фокусираме при шофиране (други автомобили, неравности по пътя и т.н.).

За да постигна тази цел, избрах да използвам обектив на Френел, тъй като те са доста големи, евтини, изглежда, че предлагат достатъчно добро фокусно разстояние за моя проект и могат да бъдат изрязани с обикновени ножици (което не е така за по -изискани стъклени лещи с кръгла форма). Лещите на Френел могат да бъдат намерени като имена „джобна лупа“или „лупа за четене на карти“, тъй като са много подходящи, за да помогнат на хората с лошо зрение да четат.

По принцип трикът тук беше за намиране на правилния компромис между:

- Наличието на разумно разстояние на виртуалното изображение (тоест колко далеч ще изглежда HUD на потребителя или колко далеч ще трябва да настрои очите си, за да види какво има на HUD)

- Текстът на екрана да не се увеличава твърде много от обектива (който по същество е лупа)

- Наличието на разумно разстояние между OLED екрана и обектива, което в противен случай би довело до много обемен модул

Аз лично поръчах няколко различни обектива на Amazon и определих съответните им фокусни разстояния, преди да избера такъв с дължина F. около 13 cm. Открих, че тази дължина F., с разстояние на OLED-обектива от 9 см, ми даде задоволително изображение на моя рефлектор (вижте последните няколко изображения по-горе).

Както ще видите на моите илюстрации, за да се фокусира правилно върху показания текст, камерата, използвана за заснемането на тези снимки, трябва да се регулира така, сякаш се фокусира върху далечен обект, което прави всичко в същата равнина като отражателя да изглежда размазано. Точно това искаме за нашия HUD.

Можете да намерите 3D файловете за държача на обектива тук.

Стъпка 4: Части - контейнер, който да ги държи всички

Части - контейнер, който да ги държи всички
Части - контейнер, който да ги държи всички
Части - контейнер, който да ги държи всички
Части - контейнер, който да ги държи всички

Докато пиша тази инструкция, действителният контейнер, който ще побере всяко парче от дисплея, не е съвсем проектиран. Имам обаче няколко идеи за общата му форма и за това как да се подходи към определени проблеми (например как да задържате рефлектора неподвижен и да го накарате да издържа на ветрове 100+ км/ч). Това все още е много в процес на работа.

Стъпка 5: Създаване на протокол за нашия модул

За да изпратя инструкциите за навигация от телефона до борда за разработка, трябваше да измисля свой собствен комуникационен протокол, който да ми позволи лесно да изпращам необходимите данни от телефона, като същевременно улеснявам обработката им след получаване.

По време на писането на тази инструкция информацията, която трябваше да бъде предадена от телефона, за да се придвижвате с модула, беше:

- Тип на предстоящата маневра (обикновен завой, кръгово движение, сливане на друг път, …)

- Точните инструкции на предстоящата маневра (в зависимост от вида на маневра: надясно/наляво за завой; кой изход да вземете за кръгово движение, …)

- Оставащото разстояние преди предстоящата маневра (в метри засега)

Реших да организирам тези данни, като използвам следната рамкова структура:

: тип.инструкции, разстояние;

Въпреки че не е красиво решение, това ни позволява лесно да отделим и разграничим всяко поле от нашия протокол, което улесни кодирането от страна на ESP32.

Важно е да се има предвид, че за бъдещи функции може да се наложи да се добави друга информация към този протокол (като точния ден и час или музиката, която се възпроизвежда на телефона на потребителя), което би било лесно осъществимо с помощта на същия изграждане на логика както сега.

Стъпка 6: Кодът: ESP32 страна

Кодът: ESP32 страна
Кодът: ESP32 страна
Кодът: ESP32 страна
Кодът: ESP32 страна

Кодът за ESP32 в момента е доста прост. Той използва библиотеката U8g2lib, която позволява лесно управление на OLED екрана (като същевременно позволява огледално отразяване на показаното изображение).

По принцип всичко, което ESP32 прави, е да получава серийни данни през Bluetooth, когато приложението ги изпраща, да ги анализира и да показва тези данни или снимки въз основа на тези данни (т.е. показва стрелка вместо изречението „завой наляво/надясно“). Ето кода:

/*Програма за управление на HUD от андроид приложение чрез сериен bluetooth*/#include "BluetoothSerial.h" // Файл на заглавието за сериен Bluetooth, ще бъде добавен по подразбиране в Arduino#include #include #ifdef U8X8_HAVE_HW_SPI#include#endif# ifdef U8X8_HAVE_HW_I2C #include #endif // OLED библиотечен конструктор, трябва да се промени съответно на вашия екран U8G2_SSD1306_128X64_ALT0_F_HW_I2C u8g2 (U8G2_MIRROR,/* reset =*/U8X8_PIN); // Състояние на машината открити стойности на полето + променлива#дефиниране на маневра Поле 1#дефиниране на инструкции Поле 2#определяне на разстояние Поле 3#дефиниране на endOfFrame 4int открито_поле = endOfFrame; BluetoothSerial serialBT; // Обект за Bluetoothchar incoming_char; char маневра [10]; char инструкции [10]; char разстояние [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; булева пълна изречение = false; void setup () {Serial.begin (9600); // Стартиране на сериен монитор в 9600 бода u8g2.begin (); // Init OLED контрол serialBT.begin ("ESP32_BT"); // Име на забавяне на Bluetooth сигнала (20); Serial.println ("Bluetooth устройството е готово за сдвояване");} void loop () {if (serialBT.available () &&! Fullsentence) // Символи, получени чрез Bluetooth serial {incoming_char = serialBT.read (); Serial.print ("Получено:"); Serial.println (incoming_char); } превключвател (открито_поле) {case maneuverField: Serial.println ("Открито поле: маневра"); if (incoming_char == '.') // Следващо поле е открито {открито_поле = инструкцииField; } else {// Попълнете информацията за маневра тип маневра маневра [nbr_char_maneuver] = incoming_char; nbr_char_maneuver ++; } почивка; инструкции за случая Поле: Serial.println ("Открито поле: инструкции"); if (incoming_char == ',') // Следващо поле е открито {открито_поле = distanceField; } else {// Попълнете инструкциите на информационния масив с инструкции [nbr_char_instructions] = incoming_char; nbr_char_instructions ++; } почивка; case distanceField: Serial.println ("Открито поле: разстояние"); if (incoming_char == ';') // Открит край на кадъра {открито_поле = endOfFrame; Serial.print ("маневра:"); Serial.println (маневра); Serial.print ("инструкции:"); Serial.println (инструкции); Serial.print ("разстояние:"); Serial.println (разстояние); пълна присъда = вярно; update_Display (); // Пълен кадър е получен, анализирайте го и покажете данните на приемника} else {// Попълнете разстоянието в информационния масив разстояние [nbr_char_distance] = incoming_char; nbr_char_distance ++; } почивка; случай endOfFrame: if (incoming_char == ':') открито_поле = maneuverField; // Нов кадър открит прекъсване; по подразбиране: // Не правете нищо; } забавяне (20);} void update_Display () {// Кеширайте всеки масив от символи, за да избегнете евентуални конфликти memcpy (tempManeuver, maneuver, nbr_char_maneuver); memcpy (tempInstructions, инструкции, nbr_char_instructions); memcpy (tempDistance, разстояние, nbr_char_distance); parseCache (); // Анализиране и обработка на char масиви fullsentence = false; // Изречението е обработено, готово за следващото} void parseCache () {u8g2.clearBuffer (); // изчистване на вътрешната памет u8g2.setFont (u8g2_font_ncenB10_tr); // избираме подходящ шрифт // char масиви -> низ задължителен за използване на функция substring () String maneuverString = tempManeuver; Низови инструкции String = tempInstructions; // Прилагане на протокол тук. За момента поддържа само завои. if (maneuverString.substring (0, 4) == "turn") {// Проверете за тип маневра Serial.print ("TURN DETECTED"); if (инструкцииString.substring (0, 5) == "надясно") {// Проверете конкретни инструкции и покажете съответно u8g2.drawStr (5, 15, "-"); } else if (інструкцииString.substring (0, 4) == "наляво") {// Проверете конкретни инструкции и покажете съответно u8g2.drawStr (5, 15, "<---"); } else u8g2.drawStr (5, 15, "Грешка"); // Невалидно поле за инструкции}/ * Прилагане на други типове маневри (кръгови кръгове и др.) * Else if (tempManeuver == "rdbt") { * *] */ u8g2.drawStr (5, 30, tempDistance); // Показване на оставащото разстояние u8g2.sendBuffer (); // прехвърляне на вътрешна памет към дисплея // Нулиране на всички символни масиви преди следващото четене memset (маневра, 0, 10); memset (инструкции, 0, 10); memset (разстояние, 0, 10); memset (tempManeuver, 0, 10); memset (tempInstructions, 0, 10); memset (tempDistance, 0, 10); // Нулиране на броя на елементите в масиви nbr_char_distance = 0; nbr_char_instructions = 0; nbr_char_maneuver = 0;}

Стъпка 7: Кодът: Android Side

Кодът: Android Side
Кодът: Android Side
Кодът: Android Side
Кодът: Android Side
Кодът: Android Side
Кодът: Android Side

За приложението за смартфон реших да използвам навигационния SDK на Mapbox, тъй като той предлага много полезни функции, когато става въпрос за изграждане на навигационна карта от нулата. Той също така позволява използването на много полезни слушатели, които определено помагат за работата на този модул. Аз също използвах harry1453 android-bluetooth-serial библиотека за android, тъй като направи серийната комуникация по Bluetooth много по-лесна за сглобяване.

Ако искате да създадете това приложение у дома, ще трябва да получите маркер за достъп до Mapbox, който е безплатен до определен брой заявки на месец. Ще трябва да поставите този знак в кода и да изградите приложението от ваша страна. Също така ще трябва да кодирате в собствения си Bluetooth MAC адрес на ESP32.

В сегашното си състояние приложението може да ви отведе от текущото ви местоположение до всяко място, върху което можете да кликнете върху картата. Както бе споменато в интрото, обаче, той не поддържа никакви други маневри освен завои и все още не се справя с извън маршрути.

Можете да намерите целия изходен код на моя github.

Стъпка 8: Какво следва?

Сега, когато приложението е достатъчно функционално, за да насочва потребителя си по определен маршрут (ако няма отклонения от зададения маршрут), основният ми фокус ще бъде да подобря приложението за смартфон и да внедря малкото възможности, които биха направили модула a жизнеспособно навигационно устройство. Това включва активиране на Bluetooth комуникация от телефона, дори когато екранът е изключен, както и поддръжка за други видове маневри (кръгови кръстовища, сливане, …). Ще внедря и функция за пренасочване, ако потребителят се отклони от първоначалния маршрут.

Когато всичко това стане, ще подобря контейнера и механизма му за закрепване, ще го отпечатам 3d и ще се опитам да взема модула за първо стартиране.

Ако всичко върви добре, моята дългосрочна цел е да проектирам персонализирана печатна платка за вградената електроника на този проект, която да спести много място за крайния продукт.

Може да добавя и някои други функции към този модул в бъдеще, включително показване на часа, както и аларма за известие по телефона, която може да накара иконата да се появи, когато потребителят получи текстово съобщение или повикване. И накрая, бих искал да добавя възможности на Spotify към този модул, като огромен фен на музиката. Въпреки това, в този момент, това е само хубаво да имате.

Стъпка 9: Заключение и специални благодарности

Заключение и специални благодарности!
Заключение и специални благодарности!

Както беше посочено в интрото, въпреки че този проект далеч не е завършен, аз наистина исках да го споделя със света, с надеждата да вдъхнови някой друг. Исках също да документирам изследванията си по тази тема, тъй като всъщност няма голям интерес към любителите към AR и HUD, което според мен е срам.

Искам да благодаря на Awall99 и Danel Quintana, чийто проект за разширена реалност ме вдъхнови много при създаването на този модул.

Благодаря на всички за вниманието, със сигурност ще публикувам актуализация, когато този проект се подобри в близко бъдеще. Междувременно ще се видим по -късно!

Препоръчано: