Becker Europa 2000 + Bluetooth
На просторах интернета имеется уже несколько "рецептов" по добавлению BT модуля в данную магнитолу Becker BE-1100. Все эти решения имеют один основной принцип подключения: отрезается АМ-диапазон и на его место впаивается выход с блютуз модуля. Однако, я считаю такой метод врезки варварским, не соответствующим концепции ClassicCarsToday. Поэтому я решил что в моей магнитоле блютуз будет установлен так, как ещё никто не делал, с сохранением всех функций и с обязательной возможностью вернуть всё к заводскому состоянию.
Итак, что мы имеем: цифровая магнитола с центральным процессором, который управляет функциональными модулями через инфтерфейс I2C. Что такое I2C и как оно работает можно почитать в интернете. Интерфейс старый, изучен вдоль и поперёк, любой современный микроконтроллер умеет работать с этим интерфейсом. За коммутацию входных сигналов от приёмника АМ или FM или от кассетного проигрывателя отвечает Цифровой аудио процессор TDA7300. Помимо этого, этот же процессор управляет громкостью и тембром магнитолы.
Управлять всем этим ансамблем будем с помощью Arduino Nano. Поскольку мы будем частично имитировать работу центрального микропроцессора магнитолы и заставлять селектор входов переключаться на нужный нам источник сигнала, то нехорошо будет, если БТ модуль будет включён всё время. Необходимо обеспечить включение БТ строго тогда, когда мы этого хотим, а значит - нужна кнопка.
Опять же, на просторах сети встречаются решения с включением блютуз с помощью кнопки на лицевой панели магнитолы, но, по понятным причинам, кнопки эти по-любому выглядят чужеродно, а иные и вовсе неаккуртно врезаны. Такое варварское вмешательство в конструкцию, на мой взгляд, неприемлемо, поэтому я был вынужден искать какое-нибудь альтернативное решение, и оно было найдено - сенсорная кнопка. Сенсорную кнопку можно легко спрятатьпод пластиковой лицевой панелью, закрепить там, и она прекрасно будет реагировать на касания пальцем. Опять же, сенсорные кнопки распостранены для Ардуино, а значит обрабатывать сигналы от неё не составит труда.
Как видно из рисунка выше, TDA7300 имеет на борту 4 стерео входа и один моно вход. Последний используется для включения режима AM приёмника. Для переключения режима воспроизведения аудиокассеты или FM стерео используются всего два входа - первый и второй. Таким образом, мы имеем два свободных стерео входа на аудио процессоре, которые можно задействовать для подключения внешних источников. Необходимо лишь научиться управлять селектором входов с помощью интерфейса I2C.
В качестве источника сигнала используется обычный недорогой блютуз модуль, который в изобилии представлен на Алиэкспресс.
Ну чтож, подведём итог:
- переключение источника сигнала можно осуществить по интерфейсу I2C;
- за управление интерфейсом отвечает Ардуино нано;
- за источник сигнала ответственный китайский BT модуль;
- за включение режима воспроизведения сигнала через блютуз будет отвечать сенсорная кнопка.
Напрашивается очевидный вопрос: если мы собираемся подключаться на интерфейс магнитолы, то почему бы нам не воспользоваться этим и не осуществлять параллельно управление дисплеем магнитолы? Например, выводить на экран символы "bt" в момент переключения в режим воспроизведения через блютуз. Ведь дисплей также управляется через I2C. В общем, этот пункт мы тоже добавим в наше импровизированное техническое задание.
Реализация.Проведя весь этот анализ, я пришёл к выводу, что необходимо сначала реализовать самое сложное - научиться управлять символами на дисплее. Точнее не самим дисплеем напрямую, а научиться передавать управляющие байты на контролллер дисплея Phillips PCF8577, который, в свою очередь уже, вырабатывает управляющие сигналы, "зажигающие" требуемый сегмент на дисплее. Этот момент был действительно самым сложным и в совокупности занял у меня примерно год неспешных поисков, проб и ошибок. В конечном итоге, постигнув абсолютный дзен в управлении дисплеем, мне удалось увидеть вот это:
Это был триумф и половина пути к заветной цели. Дальше уже всё было проще.
Кнопку решено было разместить в левом верхнем углу панели магнитолы, если смотреть на неё спереди. В том месте имеется достаточно свободного пространства для установки платы и вывода проводов, нужно лишь немного удалить рёбра жёсткости. Главное добиться плотного прилегания кнопки к тыльной стороне лицевой панели, иначе срабатывания будут нечёткими.
Внутри самой магнитолы достаточно свободного места для размещения ардуино и модуля блютуз. Я скомпоновал всё вот таким образом в единый блок:
Схема подключения выглядит следующим образом:
Логика работы схемы следующая: при включении магнитолы, на выбранном пине Г-образной платы появляется напряжение питания и происходит включение и загрузка Ардуино. Во время загрузки МК подаёт питание на пин D2, запуская тем самым кнопку, и ожидает регистрации прикосновения к кнопке. В момент "нажатия" на кнопку, происходит включение высокого уровня сигнала на пине D3, включающего БТ модуль, и одновременно происходит занятие интерфейса I2C с отсылкой необходимых байтов на дисплей. Сначала происходит очистка дисплея, а затем вывод символов "bt". Сразу после этого события происходит отправка байт данных, адресованных TDA7300, чтобы включился вход 4 и установился некий безопасный уровень громкости. Описанный процесс происходит достаточно быстро, поэтому при включении режима воспроизведения через БТ, в динамиках можно услышать стандартную мелодию, проигрываемую самим модулем. Ну, вы знаете этот звук включения блютуз колонки и звук подключения к ней. Затем необходимо подключить свой телефон по блютуз и запустить воспроизведение музыки.
Есть у данного решения и ограничения, с которыми я не успел побороться, поскольку магнитола была успешно продана. Как я уже писал выше, магнитола управляется центральным процессором через интерфейс I2C, а значит, в системе имеется одно мастер-устройство, а все остальные - ведомые. Мы же вклиниваемся в систему с ещё одним мастер устройством - Ардуино, - которое может притворяться центральным процессором и подавать ведомым устройствам команды тоже. Ведомые же устройства не слишком разборчивы и принимают такое управление. Это особенности работы I2C, тут ничего особенного нет. Однако, при вмешательстве такого рода, основной процессор не контролирует и "не знает" что происходит в его царстве и продолжает "думать" что у него по-прежнему включено радио или кассета, смотря из какого режима был осуществлён переход в режим БТ. Соответственно, центральный процессор продолжает считать что и на дисплее у него включены всё те же символы что и до перехода в режим БТ.
Отсюда возникают два нюанса управления магнитолой:
- при попытке в режиме БТ отрегулировать тембр или баланс, главный процессор вернёт на дисплей символы, которые он запомнил в последний раз, а надпись "bt" исчезнет. На дисплее вновь появится, например, значение частоты приёмника. Однако воспроизведение через блютуз нарушено не будет, потому что команда на смену входа отправляется только при включении радио или запуска воспроизведения кассеты. Просто на экране пропадёт надпись "bt".
- При выключении режима воспроизведения БТ путём повторного нажатия сенсорной кнопки, Ардуино отправляет пакет на селектор входов, чтобы воспроизведение переключилось на радио. В этом случае TDA7300 переключается на первый вход, активируется радио, устанавливается безопасный уровень громкости, а на дисплей приходит команда очистки. Надпись "bt" пропадает...и всё. Ведь центральный процессор продолжает "думать", что у него работает радио, никакой смены режимов работы не происходило и ему нет нужды отправлять команду на дисплей. Чистый дисплей будет до тех пор, пока какое-нибудь ваше действие не заставить ЦП изменить символы на дисплее. Например регулировка тембра, выбор радиостанции кнопками 1,2,3, и тому подобные действия.
По-хорошему, конечно, надо бы заставить Ардуино парсить данные, которые постоянно отсылает центральный процессор, и запоминать их. Чтобы после выключения режима БТ магнитола возвращалась в исходное состояние. К сожалению, я не успел реализовать этот функционал в полном объёме, т.к. магнитола была продана.
Также, помимо этого, была задумка реализовать отображение забортной температуры с помощью внешнего датчика. Сенсорная кнопка может обрабатывать различные виды нажатий. Так, например, по длительному нажатию кнопки можно выводить на дисплей значение температуры воздуха на улице. Все необходимые символы имеются на дисплее.
Впрочем, оставлю для вас это поле для творчества. Если у вас возникло желание повторить этот проект, то скетч для загрузки в Ардуино вы можете скачать в разделе "Магазин".
Спасибо за внимание.