Собираем CarPC на Android: недостроенный долгострой
Моя машина меня устраивает почти всем. Есть практически все, что нужно. В комплектации блютусный телефон, кнопочный климат-контроль, электростеклоподъемники на всех дверях, подогрев сидений, подогрев, регулировка и складывание зеркал, чип-ключ, CD-чейнджер на 6 дисков, но без MP3 и линейного входа. Вот этот прискорбный факт и привел меня к мысли начать собрать свой CarPC на базе андроида. Начал рассматривать варианты и покатился… появилось много идей.
Статья обзорная. Система представлена в общем виде и по каждому компоненту системы я хочу показать свое видение его реализации. Наш carpc может состоять из нескольких девайсов. Отдельные модули, связи между ними я попытался изобразить вот так:
Контроллер
Сердцем системы является “Контроллер”. В его задачи входит получение данных с устройств и датчиков, обработка этих данных и по возможности управление ими. Если установлена связь контроллера и планшета на базе 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 UART, Ethernet. Можно и через 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).
Это решает кучу проблем! Заказал, жду. Позволяет использовать любой девайс на андроиде и стоит довольно дешево. Поэтому я решил использовать его. В качестве интерфейса мне по душе больше старый добрый UART. Также скоро выйдет FT312D для аналогичных задач.
Хотелось бы иметь постоянно включенный GPS с возможностью записей треков на карту памяти, и их периодической синхронизации с дропбоксом… много возможностей для творчества появляется! Треки с хорошим качеством пригодились бы для проекта OpenStreetMaps. Для получения точных треков хотелось бы использовать GPS модуль с поддержкой технологии Dead Reckoning. Использует дополнительные данные от гироскопа, датчика температуры и скорости для уточнения положения в пространстве, калибруется пока сигнал есть, вычисляет положение по сенсорам при потере GPS сигнала.
Есть уже очень достойный проект на базе чипа UBLOX LEA-6R.
Выдает очень неплохие результаты по сравнению с обычным GPS:
Сравнение с треками обычных GPS
Видео работы навигашки с таким GPS.
ТЦ «Бела Дача»
Несколько этажей по парковке
После 2.5км тонеля ушло на 7.5 метров
Еще парковка
С такими точностями по кучности треков в OSM’е скоро и количество полос можно будет посчитать)
На данный момент вроде бы проект подзаглох…
Очень хотелось бы найти подобный открытый проект. Купил такой же чип UBLOX LEA-6R, попытался подключить. Простые GPS данные получаются элементарно, с гироскопом и одометром пока не разбирался.
Заметил, что на хабре есть любители фильтра Калмана. Возможно данная статья подтолкнет интересующихся реализовать подобное на базе контроллера и обычного чипа GPS, статьи помогут с мат. частью)
Неплохо бы еще сохранять данные акселерометра. В дальнейшем по массиву таких данных можно было бы попробовать автоматически наносить на карту лежачие полицейские, опасные ямы и т.д.
Телефон
Блютуса нет в планшете, да и при наличии толку мало. Когда я начал заниматься этим вопросом реализации профиля HFP под андроидом не обнаружил. Можно соединяться с гарнитурой, но в роли гарнитуры андроид-устройство выступать не могло. Для этой задачи можно использовать внешний модуль Bluegiga WT-32.
Позволяет совершать/принимать звонки, следить за параметрами сети, получать историю вызовов, адресную книгу, поддерживает A2DP, AVRCP и много другое. Некоторые наработки описаны тут. Это решение меня полностью устраивает: им можно управлять с помощью контроллера кнопками с руля без использования планшета, работает со всеми телефонами, которые я проверял (современный HTC One X, HTC Desire, дедушка HTC Hero, какой-то древний самсунг, прадедушка Qtek 8310, огрызок прошлого поколения)
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 и нет экрана! Это является для меня существенным плюсом.
Умельцами для него активно пилится кастомная прошивка тут, но политика распространения прошивки не очень нравится, как-то все по-тихому, по почтам, исходников нет… но ребята молодцы! Сильно прокачали функционал этого замечательного девайса.
По 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.
Маленькая коробочка с несколькими разъемами и тремя светодиодами. Поддерживает достаточно много моделей авто различных производителей. Цепляется несколькими проводами и позволяет заводить машинку без ключа. Т.е. нет необходимости оставлять один ключ в машине, чего требуют многие сигнализации с автозапуском и не позволяют многие страховые в базовом договоре на КАСКО.
Хоть автозапуск отдельно отстоит от функционала 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 серии QTouch, QMatrix. Там есть кнопки, слайдеры, круги и вроде бы оно отлично через пластик панели должно работать.
Впрочем этот вопрос решается индивидуально в каждом случае, возможно в каких-то авто есть подходящие крутилки и место под дисплей.
Голосовое управление
По большей части эта задача уже решается в андроиде, там уже есть некоторый функционал, а также видел какие-то сторонние движки для распознавания речи, создания голосовых команд. Честно говоря, если бы не гугловский голосовой поиск, я особо и не захотел бы с этим возится. По моим тестам он распознает достаточно качественно даже разнообразные произвольные команды. Но в идеале хотелось бы хорошую оффлайновую распознавалку. Хочу напомнить, у нас есть очень интересный топик «Распознавание речи на STM32F4-Discovery», поэтому можно попробовать провернуть подобное и силами микроконтроллера.
Не совсем понятно, как из всего потока речи, музыки, шума и посторонних звуков выловить саму команду. На мой взгляд системе нужно дать имя. Допустим будет какой-нибудь Джонни:) Тогда рядом с проскочившем именем в общем потоке речи можно искать ключевые слова команды. Писать в буфер, скажем, 5-10 секунд звука, детектить каким-нибудь эффективным оффлайновым алгоритмом заданное имя, и если поймали, то обрабатывать кусочек до имени и немного после. Посчитанный «отпечаток» фразы отправляем на сервер гугла, получаем строку фразы и ищем ключевые слова, анализируем запрос. Можно реализовать что-то вроде управления тачкой, навигашкой и т.д. фразами в стиле «Джонни, закрой окна», «Джонни, открой багажник», «Джонни, поехали на работу. », «Рули домой, Джонни!».
Если у вас реализован или есть в планах еще и умный дом, то можно их попробовать объединить и обрабатывать команды с учетом того, что можно из машины сделать запрос к дому и наоборот. Например, узнать выключены ли дома электроприборы или сразу обесточить контур всех розеток, включить теплые полы перед приездом, кондей и т.д.
Возможно потребуется реализовать выдачу каких-либо сообщений голосом (например, чтение прилетевших смс). К сожалению, я этим вопросом плотно не занимался, но читалки вроде бы уже давно умеют начитывать текст… можно подобрать что-то и для такой системы.
Питание
По поводу вопроса питания всего этого зоопарка устройств у нас есть отличный топик «Паяем «умный» автомобильный БП. ». Для наших устройств нужно еще 3.3В получить, но как там сказано “по умолчанию модуль KIS-3R33S настроен на 3.3V”. Да и имея стабильный и надежный источник питания в 5V большого труда для нас не составит получить 3.3 прямо на плате, используя какой-нибудь экономичный и надежный DC-DC Step-Down преобразователь или кренку 78L33. Конечно, если садится аккумулятор автомобиля, девайсы нужно отключать, контроль за системой нужен. Возможно есть смысл поставить небольшую батарею резервного питания для критических систем типа автозапуска.
Различные плюшки
Веб-доступ
Конечно, желательно подцепить систему на какой-нибудь сервер. Собирать там статистику, треки, обновлять состояние машины, позволить редактировать настройки, смотреть снимки с камер (если установлены) и т.д. Может даже сделать на нем API для мобильного приложения. Но останавливаться на этом не буду, т.к. это привычная тема для 99% хабражителей и в топике «Автомобильная спутниковая сигнализация на STM32F1» уже был затронут этот вопрос.
Не прощаюсь.
Вроде бы это все, о чем я хотел рассказать. На данный момент этот проект существует в виде отдельных демок, платок, заметок с кусочками кода и висящих на спаянных проводах детальках. По каждому пункту неплохо бы написать небольшой отдельный топик посерьезнее, с техническими подробностями, примерами команд, ссылками на github, разведенными печатными платами и т.д. Пока такого, к сожалению, нет. Надеюсь, дело двинется дальше и нечто подобное появится!
Как сделать автомагнитолу из планшета
Владельцы практически любого автомобиля всегда остаются недовольны функционалом встроенной магнитолы. Это неудивительно, ведь чаще всего производитель ставит такие «магнитофоны» для галочки. По факту штатные устройства могут порадовать, разве что, способностью проигрывать MP3 файлы и возможностью послушать радио. При этом музыка работает то тише то хуже, а иногда магнитола и вовсе отключается.
Чтобы создать полноценный мультимедийный центр, слушать любимые треки, смотреть фильмы, пользоваться камерой заднего вида и навигатором, можно установить множество современных девайсов. Однако намного дешевле использовать обычный планшет 3-4 поколения. Его можно установить самостоятельно или озадачить сотрудников автосервиса.
Самый простой способ использования планшета
Чтобы не мудрить с подключением гаджета вместо заводской магнитолы, многие просто устанавливают устройство поверх нее. На рынке можно найти огромное количество держателей на присосках, которые позволяет легко произвести такой «тюнинг». Остается только подсоединить планшет к прикуривателю и наслаждаться современным девайсом.
Однако держатели – вещь ненадежная, так как планшет может легко отвалиться и разбиться при попадании авто на кочку. Поэтому многое решают установить его вместо магнитолы.
Заменяем планшетом магнитолу (с подключением дополнительного усилителя)
Прежде всего, нужно выбрать «правильный» гаджет. Нет смысла гнаться за слишком дорогостоящими изделиями. Однако планшет должен отвечать нескольким требованиям:
После этого можно переходить к непосредственной установке. Для того это потребуется подготовить:
После этого выполняем следующие манипуляции:
Полезно! Так как планшет большой, лучше всего поставить его как можно выше. Тогда не придется нагибаться, чтобы нажимать кнопки.
В теории все выглядит хорошо, но на практике, далеко не всегда удается так просто интегрировать планшет.
Какие проблемы могут возникнуть
Большинство машин оснащены цифровой CAN-шиной. Поэтому просто поставить планшет не всегда получается. Придется найти способ, как «подружить» гаджет со штатным усилителем. Самый простой вариант приобрести небольшой адаптер AZ-FM. Оно помогает «обмануть» штатную систему, которая начинает видеть планшет в качестве стандартной магнитолы. Но, в этом случае будет недостаточно громкости. Тогда придется все равно ставить дополнительный «усилок». Проще всего использовать для этого любую старую магнитолу. Она подсоединяется к AUX, потом идет на AZ-FM и после этого к штатному усилителю. Но, это слишком длинная цепь. К тому же адаптер стоит не так дешево, порядка 900-1000 рублей.
Тогда можно купить в радиомагазине дополнительный усилитель. Он, безусловно, будет работать, но во время прослушивания музыки появится фон.
Поэтому проще всего разобрать AZ-FM и перепаять на нем сопротивление. Но фон может остаться. Можно попробовать выпаять из планшета провода, выводить массу в разные места. Но все равно дополнительный шум может оставаться, даже если подсоединиться напрямую к аккумулятору. Тогда покупаем фильтр (для автомагнитолы) и шумы исчезают.
Однако планшет, работающий на своем ОС, не станет самостоятельно интегрироваться с автомобильной системой. Поэтому нужно подумать о том, как его настроить.
Программируем планшет
Прежде всего, нужно сделать так, чтобы планет включался после зажигания. Для этого можно воспользоваться полезной утилитой microDroid. Однако в некоторых автомобилях «музыка» должна включаться через несколько секунд после включения двигателя. Поэтому можно воспользоваться более «навороченной» программой Tasker (правда утилита платная, обойдется в 100 рублей). Она позволяет произвести более тонкую настройку включения гаджета.
Также нужно продумать об организации медиа проигрывателя. Можно найти огромное количество скинов и подобрать наиболее удобный для себя. Но, как правило, автовладельцы отдают предпочтение утилитам Astro и Google Music. Второй вариант удобнее, но многие отмечают, что после очередного обновления, программу наделили слишком светлым интерфейсом, из-за чего плейлист и навигация в солнечный день видны намного хуже.
Кто-то для создания плейлистов использует всеми любимый WinAmp и потом закидывает треки на планшет. Однако в этом случае могут возникнуть проблемы с определением времени проигрывания музыки и русскоязычными названиями песен. К слову, такая же проблема нередко возникает и у Google Music. В этом случае можно воспользоваться программами Multi File Translator или TagScanner или аналогичными. Они автоматически переименуют треки, используя латиницу.
Помимо прослушивания музыки, могут возникнуть и другие проблемы. Например, нужно решить, как:
В этом случае оптимальными будут два решения:
Дополнительно можно установить утилиты для контроля систем автомобиля (например, можно вывести диагностику с ELM 327).