Оглавление:

Прототип Smart Motorcycle HUD (пошаговая навигация и многое другое): 9 шагов
Прототип Smart Motorcycle HUD (пошаговая навигация и многое другое): 9 шагов

Видео: Прототип Smart Motorcycle HUD (пошаговая навигация и многое другое): 9 шагов

Видео: Прототип Smart Motorcycle HUD (пошаговая навигация и многое другое): 9 шагов
Видео: Лучшие умные шлемы на рынке 2024, Июль
Anonim
Прототип Smart Motorcycle HUD (пошаговая навигация и многое другое)
Прототип Smart Motorcycle HUD (пошаговая навигация и многое другое)
Прототип Smart Motorcycle HUD (пошаговая навигация и многое другое)
Прототип Smart Motorcycle HUD (пошаговая навигация и многое другое)
Прототип Smart Motorcycle HUD (пошаговая навигация и многое другое)
Прототип Smart Motorcycle HUD (пошаговая навигация и многое другое)
Прототип Smart Motorcycle HUD (пошаговая навигация и многое другое)
Прототип Smart Motorcycle HUD (пошаговая навигация и многое другое)

Привет !

Эта инструкция - это история о том, как я спроектировал и построил платформу HUD (Heads-Up Display), предназначенную для установки на мотоциклетных шлемах. Это было написано в рамках конкурса «Карты». К сожалению, я не смог полностью завершить этот проект к крайнему сроку конкурса, но я все же хотел поделиться своим прогрессом в нем, а также задокументировать все попытки и ошибки, которые я сделал при его выполнении.

Идея этого проекта впервые пришла мне в голову несколько лет назад, когда я увлекся мотоциклами, и я начал думать, какое снаряжение мне нужно купить, чтобы поездка стала более приятной. В то время меня озадачило, что лучший способ получить базовую GPS-навигацию во время езды - это просто прикрепить свой смартфон к рулю велосипеда. Я подумал, что наверняка может быть лучший способ получить такую информацию на лету.

Вот когда я понял: хедз-ап дисплей может быть способом получить навигацию во время езды, не разряжая аккумулятор вашего телефона и не подвергая его воздействию элементов.

Со временем эта идея созрела в моем сознании, и я подумал, что наличие HUD передо мной в любое время позволит использовать гораздо больше, чем простая навигация. Вот почему я планирую сделать платформу общедоступной и модульной, чтобы каждый мог создать модуль, отображающий необходимую информацию на собственном HUD.

Хотя есть коммерчески доступные продукты, которые решают эту задачу, нет таких, которые были бы столь же модульными, как моя платформа, и к тому же они, как правило, были немного дорогими. В любом случае, добро пожаловать в этот проект.

Что работает на данный момент

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

- Связь между смартфоном и платой на базе ESP32 (телефон в спящем режиме)

- Дизайн оптики выполнен (в долгосрочной перспективе могут потребоваться небольшие корректировки)

- Приложение для навигации для Android с использованием SDK для навигации Mapbox:

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

- Возможность подключения к устройству Bluetooth (MAC-адрес устройства на данный момент жестко задан)

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

Что нужно поработать

Этот список содержит элементы, которые абсолютно необходимы для предполагаемого использования HUD, но еще не готовы к реализации.

- Общий дизайн (крепление шлема, механизм регулировки угла отражателя и т. Д.)

- Приложение для Android:

- Внедрить обнаружение и коррекцию отклонения от маршрута

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

- Путевые точки?

- Эргономика / эстетика

Запасы:

Основы

- Плата для разработки на основе esp32

- Любой сравнительно недавний смартфон на базе 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, а также несколько других интересных спецификаций (простое в использовании энергонезависимое хранилище, двухъядерный ЦП, достаточно оперативной памяти для фактического управления OLED-дисплеем через I2C,…). Спроектировать печатные платы на основе ESP32 относительно просто, что я и принял во внимание. У меня также есть профессиональный опыт использования и проектирования схем с ESP32, что определенно повлияло на мой выбор.

Выбор экрана в основном сводился к тому, что я мог найти, который, по моему мнению, будет достаточно ярким для использования, но при этом будет как можно меньше. Меня не очень беспокоило количество пикселей на экране, поскольку моей целью было получить очень минималистичный и простой пользовательский интерфейс.

Следует отметить, что драйвер экрана должен поддерживаться библиотекой, позволяющей зеркальное отображение изображения. Это связано с тем, что отображаемое изображение переворачивается, когда оно проходит через линзу и появляется на отражателе, и отсутствие необходимости вручную переворачивать отображаемое изображение - это огромный груз для наших строителей.

Шаг 3: Детали - оптика: в поисках компромисса

Запчасти - Оптика: в поисках компромисса
Запчасти - Оптика: в поисках компромисса
Запчасти - Оптика: в поисках компромисса
Запчасти - Оптика: в поисках компромисса
Запчасти - Оптика: в поисках компромисса
Запчасти - Оптика: в поисках компромисса

Подойти к оптике для этого проекта было довольно сложно, так как я даже не знал, что я ищу, когда только начинал этот проект. После некоторого исследования я понял, что хочу создать «виртуальное изображение» моего OLED-экрана, которое будет находиться дальше от глаза, чем оно есть на самом деле. Идеальное расстояние для формирования этого виртуального изображения должно быть примерно 2-5 метров перед водителем, то есть это расстояние до объектов, на которых мы фокусируемся во время вождения (другие автомобили, неровности на дороге и т. Д.)).

Для достижения этой цели я решил использовать линзы Френеля, так как они довольно большие, дешевые, они, кажется, предлагают достаточно хорошее фокусное расстояние для моего проекта, и их можно разрезать простыми ножницами (что не относится к более изысканные стеклянные линзы круглой формы). У линз Френеля можно найти такие названия, как «карманная лупа» или «лупа для чтения карт», поскольку они очень подходят, чтобы помочь людям с плохим зрением читать.

По сути, весь фокус здесь был в том, чтобы найти правильный компромисс между:

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

- Текст на экране не должен быть слишком увеличен линзой (которая, по сути, является лупой)

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

Я лично заказал на Amazon несколько разных объективов и определил их соответствующие фокусные расстояния, прежде чем выбрать один с длиной F около 13 см. Я обнаружил, что эта длина F. с расстоянием между линзами OLED в 9 см дала мне удовлетворительное изображение на моем отражателе (см. Несколько последних изображений выше).

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

Здесь вы можете найти 3d-файлы для держателя объектива.

Шаг 4: Детали - контейнер для их всех

Детали - вместилище их всех
Детали - вместилище их всех
Детали - вместилище их всех
Детали - вместилище их всех

Пока я пишу этот Instructables, фактический контейнер, который будет содержать каждую часть проекционного дисплея, не совсем спроектирован. Однако у меня есть несколько идей о его общей форме и о том, как решать определенные проблемы (например, как удерживать отражатель неподвижно и выдерживать его скорость ветра со скоростью 100+ км / ч). Это все еще очень большая работа.

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

Чтобы отправить инструкции по навигации с телефона на доску разработки, мне пришлось придумать собственный протокол связи, который позволил бы мне легко отправлять необходимые данные с телефона, а также облегчил их обработку после получения.

На момент написания этих инструкций информация, которую необходимо было передать с телефона для навигации с помощью модуля, была:

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

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

- Расстояние до предстоящего маневра (пока в метрах)

Я решил организовать эти данные, используя следующую структуру кадра:

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

Это не очень красивое решение, но позволяет нам легко разделять и различать каждое поле нашего протокола, что облегчило кодирование на стороне ESP32.

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

Шаг 6: Код: сторона ESP32

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

Код для ESP32 в настоящее время довольно прост. Он использует библиотеку U8g2lib, которая позволяет легко управлять OLED-экраном (одновременно обеспечивая зеркальное отображение отображаемого изображения).

По сути, все, что делает ESP32, - это получает последовательные данные через Bluetooth, когда приложение отправляет их, анализирует и отображает эти данные или изображения на основе этих данных (т. Е. Отображает стрелку вместо предложения «повернуть налево / направо»). Вот код:

/ * Программа для управления HUD из приложения Android через последовательный 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_NONE); // Конечный автомат Detected_field values + variable # define maneuverField 1 # define instructionsField 2 # define distanceField 3 # define endOfFrame 4inthibited_field = endOfFrame; BluetoothSerial serialBT; // Объект для Bluetooth char 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; логическое полное предложение = false; void setup () {Serial.begin (9600); // Запуск последовательного монитора со скоростью 9600 бод u8g2.begin (); // Инициируем управление OLED serialBT.begin ("ESP32_BT"); // Имя задержки сигнала Bluetooth (20); Serial.println ("Устройство Bluetooth готово к сопряжению");} void loop () {if (serialBT.available () &&! Fullsentence) // Персонажи принимаются через последовательный порт Bluetooth {incoming_char = serialBT.read (); Serial.print ("Получено:"); Serial.println (incoming_char); } переключатель (обнаруженное_поле) {case maneuverField: Serial.println ("Обнаруженное поле: маневр"); if (incoming_char == '.') // Обнаружено следующее поле {detect_field = instructionsField; } else {// Заполняем массив информации о типе маневра maneuver [nbr_char_maneuver] = incoming_char; nbr_char_maneuver ++; } перерыв; case InstructionsField: Serial.println («Обнаруженное поле: инструкции»); if (incoming_char == ',') // Обнаружено следующее поле {detect_field = distanceField; } else {// Заполняем массив инструкций, массив инструкций [nbr_char_instructions] = incoming_char; nbr_char_instructions ++; } перерыв; case distanceField: Serial.println ("Обнаруженное поле: расстояние"); if (incoming_char == ';') // Обнаружен конец кадра {detect_field = endOfFrame; Serial.print ("маневр:"); Serial.println (маневр); Serial.print ("инструкции:"); Serial.println (инструкция); Serial.print ("расстояние:"); Serial.println (расстояние); полное предложение = правда; update_Display (); // Получен полный кадр, проанализирован и отображены данные получателя} else {// Заполнение массива информации о расстоянии distance [nbr_char_distance] = incoming_char; nbr_char_distance ++; } перерыв; case endOfFrame: if (incoming_char == ':') detect_field = maneuverField; // Обнаружен новый фрейм break; default: // Ничего не делать break; } delay (20);} void update_Display () {// Кэшируем каждый массив символов, чтобы избежать возможных конфликтов memcpy (tempManeuver, maneuver, nbr_char_maneuver); memcpy (tempInstructions, инструкции, nbr_char_instructions); memcpy (tempDistance, distance, nbr_char_distance); parseCache (); // Разбираем и обрабатываем массивы символов fullsentence = false; // Предложение обработано, готово к следующему} void parseCache () {u8g2.clearBuffer (); // очищаем внутреннюю память u8g2.setFont (u8g2_font_ncenB10_tr); // выбираем подходящий шрифт // массивы символов -> строка, обязательная для использования substring () function String maneuverString = tempManeuver; Строковые инструкцииString = tempInstructions; // Реализация протокола здесь. Пока поддерживает только повороты. if (maneuverString.substring (0, 4) == "поворот") {// Проверяем тип маневра Serial.print ("ОБНАРУЖЕН ОБНАРУЖЕНИЕ"); if (instructionsString.substring (0, 5) == "right") {// Проверяем конкретные инструкции и отображаем соответственно u8g2.drawStr (5, 15, "-"); } else if (instructionsString.substring (0, 4) == "left") {// Проверяем конкретные инструкции и отображаем соответственно u8g2.drawStr (5, 15, "<---"); } else u8g2.drawStr (5, 15, "Err."); // Неверное поле инструкций} / * Реализуйте другие типы маневров (круговые движения и т. Д.) * Else if (tempManeuver == "rdbt") {* *] * / u8g2.drawStr (5, 30, tempDistance); // Отображаем оставшееся расстояние u8g2.sendBuffer (); // перенос внутренней памяти на дисплей // Сброс всех массивов символов перед следующим чтением memset (maneuver, 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

Код: сторона Android
Код: сторона Android
Код: сторона Android
Код: сторона Android
Код: сторона Android
Код: сторона Android

Для приложения для смартфона я решил использовать SDK навигации Mapbox, поскольку он предлагает множество полезных функций, когда дело доходит до создания навигационной карты с нуля. Это также позволяет использовать множество полезных слушателей, которые определенно помогают в работе этого модуля. Я также использовал библиотеку android-bluetooth-serial от harry1453 для Android, так как она упростила последовательную связь Bluetooth.

Если вы хотите создать это приложение дома, вам понадобится токен доступа Mapbox, который предоставляется бесплатно до определенного количества запросов в месяц. Вам нужно будет вставить этот токен в код и создать приложение на своей стороне. Вам также необходимо будет ввести свой собственный MAC-адрес Bluetooth ESP32.

В его нынешнем виде приложение может направить вас из вашего текущего местоположения в любое место, на которое вы можете щелкнуть на карте. Однако, как упоминалось во вступлении, он не поддерживает никаких других маневров, кроме поворотов, и еще не справляется с отклонениями от маршрута.

Вы можете найти весь исходный код на моем гитхабе.

Шаг 8: Что дальше?

Теперь, когда приложение достаточно функционально, чтобы на самом деле направлять пользователя по заданному маршруту (если нет отклонений от заданного маршрута), я сосредоточусь на улучшении приложения для смартфона и реализации тех немногих возможностей, которые сделали бы модуль удобным. жизнеспособное навигационное устройство. Это включает в себя включение связи Bluetooth с телефона даже при выключенном экране, а также поддержку других типов маневров (круговое движение, слияние и т. Д.). Я также буду реализовывать функцию перенаправления, если пользователь отклоняется от исходного маршрута.

Когда все это будет сделано, я улучшу контейнер и механизм его крепления, напечатаю его на 3D-принтере и попробую взять модуль для первого запуска.

Если все пойдет хорошо, моя долгосрочная цель - разработать специальную печатную плату для встроенной электроники этого проекта, которая позволила бы сэкономить много места на конечном продукте.

Я мог бы также добавить некоторые другие функции к этому модулю в будущем, в том числе отображение времени, а также будильник с телефонным уведомлением, который может отображать значок, когда пользователь получает текстовое сообщение или звонок. Наконец, я хотел бы добавить в этот модуль возможности Spotify, как большой меломан. Однако на данный момент это только хорошо.

Шаг 9: Заключение и особая благодарность

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

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

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

Спасибо всем за внимание, я обязательно опубликую обновление, когда этот проект будет улучшен в ближайшем будущем. А пока увидимся позже!

Рекомендуемые: