Блютуз на руль автомобиля
Bluetooth в автомобиле с контроллером кнопок на руле
Приветствую друзья. Давайте, кидайте в меня камнями завистники, но я это сделал! Машина заводится, музыка с смартфона начинает играть, машина глушится – музыка в смартфоне встает на паузу. При этом можно перелистывать треки КНОПКАМИ НА РУЛЕ. «Ятур» больше не нужен – любимая музыка всегда с тобой – дома, в кармане, в машине. Смелое заявление? По другому невозможно описать как я рад, что наконец-то дописал этот бесконечный роман, который не влез целиком в одну запись.
Вот представьте: у Вас есть смартфон, на который Вы без ограничений скачиваете любимую музыку. Но что-бы послушать эту музыку в машине Вам нужно “перекинуть” ее на CD/DVD диск, на “флешку”, в медиаплейер или mp3-адаптер (Yatour и т.п.). Конечно, кому-то не трудно возить с собой стопки mp3-дисков, “засирать эфир” FM-трансмиттерами и вручную переименовывать папки с музыкой (иначе медиаплейер или mp3-адаптер часто их “не видят”). На мой взгляд, все это лишний посредник между источником музыки и автомобилем. А если идет речь об Интернет-радио? Тут смартфону практически нет альтернативы, особенно если учесть, что он “всегда с тобой”.
Это продолжение разработки контроллера управления музыкой в автомобиле воспроизводимой смартфоном посредством Bluetooth, с управлением резистивными кнопками на руле. Начало здесь.
Теперь, садимся в машину – смартфон подключается и начинает играть музыка. Выходим из машины – музыка в смартфоне становится на паузу. При этом смартфон не нужно доставать из кармана вообще. Даже треки можно переключать кнопками на руле!
Отличительные особенности устройства:
Bluetooth. Используется Китайский модуль XS3868 Ver. 3.0, позволяющий помимо воспроизведения музыки еще и управлять медиаплеером в смартфоне прикидываясь Bluetooth-гарнитурой.
ATmega8A. Именно такой контроллер позволил в полной мере реализовать все задуманное в полном объеме, оставив запас ресурсов для улучшения и обновления устройства.
UART. Общение микроконтроллера с модулем происходит по линии UART посредством AT-команд, что позволило значительно расширить возможности устройства в сравнении с “кнопочным” управлением. При этом линия UART микроконтроллера гальванически развязана с Bluetooth-модулем.
DC-DC. Для питания Bluetooth-модуля применен изолированный DC-DC преобразователь, что позволило значительно снизить шумы и помехи в усилителе автомобиля от в/ч передатчика модуля и бортовой сети самого автомобиля.
USBASP. Несложный и дешевый программатор может использоваться для самостоятельного обновления прошивки.
Звук. Качество звука ничем не отличается от обычной автомобильной mp3-магнитолы, медиаплейера или mp3-адаптера (типа популярного Yatour), а с FM-трансмиттером не стоит даже сравнивать. Понятное дело, что истинных “аудиофилов”, “дрожащих от джиттера” на почти каждой CD-юшке, воротит от слова “эмпэтри”, но стоит признать, что этот формат сжатия музыки не спроста очень популярен и на сегодняшней день доступен каждому.
Аудиовыход. Выход звука модуля отделен от общей шины питания, что позволило реализовать несложную схему универсального подключения как к обычному линейному входу усилителя, так и к балансному. Керамические конденсаторы на выходе не просто “подгон аудиофилам” – с ними действительно лучше звучит.
Autoconnect. Алгоритм автоматического соединения разработан для наиболее быстрого и неизбежного соединения с смартфоном появившемся в радиусе действия Bluetooth-модуля и заранее с ним сопряженным – микроконтроллер будет заставлять модуль соединяться с смартфоном до тех пор, пока смартфон “лично” не подтвердит факт установки соединения.
Надежность соединения. Микроконтроллер устройства непрерывно опрашивает модуль и контролирует реакцию модуля на посланный запрос, не давая модулю зависнуть или уйти в “спячку”. Таким образом Bluetooth-модуль всегда “на позитиве” или в “активном поиске”.
Радиус действия. Зависит от двух факторов – качества Bluetooth-модуля в смартфоне и места установки платы устройства в автомобиле. Например, Китайский Homtom HT7 Pro прекрасно работает в радиусе до 3м во круг автомобиля, при условии установки платы на внутренней стороне пассажирской стороны передней консоли.
Autoplay. Алгоритм автоматического старта воспроизведения музыки после установки надежного канала связи смартфона с Bluetooth-модулем. Можно отключить перемычкой-джампером на плате. После выключения модуля смартфон автоматически переводится в режим паузы воспроизведения если музыка играла и при повторном подключении музыка начнет играть с того-же места.
Звуковые сигналы. Все, что происходит с модулем и микроконтроллером подтверждается различными звуковыми сигналами – модуль “пиликает” в эфир, микроконтроллер, пикает встроенным на плату зуммером. Встроенный зуммер можно отключить перемычкой-джампером.
Android. 100%-я совместимость проверена с смартфонами на Android 2.3, Android 4, Android 5.1, Android 6. Проверены смартфоны почти всех “именитых” брендов Samsung, LG, Sony, HTC, а также Китайские поделки Star 15i, Dexp, Homtom HT7 Pro, Lenovo. Производитель модуля XS3868 “мамой” клянется о совместимости со всеми “девайсами” где есть возможность подключения Bluetooth-гарнитуры независимо от типа операционной системы.
Handsfree. В этой версии контроллера нет и не будет.
В ходе разработки контроллера я перепробовал 3 вида разных модулей и на XS3868 Ver.3.0 остановился только потому, что на него была хоть какая-то внятная информация от производителя — схемы подключения, управляющие команды. На мой взгляд модуль еще нужно дорабатывать и дорабатывать потому, что в нем полно косяков и прочего неадеквата. Как показала практика, он крайне ненадежен и нестабилен поэтому, чтобы заставить его отрабатывать на 100% пришлось неоднократно сделать сальто через голову назад с паяльником в руках.
Модуль XS3868 разработан для применения в мобильных устройствах, соответственно питается «мобильным» напряжением 3.6-4.2В. Пробовал питать модули напряжением 5В и они работали… недолго. Поэтому, после DC-DC 5В-5В преобразователя стоит линейный LDO стабилизатор на 3.3В. В идеале, конечно, лучше сразу применить преобразователь 5В-3.3В, но он совершенно непопулярен у Китайцев, поэтому стоит как киловаттный трансформатор.
Необходимость в DC-DC преобразователе возникла по причине проникновения помех от бортовой сети автомобиля в звуковую часть модуля, которые соответственно воспроизводились автомобильным аудио-усилителем. Т.е. фон в колонках подвывал в такт оборотам двигателя. Никакие известные мне способы фильтрации не помогали, также не решил проблему буферный усилитель из «даташита». Стоит отметить, что DC-DC преобразователь должен быть обязательно изолированным.
Транзистор в цепи питания DC-DC преобразователя нужен для организации сброса модуля при его неадекватной работе. Например, модуль может перестать отзываться на входящие команды по UART, при этом продолжать воспроизводить музыку. Или он может самопроизвольно начать бесконечный цикл поиска нового устройства, при этом не находя смартфон «у себя под носом». Но самый крутой косяк — он может уйти в спячку после нескольких минут простоя и вывести его из этого состояния программным сбросом невозможно! Кроме того, модуль совершенно не реагирует на лог. состояние ноги RESET.
Модули также оказались беспомощными перед статическим электричеством — они умудрялись «сгорать» даже при присоединении аудио разъема. Просто начинали хрипеть в один канал и «жрать» по 200мА. Один модуль изначально приехал нерабочим. В результате, на данный момент, имеем уже 3 безполезняшки – один раненый, другой контуженный третий родился уродом. Продолжаем битву за радиосвязь.
Изначально предполагалось управлять модулем путем имитирования нажатий кнопок PLAY, BACK и NEXT, но в присланный мне модуль оказался бракованным – не реагировал на нажатие кнопки PLAY. Кроме того, оказалось, что модуль передает и может принимать команды управления по UART-интерфейсу, что существенно облегчило задачу и расширило возможности управления. В итоге микроконтроллер общается с модулем всего по двум проводкам RXD и TXD, а функциональность устройства в целом определяется только программой микроконтроллера.
В дополнение ко всему еще и модуль перестал петь! Просто перестал, греется как утюг и не поет. Что тут скажешь, тернист «путь к истине» – заказал новый. Прошел месяц…
Естественно сразу ничего не заработало, пришлось как следует вникнуть в тему, но зато удалось придумать идеальный алгоритм приема данных UART. Не стану углубляться в подробности устройства управляющей программы МК потому, что исходник постарался хорошо прокомментировать и выкладываю в свободный доступ. Такой, своеобразный, подарок «чисто от меня». Делаю так потому, что сам вчера был начинающим «программастом» и учился на таких же исходниках, поэтому знаю им цену и сознательно жертвую все исходные данные в пользу начинающих радиолюбителей. Так сказать, возвращаю должок, ибо равновесие мира держится на истине: берешь чужое, возвращаешь свое.
Вообще, установить надежный канал связи с модулем оказалось проблемой по причине того, что в данном тандеме имеет место быть т.н. «паразитная запитка». Это такое явление, когда питание одного из участвующих в тандеме устройств не подключено, но устройство работает и даже пытается общаться по RXD-TXD линии. Типичному «микроконтроллерщику» прочтенное сейчас, наверное, глаза порезало, но тот, кто в 90-х соединял два ПК через COM-порты не только для игры в Quake, должен быть «в теме». Для защиты от такого неприятного явления давно используется простая хитрость на диоде и подтягивающем резисторе вывода TXD «косячного» устройства – в данном случае модуля Bluetooth.
Но так было до того как я применил DC-DC преобразователь для питания модуля. После этого появилась новая проблема — необходимость гальванической развязки цепей управления RXD и TXD. Для чего я применил оптроны. Да не простые, а высокоскоростные (с транзистором) 6N136 потому, что «по умолчанию» модуль почему-то настроен на передачу данных по UART на высокой скорости — 115200 бод и а-бы какой оптрон не подойдет (сказки слагать уже начал).
В начале исполняемой программы все понятно — подготовка к старту основного текста программы: конфигурируем порты и АЦП, объявляем переменные и прерывания. Потом подготовка локальных переменных и небольшая пауза перед новым стартом модуля.
Состояние подключения и контроль управления смартфоном управляющая программа МК осуществляет по состоянию профилей A2DP (Advanced Audio Distribution Profile) и AVRCP (Audio/Video Remote Control Profile). Профиль Hands-Free Profile (HFP) не используется по тому, что в устройстве изначально не планировался режим громкой связи по причине того, что данный модуль не может физически обеспечить качественную работу с салонным микрофоном. Для того. что-бы «звонить» и принимать входящие вызовы на смартфон, нужно в настройках соединения с модулем убрать галочку с пункта «Профиль HSP/HFP», тогда музыка будет автоматически ставиться на паузу на время разговора.
Сопряжение выполняется в обычном порядке, как и с любым др. Bluetooth-устройством. Пароль для сопряжения: 0000 или 1234, имя устройства: POR 1007BT. Сопряжение нужно выполнить один раз, после чего смартфон будет самостоятельно подключаться к модулю устройства каждый раз, когда окажется в зоне «доступности». Управляющая программа МК заставляет модуль постоянно сканировать «эфир» на предмет наличия в зоне видимости заранее сопряженного смартфона. Если в течении нескольких минут модуль не находит «жертву», то он обижается и уходит в глухую оборону. И из этого состояния его разумными средствами вывести невозможно — не помогает даже физическое «дерганье» ноги RESET. Поэтому, если модулю не удается соединиться с смартфоном в течении определенного времени или он норовит уйти в спячку (о чем он, кстати, вежливо предупреждает) он сбрасывается и цикл установки соединения запускается заново.
Управляющая программа МК подразумевает использование резистивных кнопок на руле. На сколько мне известно, такой способ применяют 9 из 10 производителей автомобилей в попытке сэкономить пару проводников на рулевом шлейфе. Для считывания состояния кнопок входы АЦП микроконтроллера подключены параллельно штатному блоку управления. Опрос значения АЦП производится в подпрограмме основного цикла. Для фильтрации ложных срабатываний, помимо конденсаторов на входах АЦП, в подпрограмме обработки значения АЦП применен простой алгоритм многократного повторного считывания значения. Дело в том, что в «мега» AVR-ках есть такой косяк (один из многих) — первое считанное значение АЦП всегда завышено и соответственно неверно. При этом все последующие значения стремятся к истине в логарифмическом порядке. Т.е. после 2-3 замеров значение переменной АЦП теоретически можно принять за верное потому, что такая переменная не может быть дробной и будет бесконечно округляться компилятором до целого числа.
Изначально, в управляющей программе МК заложены определенные значения АЦП, соответствующие кнопками UP и DOWN моего автомобиля. При необходимости изменить эти значения (перенастроить кнопки) выполняется след. порядок действий:
Нажать кнопку PROG на плате устройства.
Нажать кнопку UP на руле.
Нажать кнопку DOWN на руле.
После нажатия кнопок на руле, их значения сохраняются в энергонезависимой памяти и восстанавливаются каждый раз при включении устройства. Успешное сохранение значений кнопок в памяти подтверждается звуковым сигналом. В последствии, нажатия запрограммированных кнопок также подтверждаются звуковым сигналом при условии, что перемычка-джампер BUZZER установлена.
Перед тем, как попасть в основной цикл управляющая программа проверяет уровень выходной громкости модуля. Такой алгоритм пришлось добавить по причине того, что некоторые модули при выключении успевают самовольно (без команды) убавить уровень громкости на 1 ед. (всего 15 ед.). Алгоритм настроен таким образом, чтобы поддерживать громкость всегда на максимальном уровне.
После проверки громкости проверяется положение перемычки-джампера AUTOPLAY и готовность смартфона принимать управляющие команды. Если смартфон в течении опред. времени сообщает о готовности к внешнему управлению управляющая программа переходит в основной цикл. Если при этом перемычка-джампер AUTOPLAY установлена, запускается короткая подпрограмма автостарта воспроизведения музыки на смартфоне. Остановка воспроизведения музыки выполняется операционной системой Android (4.0 и выше) автоматически, при разрыве Bluetooth-соединения.
Для улучшения надежности устройства на этапе наладки в микроконтроллере был включен аппаратный Watchdog, да по сей день там и остался. Таймер настроен на пару сек. и периодически сбрасывается по ходу выполнения управл. программы МК. В данной версии прошивки необходимости в нем нет — все работает стабильно, но «подтирать» его я не стал по причине того, что на некоторых автомобилях МК умудряется самопроизвольно «зависнуть» в момент запуска двигателя автомобиля. Если такое произойдет — МК «самосбросится» и работа устройства возобновится.
Данная версия устройства названа стебно в результате слияния названия моего любимого автомобиля и термина Bluetooth — BLUEFINITI. 100% совместимость гарантируется с автомобилями Nissan/Infiniti 2003-2008г/в. Версия 1.2 означает, что перед «финальной» разработкой героически погибло немного доноров-испытателей, но на данном этапе все проблемы решены и устройство полностью готово для повторения. Из-за ограничений Драйва на кол-во символов и фото данная версия статьи сильно порезана. Полная версия статьи статьи находится на моем сайте: p90590qa.bget.ru/steering-button-bluetooth. Там же публикуются исходники, обновления и прочие материалы к статье.
Экстерном отвечу на наиболее вероятные вопросы:
• Почему именно такой модуль? Выбор модуля не принципиален, использую буквально «какой попался под руку». Вполне возможно, в будущих поделках, будет другой модуль потому, что от этого я сам не в восторге. Но, т.к., в итоге мне удалось добиться поставленной задачи, поэтому новый проект на эту тему будет подождет.
• Почему Bascom? Сам себе иногда задаю этот вопрос. Ассемблер, в принципе, понимаю, могу наваять несложный «скетч», подправить чужое творение, но не люблю его – в языках высокого уровня мы пишем, что нужно сделать и проверяем результат, а компилятор пусть сам мается, как это сделать. На языке программирования низкого уровня нужно абсолютно все писать самому. В этом случае, программирование превращается в розыск готовых «скетчей» или штудирование своих прошлых наработок. «Ардуинщики» поймут – вы же все «программисты».
• Почему схема, плата, исходники программного кода и прочие материалы в открытом доступе? Потому, что я не боюсь конкуренции. Дело не в излишней самоуверенности или безграничной щедрости, дело в том, что я не Хохол. Я не пытаюсь заработать на всем, что можно продать, делая себе рекламу на всевозможных «общесоциальнозначимых» ресурсах. Я занимаюсь тем, что мне интересно, не думая о прибыли и расходах. Я уверен, что тот, кто может сам создать подобное, даже до середины не дочитал. Поэтому ему совершенно неинтересны мои потуги в освоении Bascom-а – он все это сможет сам. Кто не сможет это сделать сам, тот просто не станет забивать себе голову – купит у меня готовую плату и будет пользоваться.
• Почему я продаю готовые устройства? Было бы здорово, если бы я их бесплатно раздавал? Раздаю, друзьям и «тестерам», бывает такое. А продаю потому, что чтобы сделать себе одно устройство за 500р. нужно купить по 100 радиодеталей каждого номинала за 2000р. Я не пытаюсь «набарыжить» лишнего, я всего лишь надеюсь оправдать затраченное. Радиолюбительство это не то хобби, которым зарабатывают – это мания, неуемное желание создать что-то новое, жертвуя всем, себе в ущерб – когда выбор стоит между покупкой обуви на зиму или «крайненеобходимоймнемикросхемы» я выберу микросхему. Кто в теме, то поймет, всем остальным объяснить не смогу – это понять невозможно, это образ жизни.
• Почему DipTrace? Х.з, уже привык, уже кажется удобным. Знаю его с детства (с его детства), тогда даже Sprint-а еще не было. Выбор был небольшой — либо DipTrace либо PCAD или ему подобные монстры. Не все устраивает, но переучиваться не хочу – он как-то профессиональней Sprint Layout-а. Вот если их объединить, получился бы идеальный комплекс для разработки печатных плат. DipTrace не хватает простоты общения с разработчиком и создания новых компонентов как в Sprint-е, но это компенсируется итоговой экономией времени на создание проекта.
• «Вот Мой знакомый встроил себе в магнитолу такой же модуль, но у него с ним нет таких проблем как у Вас» — частая фраза дилетанта. Ваш знакомый Вам точно не договаривает или просто не использует все возможности модуля. Пусть это покажется самоуверенно, но, кроме меня, никто не добился внятной и адекватной работы модуля. По крайней мере я, не нашел ни одного сайта, форума блога — ничего, где кто-либо сделал что-то подобное. В основном все ограничиваются припаиванием к модулю наушников, кнопок и батарейки.
• Смысл в разработке данного устройства, если на АлиЭкспресс можно купить готовое? Выше я уже подробно все описал, если у Вас возник подобный вопрос, значит Вы не все прочитали. Повторю: основной модуль устройства я купил на АлиЭкспресс и заеб*лся его побеждать даже в таком простом проекте. Купив на Али более сложное (готовое) устройство, по факту Вы купите тот же х*й в красивой упаковке и с теми же косяками. Лично мне, кажущийся несложным, на первый взгляд, проект, дался очень тяжело. В основном виной тому ловля блох в разуме Китайского образа мышления. Сделанный наперекосяк модуль только на первый взгляд кажется простым и понятным — пока я с ним тренировался, я Datasheet на вражеском языке я выучил наизусть. В итоге, я сажусь в машину «к Вашему знакомому», он мне включает свой «заводской Китай» и-и-и… я слышу те же косяки со звуком, которые я победил, слышу фон в колонках, которого у меня нет. Он звонит мне по «громкой связи» и я ничего не слышу кроме треска, он орет в микрофон — слышу его хорошо, но много раз (эхо).
• Есть ли готовые устройства «на продажу». Готовых нет — себестоимость устройства высока, поэтому все делается только «под заказ» после предоплаты.
Кто дочитал сей роман – респект. Желаю всем в новом году добра, бобра, тачку, бабки и что-б «паяльник» не подвел в ответственный момент. И еще – больше музыки, хорошей и разной.