Собираем идеальный CarPC на Android

Моя машина меня устраивает почти всем. Есть практически все, что нужно. В комплектации блютусный телефон, кнопочный климат-контроль, электростеклоподъемники на всех дверях, подогрев сидений, подогрев, регулировка и складывание зеркал, чип-ключ, CD-чейнджер на 6 дисков, но без MP3 и линейного входа. Вот этот прискорбный факт и привел меня к мысли начать собрать свой CarPC на базе андроида. Начал рассматривать варианты и покатился… появилось много идей.

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

  • основа нашего CarPC — Android;
  • должен встраиваться в панель и выглядеть как заводской… без всякого колхоза;
  • на борту должен быть блютус для подключения телефона, громкой связи и A2DP;
  • обязателен качественный экран и высокая производительность графики;
  • устанавливаем с минимальным вмешательством в проводку авто;
  • большой HDD или SSD для музыки, навигационных карт, записей с видеорегистраторов и т.д.;
  • синхронизация музыки, когда машина рядом с домом и ловит домашний Wi-Fi;
  • пусть и медленный, но постоянный доступ в интернет.

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

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

Все блоки разделил по степени надежности:

  • Синий — девайсы, которые могут отключиться в любой момент;
  • Оранжевые — девайсы которые должны работать независимо от синих, включаться быстро и быть надежными по возможности. Хотя ничего страшного не случится, если система упадет целиком… с дороги мы не уедем, движок заглохнуть не должен);
  • Черные стрелки — цифровая передача данных;
  • Красные стрелки — аналоговая передача звука;
  • Прерывистая стрелка — WiFi сеть.

Контроллер

Сердцем системы является “Контроллер”. В его задачи входит получение данных с устройств и датчиков, обработка этих данных и по возможности управление ими. Если установлена связь контроллера и планшета на базе Android, то контроллер передает собранные данные более “интеллектуальной” программе андроида, и тогда уже она позволяет изменять настройки контроллера, управлять посредством контроллера другими девайсами.

Немного забегая вперед приведу пример:
Допустим андроид повис, перезагружается или на нем упала управляющая программа. В это время на блютусный модуль с телефона идет входящий звонок. Есть возможность ответить на него кнопкой на руле. И она реализуется контроллером без участия андроида. Т.к. контроллеру доступна информация о состоянии кнопок руля и он видит, что связи с андроидом нет, то он может реализовать такую примитивную функцию как прием вызова по короткому нажатию, отбой по длинному. Если все в порядке и управляющая программа ему отвечает, то он передаст информацию о входящем звонке андроиду, андроид нарисует красивое окошко и можно будет реализовать более удобный функционал средствами самого андроида. О кнопках на руле андроид тоже соответственно будет знать. То же самое касается радио. Переключение каналов и управление громкостью можно осуществить с руля без участия андроида.

В основу контроллера я предполагаю взять камень STM32. Вожусь с платой STM32F4-Discovery, но возможно использовать конечно и другие варианты. Лично мне несколько сложнее писать код на С под STM32 и не так удобно, чем скажем на python или node.js под Raspberry Pi. Но девайс на STM32 более подходящий для этих задач. Логика сравнительно простая и код необходимо написать, грубо говоря, для подключения устройств и обработки простых команд. Плюс, я думаю, контроллер на базе STM32 будет инициализироваться намного быстрее Raspberry Pi.

Планшет

Я выбрал в качестве планшета Amazon Kindle Fire первого поколения. Он у меня давно завалялся и его видимая область экрана хорошо подходит по размерам в 2DIN. Размеры корпуса позволяют воткнуть его без значительных переделок панели в машине. Сравнительно дешевый, имеет качественный экран, достаточно мощный проц и графику. У него нет лишних кнопок! В данном случае это скорее плюс! Есть USB-хост, но, думаю, не стоит его использовать. Так как поддерживается он только в кастомных прошивках и при подключении нескольких девайсов происходили различные плавающие глюки. Стабильной работы не добился…
Думаю, все в курсе что в старом Kindle Fire нет ни 3G, ни GPS, ни блютуса, поэтому для 3G и подключения внешних USB накопителей использую TP-LINK MR3020. Такой вариант несколько избыточен, но пока пусть будет так.

Прошивка

Думаю, не стоит сильно пилить саму прошивку, а то обновлять ее будет проблематично. Хотелось бы весь функционал реализовать чисто приложением. Но все-таки если делать удобно, то можно убрать значок батарейки (или показывать им уровень топлива в баке, заряд аккумулятора). Значок блютуса показывать при подключении к блютус-модулю нашего CarPC телефона и/или A2DP плеера, а также показывать уровень сети подключенного через блютус мобильника. Также неплохо бы подцепить стандартную звонилку андроида к своему блютус модулю.

Связь контроллера с планшетом

Связь с планшетом на андроиде можно реализовать разными способами. Если на борту есть USB-хост, то можно использовать USB<->UARTEthernet. Можно и через Wi-Fi, но хотелось бы иметь надежное проводное подключение. Самым оптимальным вариантом реализации соединения я считаю использование ADK, поддержка которого уже давно реализована даже не в самых свежих версиях андроида. В этом случае подойдет любой планшет и даже мобильный телефон, на который можно поставить управляющий софт, подключить к нему провод от carpc, воткнуть в держатель. К тому же для STM32F4 есть реализация протокола ADK. Собирал и проверял. С планшетом и мобильником тестовый пример работал. Есть глюки, но можно разобраться. На хабре уже есть материал на схожую тему:
Android + Arduino = ♥
Старинное радио на базе Android
USB устройства для Android
Работа с COM портом в Android приложениях
COM порт на Android

Буквально на днях я набрел на чип FT311D от FTDI, который реализует на базе ADK удобный интерфес Андроид <-> (GPIO, UART, PWM, I2C Master, SPI Slave, SPI Master).
image
Это решает кучу проблем! Заказал, жду. Позволяет использовать любой девайс на андроиде и стоит довольно дешево. Поэтому я решил использовать его. В качестве интерфейса мне по душе больше старый добрый UART. Также скоро выйдетFT312D для аналогичных задач.

GPS

Хотелось бы иметь постоянно включенный GPS с возможностью записей треков на карту памяти, и их периодической синхронизации с дропбоксом… много возможностей для творчества появляется! Треки с хорошим качеством пригодились бы для проекта OpenStreetMaps. Для получения точных треков хотелось бы использовать GPS модуль с поддержкой технологии Dead Reckoning. Использует дополнительные данные от гироскопа, датчика температуры и скорости для уточнения положения в пространстве, калибруется пока сигнал есть, вычисляет положение по сенсорам при потере GPS сигнала.

Есть уже очень достойный проект на базе чипа UBLOX LEA-6R.
image

Выдает очень неплохие результаты по сравнению с обычным GPS:
image
Сравнение с треками обычных GPS


Видео работы навигашки с таким GPS.

Еще картинок!

С такими точностями по кучности треков в OSM’е скоро и количество полос можно будет посчитать)
На данный момент вроде бы проект подзаглох…
Очень хотелось бы найти подобный открытый проект. Купил такой же чип UBLOX LEA-6R, попытался подключить. Простые GPS данные получаются элементарно, с гироскопом и одометром пока не разбирался.
Заметил, что на хабре есть любители фильтра Калмана. Возможно данная статья подтолкнет интересующихся реализовать подобное на базе контроллера и обычного чипа GPS, статьи помогут с мат. частью)

Неплохо бы еще сохранять данные акселерометра. В дальнейшем по массиву таких данных можно было бы попробовать автоматически наносить на карту лежачие полицейские, опасные ямы и т.д.

Телефон

Блютуса нет в планшете, да и при наличии толку мало. Когда я начал заниматься этим вопросом реализации профиля HFPпод андроидом не обнаружил. Можно соединяться с гарнитурой, но в роли гарнитуры андроид-устройство выступать не могло. Для этой задачи можно использовать внешний модуль Bluegiga WT-32.
image
Позволяет совершать/принимать звонки, следить за параметрами сети, получать историю вызовов, адресную книгу, поддерживает A2DPAVRCP и много другое. Некоторые наработки описаны тут. Это решение меня полностью устраивает: им можно управлять с помощью контроллера кнопками с руля без использования планшета, работает со всеми телефонами, которые я проверял (современный HTC One X, HTC Desire, дедушка HTC Hero, какой-то древний самсунг, прадедушка Qtek 8310, огрызок прошлого поколения)

Звук

Со звуком на данный момент некоторая неопределенность…
Нужно подобрать необходимые компоненты. Надеюсь на Вашу помощь!
Есть несколько аналоговых источников стерео-звука. Нужно их смешать в один стерео-канал и управлять как общей громкостью, так и громкостью каждого канала в отдельности через цифровой интерфейс. Плюс в машине может быть много динамиков (передние/задние и т.д.). Нужно как-то и это учитывать… Находил для этих задач некоторые готовые микросхемы, но с решением не определился.
Каналы примерно следующие:

  • планшет (оповещения, музыка, навигация, skype, hangouts и т.д.);
  • WT32 (телефон, A2DP музыка);
  • AUX оставить для подключения внешних устройств;
  • внешнее FM-радио (у меня в планшете его нет, да и мне кажется оно должно быть внешним модулем, т.к. управлять им можно и без планшета);
  • плюс возможно кто-то захочет подключить CD-чейнджер или рацию.

Также сигнал от микрофона из машины должен идти к модулю блютуса WT32 и к планшету (skype, hangouts, голосовые заметки и т.д.). Желательно как-нибудь сделать эхоподавление между выходом звука на усилитель и микрофоном. Наверняка есть какое-нибудь готовое решение.

FM-Радио

Пока я использовал примитивный TEA5767. Примеров использования в сети достаточно… вместо нудного и скучного даташита можно начать ознакомление тут FM STEREO Приемник на модуле TEA5767
Как я уже писал, хотелось бы, чтобы он подключался к контроллеру и не зависел от работы андроида, но мог управляться и конфигурироваться через андроид.

Есть также интересная возможность использовать знаменитый RTL2832U.

Кого заинтересует этот чип откроет для себя массу возможностей для реализации множества классных идей. Про него уже есть несколько топиков:
Радиоприемник 60-1700 МГц на RTL2832 за 20 баксов или SDR для начинающих
USB TV-тюнеры на rtl2832 — или как услышать в радиоэфире все за 600 рублей
Правда остается вопрос с его подключением. Т.к. в моем варианте usb порт планшета уже занят. Тогда не совсем понятно, как и куда его подключать. Но если к андроиду подключен USB хаб и обмен с контроллером идет через какой-нибудь модульUSB<->UART, то проблема решаема. Впрочем стабильной работы нескольких устройств через usb-хост на Kindle Fire я не добился…

Видеорегистрация

Прилетел из Кореи BlackVue DR500GW-HD. У него есть GPS, акселерометр, WiFi и нет экрана! Это является для меня существенным плюсом.
image
Умельцами для него активно пилится кастомная прошивка тут, но политика распространения прошивки не очень нравится, как-то все по-тихому, по почтам, исходников нет… но ребята молодцы! Сильно прокачали функционал этого замечательного девайса.
По WiFi живое видео с камеры и записанные ролики можно смотреть через андроид, сохранять их. Думаю не очень сложно написать софт, чтобы автоматически выкачивать с регистратора GPS треки, данные акселерометра и даже видео, если скорость WiFi позволит.

Для камеры заднего вида можно приспособить даже вебку. Подключить через Raspberry Pi или какой-нибудь DIR320, MR3020 к сети. В самом простом случае смотреть через браузер)

Вообще было бы очень неплохо иметь хороший механизм подключения нескольких видеорегистраторов к своей системе для записи видео сразу на жесткий диск. Что-то типа промышленного видеорегистратора для видеонаблюдения.
В этом плане меня очень обнадеживает проект Virt2real. Мне кажется, он не совсем подходит для такой задачи, но раз наработки есть, то возможно кто-нибудь запилит более специфичный девайс с конкретной задачей сбора видео с нескольких выносных камер (встречал в видеорегистраторах выносные HDMI камеры) на HDD, доступом к архиву и управлением через Ethernet, своим API и/или SDK для сторонних приложений, открытой прошивкой и по приемлемой цене! В общем есть над чем работать)

Еще была мысль сделать нечто вроде прокси SD-карты, т.е. подключить видеорегистратор вместо SD карты к ПЛИСке или процессору, который бы реализовал интерфейс карты памяти, но писал данные по сети в расшаренную папку или через SATA на HDD. Но это не так просто и сам этим заниматься не рискнул. Из готовых вариантов практически ничего не попадалось. Есть www.eye.fi/, но в данном случае это не подойдет. Соединение желательно проводное, не факт, что она будет стабильно держать поток в 10-15Мб/с. С помощью таких девайсов можно было бы направить запись с нескольких видеорегистраторов на один винч.

Также у нас есть топик «Автомобильная спутниковая сигнализация на STM32F1», там очень много интересных идей. И идея насчет камер на базе STM32F4 очень впечатлила.

Автозапуск

Хотелось бы предусмотреть возможность автозапуска. Решения разные для каждого авто, но в моем случае подходит обходчик иммобилайзера Fortin EVO-ALL.
image
Маленькая коробочка с несколькими разъемами и тремя светодиодами. Поддерживает достаточно много моделей авто различных производителей. Цепляется несколькими проводами и позволяет заводить машинку без ключа. Т.е. нет необходимости оставлять один ключ в машине, чего требуют многие сигнализации с автозапуском и не позволяют многие страховые в базовом договоре на КАСКО.
Хоть автозапуск отдельно отстоит от функционала CarPC, но сигнализации с автозапуском у меня нет и не хочется устанавливать. Это не удобно, а в плане защиты авто я больше надеюсь на КАСКО от угона. Поэтому выдать сигнал на запуск должен контроллер по смске с шифрованной командой, либо по звонку с определенного номера в самом простейшем случае. Много различных вариантов можно придумать. Для этого лучше бы прикрутить GSM модуль к контроллеру. Я думаю, это надежнее, чем канал связи через интернет. В памяти контроллера или на SD-карте можно хранить конфиг, в котором будет определяться последовательность действий после успешного запуска. Летом включаем кондей, зимой обдув лобового стекла, подогрев стекол/зеркал, руля, сиденья водителя и т.д. Этот конфиг андроид может изменять и сохранять в память контроллера. Хотелось бы отправить конфиг в дропбокс и заливать в контроллер автоматом программой на планшете.

Контроль давления в шинах — TPMS

Давно не следил за темой, но помнится, были наработки, позволяющие получить данные в свой девайс от уже существующих на рынке систем:
Контроль давления в шинах (USB TPMS)
Custom USB tyre pressure monitoring interface
Наткнулся на интересную штуку от TI.

Маленький специализированный модуль для этих задач TX-Module TPIC82000 Series, обещают “Over 10 year life with 550mAhr Li-Coin battery” в продаже не нашел, но хотелось бы повозиться.

Дополнительные кнопки, разъемы

Честно говоря, есть очень большое желание их избежать вовсе… тех штатных кнопок, что стоят на руле и консоли скорее всего вполне хватит, никаких дополнительных самодельных крутилок и кнопок не хочется, т.к. вряд ли их можно будет сделать качественно. У Kindle Fire кнопка всего одна, и та не всегда нужна. В каждом авто есть какая-нибудь неприметная панелька, туда можно установить “сервисные” кнопки и разъемы. Они нужны крайне редко. Если же все-таки есть необходимость использовать аппаратные кнопки, то на мой взгляд лучше их сделать сенсорными и расположить прямо под пластиком панели. Можно использовать специализированные контроллеры Atmel серии QTouchQMatrix. Там есть кнопки, слайдеры, круги и вроде бы оно отлично через пластик панели должно работать.
image
Впрочем этот вопрос решается индивидуально в каждом случае, возможно в каких-то авто есть подходящие крутилки и место под дисплей.

Голосовое управление

По большей части эта задача уже решается в андроиде, там уже есть некоторый функционал, а также видел какие-то сторонние движки для распознавания речи, создания голосовых команд. Честно говоря, если бы не гугловский голосовой поиск, я особо и не захотел бы с этим возится. По моим тестам он распознает достаточно качественно даже разнообразные произвольные команды. Но в идеале хотелось бы хорошую оффлайновую распознавалку. Хочу напомнить, у нас есть очень интересный топик «Распознавание речи на STM32F4-Discovery», поэтому можно попробовать провернуть подобное и силами микроконтроллера.
Не совсем понятно, как из всего потока речи, музыки, шума и посторонних звуков выловить саму команду. На мой взгляд системе нужно дать имя. Допустим будет какой-нибудь Джонни:) Тогда рядом с проскочившем именем в общем потоке речи можно искать ключевые слова команды. Писать в буфер, скажем, 5-10 секунд звука, детектить каким-нибудь эффективным оффлайновым алгоритмом заданное имя, и если поймали, то обрабатывать кусочек до имени и немного после. Посчитанный «отпечаток» фразы отправляем на сервер гугла, получаем строку фразы и ищем ключевые слова, анализируем запрос. Можно реализовать что-то вроде управления тачкой, навигашкой и т.д. фразами в стиле «Джонни, закрой окна», «Джонни, открой багажник», «Джонни, поехали на работу…», «Рули домой, Джонни!».
Если у вас реализован или есть в планах еще и умный дом, то можно их попробовать объединить и обрабатывать команды с учетом того, что можно из машины сделать запрос к дому и наоборот. Например, узнать выключены ли дома электроприборы или сразу обесточить контур всех розеток, включить теплые полы перед приездом, кондей и т.д.

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

Питание

По поводу вопроса питания всего этого зоопарка устройств у нас есть отличный топик «Паяем «умный» автомобильный БП…». Для наших устройств нужно еще 3.3В получить, но как там сказано “по умолчанию модуль KIS-3R33S настроен на 3.3V”. Да и имея стабильный и надежный источник питания в 5V большого труда для нас не составит получить 3.3 прямо на плате, используя какой-нибудь экономичный и надежный DC-DC Step-Down преобразователь или кренку 78L33. Конечно, если садится аккумулятор автомобиля, девайсы нужно отключать, контроль за системой нужен. Возможно есть смысл поставить небольшую батарею резервного питания для критических систем типа автозапуска.

Различные плюшки

Поскольку у нас есть возможность подключиться к машине, то мы может получать от нее данные и частично управлять ей. Можно реализовать вещи, которые есть не в каждой машине. Например:

  • автоматическое складывание/раскладывание зеркал при блокировке/разблокировке машины с брелка;
  • опускание зеркал чуть вниз при включении задней передачи;
  • поднятие стекол дверей при блокировке;
  • блокировка дверей при наборе скорости свыше 20 км/ч;
  • блокировка открывания багажника кнопкой снаружи при заведенном двигателе;
  • умное управление светом;
  • вывод на экран андроида различных параметров двигателя;

Веб-доступ

Конечно, желательно подцепить систему на какой-нибудь сервер. Собирать там статистику, треки, обновлять состояние машины, позволить редактировать настройки, смотреть снимки с камер (если установлены) и т.д. Может даже сделать на нем API для мобильного приложения. Но останавливаться на этом не буду, т.к. это привычная тема для 99% хабражителей и в топике «Автомобильная спутниковая сигнализация на STM32F1» уже был затронут этот вопрос.

Не прощаюсь…

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

Собираем идеальный CarPC на Android
Tagged on:             

Добавить комментарий