Герой заметки — магнитола Kenwood GX806EF2 — славна тем, что устанавливалась в очень большое число экспортных японских автомобилей (взять хотя бы Subaru Forester) и не имеет ни входа AUX для подключения внешних источников звука, ни возможности воспроизвести MP3-файлы с CD-дисков (с внешних накопителей тоже). Магнитола вышла весьма утилитарной для своего времени (2004-2007 года), несмотря на CD-чейнджер на 6 CD. CD-audio, FM/AM-тюнер, и всё, но кассетоприемника, к слову, уже нет.
Но все-таки сделать ей вход AUX можно без порчи внешнего вида и функциональности.
Попалась мне эта магнитола вместе с автомобилем. Вмонтировав андроид-планшет 7" в будку для навигации я начал искать способы вывести звук с планшета на магнитолу, а покупать для этого новую «голову» совсем не хотелось.
Выяснилось, что многие отключают внутренний CD-чейнджер и подключают серийно производимые эмуляторы с возможностью воспроизведения MP3 через USB, например так, но мне это показалось излишним вандализмом с избыточными затратами.
Передачу звука с внешнего устройства можно решить еще с помощью FM-передатчика, но качество звука с таким вариантом очень плохое и здесь так же присутствует звено с лишними затратами на FM-передатчик и на его размещение в салоне.
В некоторых местах я находил упоминание про отрезание линии AM-тюнера от магнитолы и использование её остатка для внешнего звука, но это неосуществимо с конкретно этой магнитолой, в любых режимах тюнера сигналы идут по одной линии. Было решено проанализировать всю схему магнитолы на предмет «уязвимых» мест.
Склеенную схему главной платы можно посмотреть здесь. Вот интересная часть схемы:
Искомое находится рядом с аудиопроцессором TDA7406 (IC203 на схеме) от STMicroelectronics. Красным я обвел шину i2c, которая связывает главный контроллер с микросхемой IC203, синим — неиспользуемые аудиовходы MD и TAPE. Как выясняется из даташита на эту микросхему, у неё есть 4 раздельных стерео аудиовхода и 4 раздельных моно аудиовхода. Однако, используются они не все, а неиспользуемые «заглушены» конденсаторами об землю (C233-C236 тому пример).
Изучив принцип работы TDA7406, я понял, что можно попробовать вклиниться в управление главным контроллером и задействовать неиспользованные звуковые входы когда это необходимо. Я подпаял на линии SDA и SCL (резисторы R855, R857) провода и подключил к ним логический анализатор:
Выяснилось, что при штатном функционировании контроллер каждые полсекунды запрашивает по шине i2c статус у TDA7406. В этом запросе ничего интересного для нас нет — там флаги состояния TDA7406. Никаких команд управления в покое не встречается:
Самое интересное на шине происходит в момент переключения режимов CD/BAND и при изменении громкости. В таких случаях контроллер дает длинную посылку для регистров управления TDA7406. Эта посылка содержит настройки почти для всех доступных регистров. Вот пример посылки (её небольшая начальная часть):
Разберем это посылку:
0x8C (chip address) — адрес чипа TDA7406 со сброшенным битом R/W (контроллер собирается писать в регистры).
0x60 (subaddress) — адрес первого регистра, с которого начнется запись посылки и некоторые установки порядка записи (в данном случае запись будет производится с нулевого адреса, как впрочем и всегда, когда контроллер конфигурирует TDA7406: он всегда записывает конфигурацию начиная с регистра 0).
0x0E (регистр 0) — конфигурация для регистра 0, то что нам надо, судя по документации: это регистр Input Selector. В нем указывается какой вход аудиомикшера сейчас должен быть выбран и какое усиление (громкость) должно быть у этого канала:
При выборе канала тюнера и при дальнейшей работе с ним (повышение/понижение громкости), контроллер отсылает в поле Source Selector нулевого регистра биты 110. И это очень хорошо, поскольку для того чтобы задействовать под AUX вход MD надо передать в это поле биты 010. Для справки: шина i2c имеет подтяжки к напряжению питания и всегда свободна, а активный уровень на шине — ноль, т.е. управление ведется открытым коллектором (открытым стоком). В любой момент времени любую линию шины i2c можно «дернуть» к нулю без ущерба для всех устройств на этой шине.
Можно вклиниться в общение контроллера с аудиомикшером в нужный нам момент и превратить режим FM в режим MD. Единственное что требуется — точно отследить нужное время для импульса, чтобы «110» превратилось в «010». И делать это надо каждый раз, когда контроллер разговаривает с TDA7406. Вот нужный нам момент на диаграмме, в момент выделенного красным такта линии SCL надо задавить линию SDA в ноль:
Я нарисовал и изготовил небольшую платку с микроконтроллером Attiny13, с штыревыми разъемами на всех выводах для удобства программирования и дальнейшего подключения к i2c и питанию:
Нижний слой платы я намеренно сделал плоским, без выпирания штырей, чтобы можно без проблем приклеить плату на голову TDA7406.
Осталось дело за малым: припаять к плате с ATTiny13 провода питания, i2c, провода от внешнего разъема 3,5 мм («мама») и проводки на плату магнитолы к линиям MD (предварительно удалив конденсаторы С233, С234):
Прошу прощения за качество фото, был увлечен больше процессом создания, а не документированием.
Синий провод уходящий вверх на фото идет к кнопке News на передней панели магнитолы. Именно она используется для включения перехвата управления аудиомикшером. Нажатием кнопки активируем перехват, еще одним нажатием — деактивируем. Важно: после нажатия кнопки News нужно будет уменьшить или увеличить громкость, т.к. в покое, как мы помним, управление аудиомикшером не происходит, а сам по себе микроконтроллер ATTiny13 никаких посылок в шину не делает.
Программа для микроконтроллера получилась очень простой; в основном это решение задачи «в лоб», без применения прерываний. Я вернусь к программе чуть ниже.
Итак, для тех кто решит воспользоваться этим методом для создания входа AUX этой магнитоле:
1. Разобрать магнитолу, запомнив типы винтов и их места.
2. Добраться до основной платы и найти микросхему TDA7406.
3. Изготовить и запрограммировать плату с ATTiny13 (номиналы конденсаторов С1-С3 0,1 мкФ):
4. Приклеить плату к чипу TDA7406.
5. Выпаять с основной платы С233, С234. Припаять проводки от основной платы к плате ATTiny13 по схеме:
Питание для ATTiny13 вблизи TDA7406 нет, т.к. TDA7406 питается от 8 В, а нам надо 5. Тянем к XP2:1 провод от вывода 8 микросхемы памяти IC803 (24C02), корпус SO-8, см. фото выше.
Провод от кнопки News (у неё два контакта, нам нужен тот, что сидит на питании, а не на земле) тянем к XP1:2 (PB3).
6. Припаиваем собственно выход AUX (у меня это фабричный разъем 3,5мм «мама» с проводом, от удлинителя наушников) к плате: XP1:5 левый канал, XP2:5 правый канал и общий провод на XP1:4. Провод от разъема заводим перед этим снаружи откуда удобнее.
7. Подключаем динамики к магнитоле, проверяем.
8. Пайку проводов хорошо проверяем и фиксируем провода к плате эластичным клеем типа «Момента».
Данная модификация работает у меня почти месяц без нареканий. Единственное неудобство — двухступенчатое включение и выключение AUX. Сначала кнопку нажимаем News, а затем страгиваем немного громкость. Этого можно было бы избежать, дописав программу таким образом, чтобы ATTiny сама отправляла конфигурацию регистрам аудиомикшера в момент нажатия кнопки, но я посчитал это излишним вмешательством, усложняющим программу. Но при должном опыте работы с микроконтроллерами такую функцию приделать недолго.
Пара слов о программе. В ней не используются прерывания, а отслеживание тактов (фронтов) на линии SCL ведется по флагам GIFR в циклах. С каждым тактом SCL программа оценивает состояние шины SDA и если оно удовлетворяет последовательности 0x8C 0x60 0x0E, то на линии SDA в нужном месте выставляется лог.0. И так по кругу. При использовании прерываний ATTiny13 тратит много тактов на вход и обработку прерывания и не успевает за тактами; частота i2c для него высоковата: 160 кГц.
Плата в формате PCB P-CAD 2006 здесь.
Прошивка для ATTiny13 в формате Intel hex здесь.
Комментарии (14)
gleb_l
29.05.2015 15:41Класс! Повезло, что пришлось переопределять 1 -> 0, а не наоборот, иначе пришлось бы мудрить двунаправленный коммутатор, так как насильно поднимать линию с монтажным И чревато
Dominikanez Автор
29.05.2015 16:18+2Всё верно, но есть один нюанс.
На данной схеме можно «ноль» от главного контроллера задавить «единицей» без сильного для него ущерба: на схеме в линиях SDA и SCL от главного контроллера стоят последовательно резисторы R855 и R857 по 100 Ом, что и позволяет такое проделывать. Нехорошо грузить лапки контроллера таким током, но если нельзя, но сильно хочется, до на короткий импульс можно.
jaiprakash
29.05.2015 21:26Спасибо автору за вдохновление!
Расковырял ещё более старую магнитолу под кассеты на чипе TDA7461, в целом, похожем.
Собираюсь сделать проще: подключиться к входам TAPE, т. е. вместо кассетника.
Пока обнаружил что если снять механизм с моторами и головкой, основной контроллер исключает возможность выбора магнитофона. Попробую просто отключить двигатели. И ещё есть подозрение что надо будет жать «Play» на магнитоле для того, чтобы пошёл звук.vanyas
01.06.2015 05:11Просто так к TAPE не подключится, там контроллер контролирует работу лентопротяжного механизма, так что отключение мотора тоже не канает, пробовал я это на какой-то магнитоле.
jaiprakash
01.06.2015 13:23Мне повезло: у моей магнитолы оказался вход для подключения адаптера CA-C1AUX (схема ниже, там вид на штекер, нужно отзеркалить для гнезда), поэтому кассетный механизм просто выбросил, припаял на выводы 13-выводного гнезда резистор и провода для AUX.
jaiprakash
30.05.2015 20:12Или даже так:
Просто подпаявшись к плате.
И сам переходник магнитола-миниджек рублей 500 в Китае, но ждать лень. И не по-хакерски же.
Hoshi
30.05.2015 23:41+1Круто получилось, но мой внутренний перфекционист негодует: почему не использованы штырьковые разъёмы, а просто напаяны провода прямо на плату? Ведь можно было каждый проводок оформить так-же как и синий провод для кнопки News — разъёмом. Но это так — вкусовщина.
Dominikanez Автор
01.06.2015 05:43+3У меня была такая же мысль изначально, я не зря вывел всё что нужно на штыри PLS. Но в данном случае во мне победил перестраховщик. Автомобиль — это источник вибраций и более надежным мне показалось пайка проводов к штырькам и фиксация всего жгута клеем к плате.
Видимо меня запугали заводские испытания оборудования, которые я по роду деятельности иногда прохожу. Нередко приходится вытряхивать из блоков оторванные от вибрации выводные компоненты.
danfe
Круто. Еще круче было бы увидеть исходник прошивки на условном гитхабе. ;-)
Dominikanez Автор
GitHub никогда не использовал в работе, да и стыдненько исходник показывать: элегантности там маловато.
Но раз уж есть интерес, то вот, положил.
Комментарии в кириллице после скачивания нормально читаются. Я еще не понял почему непосредственно в GitHub так отображается кириллица и как это забороть.
danfe
Не переживайте из-за недостаточной элегантности или кириллических комментариев. Куда важнее то, что теперь ничего не мешает кому-нибудь дописать вышеупомянутую «посылку конфигурации аудиомикшера в момент нажатия кнопки» например и сделать pull request.
Вообще гитхаб — это еще и отличный бекап-сервис для собственных наработок: теперь вы свой исходник точно не потеряете.
mrol
Отправил Вам pull-request с исправленной кириллицей
Dominikanez Автор
Спасибо, сделал merge. Но кажется не ваш, а чей-то другой. Для меня системы контроля версий пока в новинку, поэтому путаюсь в интерфейсе и терминологии.