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.
  • iOS. 100%-я совместимость проверена с iPhone 4 и 6s. Производитель модуля XS3868 «мамой» клянется о совместимости со всеми «девайсами» где есть возможность подключения Bluetooth-гарнитуры независимо от типа операционной системы.
  • Handsfree. В этой версии контроллера нет и не будет.

По хорошему, нужно было сразу начать освоения подобного модуля, но в попытке обойтись «малой кровью» была проделана довольно большая работа и исследовано много разного материала. В общем, решено было сделать Bluetooth-гарнитуру для автомобиля. Для этого, на AliExpress были заказаны модули XS3868 Ver.3.0:

В ходе разработки контроллера я перепробовал 3 вида разных модулей и на XS3868 остановился только потому, что на него была хоть какая-то внятная информация от производителя — схемы подключения, управляющие команды. На мой взгляд модуль еще нужно дорабатывать и дорабатывать потому, что в нем полно косяков и прочего неадеквата. Как показала практика, он крайне ненадежен и нестабилен поэтому, чтобы заставить его отрабатывать на 100% пришлось неоднократно сделать сальто через голову назад с паяльником в руках.

Под новый проект у «тини13» не хватало свободных ног, памяти и аппаратного UART-а, поэтому пришлось перекраивать программу под Mega8, чему впоследствии был только рад. Прекрасно подошел бы МК типа ATtiny26, но из-за своей непопулярности и встроенного датчика температуры он стоит как «мега». Зато теперь я не ограничен «килобайтом» памяти, «короткими ногами» и другими «недовозможностями» микроконтроллера. Постепенно начал рождаться новый проект:

Проект последовательно усложнялся и разрастался в размерах. Пришлось перейти на новую макетку и даже наваять имитацию руля и бортовой сети автомобиля:

Модуль XS3868 разработан для применения в мобильных устройствах, соответственно питается «мобильным» напряжением 3.6-4.2В. Пробовал питать модули напряжением 5В и они работали… недолго. Поэтому, после DC-DC 5В-5В преобразователя стоит линейный LDO стабилизатор на 3.3В. В идеале, конечно, лучше сразу применить преобразователь 5В-3.3В, но он совершенно непопулярен у Китайцев, поэтому стоит как киловаттный трансформатор.

Необходимость в DC-DC преобразователе возникла по причине проникновения помех от бортовой сети автомобиля в звуковую часть модуля, которые соответственно воспроизводились автомобильным аудио-усилителем. Т.е. фон в колонках подвывал в такт оборотам двигателя. Никакие известные мне способы фильтрации не помогали, также не решил проблему буферный усилитель из «даташита». Стоит отметить, что DC-DC преобразователь должен быть обязательно изолированным.

Транзистор в цепи питания DC-DC преобразователя нужен для организации сброса модуля при его неадекватной работе. Например, модуль может перестать отзываться на входящие команды по UART, при этом продолжать воспроизводить музыку. Или он может самопроизвольно начать бесконечный цикл поиска нового устройства, при этом не находя смартфон «у себя под носом». Но самый крутой косяк — он может уйти в спячку после нескольких минут простоя и вывести его из этого состояния программным сбросом невозможно! Кроме того, модуль совершенно не реагирует на лог. состояние ноги RESET.

Часть блока питания, предназначенная для питания основной части схемы, выполнена на регулируемом стабилизаторе напряжения в «большом» корпусе – ТО220. В дежурном режиме схема потребляет ток менее 10мА, а при работающем модуле  Bluetooth потребляемый ток может достигать 200мА, что как следует «напряжет» стабилизатор в «мелком»корпусе.

Модули также оказались беспомощными перед статическим электричеством — они умудрялись «сгорать» даже при присоединении аудио разъема. Просто начинали хрипеть в один канал и «жрать» по 200мА. Один модуль изначально приехал нерабочим. В результате, на данный момент, имеем уже 3 безполезняшки – один раненый, другой контуженный третий родился уродом. Продолжаем битву за радиосвязь.

Получившаяся в итоге схема-чудище состоит из стандартных узлов и будет понятна любому «микроконтроллерщику». Входные цепи максимально защищены от всех видов воздействий и помех. В цепь питания добавлен диод для защиты от переполюсовки. Внутренние подтягивающие резисторы не используются принципиально – для повышения надежности устройства и устранения ложных срабатываний и зависаний. Зуммер подключен напрямую к ноге МК, используется 12-вольтовый — при питании 5В потребляет сущие копейки, микроконтроллер не обиделся.

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

Изначально предполагалось управлять модулем путем имитирования нажатий кнопок PLAY, BACK и NEXT, но в присланный мне модуль оказался бракованным – не реагировал на нажатие кнопки PLAY. Кроме того, оказалось, что модуль передает и может принимать команды управления по UART-интерфейсу, что существенно облегчило задачу и расширило возможности управления. В итоге микроконтроллер общается с модулем всего по двум проводкам RXD и TXD, а функциональность устройства в целом определяется только программой микроконтроллера. Но и тут я споткнулся – стандартные частоты тактирования МК не позволяли получить скорость передачи 115200 являющейся стандартной для Bluetooth-модуля. В лучшем случае получалось около 7% ошибок, что очень много – микроконтроллер и модуль тупо не понимали друг друга. Поэтому пришлось добавить внешний кварц «не популярной» частоты 7.372800МГц, что для UART-а самое «то».

В дополнение ко всему еще и модуль перестал петь! Просто перестал, греется как утюг и не поет. Что тут скажешь, тернист «путь к истине» – заказал новый. Прошел месяц…

Пока «летели» (ползли) Почтой новые модули потихоньку мучал старый, пытаясь добиться от него внятной передачи информации по UART. Дело в том, что модуль передает строку символов как обычно – через жопу. Например, мы ему передаем управляющую команду «AT#MA», он должен подтвердить ее принятие ответом «OK» и потом вернуть подтверждение исполнения команды от смартфона «MR». Но при помощи обычного оператора «Input» МК принимал только первый символ, т.е только «O» и «M». При этом компьютерный терминал прекрасно понимает команды модуля и видит все символы, микроконтроллер также отлично принимает и передает любые строки в ПК, а модуль не понимает. Пришлось взрыхлить весь интернет на тему посимвольного приема данных в UART и формирования из них строки. «Гугл» трещал от моей атаки, но сдался и в результате я все-таки выудил подходящий кусок исходника.

Естественно сразу ничего не заработало, пришлось как следует вникнуть в тему, но зато удалось придумать идеальный алгоритм приема данных UART. Не стану углубляться в подробности устройства управляющей программы МК потому, что исходник постарался хорошо прокомментировать и выкладываю в свободный доступ. Такой, своеобразный, подарок «чисто от меня». Делаю так потому, что сам вчера был начинающим «программастом» и учился на таких же исходниках, поэтому знаю им цену и сознательно жертвую все исходные данные в пользу начинающих радиолюбителей. Так сказать, возвращаю должок, ибо равновесие мира держится на истине: берешь чужое, возвращаешь свое.

Вообще, установить надежный канал связи с модулем оказалось проблемой по причине того, что в данном тандеме имеет место быть т.н. «паразитная запитка». Это такое явление, когда питание одного из участвующих в тандеме устройств не подключено, но устройство работает и даже пытается общаться по RXD-TXD линии. Типичному «микроконтроллерщику» прочтенное сейчас, наверное, глаза порезало, но тот, кто в 90-х соединял два ПК через COM-порты не только для игры в Quake, должен быть «в теме». Для защиты от такого неприятного явления давно используется простая хитрость на диоде и подтягивающем резисторе вывода TXD «косячного» устройства – в данном случае модуля Bluetooth.

Но так было до того как я применил DC-DC преобразователь для питания модуля. После этого появилась новая проблема — необходимость гальванической развязки цепей управления RXD и TXD. Для чего я применил оптроны. Да не простые, а высокоскоростные (с транзистором) 6N136 потому, что «по умолчанию» модуль почему-то настроен на передачу данных по UART на высокой скорости — 115200 бод и а-бы какой оптрон не подойдет (сказки слагать уже начал).

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

В начале исполняемой программы все понятно — подготовка к старту основного текста программы: конфигурируем порты и АЦП, объявляем переменные и прерывания. Потом подготовка локальных переменных и небольшая пауза перед новым стартом модуля.

К необходимости именно такой небольшой паузы я пришел в самом конце разработки проекта: даже когда проект был готов на 99% оставалась одна нерешенная проблема — иногда модуль соединялся с смартфоном «криво» из-за чего звук передавал с искажениями (как будто битрейт mp3 не более 30кбит/с). В большинстве случаев соединения все было отлично, но это «иногда» портило все удовольствие от работы над проектом. На деле, для 100% результата, пауза должна быть чуть дольше, но я придумал как ее сократить — резистор параллельно питанию модуля ускоряет разряд конденсаторов на плате модуля. Благодаря чему, буквально за пару сек. происходит полный (тотальный) физический сброс основного чипа. Кроме того, каждый раз, при потере связи с смартфоном управляющий МК физически сбрасывает модуль, «отрубая» ему питание, что-бы он не успел «подхватить» соединение.

Состояние подключения и контроль управления смартфоном управляющая программа МК осуществляет по состоянию профилей A2DP (Advanced Audio Distribution Profile) и AVRCP (Audio/Video Remote Control Profile). Профиль Hands-Free Profile (HFP) не используется по тому, что в устройстве изначально не планировался режим громкой связи по причине того, что данный модуль не может физически обеспечить качественную работу с салонным микрофоном. Для того. что-бы «звонить» и принимать входящие вызовы на смартфон, нужно в настройках соединения с модулем убрать галочку с пункта «Профиль HSP/HFP», тогда музыка будет автоматически ставиться на паузу на время разговора.

Сопряжение выполняется в обычном порядке, как и с любым др. Bluetooth-устройством. Пароль для сопряжения: 0000 или 1234, имя устройства: POR 1007BT. Сопряжение нужно выполнить один раз, после чего смартфон будет самостоятельно подключаться к модулю устройства каждый раз, когда окажется в зоне «доступности». Управляющая программа МК заставляет модуль постоянно сканировать «эфир» на предмет наличия в зоне видимости заранее сопряженного смартфона. Если в течении нескольких минут модуль не находит «жертву», то он обижается и уходит в глухую оборону. И из этого состояния его разумными средствами вывести невозможно — не помогает даже физическое «дерганье» ноги RESET. Поэтому, если модулю не удается соединиться с смартфоном в течении определенного времени или он норовит уйти в спячку (о чем он, кстати, вежливо предупреждает) он сбрасывается и цикл установки соединения запускается заново.

Прием данных по UART осуществляется в подпрограмме прерывания UART. Модуль передает данные в виде символов по таблице ASCII в формате <CR><LF>сообщение<CR><LF>, поэтому в цикле подпрограммы контролируем прием символа Enter, который условно является началом нового сообщения и концом текущего. Между символами Enter формируем сообщение конвертируя и складывая принятые символы. После завершения приема выполняется простейшая обработка принятой информации путем присваивания принятого значения соответствующей переменной. Не самый лучший вариант обрабатывать информацию в прерывании, но дело в том, что модуль постоянно что-то передает и поэтому такой способ оказался эффективным для отсеивания лишнего. Всю принятую информацию от модуля МК перетранслирует в UART для терминала на компьютере и наоборот — с компьютера можно через микроконтроллер управлять модулем.

Здесь стоит сказать пару «ласковых» о всемилюбимом эмуляторе терминала Terminal 1.9b — она совершенно не годится для работы с командами типа «AT#…». Контуженная «терминалка» Terminal emulator из BASCOM-а и HyperTerminal из Windows ХР похоже вообще не могут отправлять сообщения. С наилучшей стороны в данном случае показали себя простейшие «терминалки» типа KeTerm 2.0 и ей подобные.

Управляющая программа МК подразумевает использование резистивных кнопок на руле. На сколько мне известно, такой способ применяют 9 из 10 производителей автомобилей в попытке сэкономить пару проводников на рулевом шлейфе. Для считывания состояния кнопок входы АЦП микроконтроллера подключены параллельно штатному блоку управления. Опрос значения АЦП производится в подпрограмме основного цикла. Для фильтрации ложных срабатываний, помимо конденсаторов на входах АЦП, в подпрограмме обработки значения АЦП применен простой алгоритм многократного повторного считывания значения. Дело в том, что в «мега» AVR-ках есть такой косяк (один из многих) — первое считанное значение АЦП всегда завышено и соответственно неверно. При этом все последующие значения стремятся к истине в логарифмическом порядке. Т.е. после 2-3 замеров значение переменной АЦП теоретически можно принять за верное потому, что такая переменная не может быть дробной и будет бесконечно округляться компилятором до целого числа.

Изначально, в управляющей программе МК заложены определенные значения АЦП, соответствующие кнопками UP и DOWN моего автомобиля. При необходимости изменить эти значения (перенастроить кнопки) выполняется след. порядок действий:

  1. Нажать кнопку PROG на плате устройства.
  2. Нажать кнопку UP на руле.
  3. Нажать кнопку DOWN на руле.

После нажатия кнопок на руле, их значения сохраняются в энергонезависимой памяти и восстанавливаются каждый раз при включении устройства. Успешное сохранение значений кнопок в памяти подтверждается звуковым сигналом. В последствии, нажатия запрограммированных кнопок также подтверждаются звуковым сигналом при условии, что перемычка-джампер BUZZER установлена.

Перед тем, как попасть в основной цикл управляющая программа проверяет уровень выходной громкости модуля. Такой алгоритм пришлось добавить по причине того, что некоторые модули при выключении успевают самовольно (без команды) убавить уровень громкости на 1 ед. (всего 15 ед.). Алгоритм настроен таким образом, чтобы поддерживать громкость всегда на максимальном уровне.

После проверки громкости проверяется положение перемычки-джампера AUTOPLAY и готовность смартфона принимать управляющие команды. Если смартфон в течении опред. времени сообщает о готовности к внешнему управлению управляющая программа переходит в основной цикл. Если при этом перемычка-джампер AUTOPLAY установлена, запускается короткая подпрограмма автостарта воспроизведения музыки на смартфоне. Остановка воспроизведения музыки выполняется операционной системой Android (4.0 и выше) автоматически, при разрыве Bluetooth-соединения.

Для улучшения надежности устройства на этапе наладки в микроконтроллере был включен аппаратный Watchdog, да по сей день там и остался. Таймер настроен на пару сек. и периодически сбрасывается по ходу выполнения управл. программы МК. В данной версии прошивки необходимости в нем нет — все работает стабильно, но «подтирать» его я не стал по причине того, что на некоторых автомобилях МК умудряется самопроизвольно «зависнуть» в момент запуска двигателя автомобиля. Если такое произойдет — МК «самосбросится» и работа устройства возобновится.

Фьюзы указаны в исходнике управляющей программы: тем, кто прошивает МК через BASCOM — повезло, все прошьется автоматически. Кто заливает готовые HEX-ы, вот вам картинка из прошивальщика BASCOM-а, разгадывайте ребус самостоятельно:

Данная версия устройства названа стебно в результате слияния названия моего любимого автомобиля и термина Bluetooth — BLUEFINITI. 100% совместимость гарантируется с автомобилями Nissan/Infiniti 2003-2008г/в. Версия 1.2 означает, что перед «финальной» разработкой героически погибло немного доноров-испытателей, но на данном этапе все проблемы решены и устройство полностью готово для повторения.

Версии устройства:

  • V.1.0 FEB.2017 — изготовлена в ед. экземпляре, тестовая плата. Работает с прошивкой V.1.2 DEC.2017

  • V.1.1 NOV.2017 — не изготавливалась. Сложный алгоритм работы с модулем. Не удалось реализовать задуманные функции из-за невозможности их выполнения модулем.
  • V.1.2 DEC.2017 — упрощен алгоритм работы с модулем. Уменьшен размер печатной платы. Скачать архив.

  • V.1.3 JAN.2018 — добавлен резистор в затвор ключа на полевом транзисторе питания DC-DC преобразователя. Перетрассирована плата — уменьшен размер до 50х92мм. Скачать архив.