Кнопки управления магнитолой
Стояла у меня в машине родная магнитола с Яндекс навигатором, но как выяснилось, там Android 4, 2Гб оперативки и дохлый проц, из-за чего всё происходит довольно неспешно. И ни о каком обновлении/установке приложений речи быть не может - всё заблокировано. Мне такой расклад поднадоел, и я решил заменить магнитолу на современную, да побольше. Выбрал Dudu7, почти максималку, с камерами 360 и всякими свистелками-перделками, заодно купил новые динамики. Но про речь не про это, а про то, что экран полностью сенсорный, и мне не хватает кнопок и крутилок. Да, такой вариант магнитолы тоже был, но экран сразу меньше. Обычно в магнитолах есть вход Key1/Key2 для подключения внешних резистивных кнопок, например туда я подключил кнопки на руле. В продаже есть довольно много всяких вариантов внешних кнопок и крутилок, но у меня уже возникла идея, как это должно выглядеть и где стоять. Была идея купить готовое как блок и проводами подцепить свои кнопки, но… я ж инженер-программист/инженер-конструктор или кто? Так родился незатейливый (нет) проект своего блока с кнопками.
Резистивные кнопки
Для начала надо понять, с чем мы работает. А именно - резистивные кнопки.

Самый простой вариант - это последовательно соединённые резисторы, а кнопки замыкают точки между резисторами на землю. Таким образом, при нажатии разных кнопок в цепи будет течь разный ток, и на стороне контроллера можно будет это отследить (или по току, или по напряжению делителя) с АЦП.
Реализовать такой вариант проще простого - кнопки, резисторы и конденсатор на выходе. Всё!
Тем не менее, добавление крутилки нам всё ломает. Крутилка - это энкодер, ему для обработки надо добавить микроконтроллер. Можно взять самую мелкую Attiny13 и дёргать пару резисторов. А можно пойти дальше и добавить цифровой потенциометр и матричный опрос кнопок, что я и сделал.
Матричный опрос
Для начала - схема:


Матричный опрос работает просто: все кнопки одним концом соединены с контроллером, в вторые у них у всех соединены друг с другом, и этот общий провод идёт обратно на контроллер. Общих проводов может быть несколько, тогда несколько рядов кнопок спаяны между собой ещё и первым концом. Контроллер подаёт одиночные импульсы по очереди на каждую кнопку, и смотрит, а что там возвращается с общего провода. Если кнопка замкнута - импульс вернётся. Зная куда подавали, знаем какая кнопка нажата. А чтобы одна кнопка не влияла на другую, ставят последовательно диод.
Выбор компонентов
Итак, пора начинать что-нибудь делать.
Для начала подобрал кнопки с иконками, их на AliExpress довольно много, но реально низкопрофильных уже сильно меньше. Взял 19мм, довольно большая, чтобы на ходу нащупать, попасть и не промахнуться. Да и визуально гармонично. Цвет подсветки - синий, чтобы совпадало с подсветкой всех штатных кнопок в машине.
Энкодер любой, но лучше найти понадёжней. Ручку для него искал тоже с подсветкой, нашёл с окошком для подсветки - сойдёт.
Микроконтроллер взял поменьше - Attiny24. Вернее Attiny44. Ну или сразу Attiny84. Для матрицы взял сдвиговый регистр 74HC595. Цифровой потенциометр AD5245 на 100кОм, подключается по i2c. Вместо кнопки после потенциометра - MOSFET. Ещё я поставил последовательно с линией многооборотистый подстроечный резистор. Так, для корректировки. Но возможно стоит заменить его не постоянный.
Раз уж у нас есть подсветка, то добавим управление. Примерял разные варианты, в итоге остановился на PWM контроллере PCA9685 с i2c управлением, который будет управлять MOSFET’ами и дрыгать подсветкой. А подсветку будем включать по сигналу ILL - когда включаешь фары в машине, там появляется напряжение. Развяжем через оптопару.
Ещё надо подумать о питании. Им займётся TMI3253S, сигнал En будет с сигнала ACC - это зажигание. То есть, когда выключается зажигание, TMI3253S выключается, питание пропадает, и ток не жрёт. Скажу сразу, что заменил её на RT6224D, с ней сигнал почище и работает стабильней.
Энкодер будет на отдельной плате, там же фильтр для сигналов и четыре SMD светодиода с резисторами. Разъёмы везде PicoBlade, так как такие уже стоят на кнопках. Да и они мелкие - можно плату сделать поменьше.
Схема и плата
По итогу схема получилась вот такая:
Плата делалась под корпус Gainga G200MF:
Корпус
Корпус для кнопок - именно то, ради чего всё и затевалось.
Разместить свой девайс я решил под рамкой магнитолы, так как она немного выпирала за уровень торпедо. И это была задачка со звёздочкой, потому что подбирать несколько криволинейных поверхностей, чтобы они чётко прилегали, довольно сложно. Да, можно заказать 3D сканирование, но это дорого для мелкого единичного экземпляра. Я пробовал и замерять, и делать шаблоны из бумаги/картона, лепить глиной… И пришёл к тому, что надо делать несколько сечений, по которым потом делается вытягивание тела. И потом можно печатать пробник на 3D принтере из простого пластика. Если подходит, уже размещать кнопки и энкодер, делать стыки, бортики, скругления, закладные под гайки, винты и прочее. Под ручку энкодера сделал углубление, чтобы сильно не торчала. Напротив светодиодов сделал окошки и вставил световоды диаметра 2мм.
И когда всё готово, стоит выбор пластика. Вспомните, какая жарень стоит в машине летом на солнце? У меня сигнализация показывает 60-70 градусов на внутреннем датчике. PLA здесь отметаем сразу - он не выдержит. PETG - уже лучше, но я бы перебдел. ABS - отличный вариант, но надо красить, потому что деградирует на ультрафиолете. А вот его брат ASA - подойдёт идеально. ASA и стойкий к ультрафиолету, и такой же прочный, и температуры держит хорошо. Так что итоговый корпус печатался пластиком ASA уже на работе на подходящем для этого 3D принтере.
В корпусе сделаны отверстия для проводов, отверстия под винты и выступающие направляющие для крепления к рамке магнитолы. Угол панели подобран оптимально для моей посадки в машине и моего роста, длины руки. В рамке магнитолы проделал ответные отверстия под направляющие, под винты и под провода.
Функционал
Самое главное - нажатие кнопок, поворот энкодера.
Алгоритм простой: фильтруем шум, ловим нажатие/отпускание/поворот энкодера, читаем из массива сопротивление, выставляем сопротивление у цифрового резистора, немного ждём и замыкаем MOSFET. Кнопка отпущена - отпускаем MOSFET. Для энкодера есть время нажатия, на которое замыкается цепь.
Дальше - больше. Долгое нажатие на энкодер активирует меню. Там уже можно поменять яркость подсветки, настроить сопротивление кнопок, выбрать режим обучения. Обучение - это когда надо держать кнопку 3 секунды для обучения магнитолы. Можно и ручками держать 3 секунды, но поворот энкодера так не сделаешь, поэтому добавил такой режим. Здесь и пригодилось индивидуальное управление подсветкой, чтобы показывать номера меню, выбранную кнопку и так далее.
Ну и уже потом добавил всякие штуки типа плавное переключение подсветки, анимации нажатия на кнопки, разные приколюхи.
Косяки
Самый главный косяк - TMI3253S, которая даёт ощутимую пилу на выходе. Можно, конечно, подбирать обвязку и добавлять фильтрацию, но переход на RT6224D самый простой. Почему именно эти чипы? Потому что на работе применяем их много где, оттуда же и решение с заменой.
Разъёмы PicoBlade - тоже подложили мне свинью. То, что я профукал диаметр отверстия в платах - ССЗБ. А вот то, что я решил обжимать шлейфы - было просто слишком самоуверенно. Контакты там настолько мелкие, что мои ювелирные сосиски еле их удерживают в обжимке. Да и провод у меня плохо держался. Проще купить готовые шлейфы, что я и сделал.
Ещё есть какая-то нестабильность в определении магнитолой сопротивления “кнопки”. Это видно в циферках при обучении, в работа сбоев почти нет. Пока не разобрался.
Ссылки
Ссылка на проект на GitHub:
Товары на AliExpress могут быть недоступны, поэтому пишу название лотов.
- Кнопки: Мгновенный выключатель VaneAims из нержавеющей стали
- Ручка со световодом: 4 шт., алюминиевая пластиковая полупрозрачная ручка, автомобильные ручки потенциометра регулировки громкости с накаткой 22*15 мм Infiniti FX37 Hyundai ix35
- Шлейфы PicoBlade: Molex MX1.25 PicoBlade 1.25мм кабельные сборки
- Световод: Длинный 1 м ПММА боковой светящийся оптоволоконный Пластиковый кабель диаметром 1,5 мм/2 мм/3 мм для освещения автомобиля яркое украшение






