CAN-bus Arduino адаптер руля Citroen C4B7. Подключаем 2din к шине CAN. Часть 1.
Значит делать было нечего и решил я заменить китайское незнамо что хорошей 2din магнитолой (JVC KW-M560BT). За время использования Teyes я понял что это невообразимой глубины бездна багов, лагов и пользоваться этой отрыжкой it-индустрии я больше не могу. Тем более основное что мне надо от этой штуки, как оказалось, это музыка и навигация через CarPlay.
Как я подключил 2din, наверное, в другой раз опишу и работает она идеально — музыка льется как мед для ушей, а CarPlay работает лучше самого телефона. Но сейчас вкратце и по верхам поделюсь как сделать так что бы кнопки руля которые работают по can-шине доходили до магнитолы в виде "резистивных сигналов".
Сразу скажу что это первый опыт, я аматор, новичок и просто делаю это в свое удовольствие в обед и вечерком между рабочими делишками.
Как работает canbus в двух словах: по определенным проводам машины постоянно летают сигналы о состоянии разных агрегатов и механизмов, например что включено и что нет, скорость, нажатие кнопок и тд.
Например если кнопка громкости не нажата, то в определенных пакетах данных каждые 100 миллисекунд приходит значение 0, а если нажата то те же 100 миллисекунд приходит значение 64.
Больше инфы и деталей по CAN Citroen C4 тут. Там же достаточно информации что бы собрать свой CanHacker для исследования сообщений на шине.
Теперь задача состоит в том что бы отловить эти пакеты данных, проверить что в них, перевести это в понятный для магнитолы язык и отправить ей. Магнитолы обычно имеют несколько проводов для резистивного управления с руля — GND, KEY1, KEY2. Меняя сопротивление между KEY1/KEY2 и GND мы говорим магнитоле что нажата определенная кнопка.
Для тестирования на столе пришлось собрать 12 физических кнопок что бы имитировать машину и еще одно can устройство которое бы имитировало активность в кан-шине.

Какие материалы нужны:
1️⃣ Arduino Nano / ATMEGA 328p — мозг этого всего устройства.
2️⃣ mcp2515 tja1050 модуль — модуль которые переводит в понятный для ардуино язык сигналы canbus.
3️⃣ ULN2803APG — микросхема которая в этом устройстве работает как реле, виртуально нажимая резистивные кнопки, то есть посылает сигналы в магнитолу что нажата некая кнопка на руле.
4️⃣ Набор резисторов (220, 470, 680… и другие, но кажется это должно подбираться индивидуально под магнитолу, каждые резистор — другая виртуальная кнопка)
5️⃣ Паяльник, припой, макетки, куча проводов и все остальное что бы превратить квартиру в гараж и мастерскую )

Схему я рисовал впервые, поэтому вышло как вышло, по крайней мере пару таких устройств по ней я собрал и всё работает ) Использовал юзерфрендли прогу Fritzing, интуитивно понятная, легко разобраться.

Схема нарисована для голого чипа Atmega328p, но по ней легко понять как заменить микросхему на готовую Arduino Nano. Предполагается что питание каким-то модулем конвертируется из 12 в 5, модулей разных огромная куча.
Суть работы устройства: mcp2515 переводит сигналы кан-шины в понятный для atmega328p/arduino язык, на atmega328p/arduino мы пишем код который отлавливает нужные нам сигналы и передает их в ULN2803APG.
ULN2803APG — это такое себе, если сильно грубо сказать — реле, на одну ногу мы подаем +5в, а на другой открывается канал к которому и подключен нужный резистор и KEY1/KEY2 магнитолы. Дальше магнитола определяет сопротивление и считает что нажата кнопка руля.
Всего в ULN2803APG есть 8 транзисторных пар, но кнопок магнитола может захотеть и 10 и 12 (как в моем случае) с этим проблем нет — просто открываем сразу несколько транзисторных пар и получаем новое сопротивление.
К машине это подключается через quadlock разъем. Он продается в любых авто- и радио- магазинах, через него и питание и CAN-шина.



Текста получилось очень много, поэтому продолжу в другой раз, если дойдут руки ))