Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
Key1) "src =" https://content.instructables.com/ORIG/F3X/UXCI/KCT3F9KZ/F3XUXCIKCT3F9KZ-p.webp
Key1) "src =" {{file.large_url | add: 'auto = webp & frame = 1 & height = 300'%} ">
Через несколько дней после покупки подержанной машины я обнаружил, что не могу воспроизводить музыку со своего телефона через автомобильную стереосистему. Еще больше расстраивало то, что в машине был Bluetooth, но разрешались только голосовые вызовы, а не музыка. У него также был USB-порт для Windows Phone, но он не работал с iPhone без ключа за 60 долларов.
Заменив стереосистемы на моих предыдущих машинах, без особых размышлений и исследований, я заказал замену стереосистемы за 40 долларов на хорошо известном «дешевом» сайте. Стереосистема поставлялась с камерой заднего вида, Car Play и множеством дополнительных функций, которые казались гораздо более выгодными, чем более дорогой ключ, который выполняет только одну функцию.
После покупки и покраски новой лицевой панели, 3D-печати крепления и большого количества дополнительной работы (которая могла быть полезной сама по себе) я пришел к неприятному открытию. Команды клавиш на рулевом колесе отправлялись через шину CAN, но у стереосистемы был только вход Key1. Не желая сдаваться на полпути, я заказал адаптер за 60 фунтов стерлингов, который, как оказалось, не работал. В этот момент я решил сам сделать переходник.
Я не инженер-электрик, у меня только элементарные знания в области электроники, и это был для меня учебный и исследовательский проект. Я бы посоветовал сначала проверить характеристики вашего автомобиля и заказать совместимое радио, но если вы уже застряли (как и я), следуйте инструкциям на свой страх и риск.
Запасы
Адаптер (ок. 15 $)
- Arduino Pro Mini 5V (или совместимая плата)
- Модуль шины CAN MCP2515
- Перфокарт 60x80 мм
- Цифровой потенциометр X9C104 100 кОм (зависит от вашей стереосистемы)
- Понижающий регулятор DC-DC LM2596S 3-40V 3A
- Держатель предохранителя кабеля + предохранитель (100-200 Ом)
- Коробка проекта или 3D-принтер для печати
- Автомобильные стереоразъемы (штекер + гнездо)
- Принадлежности для пайки, провода и т. Д.
Помощники по тестированию (не обязательно, но сделают тестирование намного проще)
- Arduino (подойдет любая плата на 5 В)
- Модуль шины CAN MCP2515
- Макетная плата + перемычки
Шаг 1: анализ шины CAN
Вместо того, чтобы прокладывать пучок проводов внутри вашего автомобиля, соединяя множество систем, некоторые современные автомобили имеют пары проводов, идущих к каждому компоненту. Информация передается в виде пакетов цифровых данных по этим проводам, и все системы могут читать все сообщения. Это сеть CAN-шины (в вашем автомобиле может быть несколько сетей, поэтому вся информация может быть не видна).
Что мы хотим сделать, так это подключиться к сети CAN-шины и «прослушать» трафик данных. Таким образом, мы можем «видеть», когда нажата клавиша на рулевом колесе. Каждый пакет имеет идентификатор, который представляет подсистему транспортного средства, отправившую пакет, и данные, которые представляют состояние системы. В этом случае мы пытаемся найти идентификатор подсистемы, которая отправляет сообщения клавиш рулевого колеса, и представление данных каждой клавиши.
Если вам повезет, вы можете найти значения для своего автомобиля где-нибудь в Интернете и пропустите этот шаг.
Этот процесс немного сложен и уже был объяснен в других местах, поэтому я просто резюмирую его:
- Найдите правильные значения для связи по шине CAN на вашем автомобиле. Для моей машины (Fiat Idea 2009 года) это была скорость передачи данных 50 Кбит / с и тактовая частота 8 МГц.
- Подключитесь к сети CAN-шины с помощью модуля CAN-шины и Arduino в конфигурации «сниффера».
- Считайте значения шины CAN на вашем ноутбуке с помощью такого инструмента, как https://github.com/alexandreblin/python-can-monito…. Без него сделать это будет очень сложно, так как много сообщений отправляется, даже когда машина ничего не делает.
- Нажмите кнопку на рулевом колесе и обратите внимание на изменение значения. Это может быть немного сложно, так как отправляется много сообщений, и может быть трудно понять, что из чего.
Вот две отличные статьи, подробно объясняющие этот процесс:
- https://medium.com/@alexandreblin/can-bus-reverse-…
- https://www.instructables.com/id/CAN-Bus-Sniffing-…
В конце концов, у вас должен быть идентификатор подсистемы, который мы будем использовать для прослушивания только сообщений шины CAN рулевого колеса, и список шестнадцатеричных значений для ключевых команд. В моем случае данные выглядели так:
ID | ID Hex | Байт 0 | Байт 1 | Кнопка
--------------------------------------------- 964 | 3C4 | 00 | 00 | Без кнопок 964 | 3C4 | 04 | 00 | SRC 964 | 3C4 | 10 | 00 | >> 964 | 3C4 | 08 | 00 | << 964 | 3C4 | 00 | 80 | Телефон 964 | 3C4 | 00 | 08 | ESC 964 | 3C4 | 80 | 00 | + 964 | 3C4 | 40 | 00 | - 964 | 3C4 | 00 | 40 | Win 964 | 3C4 | 00 | 02 | Up 964 | 3C4 | 00 | 01 | Вниз 964 | 3C4 | 00 | 04 | Ok
Идентификатор подсистемы - 3C4 (в данном случае), который является шестнадцатеричным числом, поэтому мы должны записать его как 0x3C4 в эскизах Arduino. Также нас интересуют байты 0 и 1 (в вашем случае байтов может быть больше). Это также шестнадцатеричные значения, поэтому они также должны быть записаны с начальным 0x.
Если вы конвертируете значения в двоичные, вы заметите, что биты не перекрываются (например, + 0b10000000 и - 0b01000000), это значит, что одновременно можно нажимать несколько клавиш.
Я предлагаю создать сниффер из материалов, перечисленных в разделе «Помощник по тестированию», чтобы вы могли повторно использовать его позже для моделирования своей машины. Это избавит вас от необходимости сидеть в машине все время, пока вы собираете и тестируете адаптер. Вы можете использовать предоставленный эскиз в качестве имитатора. Измените "subsystemId", "data0" и "data1" значениями, которые вы поняли.
Шаг 2: отправка команд на стерео
Перед тем, как приступить к сборке адаптера, лучше сначала проверить, может ли стереосистема получать команды.
У меня был запасной автомобильный аккумулятор, поэтому я подключил стереосистему напрямую к нему. Даже лучше, если у вас настольный источник питания 12 В. К сожалению, я не смог найти в Интернете много информации о входе Key1 на моем устройстве, поэтому я решил поэкспериментировать. Я не особо беспокоился о том, чтобы сжечь стереосистему на этом этапе, поскольку она относительно дешевая, и это была моя последняя отчаянная попытка заставить ее работать с моей машиной.
В стереосистеме есть экран обучения командам, на котором можно выбрать одно из двух значений сопротивления (1 кОм и 3,3 кОм) и увидеть значение «напряжения» (0–255). "Напряжение" цитируется, потому что оно вводит в заблуждение. Я потратил много времени, безуспешно подавая разные напряжения на Key1. Я также пытался использовать разные резисторы для подачи напряжения, но безуспешно.
Прорыв произошел, когда я попытался прикоснуться проводом Key1 к заземлению батареи, что привело к падению «напряжения» до 0. Это в сочетании с разными резисторами давало согласованные значения «напряжения» на экране обучения.
Теперь, когда я знал, как отправлять входы в стерео, мне нужен был способ отправлять их с Arduino. На данный момент я не слышал о мультиплексорах, которые вместе с некоторыми резисторами могли бы быть более быстрым и надежным решением (я все еще не уверен, возможно ли это), поэтому я использовал цифровой потенциометр. Сначала у меня были проблемы с работой цифрового потенциометра, пока я не понял, что мне нужно подключить его как реостат, чтобы он действовал как переменный резистор вместо делителя напряжения. В основном мне приходилось соединять клеммы RH и RW.
Помимо сопротивления, решающее значение имел выбор времени. Если падение сопротивления слишком короткое, команда не будет зарегистрирована. Если он слишком длинный, он может регистрироваться несколько раз. Падение на 240 мс с последующей задержкой на 240 мс до следующей команды сработало довольно надежно для моей стереосистемы. Хотя это кажется очень небольшим временем, это означает, что мы можем отправлять максимум 2 команды в секунду, что заметно, если вы пытаетесь быстро увеличить или уменьшить громкость. Я пробовал поиграть с разными таймингами и шаблонами, которые действительно увеличивали скорость, но были не очень надежны. Если у вас есть идеи, как это улучшить, оставьте их в комментариях.
Прежде чем продолжить, я предлагаю создать прототип, чтобы проверить, принимает ли ваша стереосистема такой же вход. Даже если он принимает разные напряжения, адаптер должен работать с небольшими изменениями в проводке и эскизе Arduino.
Шаг 3: Сборка адаптера
После тестирования всех компонентов по отдельности и испытания их вместе на макетной плате пришло время придать им более постоянный дом. На раскладку компонентов и пайку ушло несколько часов.
В верхнем левом углу находится понижающий регулятор, который преобразует 12 В от автомобильного аккумулятора в 5 В, которые могут использоваться другими компонентами.
В левом нижнем углу находится модуль шины CAN, который считывает значения из сети шины CAN автомобиля и пересылает их в Arduino.
В правом верхнем углу находится цифровой потенциометр (подключенный как реостат), который действует как переменный резистор между землей и входом Key1 стереосистемы.
В правом нижнем углу находится Arduino, который действует как мозг адаптера, преобразуя сообщения шины CAN в сопротивления, которые считываются стереосистемой.
На входе 12 В находится предохранитель на 150 мА, который, скорее всего, не защитит цепь, но предназначен для предотвращения возгорания в случае короткого замыкания.
Шаг 4: Программное обеспечение
После загрузки поместите все три файла.ino в одну папку. Таким образом, все они будут частью одного скетча и вместе будут развернуты на Арудино.
Вам также необходимо добавить необходимые библиотеки в IDE Arduino. Для этого скачайте следующие файлы:
github.com/autowp/arduino-mcp2515/archive/…
github.com/philbowles/Arduino-X9C/archive/…
затем добавьте их оба, выбрав Sketch> Include Library> Add. Zip Library…
CanBusStereoAdapter.ino
В этом файле выполняется базовая настройка.
Значения ключевой команды CAN-шины определены вверху. Если у вас нет такой же машины, как у меня, вам, скорее всего, придется использовать свои собственные ценности. Вы можете использовать шестнадцатеричные значения из сниффера, я использовал двоичные, чтобы было легче увидеть, что нет случайных перекрытий в битах.
У всех автомобилей разные команды на рулевом колесе, поэтому не стесняйтесь удалять, добавлять или редактировать определенные значения.
Не забудьте заменить идентификатор вашей подсистемы на "STEERING_ID".
CanBus.ino
Этот файл устанавливает прослушиватель шины CAN, интерпретирует пакеты и помещает значения сопротивления в кольцевой буфер.
Настройте конфигурацию шины CAN в функции «setupCanBus», чтобы она соответствовала вашему автомобилю.
Мы используем кольцевой буфер, потому что, как упоминалось ранее, ввод команды с рулевого колеса намного быстрее, чем ввод стерео. Таким образом, мы не пропускаем ни одной команды, пока цифровой потенциометр делает свое дело. Если мы введем слишком много команд, самые старые будут отброшены первыми, так как они наименее важны. Это также позволяет нам обрабатывать случай, когда нажимается несколько кнопок, поскольку стереовход принимает только одно значение за раз.
Если вы изменили какие-либо определения команд в CanBusStereoAdapter.ino, вам также необходимо обновить их в функции handleMessageData. "handleMessageData" проверяет, содержат ли предоставленные кадры данных шины CAN какие-либо известные команды, с помощью операции побитового И.
Например, если я одновременно нажал >> и +, это даст нам фрейм данных со значением 0b10010000. >> (для моей машины) - это 0b00010000 в двоичном формате, а + - это 0b10000000.
--------------- >> -------------- + ------------- << --- - data0 | 0b10010000 | 0b10010000 | 0b10010000 команда | И 0b00010000 | И 0b10000000 | И результат 0b00001000 | = 0b00010000 | = 0b10000000 | = 0b00000000
Здесь мы видим, что результат операции И будет больше 0, если команда присутствует в кадре данных. Итак, все, что нам нужно сделать, это проверить наличие {data frame} & {command value}> 0 для каждой команды, которую мы определили.
Имейте в виду, что каждый фрейм данных содержит разные команды, поэтому ничего страшного, если значения команд совпадают, поскольку мы сравниваем их с их собственными фреймами. В моем примере << и ESC имеют одинаковое значение 0b00001000 (0x08), но << находится в data0, а ESC - в data1.
После того, как мы определили, что команда присутствует в кадре, мы добавляем значение цифрового потенциометра в кольцевой буфер. Значения варьируются от 0 до 99, но я заметил, что "напряжение", считываемое стереосистемой, не является линейным, поэтому проверьте значения самостоятельно.
DigitalPot.ino
Этот файл извлекает значения из кольцевого буфера и отправляет их в цифровой горшок для выполнения. В моем случае "pot.setPotMin (false);" увеличит сопротивление до максимума, который стерео будет считывать как максимальное «напряжение». Ваша стереосистема может потребовать от вас установить цифровой потенциометр на минимум, так что проверьте это.
Шаг 5: Приложение к проекту
У меня есть 3D-принтер, поэтому я решил напечатать корпус из двух частей для своего адаптера. Я включил файл Fusion 360, который вы можете редактировать, и файлы gcode, которые подходят для перфорированной платы 60x80 мм.
Если у вас нет доступа к 3D-принтеру, вы можете использовать готовый проектный корпус или прочный контейнер.
Шаг 6: Заключительные мысли
Изначально я планировал подключить адаптер к постоянному источнику питания и просыпаться по определенным сообщениям шины CAN, поскольку в моей машине нет провода зажигания в отсеке стереосистемы. Позже я отказался от этого, так как не хотел рисковать, разряжая аккумулятор и беспокоясь об адаптере, пока я не в машине. Я использовал разветвитель автомобильного блока предохранителей, чтобы проложить провод зажигания, и мне не пришлось усложнять адаптер.
По моим тестам потребляемая мощность 20-30 мА. Я снизил его до 10 мА в спящем режиме и мог бы снизить его даже, удалив светодиоды из компонентов, но я решил не беспокоиться об этом, поскольку он будет работать только во время движения автомобиля.
Я очень доволен конечным результатом. Время отклика приемлемое, и он редко пропускает команды.
Несмотря на то, что мое время было намного больше, чем стоимость имеющегося в продаже адаптера (который не работал), полученные мной знания бесценны.