Изменение температуры кондиционера Ford Fusion при помощи команд через шину CAN.

Ariel Nuñez
Изменение температуры кондиционера Ford Fusion при помощи команд через шину CAN.


Рисунок 1: Как при помощи приложения управлять ключевыми функциями автомобиля?
Недавно я вместе со своими друзьями из компании Voyage работал над реализацией программного управления системой кондиционирования в Ford Fusion. На данный момент Voyage занимается разработкой бюджетных самоуправляемых автомобилей. Конечная цель: чтобы каждый смог вызвать автомобиль к своей входной двери и безопасно путешествовать туда, куда вздумается. В компании Voyage считают крайне важной возможностью предоставление доступа к ключевым функциям автомобиля с заднего кресла, поскольку не за горами тот день, когда работа водителя будет полностью автоматизирована.
Зачем нужна шина CAN
Современные автомобили используют множество систем управления, которые во многих случаях функционируют подобно микро-службам в веб-разработке. Например, подушки безопасности, тормозные системы, регулирование скорости движения (круиз контроль), электроусилитель руля, аудиосистемы, управление окнами и дверями, подстройка стекл, системы зарядки для электрических автомобилей и т. д. Эти системы должны уметь осуществлять коммуникацию и считывать параметры друг друга. В 1983 в компании Bosch началась разработка шины CAN (Controller Area Network; Локальная сеть контролеров) для решения этой сложной задачи.
Можно сказать, что шина CAN представляет собой простую сеть, где каждая система автомобиля может считывать и отсылать команды. Эта шина интегрируется все сложные компоненты элегантным образом, что дает возможность реализовать всеми любимые функции автомобиля, которыми мы пользуемся.


Рисунок 2: Впервые шина CAN стала использоваться в 1988 году в БМВ 8 серии
Самоуправляемые автомобили и шина CAN
Поскольку интерес к разработке самоуправляемых автомобилей серьезно вырос, соответственно, словосочетание «шина CAN» также становится популярным. Почему? Большинство компаний, создающих самоуправляемых автомобилей, не занимаются производством с нуля, а пытаются научиться программно управлять машинами после выхода с конвейера фабрики.
Понимание внутреннего устройства шины CAN, используемой в автомобиле, позволяет инженеру формировать команды при помощи программного обеспечения. Самые нужные команды, как вы можете догадаться, связаны с управлением рулем, ускорением и торможением.


Рисунок 3: Введение в LIDAR (ключевой сенсор самоуправляемого автомобиля)
При помощи сенсоров наподобие LIDAR (light detecting and ranging; оптическая локационная система) машина способна смотреть на мир как суперчеловек. Затем компьютер внутри автомобиля на базе полученной информации принимает решения и посылается команды в шину CAN для управления рулем, ускорение и торможением.
Не каждый автомобиль способен стать самоуправляемым. И по некоторым причинам компания Voyage выбрала модель Ford Fusion (подробнее о причинах можно почитать в этой статье).
Исследование шины CAN в Ford Fusion
Перед началом исследования систем кондиционирования воздуха в Ford Fusion я открыл мою любимую книгу The Car Hacker’s Handbook . Перед погружением в суть вопроса заглянем в Главу 2 , где описываются три важные концепции: протоколы шины, шина CAN и CAN-фреймы.
Шина CAN
Шина CAN начала использоваться в американских легковых машинах и небольших грузовиках с 1994 года и с 2008 года в обязательном порядке (в европейских автомобилях с 2001 года). В этой шине предусмотрено два провода: CAN high (CANH) и CAN low (CANL). Шина CAN использует дифференциальный сигналинг, суть которого заключается в том, что при поступлении сигнала на одном проводе вольтаж повышается, а на другом понижается на одну и ту же величину. Дифференциальный сигналинг используется в средах, которые должны быть малочувствительны к шуму, например, в автомобильных системах или при производстве.


Рисунок 4: Необработанный сигнал шины CAN, отображаемый на осциллографе
С другой стороны, пакеты, передаваемые по шине CAN, не стандартизированы . Каждый пакет содержит 4 ключевых элемента:

  • Арбитражный ID (Arbitration ID ) представляет собой широковещательно сообщение, идентифицирующее устройство, которое пытается начать коммуникацию. Любое устройство может отсылать несколько арбитражных ID. Если в единицу времени по шине отсылаются два CAN-пакета, пропускается тот, у которого ниже арбитражный ID.
  • Расширение идентификатора (Identifier extension ; IDE ) – в случае с шиной CAN стандартной конфигурации этот бит всегда равен 0.
  • Код длины данных (Data length code ; DLC ) определяет размер данных, который варьируется от 0 до 8 байт.
  • Данные. Максимальный размер данных, переносимых стандартной шиной CAN, может быть до 8 байт. В некоторых системах происходит принудительное дополнение пакета до размера 8 байт.


Рисунок 5: Формат стандартных CAN-пакетов
CAN фреймы
Для того чтобы включить / выключить климатическую систему мы должны найти нужную шину CAN (в автомобиле таких шин несколько). В Ford Fusion есть как минимум 4 задокументированные шины. 3 шины работают на высокой скорости 500 кбит/с (High Speed CAN; HS) и 1 шина на средней скорости 125 кбит/с (Medium Speed CAN; MS).
К порту OBD-II подключено две высокоскоростные шины HS1 и HS2, однако там стоит защита, которая не позволяет подделывать команды. Вместе с Аланом из компании Voyage мы вынули порт OBD-II и нашли места соединения со всеми шинами (HS1, HS2, HS3 и MS). На задней стенке OBD-II все шины подключались к модулю шлюза (Gateway Module).


Рисунок 6: Homer – первое самоуправляемое такси от компании Voyage
Поскольку климатическая система управляется через медиа-интерфейс (SYNC), нам придется отсылать команды через среднескоростную шину (MS).
Чтение и запись CAN-пакетов осуществляется при помощи драйвера и сетевого стека SocketCAN , созданного исследовательским отделом компании Volkswagen для ядра в Linux .
Мы будем подсоединять три провода от машины (GND, MSCANH, MSCANL) к переходнику Kvaser Leaf Light HSv2 (можно купить за 300$ на Амазоне) или к CANable (продается за 25$ на Tindie) и загружать на компьютере со свежим Linux-ядром шину CAN в качестве сетевого устройства.

Modprobe can
modprobe kvaser_usb
ip link set can0 type can bitrate 1250000
ifconfig can0 up

После загрузки запускаем команду candump can0 и начинаем отслеживать трафик:

Can0 33A 00 00 00 00 00 00 00 00 can0 415 00 00 C4 FB 0F FE 0F FE can0 346 00 00 00 03 03 00 C0 00 can0 348 00 00 00 00 00 00 00 00 can0 167 72 7F FF 10 00 19 F8 00 can0 3E0 00 00 00 00 80 00 00 00 can0 167 72 7F FF 10 00 19 F7 00 can0 34E 00 00 00 00 00 00 00 00 can0 358 00 00 00 00 00 00 00 00 can0 3A4 00 00 00 00 00 00 00 00 can0 216 00 00 00 00 82 00 00 00 can0 3AC FF FF FF FF FF FF FF FF can0 415 00 00 C8 FA 0F FE 0F FE can0 083 00 00 00 00 00 01 7E F4 can0 2FD D4 00 E3 C1 08 52 00 00 can0 3BC 0C 00 08 96 01 BB 27 00 can0 167 72 7F FF 10 00 19 F7 00 can0 3BE 00 20 AE EC D2 03 54 00 can0 333 00 00 00 00 00 00 00 00 can0 42A D6 5B 70 E0 00 00 00 00 can0 42C 05 51 54 00 90 46 A4 00 can0 33B 00 00 00 00 00 00 00 00 can0 42E 93 00 00 E1 78 03 CD 40 can0 42F 7D 04 00 2E 66 04 01 77 can0 167 72 7F FF 10 00 19 F7 00 can0 3E7 00 00 00 00 00 00 00 00 can0 216 00 00 00 00 82 00 00 00 can0 415 00 00 CC F9 0F FE 0F FE can0 3A5 00 00 00 00 00 00 00 00 can0 3AD FF FF FF FF FF FF FF FF can0 50B 1E 12 00 00 00 00 00 00

Несмотря на то, что вышеуказанная информация эквивалентна амплитуде звукового сигнала, довольно трудно понять, что происходит, и обнаружить какие-либо закономерности. Нам нужно нечто похожее на частотный анализатор, и такой эквивалент есть в виде утилиты cansniffer. Cansniffer показывает список идентификаторов и позволяет отслеживать изменения в секции данных внутри CAN-фрейма. По мере того как мы будем изучать определенные идентификаторы, мы можем установить фильтр нужных ID, которые имеют отношение к нашей задаче.
На рисунке ниже показан пример информации, снятой при помощи cansniffer с шины MS. Мы отфильтровали все, что имеет отношение к идентификаторам 355, 356 и 358. После нажатия и отпускания кнопок, связанных с подстройкой температуры, в самом конце появляется значение 001C00000000.


Рисунок 7: Информация с шины MS, снятая при помощи утилиты cansniffer
Далее необходимо объединить функционал для управления климатической системой с компьютером, работающим внутри автомобиля. Компьютер работает на операционной системе ROS (Robot Operating System; Операционная система для роботов). Поскольку мы используем SocketCAN, то модуль socketcan_bridge серьезно упрощает задачу по преобразованию CAN-фрейма в блок информации, понимаемый операционной системой ROS.
Ниже показан пример алгоритма декодирования:

If frame.id == 0x356:
raw_data = unpack("BBBBBBBB", frame.data)
fan_speed = raw_data / 4
driver_temp = parse_temperature(raw_data)
passenger_temp = parse_temperature(raw_data)

Полученные данные хранятся в CelsiusReport.msg:

Bool auto
bool system_on
bool unit_on
bool dual
bool max_cool
bool max_defrost
bool recirculation
bool head_fan
bool feet_fan
bool front_defrost
bool rear_defrost string driver_temp
string passenger_temp

После нажатия всех нужных кнопок в машине, у нас появляется следующий список:

CONTROL_CODES = {
"ac_toggle": 0x5C,
"ac_unit_toggle": 0x14,
"max_ac_toggle": 0x38,
"recirculation_toggle": 0x3C,
"dual_temperature_toggle": 0x18,
"passenger_temp_up": 0x24,
"passenger_temp_down": 0x28,
"driver_temp_up": 0x1C,
"driver_temp_down": 0x20,
"auto": 0x34,
"wheel_heat_toggle": 0x78,
"defrost_max_toggle": 0x64,
"defrost_toggle": 0x4C,
"rear_defrost_toggle": 0x58,
"body_fan_toggle": 0x04,
"feet_fan_toggle": 0x0C,
"fan_up": 0x2C,
"fan_down": 0x30,
}

Затем эти строки отсылаются на узел под управлением операционной системы ROS и далее происходит трансляция в коды, понимаемые автомобилем:

Rostopic pub /celsius_control celsius/CelsiusControl ac_toggle

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


Рисунок 8: Удаленное управление климатической системой автомобиля
Это лишь небольшой шаг при создании самоуправляемого такси вместе со специалистами компании Voyage . Я получил массу положительных эмоций во время работы над этим проектом. Если вы тоже интересуетесь этой темой, можете ознакомиться со списком вакансий в компании Voyage.

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

Для обмена информацией между ними требовалась надежная коммуникационная сеть.
В середине 80-х годов прошлого столетия компанией BOSCH была предложена новая концепция сетевого интерфейса CAN (Controller Area Network).

CAN-шина обеспечивает подключение любых устройств, которые могут одновременно принимать и передавать цифровую информацию (дуплексная система). Собственно шины представляет собой витую пару. Данная реализация шина позволила снизить влияние внешних электромагнитных полей, возникающих при работе двигателя и других систем автомобиля. По такой шине обеспечивается достаточно высокая скорость передачи данных.

Как правило, провода CAN-шины оранжевого цвета, иногда они отличаются различными цветными полосами (CAN-High - черная, CAN-Low - оранжево-коричневая).

Благодаря применению данной системы из состава электрической схемы автомобиля высвободилось определенное количество проводников,которые обеспечивали связь, например, по протоколу KWP 2000 между контроллером системы управления двигателем и штатной сигнализацией, диагностическим оборудованием и т.д.

Скорость передачи данных по CAN-шине может достигать до 1 Мбит/с, при этом скорость передачи информации между блоками управления (двигатель - трансмиссия, ABS - система безопасности) составляет 500 кбит/с (быстрый канал), а скорость передачи информации системы "Комфорт" (блок управления подушками безопасности, блоками управления в дверях автомобиля и т.д.), информационно-командной системы составляет 100 кбит/с (медленный канал).

На рис. 1 показана топология и форма сигналов CAN-шины легкового автомобиля.

При передаче информации какого-либо из блоков управления сигналы усиливаются приемо-передатчиком (трансивером) до необходимого уровня.

Каждый подключенный к CAN-шине блок имеет определенное входное сопротивление, в результате образуется общая нагрузка шины CAN. Общее сопротивление нагрузки зависит от числа подключенных к шине электронных блоков управления и исполнительных механизмов. Так, например, сопротивление блоков управления, подключенных к CAN-шине силового агрегата, в среднем составляет 68 Ом, а системы "Комфорт" и информационно-командной системы - от 2,0 до 3,5 кОм.

Следует учесть, что при выключении питания происходит отключение нагрузочных сопротивлений модулей, подключенных к CAN-шине.

На рис. 2 показан фрагмент CAN-шин с распределением нагрузки в линиях CAN-High, CAN-Low.

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

Для решения данной технической проблемы используется преобразователь для связи между шинами.

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

Также интерфейс используется для ввода и вывода диагностической информации, запрос которой реализуется по проводу "К", подключенному к интерфейсу или к специальному диагностическому кабелю CAN-шины.

В данном случае большим плюсом в проведении диагностических работ является наличие единого унифицированного диагностического разъема (колодка OBD).

На рис. 3 показана блок-схема межсетевого интерфейса.

Следует учесть, что на некоторых марках автомобилей, например, на Volkswagen Golf V, CAN-шины системы "Комфорт" и информационно-командная система не соединены межсетевым интерфейсом.

В таблице представлены электронные блоки и элементы, относящиеся к CAN-шинам силового агрегата, системы "Комфорт" и информационно-командной системы. Приведенные в таблице элементы и блоки по своему составу могут отличаться в зависимости от марки автомобиля.

Диагностика неисправностей CAN-шины производится с помощью специализированной диагностической аппаратуры (анализаторы CAN-шины) осциллографа (в том числе, со встроенным анализатором шины CHN) и цифрового мультиметра.

Как правило работы по проверке работы CAN-шины начинают с измерения сопротивления между проводами шины. Необходимо иметь в виду, что CAN-шины системы "Комфорт" и информационно-командной системы, в отличие от шины силового агрегата, постоянно находятся под напряжением, поэтому для их проверки следует отключить одну из клемм аккумуляторной батареи.

Основные неисправности CAN-шины в основном связаны с замыканием/обрывом линий (или нагрузочных резисторов на них), снижением уровня сигналов на шине, нарушениями в логике ее работы. В последнем случае поиск дефекта может обеспечить только анализатор CAN-шины.

CAN-шины современного автомобиля

  • CAN шина силового агрегата
  • Электронный блок управления двигателя
  • Электронный блок управления КПП
  • Блок управления подушками безопасности
  • Электронный блок управления АБС
  • Блок управления электроусилителя руля
  • Блок управления ТНВД
  • Центральный монтажный блок
  • Электронный замок зажигания
  • Датчик угла поворота рулевого колеса
  • CAN-шина системы "Комфорт"
  • Комбинация приборов
  • Электронные блоки дверей
  • Электронный блок контроля парковочной

Системы

  • Блок управления системы "Комфорт"
  • Блок упрввления стеклоочистителей
  • Контроль давления в шинах

CAN-шина информационно-командной системы

  • Комбинация приборов
  • Система звуковоспроизведения
  • Информационная система
  • Навигационная система

В современных машинах используются электронные блоки управления (ЭБУ, ECU - Electronic Control Unit) для контроля и управления различными системами машины, такими как гидравликой, коробкой передач и двигателем.
Аналогично тому, как компьютеры могут быть соединены в одну сеть, блоки управления в машине тоже можно объединить.

Преимущества сетевого соединения:

  • Более чувствительная система управления
  • Получение более полных и надежных данных
  • Обнаружение неисправностей и управление настройками производится средствами программного обеспечения.

Например, ЭБУ двигателя может обмениваться с другими ЭБУ машины по системе сети CAN .

Система CAN :Controller Area Network - сеть контроллеров. CAN разработан компанией Robert Bosch GmbH в середине 1980-х и в настоящее время получил широкое применение в автомобильной, авиационной, тракторостроительной и других видах промышленности.

Электронная система связи CAN, которая объединяет все блоки управления машиной в сеть с общим кабелем(шиной) и состоящая из одной пары проводов, называется шиной CAN. Закодированные данные посылаются от блоков управления на шину CAN.

Рисунок - CAN шина из 4-х блоков управления.

Выше показана шина CAN, состоящая из 4-х блоков управления. На концах общего кабеля (шины) устанавливается согласующие сопротивления (терминаторы, резисторы) Обычно сопротивление каждого резистора составляет 120 Ом. Применение согласующих резисторов на концах системы позволяет избежать отражение сигнала в конце линии тем самым обеспечивая нормальную работу всей CAN сети.

Передача сигналов в шине CAN осуществляется посредством двух скрученных между собой проводов (витая пара, Twisted Pair) Применение витой пары проводов, обусловлено дифференциальной передачей данных и высокой защитой такого решения от внешних помех.

В нашем случае блок №2 отправляет один сигнал по двум витым проводам в шину CAN, причем у этого сигнала будет различное напряжение на каждом проводе витой пары. Другие блоки в сети читают сигнал и определяют какому блоку оно предназначено и какую команду нужно выполнить (Блоки №1 и №4)

Передача одного и того же сигнала на два провода (CAN High и CAN low) с разным напряжением происходит методом "дифференциальной передачи данных". В состоянии покоя напряжение на проводе CAN High и CAN low составляет 2,5 В. Такое состояние называется "рецессивное" и упрощенно соответствует значению бита "0" При переходе в активное "доминантное" состояние (такое состояние может создать любой элемент сети) напряжение на проводе CAN High будет повышаться не меньше чем на 1 В до 3,5 В, а CAN low понижаться - тоже на 1 В до 1,5В. Чтобы "понимать" разницу напряжений между CAN High и CAN low, каждый блок управления подключается к шине CAN через трансивер, где происходит преобразование разности напряжений U CAN Hi и U CAN Lo в итоговое напряжение U DIFF . Разница между CAN High и CAN low будет 2В и будет восприниматься принимающими блоками управления как значение бита, равное "1". Такая "дифференциальная передача" сигнала, исключает влияние базового напряжения 2,5 В и другие скачки напряжений из-за различных помех на работу блоков управления. Например, происходит просадка напряжения в бортовой сети на 1,5 В из-за включения мощного потребителя в сеть: U CAN Hi и U CAN Lo в состоянии покоя 2,5 -1,5 = 1 В (U DIFF = 1 - 1 = 0 - Значение бита "0") Разница, при переходе в доминантное состояние U CAN Hi = 2,5 +1 -1,5 = 2 В; U CAN Lo =2,5 -1 -1,5 = 0 В. Итого U DIFF = 2 - 0 = 2 В (Значение бита "1"), даже такая нереальная просадка не повлияла на работу.

Рисунок - Принцип линии CAN

Так происходит передача сигналов по шине CAN. Сами эти сигналы представляют собой "кадры" (сообщения), которые принимаются всеми элементами сети CAN. Полезная информация в кадре состоит из идентификационного поля (идентификатора) длиной 11 бит (стандартный формат) или 29 бит (расширенный формат, надмножество предыдущего) и поля данных длиной от 0 до 8 байт. Идентификационное поле говрит о содержимом пакета и служит для определения приоритета при попытке одновременной передачи несколькими сетевыми узлами. Также в кадре (сообщении) помимо полезной информации содержится служебная информация. Она представлена полями проверки, полем отзыва и другим полями. В конце кадра содержится "поле конец сообщения"

В шине CAN сообщения от блоков управления должны передаваться в общую шину, то для исключения конфликтов между блоками, каждый узел перед отправкой кадра проверяет сеть на передачу доминантного бита. Устройство передающее доминантный бит считается приоритетным. Таким образом устройство будет дожидаться освобождения линии CAN. С одной стороны такой алгоритм работы повышает быстродействие, но с другой при неправильной работе одного из блоков управления возможна полная "загрузка" CAN шины и невозможность отправки сообщении другими блоками, элементами сети CAN (Линия для них будет всегда занята).

Рисунок -Структура сообщения

Напоследок пример работы:

Переключением кнопки инициируем команду блока управления №1 передачу сообщений в шину CAN. Блок №2 получает сообщение и расшифровав в сообщении что кадр пришел для него с командой включить свет. Подается бортовое напряжение на потребитель.

Рисунок - Принцип коммуникации через CAN

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

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

Мой автомобиль Skoda Octavia 2011 г. в. не предлагает возможностей управления с телефона, поэтому я решил исправить этот недостаток, а заодно и добавить функцию голосового управления. В качестве шлюза между CAN шиной и телефоном я использую Raspberry Pi с шилдом CAN BUS и WiFi роутер TP-Link. Протокол общения агрегатов авто закрытый, и на все мои письма предоставить документацию протокола Volkswagen отвечал отказом. Поэтому единственный способ узнать, как общаются устройства в авто и научиться ими управлять является реверс-инжиниринг протокола CAN шины VW.

Я действовал поэтапно:

  1. Подключение к CAN шине авто
  2. Голосовое управление с помощью Homekit и Siri
В конце видео голосового управления стеклоподъемником.

Разработка CAN шилда для Raspberry Pi

Схему шилда взял здесь lnxpps.de/rpie , там же и описание выводов, для общения с CAN используются 2 микросхемы MCP2515 и MCP2551. К шилду подключаются 2 провода CAN-High и CAN-Low. В SprintLayout 6 развел плату, может кому пригодится CANBoardRPi.lay (на заглавном фото прототип шилда на макетке).

Установка ПО для работы с CAN шиной

На Raspbian 2-x годичной давность мне потребовалось пропатчить bcm2708.c, чтобы добавить поддержку CAN (возможно сейчас это не требуется). Для работы с CAN шиной нужно установить пакет утилит can-utils с github.com/linux-can/can-utils , после этого подгрузить модули и поднять can интерфейс:

# initialize insmod spi-bcm2708 insmod can insmod can-dev insmod can-raw insmod can-bcm insmod mcp251x # Maerklin Gleisbox (60112 and 60113) uses 250000 # loopback mode for testing ip link set can0 type can bitrate 125000 loopback on ifconfig can0 up
Проверяем, что интерфейс CAN поднялся командой ifconfig :

Проверить, что все работает можно отправив команду и получив ее.

В одном терминале слушаем:

Root@raspberrypi ~ # candump any,0:0,#FFFFFFFF
В другом терминале отправляем:

Root@raspberrypi ~ # cansend can0 123#deadbeef
Более подробный процесс установки описан здесь lnxpps.de/rpie .

Подключение к CAN шине авто

Немного изучив открытую документацию на CAN шину VW я выяснил, что у меня используется 2 шины.

Шина CAN силового агрегата , передающая данные со скоростью 500 кбит/с, связывает все обслуживающие этот агрегат блоки управления.

Например, к шине CAN силового агрегата могут быть подключены следующие приборы:

  • блок управления двигателем,
  • блок управления АБС,
  • блок управления системой курсовой стабилизации,
  • блок управления коробкой передач,
  • блок управления подушками безопасности,
  • комбинация приборов.
Шина CAN системы «Комфорт» и информационнокомандной системы , позволяющая передавать данные со скоростью 100 кбит/с между обслуживающими эти системы блоками управления.

Например, к шине CAN системы «Комфорт» и информационно<командной системы могут быть
подключены следующие приборы:

  • блок управления системой Climatronic или климатической установкой,
  • блоки управления в дверях автомобиля,
  • блок управления системой «Комфорт»,
  • блок управления с дисплеем для радио и навигационной системы.
Получив доступ к первой можно у управлять движением (в моем варианте на механике, как минимум можно управлять круиз контролем), получив доступ ко второй можно управлять магнитолой, климатом, центральным замком, стеклоподъемниками, фарами и др.

Обе шины связаны через шлюз, который находится в области под рулем, так же к шлюзу подключен диагностический OBD2 разъем, к сожаление через OBD2 разъем нельзя послушать трафик от обеих шин, можно только передать команду и запросить состояние. Я решил, что буду работать только с шиной «Комфорт» и самым удобным местом подключения к шине оказался разъем в водительской двери.

Теперь я могу слушать, все что происходит в CAN шине «Комфорт» и отправлять команды.

Разработка сниффера и изучение протокола CAN шины


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

Все утилиты из набора can-utils сами умеют разбирать CAN пакеты и отдают только полезную информацию, а именно:

  • Идентификатор
  • Длина данных
  • Данные
Данные передаются в не зашифрованном виде, это облегчило изучение протокола. На Raspberry Pi я написал маленький сервер который перенаправляет данные с candump в TCP/IP, чтобы на компьютере разобрать поток данных и красиво показать их.

Для macOS я написал простое приложение, которое для каждого адреса устройства добавляет ячейку в табличку и в этой ячейке я уже вижу какие данные меняются.

Нажимаю кнопку стеклоподъемника я нашел ячейку в которой меняются данные, затем я и определил какие команды соответствуют нажатию вниз, нажатию вверх, удержанию вверх, удержанию вниз.

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

Cansend can0 181#0200
Команды, которые передают устройства по CAN шине в автомобилях VAG (Skoda Octavia 2011), полученные методом реверс-инжиниринг:

// Front Left Glass Up 181#0200 // Front Left Glass Down 181#0800 // Front Right Glass Up 181#2000 // Front Right Glass Down 181#8000 // Back Left Glass Up 181#0002 // Back Left Glass Down 181#0008 // Back Right Glass Up 181#0020 // Back Right Glass Down 181#0080 // Central Lock Open 291#09AA020000 // Central Lock Close 291#0955040000 // Update Light status of central lock (Когда отправляешь команду открыть/закрыть замок то на кнопке управления замком светодиод не изменяет состояние, чтобы он показал реальное состояние центрального замка, нужно отправить команду обновления) 291#0900000000
Мне было лень изучить все остальные устройства, поэтому в этом списке, только то что мне было интересно.

Разработка приложения для телефона

Используя полученные команды я написал приложение для iPhone, которое открывает/закрывает стекла и управляет центральным замком.

На Raspberry Pi я запустил 2 маленьких сервера, первый отправляет данные с candump в TCP/IP, второй принимает команды от iPhone и передает их cansend.


Исходники приложения управления авто для iOS

// // FirstViewController.m // Car Control // // Created by Vitaliy Yurkin on 17.05.15. // Copyright (c) 2015 Vitaliy Yurkin. All rights reserved. // #import "FirstViewController.h" #import "DataConnection.h" #import "CommandConnection.h" @interface FirstViewController () @property (nonatomic, strong) DataConnection *dataConnection; @property (nonatomic, strong) CommandConnection *commandConnection; @property (weak, nonatomic) IBOutlet UILabel *Door_1; @property (weak, nonatomic) IBOutlet UILabel *Door_2; @property (weak, nonatomic) IBOutlet UILabel *Door_3; @property (weak, nonatomic) IBOutlet UILabel *Door_4; @property (weak, nonatomic) IBOutlet UIButton *CentralLock; - (IBAction)lockUnlock:(UIButton *)sender; @end @implementation FirstViewController - (void)viewDidLoad { self.dataConnection = ; self.dataConnection.delegate = self; ; self.commandConnection = ; ; } - (void)didReceiveMemoryWarning { ; // Dispose of any resources that can be recreated. } - (void)doorStatusChanged:(char)value { /* 1 - Front Left Door 2 - Front Right Door 4 - Back Left Door 8 - Back Right Door 3 - Front Left&Right Door = 1 + 3 5 - Front& Back left Door = 1 + 4 */ // Front Left Door if (value & 1) { self.Door_1.backgroundColor = ; self.Door_1.text = @"Открыто"; NSLog(@"1"); } else { self.Door_1.backgroundColor = ; self.Door_1.text = @"Закрыто"; } // Front Right Door if (value & 2) { self.Door_2.backgroundColor = ; self.Door_2.text = @"Открыто"; NSLog(@"2"); } else { self.Door_2.backgroundColor = ; self.Door_2.text = @"Закрыто"; } // Back Left Door if (value & 4) { self.Door_3.backgroundColor = ; self.Door_3.text = @"Открыто"; NSLog(@"4"); } else { self.Door_3.backgroundColor = ; self.Door_3.text = @"Закрыто"; } // Back Right Door if (value & 8) { self.Door_4.backgroundColor = ; self.Door_4.text = @"Открыто"; NSLog(@"8"); } else { self.Door_4.backgroundColor = ; self.Door_4.text = @"Закрыто"; } } BOOL firstStatusChange = YES; BOOL lastStatus; -(void) centralLockStatusChanged:(BOOL)status { // At first status changes set lastStatus variable if (firstStatusChange) { firstStatusChange = NO; // Invert status, to pass the next test lastStatus = !status; } // Change Lock image only if status changed if (!(lastStatus == status)) { // Check status if (status) { forState:UIControlStateNormal]; } else { forState:UIControlStateNormal]; } lastStatus = status; } } // Front Left Glass - (IBAction)frontLeftUp:(UIButton *)sender { ; } - (IBAction)frontLeftDown:(id)sender { ; } // Front Right Glass - (IBAction)frontRightUp:(UIButton *)sender { ; } - (IBAction)frontRightDown:(id)sender { ; } // Back Left Glass - (IBAction)backLeftUp:(UIButton *)sender { ; } - (IBAction)backLeftDown:(id)sender { ; } // Back Right Glass - (IBAction)backRightUp:(UIButton *)sender { ; } - (IBAction)backtRightDown:(id)sender { ; } - (IBAction)lockUnlock:(UIButton *)sender { // If central lock closed if (lastStatus) { // Open ; int64_t delayInSeconds = 1; // 1 sec dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ ; }); } else { // Close ; int64_t delayInSeconds = 1; // 1 sec dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ ; }); } } @end


Есть способ не писать свое приложение для телефона, а воспользоваться готовым из мира умных домов, всего лишь потребуется установиться на Raspberry Pi систему автоматизации

Появление цифровых шин в автомобилях произошло позднее, чем в них начали широко внедряться электронные блоки. В то время цифровой «выход» им был нужен только для «общения» с диагностическим оборудованием – для этого хватало низкоскоростных последовательных интерфейсов наподобие ISO 9141-2 (K-Line). Однако кажущееся усложнение бортовой электроники с переходом на CAN-архитектуру стало ее упрощением.

Действительно, зачем иметь отдельный датчик скорости, если блок АБС уже имеет информацию о скорости вращения каждого колеса? Достаточно передавать эту информацию на приборную панель и в блок управления двигателем. Для систем безопасности это ещё важнее: так, контроллер подушек безопасности уже становится способен самостоятельно заглушить мотор при столкновении, послав соответствующую команду на ЭБУ двигателя, и обесточить максимум бортовых цепей, передав команду на блок управления питанием. Раньше же приходилось для безопасности применять не надежные меры вроде инерционных выключателей и пиропатронов на клемме аккумулятора (владельцы BMW с его «глюками» уже хорошо знакомы).

Однако на старых принципах реализовать полноценное «общение» блоков управления было невозможно. На порядок выросли объем данных и их важность, то есть потребовалась шина, которая не только способна работать с высокой скоростью и защищена от помех, но и обеспечивает минимальные задержки при передаче. Для движущейся на высокой скорости машины даже миллисекунды уже могут играть критичную роль. Решение, удовлетворяющее таким запросам, уже существовало в промышленности – речь идет о CAN BUS (Controller Area Network).

Суть CAN-шины

Цифровая CAN-шина – это не конкретный физический протокол. Принцип работы CAN-шины, разработанный Bosch еще в восьмидесятых годах, позволяет реализовать ее с любым типом передачи – хоть по проводам, хоть по оптоволокну, хоть по радиоканалу. КАН-шина работает с аппаратной поддержкой приоритетов блоков и возможностью «более важному» перебивать передачу «менее важного».

Для этого введено понятие доминантного и рецессивного битов: упрощенно говоря, протокол CAN позволит любому блоку в нужный момент выйти на связь, остановив передачу данных от менее важных систем простой передачей доминантного бита во время наличия на шине рецессивного. Это происходит чисто физически – например, если «плюс» на проводе означает «единицу» (доминантный бит), а отсутствие сигнала – «ноль» (рецессивный бит), то передача «единицы» однозначно подавит «ноль».

Представьте себе класс в начале урока. Ученики (контроллеры низкого приоритета) спокойно переговариваются между собой. Но, стоит учителю (контроллеру высокого приоритета) громко дать команду «Тишина в классе!», перекрывая шум в классе (доминантный бит подавил рецессивный), как передача данных между контроллерами-учениками прекращается. В отличие от школьного класса, в CAN-шине это правило работает на постоянной основе.

Для чего это нужно? Чтобы важные данные были переданы с минимумом задержек даже ценой того, что маловажные данные не будут переданы на шину (это отличает CAN шину от знакомого всем по компьютерам Ethernet). В случае аварии возможность ЭБУ впрыска получить информацию об этом от контроллера SRS несоизмеримо важнее, чем приборной панели получить очередной пакет данных о скорости движения.

В современных автомобилях уже стало нормой физическое разграничение низкого и высокого приоритетов. В них используются две и даже более физические шины низкой и высокой скорости – обычно это «моторная» CAN-шина и «кузовная», потоки данных между ними не пересекаются. К всем сразу подключен только контроллер CAN-шины, который дает возможность «общаться» со всеми блоками через один разъем.

Например, техническая документация Volkswagen определяет три типа применяемых CAN-шин:

  • «Быстрая» шина, работающая на скорости 500 килобит в секунду, объединяет блоки управления двигателем, ABS, SRS и трансмиссией.
  • «Медленная» функционирует на скорости 100 кбит/с и объединяет блоки системы «Комфорт» (центральный замок, стеклоподъемники и так далее).
  • Третья работает на той же скорости, но передает информацию только между навигацией, встроенным телефоном и так далее. На старых машинах (например, Golf IV) информационная шина и шина «комфорт» были объединены физически.

Интересный факт : на Renault Logan второго поколения и его «соплатформенниках» также физически две шины, но вторая соединяет исключительно мультимедийную систему с CAN-контроллером, на второй одновременно присутствуют и ЭБУ двигателя, и контроллер ABS, и подушки безопасности, и ЦЭКБС.

Физически же автомобили с CAN-шиной используют ее в виде витой дифференциальной пары: в ней оба провода служат для передачи единственного сигнала, который определяется как разница напряжений на обоих проводах. Это нужно для простой и надежной помехозащиты. Неэкранированный провод работает, как антенна, то есть источник радиопомех способен навести в нем электродвижущую силу, достаточную для того, чтобы помеха воспринялась контроллерами как реально переданный бит информации.

Но в витой паре на обоих проводах значение ЭДС помехи будет одинаковым, так что разница напряжений останется неизменной. Поэтому, чтобы найти CAN-шину в автомобиле, ищите витую пару проводов – главное не перепутать ее с проводкой датчиков ABS, которые так же для защиты от помех прокладываются внутри машины витой парой.

Диагностический разъем CAN-шины не стали придумывать заново: провода вывели на свободные пины уже стандартизированной в колодки, в ней CAN-шина находится на контактах 6 (CAN-H) и 14 (CAN-L).

Поскольку CAN-шин на автомобиле может быть несколько, часто практикуется использование на каждой разных физических уровней сигналов. Вновь для примера обратимся к документации Volkswagen. Так выглядит передача данных в моторной шине:

Когда на шине не передаются данные или передается рецессивный бит, на обоих проводах витой пары вольтметр покажет по 2,5 В относительно «массы» (разница сигналов равна нулю). В момент передачи доминантного бита на проводе CAN-High напряжение поднимается до 3,5 В, в то время как на CAN-Low опускается до полутора. Разница в 2 вольта и означает «единицу».

На шине «Комфорт» все выглядит иначе:

Здесь «ноль» — это, наоборот, 5 вольт разницы, причем напряжение на проводе Low выше, чем на проводе High. «Единица» же – это изменение разности напряжений до 2,2 В.

Проверка CAN-шины на физическом уровне ведется с помощью осциллографа, позволяющего увидеть реальное прохождение сигналов по витой паре: обычным тестером, естественно, «разглядеть» чередование импульсов такой длины невозможно.

«Расшифровка» CAN-шины автомобиля также ведется специализированным прибором – анализатором. Он позволяет выводить пакеты данных с шины в том виде, как они передаются.

Сами понимаете, что диагностика шины CAN на «любительском» уровне без соответствующего оборудования и знаний не имеет смысла, да и банально невозможна. Максимум, что можно сделать «подручными» средствами, чтобы проверить кан-шину – это измерить напряжения и сопротивление на проводах, сравнив их с эталонными для конкретного автомобиля и конкретной шины. Это важно – выше мы специально привели пример того, что даже на одном автомобиле между шинами может быть серьезная разница.

Неисправности

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

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

Чисто электрические проблемы – это обрывы проводов шины, их замыкания на «массу» или «плюс». Принцип дифференциальной передачи при обрыве любого из проводов или «неправильном» сигнале на нем становится нереализуем. Страшнее всего замыкание провода, поскольку оно «парализует» всю шину.

Представьте себе простую моторную шину в виде провода, на котором «сидят в ряд» несколько блоков – контроллер двигателя, контроллер АБС, приборная панель и диагностический разъем. Обрыв у разъема автомобилю не страшен – все блоки продолжат передавать информацию друг другу в штатном режиме, невозможной станет только диагностика. Если оборвать провод между контроллером АБС и панелью, мы сможем увидеть сканером на шине только ее, ни скорость, ни обороты двигателя она показывать не будет.

А вот при обрыве между ЭБУ двигателя и АБС машина, скорее всего, уже не заведется: блок, не «видя» нужный ему контроллер (информация о скорости учитывается при расчете времени впрыска и угла опережения зажигания), уйдет в аварийный режим.

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

Благо подключение CAN-шины сигнализации не разъем в разъем, а врезаясь непосредственно в шину автомобиля, дают «криворукому» установщику возможность перепутать провода местами. Автомобиль после этого не то что откажется заводиться – при наличии контроллера управления бортовыми цепями, распределяющего питание, даже зажигание не факт что включится.