[Перевод] Как я добавил функции автомобилю по шине CAN, не умея программировать

xok7t2l-qmakairvtmxiduaj6pg.jpeg

Цель этой статьи — рассказать о моём опыте модификации автомобиля, экспериментируя с шиной CAN.


Сначала я решил добавить фронтальную камеру в свой 2017 Chevrolet Cruze. Поскольку у автомобиля уже есть заводская камера заднего вида, то на высоком уровне нужно было выяснить две вещи:

  1. Способ передачи видео с фронтальной камеры, которую я добавлю.
  2. Способ отображения на экране картинки с камеры заднего вида в любое время.


Видеочасть была простой. Из предыдущего опыта я знал, что можно сделать видеомикшер на реле.

Запуск на экране оказался более сложным, и после некоторого расследования я пришёл к выводу, что машина должна подавать сигнал от камеры заднего вида на экран через какую-то шину данных.


У Chevrolet две разные шины данных. Первая — это стандартная CAN, быстрая (500 Кбит/с) и надёжная, она используется для критических данных. Вторая — то, что GM называет LAN (GMLAN), более старая и медленная шина (33,3 Кбит/с), которая используется для данных, не связанных с безопасностью.

Мне нужен был способ прослушивать трафик по CAN, то есть снифер. Для этой цели невероятно полезно устройство PCAN.

cf018fdb5119f22edb383bc4b77f92cd.jpg
Peak Can

Peak Can (PCAN) представляет собой USB-устройство, способное перехватывать и передавать сообщения. Благодаря программному обеспечению Pcan View можно начинать работу без особого обучения.

Поскольку камера заднего вида менее важна для безопасности, чем другие компоненты, я предположил, что искомые данные, скорее всего, будут на шине GMLAN.

Самая простая точка доступа — разъём OBD2. Я подключил Peak Can к шине GMLAN, запустил программное обеспечение — и сразу началось прослушивание трафика.


Цель состояла в том, чтобы перепроектировать вызов камеры заднего вида. Для этого с включённым снифером я повёл машину задним ходом, чтобы она включила дисплей, а затем несколько раз попробовал парковался. На протяжении всего этого процесса я заметил один ID с сообщениями, которые последовательно имитировали мои действия.

Тогда я припарковался и через Pcan View попытался передать то же самое сообщение, которое я видел, когда включался и выключался дисплей. В мгновение ока я уже взаимодействовал с шиной.


Передача сообщения через PCAN

Впрочем, я не планировал постоянно ездить с ноутбуком. Нужен был способ автоматизировать эти функции — и здесь пригодилась Arduino. Возможность напрямую получать питание 12V в сочетании с большим количеством ресурсов и поддержки в интернете сделала этот выбор очевидным.

В дополнение к Arduino для завершения проекта мне понадобилось два компонента: модуль CAN и модуль реле. По сути, Arduino — это мозг, запускающий и выполняющий код. Модуль CAN предоставляет возможность взаимодействовать с шиной данных, а реле обеспечивает питание фронтальной камеры, а также действует как видеомикшер между ней и камерой заднего вида.

fd28b9335da54c5e1f490e0439bf6694.jpg
Модуль mcp2515 (сверху), Arduino Uno (посередине), модуль реле (снизу)

После добавления и настройки соответствующих библиотек Arduino установил связь с автомобилем.


Прослушивание трафика через Arduino

Поскольку я уже знал, что могу запустить дисплей, то начал думать о том, КАК это сделать. Первоначальная идея состояла в том, чтобы установить на панели специальную кнопку мгновенного вызова, но я начал думать: «А что ЕЩЁ в сети можно использовать в качестве триггера?»

В ходе экспериментов я обнаружил, что по шине GMLAN также передаются сообщения с ID, соответствующим кнопке «Отмена круиз-контроля». Это было идеально, потому что круиз-контроль включается на скоростях более 65 км/ч, когда я буду использовать переднюю камеру, а на скоростях ниже 15 км/ч будет включаться камера заднего вида, чтобы помочь с парковкой, так что они никогда не будут перекрываться. После написания некоторого кода я смог заставить Arduino распознать, когда нажимается кнопка отмены круиз-контроля.


Распознавание однократного нажатия кнопки

Однако я не хотел, чтобы камера активировалась каждый раз, когда я отменяю круиз-контроль, поэтому я решил, что лучший подход — превратить её (по сути) в многофункциональную кнопку. Камера активируется только в том случае, если кнопка «дважды нажата».

После долгого уикенда изучения функции millis и отладки кода я успешно запрограммировал распознавание двойного нажатия.


Распознавание двойного нажатия

И когда я привязал его к своим командам для управления дисплеем, у меня собралась довольно крутая небольшая утилита.


Двойное нажатие + команды
Теперь у меня была возможность включать и выключать дисплей, но оставалась одна проблема — что насчёт камеры заднего вида? Мне нужно было, чтобы они с фронтальной камерой работали вместе, словно их так настроили на заводе.

На блок-схеме я изобразил, как я это представляю.

77163ecca613e040e82d2aae9db9c511.jpg

Я быстро понял, что для такой системы нужно в любой момент времени знать состояние трёх переменных:

  • Модуль передней камеры: водитель включил или выключил его?
  • Дисплей камеры: изображение на дисплее включено или выключено?
  • Задний ход: автомобиль в реверсе или нет?


Не имея опыта программирования, это было очень сложно сделать, и я всё свободное время думал о разных подходах.

В конце концов, я добился успеха!


Активный мониторинг

Теперь я смог реализовать операционную логику, которую контролирует реле.


Управление через реле

На протяжении всего процесса я всё больше узнавал об Arduino и заметил, что версия Nano способна делать всё, что нужно, при этом у неё меньший размер и более низкая цена. Она идеально подходит для постоянной установки в автомобиль. Я разработал модель и распечатал на 3D-принтере корпус для размещения компонентов в качестве компактного блока для установки.

o9dqvdst9apwqd3ufvmr-l7ppqy.png
3D корпус

6afbc4e8629d4fd6255f6f79f8344b8d.png


Наконец настал день, когда я увидел результаты. Хотя нужно ещё повозиться с таймингом, но было приятно видеть, что модуль корректно работает.


Включение/выключение режима парковки, включение/выключение фронтальной камеры, автоматическое переключение на камеру заднего вида и автоматическое переключение обратно

В целом, этот опыт меня многому научил и открыл глаза на возможности интеграции непосредственно с шиной CAN. Довольно удивительно, чего можно достичь соединением по двум проводам.


В будущем я планирую написать углублённый учебник о том, как добавить дополнительную функциональность к существующим кнопкам в вашем автомобиле, используя бесплатное программное обеспечение и компоненты.

© Habrahabr.ru