Что такое CAN-шина в автомобиле (устройство и схема подключения)

Содержание

Что такое CAN-шина в автомобиле (устройство и схема подключения)

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

Что такое CAN-шина в автомобиле (устройство и схема подключения)

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

Зачем нужна в машине CAN-шина

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

Далее наращивать объём оборудования простым добавлением управляющих и исполнительных устройств стало невозможно:

Что такое CAN-шина в автомобиле (устройство и схема подключения)

Решение должно было быть радикальным, и этот качественный скачок в развитии автомобильной электроники произошёл.

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

Что такое CAN-шина в автомобиле (устройство и схема подключения)

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

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

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

По теме: Как работает автопилот в современных автомобилях

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

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

Что такое CAN-шина в автомобиле (устройство и схема подключения)

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

Схема и место расположения КАН-интерфейса

Сеть имеет выход наружу через диагностический OBD разъём, где на этот счёт стандартом чётко определена пара контактов.

Что такое CAN-шина в автомобиле (устройство и схема подключения)

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

Что такое CAN-шина в автомобиле (устройство и схема подключения)

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

Принцип работы

Работа CAN-шины определяется физическим и логическим протоколами, которые достаточно чётко стандартизованы, хотя и имеют целый ряд исполнений.

Физически это витая пара, каждый из проводов которой является сигнальным. Работают они в противофазе, один поэтому называется CAN-High, второй – CAN-Low.

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

На концах витой пары имеется волновое согласование двумя терминальными резисторами по 120 Ом. Хотя встречаются и другие номиналы, но редко.

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

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

Это интересно: Почему появляется вибрация в салоне автомобиля

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

Виды CAN-шин

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

Первая применена для связи наиболее важных устройств, агрегатов двигателя, трансмиссии, тормозов, подвесок, систем безопасности. Вторая обслуживает второстепенные функции комфорта и сервиса.

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

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

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

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

Как подключиться и сделать диагностику автомобиля

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

Для связи используются специальные адаптеры USB-CAN, более сложные устройства и программное обеспечение.

Что такое CAN-шина в автомобиле (устройство и схема подключения)

До появления профессиональных CAN-анализаторов и тестеров пользовались скоростным запоминающим осциллографом и логическим анализатором.

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

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

Отказы шины обычно сводятся к нескольким типовым случаям:

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

Плюсы и минусы встроенных шин

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

CAN-шина всё это обеспечивает:

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

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

Что такое CAN-шина, для чего она нужна и как работает в автомобиле?

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

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

В момент микропроцессорной революцией решение проблемы стало возможным:

Всем знаменитый немецкая в 1983 году, приступила к разработке скоростного протокола данных для автомобилестроения. Тремя годами позже, в Детройте на конференции был официально анонсировано устройство под названием CAN (от англ. Controller Area Network — сеть пространства датчиков).

Первыми вариантами чудо устройства в 1987 году по реализации продукции, занялись крупные и «FILIPS», а годом позже в 1989 году , компания BMW выпустила первый автомобиль «BMW 8-й серии», на которой датчики были сконструированы при помощи CAN.

BMW 8 Series E31 (1989-1999) – убийца Феррари

BMW 8 Series E31 (1989-1999) – убийца Феррари

Тремя годами позже, а именно 1991 году, добавила в устройства новые технологии, обновив тем самым существующий стандарт.

Далее, примерно в 1993 году стандарт «CAN» получил международный классификатор «ISO» и вышел уже на всемирную арену.

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

1991 году, добавила в устройства новые технологии.

1991 году, добавила в устройства новые технологии.


Управление автомобилем по CAN

Введение

Беспилотный автомобиль StarLine
на платформе
Lexus RX 450h
— научно-исследовательский проект, стартовавший в 2021 году. Проект открыт для амбициозных специалистов из Open Source Community. Мы предлагаем всем желающим поучаствовать в процессе разработки на уровне кода, опробовать свои алгоритмы на реальном автомобиле, оснащенном дорогостоящим оборудованием. Для управления автомобилем было решено использовать Apollo, открытый фреймворк. Для работы Apollo нам необходимо было подключить набор модулей. Эти модули помогают программе получать информацию об автомобиле и управлять им по заданным алгоритмам.
К таким модулям относятся:

  • модуль позиционирования автомобиля в пространстве с помощью GPS-координат;
  • модуль управления рулем, ускорением и торможением авто;
  • модуль состояния систем автомобиля: скорость, ускорение, положение руля, нажатие на педали и т.д.;
  • модуль получения информации об окружении автомобиля. С этим справятся ультразвуковые датчики, камеры, радары и лидары.

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

Теоретическая часть

Что такое CAN-шина

В современных автомобилях управление всеми системами взяли на себя электронные блоки (Рис. 1.). Электронные блоки — это специализированные компьютеры, каждый из которых имеет все необходимые интерфейсы для интеграции с автомобилем. С помощью цифровых интерфейсов связи, блоки объединяются в сеть для обмена информацией друг с другом. Самые распространенные цифровые интерфейсы в автомобилях — CAN, LIN, FLEXRay. Из них наибольшее распространение получил именно CAN.
CAN (Controller Area Network) шина — это промышленный стандарт сети. В 1986 году этот стандарт разработали в компании Bosch. А первым автомобилем с CAN-шиной стал Mercedes-Benz W140, выпущенный в 1991 году. Стандарт разрабатывался для возможности устройствам общаться друг с другом без хоста. Обмен информацией осуществляется с помощью специальных сообщений, которые состоят из полей ID, длины сообщения и данных. Каждый блок имеет свой набор ID. При этом приоритет на шине имеет сообщение с меньшим ID. Поле данных может нести информацию, например, о состоянии систем и датчиков, команды управления механизмами и т.д.


Рис. 1. Шина CAN автомобиля.

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


Рис. 2. Физическое представление сигнала в CAN шине

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

Мы выбрали Lexus RX, потому что знали, что сможем управлять всеми необходимыми узлами по CAN. Так как самое сложное при исследовании автомобиля — это закрытые протоколы. Поэтому одной из причин выбора именно этой модели авто стало наличие описания части протокола CAN-шины в opensource-проекте Openpilot.

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

Электроусилитель руля

Электроусилитель руля EPS (Electric Power Steering) — система, предназначенная снизить усилие на руль при повороте (Рис. 3). Приставка «электро» говорит о типе системы — электрическая. Управление рулем с этой системой становится комфортным, водитель поворачивает руль в нужном направлении, а электродвигатель помогает довернуть его до необходимого угла.
Электроусилитель устанавливается на рулевой вал автомобиля, части которого соединены между собой торсионным валом. На торсионный вал устанавливается датчик величины крутящего момента (Torque Sensor). При вращении руля происходит скручивание торсионного вала, которое регистрируется датчиком момента. Данные, полученные от датчика момента, датчиков скорости и оборотов коленвала, поступают в электронный блок управления ECU. А ECU, в свою очередь, уже вычисляет необходимое компенсационное усилие и подает команду на электродвигатель усилителя.


Рис. 3. Схематичное изображение системы электроусилителя руля
Видео: cистема LKA рулит автомобилем с помощью системы EPS.

Вам будет интересно  Проверить автомобиль перед покупкой по ВИН или гос номеру

Электронная педаль газа

Дроссельная заслонка — это механизм регулировки количества топливной смеси, которая попадет в двигатель. Чем больше смеси попадет, тем быстрее едет автомобиль. Электронная педаль газа — это система, которая задействует работу нескольких электронных узлов. Сигнал о положении педали, при ее нажатии, поступает в блок управления двигателем ECM (Engine Control Module). ECM, на основе этого сигнала, рассчитывает необходимое количество топлива, которое нужно подать в двигатель. В зависимости от необходимого количества топлива, ECM регулирует угол открытия дроссельной заслонки.


Рис. 4. Система электронной педали газа.
Видео: Для работы круиз-контроля используется управление электронной педалью газа.

Электронные системы помощи водителю

Мы купили автомобиль, который оборудован множеством цифровых блоков и систем помощи водителю (ADAS). В нашем проекте мы используем LKA, ACC и PCS.
LKA (Lane Keep Assist) — это система удержания в полосе, которая состоит из фронтальной камеры и вычислительного блока. LKA удерживает автомобиль в полосе движения, когда водитель, например, отвлекся. Алгоритмы в вычислительном блоке получают данные от камеры и на их основе принимают решение о состоянии автомобиля на дороге. Система способна понимать, что автомобиль неконтролируемо движется к правой или левой полосе. В таких случаях подается звуковой сигнал для привлечения внимания водителя. При пересечении полосы система сама скорректирует угол поворота колес так, чтобы автомобиль остался в полосе движения. Система должна вмешиваться только в том случае, если осознает, что маневр между полосами движения не был вызван действием водителя.

ACC (Adaptive Cruise Control) — система адаптивного круиз-контроля, который позволяет выставить заданную скорость следования. Автомобиль сам ускоряется и притормаживает для поддержания нужной скорости, при этом водитель может убрать ногу с педалей газа и тормоза. Этот режим удобно использовать при езде по скоростным магистралям и автострадам. Адаптивный круиз контроль способен видеть препятствия впереди автомобиля и притормаживать для избежания столкновения с ними. Если впереди автомобиля едет другое транспортное средство с меньшей скоростью, ACC сбавит скорость и будет следовать за ним. При обнаружении статичного объекта, ACC сбавит скорость до полной остановки. Для обнаружения объектов перед автомобилем такая система использует радар с миллиметровым диапазоном длин волн. Обычно такие радары работают на частоте 24-72 ГГц и способны уверенно видеть объекты на расстоянии до 300 метров. Радар обычно установлен за передним значком на решетке радиатора.

PCS (Pre-Collision System) — система предотвращения столкновения. Система призвана предотвратить столкновение с автомобилем, который движется впереди. При неизбежности столкновения, система минимизирует урон от столкновения. Здесь так же используются радар для оценки расстояния до объекта и фронтальная камера для его распознавания. Фронт PCS прогнозирует вероятность столкновения на основе скорости автомобиля, расстояния до объекта и его скорости. Обычно у системы есть два этапа срабатывания. Первый этап — система звуком и индикацией на приборной панели оповещает об опасности водителя. Второй этап — активируется экстренное торможение с помощью системы ABS, и включаются преднатяжители ремней безопасности.

Практическая часть

Управление рулем

Первое, что захотелось сделать нашей команде, — это научиться рулить. Рулем в автомобиле могут управлять две системы: парковочный ассистент IPAS (Intelligent Park Assist) и LKA.
IPAS позволяет задавать напрямую угол поворота рулевого колеса в градусах. Так как в нашем автомобиле нет данной системы, проверить и освоить рулевое управление таким способом нельзя.

Поэтому мы изучили электрические схемы автомобиля и поняли, какие CAN-шины могут быть полезны. Мы подключили анализатор CAN-шины. Лог содержит файл записей сообщений в шине в хронологической последовательности. Наша задача была найти команды управления электроусилителем руля EPS (Electric Power Steering). Мы сняли лог поворота рулевого колеса из стороны в сторону, в логе смогли найти показания угла поворота и скорость вращения рулевого колеса. Ниже пример изменения данных в шине CAN. Интересующие нас данные выделены маркером.

Поворот руля влево на 360 градусов

Поворот руля вправо на 270 градусов

Следующим этапом мы исследовали систему удержания в полосе. Для этого мы выехали на тихую улицу и записали логи обмена между блоком удержания в полосе и DSU (Driving Support ECU). С помощью анализатора шины CAN нам удалось вычислить сообщения от системы LKA. На рисунке 6 изображена команда управления EPS.


Рис. 5. Команда управления рулем с помощью системы LKA

LKA управляет рулем путем задания значения момента на валу (STEER_TORQUE_CMD) рулевого колеса. Команду принимает модуль EPS. Каждое сообщение содержит в заголовке значение счетчика (COUNTER), которое инкрементируется при каждой отправке. Поле LKA_STATE содержит информацию о состоянии LKA. Для захвата управления необходимо выставлять бит STEER_REQUEST.

Сообщения, которые отвечают за работу важных систем авто, защищаются контрольной суммой (CHECKSUM) для минимизации рисков ложного срабатывания. Автомобиль проигнорирует такую команду, если сообщение содержит некорректную контрольную сумму или значение счетчика. Это встроенная производителем защита от вмешательств сторонних систем и помех в линии связи.

На графике (Рис. 6.) представлена диаграмма работы LKA. Torque Sensor — значение с датчика момента на торсионном валу. Torque Cmd — команда от LKA для управления рулем. Из картинки видно, как происходит подруливание LKA для удержания автомобиля в полосе. При переходе через ноль меняется направление поворота руля. Т.е. отрицательное значение сигнала говорит о повороте вправо, положительное — влево. Удержание команды в нуле говорит об отсутствии управления со стороны LKA. При вмешательстве водителя, система перестает выдавать управление. О вмешательстве водителя LKA узнает с помощью второго датчика момента на валу со стороны рулевого колеса.


Рис. 6. График работы системы LKA

Нам предстояло проверить работу команды управления рулем. С помощью модуля StarLine Сигма 10 мы подготовили прошивку для проверки управления. StarLine Сигма 10 должен выдавать в CAN-шину команды на поворот руля влево или вправо. На тот момент у нас не было графического интерфейса для управления модулем, поэтому пришлось использовать штатные средства автомобиля. Мы нашли в CAN-шине статус положения рычага круиз-контроля и запрограммировали модуль таким образом, что верхнее положение рычага приводило к повороту руля вправо, нижнее положение — к повороту влево (Рис. 7).

Рис. 7. Первые попытки рулить

На видео видно, что управление осуществляется короткими секциями. Это возникает по нескольким причинам.

Первая из причин — это отсутствие обратной связи. Если расхождение между сигналом Torque Cmd и Torque Sensor превышает определенное значение Δ, система автоматически перестает воспринимать команды (Рис. 8). Мы настроили алгоритм на корректировку выдаваемой команды (Torque CMD) в зависимости от значения момента на валу (Torque Sensor).


Рис. 8. Расхождение сигнала приводит к ошибке работы системы

Следующее ограничение связано с системой защиты встроенной в EPS. Система EPS не позволяет командами от LKA рулить в широком диапазоне. Что вполне логично, т.к. при езде по дороге резкое маневрирование не безопасно. Таким образом, при превышении порогового значения момента на валу, система LKA выдает ошибку и отключается (Рис. 9).


Рис. 9. Превышение порогового значения регулировки момента на валу

Независимо от того, активирована система LKA или нет, сообщения с командами от нее присутствуют в шине постоянно. Мы посылаем модулю EPS команду повернуть колеса с конкретным усилием влево или вправо. А в это время LKA перебивает наши посылки «пустыми» сообщениями. После нашей команды со значением момента, приходит штатная с нулевым (Рис. 10).


Рис. 10. Штатные сообщения приходят с нулевыми значениями момента и перебивают наше управление

Тогда мы, с помощью модуля StarLine Сигма 10, смогли фильтровать весь трафик от LKA и блокировать сообщения с ID 2E4, когда нам это было нужно. Это решило проблему, а нам удалось получить плавное управления рулем (Рис. 11).


Рис. 11. Плавная регулировка поворота руля без ошибок

Управление газом

Система адаптивного круиз-контроля ACC управляет ускорением и торможением программно по CAN-шине. Блок управления двигателем ECU принимает команды DSU, если необходимо ускориться — активирует электронную педаль газа. Для торможения автомобиля используется рекуперативное торможение. При этом на торможение и ускорение используется одна команда, отличаются только значения.
Команда управления ускорением или замедлением представлена на рисунке 12. Она состоит из величины ускорения ACCEL_CMD, пары служебных бит и контрольной сумма Checksum. Для ускорения автомобилем значение ACCEL_CMD положительное, для замедления — отрицательное. Ускорение задается в диапазоне от 0 до 3 м/с^2, замедление аналогично, но со знаком минус. Для отправки данных в шину необходимо пересчитать желаемое ускорение или замедление с коэффициентом 0,001. Например, для ускорения 1 м/с^2, ACCEL_CMD = 1000 (0x03E8).


Рис. 12. Команда управления ускорения/замедления автомобиля

Мы сняли логи со штатной системы ACC и проанализировали команды. Сравнили с имеющимся у нас описанием команд и приступили к тестированию.

Рис. 13. Лог управления ускорением/замедлением системы адаптивного круиз-контроля ACC (выделено маркером)

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

Рис. 14. Активация круиз контроля происходит при наличии впереди другого траснпортного средства

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

Команды работали до тех пор, пока не потеряли автомобиль впереди. Система круиз-контроля отключилась, а следовательно, и команды ускорения перестали работать. Мы приступили к исследованию возможности использовать команды без активного круиз-контроля. Пришлось много времени потратить на анализ данных в шине CAN, чтобы понять как создать условия для работы команд. Нас интересовало, в первую очередь, какой блок блокирует выполнение команд ACC на ускорение или замедление. Пришлось изучить какие ID идут от DSU, LKA, радара и камеры, подсовывая липовые данные различных датчиков.

Решение пришло спустя 3 недели. К тому времени мы представляли как происходит взаимодействие блоков автомобиля, провели исследование трафика сообщений и выделили группы сообщений, посылаемых каждым блоком. За работу адаптивного круиз-контроля ACC отвечает блок Driving Support ECU (DSU). DSU выдает команды на ускорение и замедление автомобиля, и именно этот блок получает данные от радара миллиметрового диапазона. Радар сообщает DSU на каком расстоянии от машины движется объект, с какой относительной скоростью и определяет его положение по горизонтали (левее, правее или по центру).

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

a) б) Рис. 15. Активация круиза: a) попытка активировать без подмены данных радара; б) активация при подмене данных от радара.

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

Как мы уже узнали, команда на ускорение и замедление одна. Поэтому тут же проверили и замедление. Поехали на на скорости с активным круиз-контролем, запустили команду на торможение, и авто сразу же замедлилось.

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

Что еще мы используем

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

Оборудование и ПО

Для работ с автомобилем сегодня мы используем набор различного оборудования:

  • Анализатор шины Marathon позволяет подключать и читать данные с двух шин одновременно. На сайте производителя анализатора есть бесплатное ПО для анализа логов. Но мы используем ПО, написанное в нашей компании для внутреннего пользования.
  • Модуль StarLine Сигма 10 мы используем как платформу для работы с цифровыми интерфейсами. Модуль поддерживает CAN и LIN интерфейсы. При исследовании автомобиля пишем программы на C, зашиваем их в модуль и проверяем работу. Из модуля можем сделать сниффер трафика CAN-шины. Сниффер нам помогает понять, какие ID идут от блока или блокировать сообщения от штатных систем.
  • Диагностическое оборудование Toyota/Lexus. С помощью этого оборудования можно найти команды управления системами автомобиля: поворотниками, стоп-сигналами, клаксоном, индикацией приборки.

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

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

Принципы работы CAN-шины

Сама по себе CAN шина – это микро чип, обеспечивающий всю работу программной электроники по 2 проводам CAN_H (Сan-High) / CAN_L (Can-Low) с высокой передачей данных. По каждому из провода передается больше сотни различных управляющих сигналов одновременно, коммутируя между собой различные устройства и контролеры в автомобиле, но и тут предел устройства не ограничивается, при необходимости увеличения потока данных, сигнал может быть усилен до необходимого для этого уровня.

Вам будет интересно  Как самостоятельно из обычной машины сделать электромобиль

Функционал технологии CAN-шины:

  • Фоновый режим – в момент выключенной системы, на микро чип CAN-шины продолжает питание, но это не страшно, уровень потребления электричества в фоновом режиме не высок примерно 2Ma – 3Ma доли миллиампер.
  • Старт системы – в момент поворота ключа или нажатия на кнопку «STATR» система оживает, включая при этом режим стабилизации питания с блоков или поступающие на различные управляющие автомобилем датчики.
  • Работа в обычном режиме – автомобильные контроллеры обмениваются между собой нужной для автомобиля и водителя информацией, например — диагностической или текущей, при этом уровень потребления питания на пиковых нагрузках может возрасти до «85 Ma» миллиампер.
  • Режим сна CAN модуля – как только прекращается эксплуатация автомобиля различные датчики «CAN-шины» системы отсоединяются от электрической сети и переходят в режим спячки до следующего запуска.

Определение шины CAN

Несмотря на богатую функциональность, визуально CAN-шина

выглядит довольно примитивно. Все его компоненты представляют собой микросхему и два провода. Хотя в самом начале его «карьеры» (80-х) для контакта со всеми датчиками потребовалось более дюжины разъемов. Это потому, что каждый отдельный провод отвечал за один сигнал, но теперь их количество может достигать сотен. Кстати, поскольку мы уже упоминали датчики, мы рассмотрим, что именно управляет нашим механизмом:

  • Пропускной пункт
  • Двигатель;
  • Антиблокировочная система;
  • Защитная сумка;
  • Дворники
  • Панель приборов;
  • Усилитель руля;
  • Контроллеры;
  • Зажигание;
  • Бортовой компьютер;
  • Мультимедийная система;
  • GPS навигация.

READ Как Угоняют Машины С Бесключевым Доступом

Кроме того, современная шина CAN может не только проверить оборудование машины, но даже устранить некоторые неисправности! А отличная изоляция всех контактов инструмента позволяет ему полностью защитить себя от любых вмешательств!

Автомобиль и CAN-шина

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

Что такое CAN-шина.

Что такое CAN-шина.

Современные автомобили обладают огромным количеством пот датчиков, датчико-пот датчиков соединенных в единую цифровую автомобильную сеть CAN, объединяя следующие устройства:

  • Двигатель ;
  • Коробка переключения передач (МКПП / АКПП);
  • Система безопасности автомобиля «Аирбэги» и их датчики (коротко, «подушки безопасности»);
  • Система блокировки и антиблокировки автомобиля;
  • Различные усилитель управления рулем;
  • Зажигание;
  • Приборка;
  • Различные контроллеры, например, определяющие давление в шинах;
  • Системы складывания зекрал заднего вида и очистки стекол;
  • Мультимедийно-навигационная системы автомобиля;
  • Бортовой компьютер;
  • Сигнализация да все что есть в автомобиле, так или иначе работая по средством проводки.

Устройство и принцип работы

По конструкции данный интерфейс выполнен в виде модуля в пластмассовом корпусе или колодки для подсоединения проводников. Цифровая шина включает в себя несколько кабелей CAN. Подключение этого устройства к бортовой сети осуществляется посредством одного проводника.

Шина работает по принципу отправки данных в закодированном виде. Каждое передающееся сообщение обладает специальным уникальным идентификаторов. Может быть информация: «скорость передвижения авто составляет 50 км/ч», «температура охлаждающей жидкости 90 градусов Цельсия» и т. д. При отправке сообщений все электронные блоки получают данные, проверяющиеся идентификаторами. Если информация имеет отношение к определенному модулю, то она обрабатывается, если нет — то игнорируется.

В зависимости от модели, длина идентификатора интерфейса может быть 11 или 29 бит.

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

Работа CAN-шины возможна в нескольких режимах:

  1. Автономный, фоновый или спящий. При включении данного режима все основные агрегаты и узлы выключены и двигатель не заведен. На шину все равно подается напряжение от бортовой сети. Его значение небольшое, что дает возможность не допустить разряда АКБ.
  2. Пробуждение или запуск интерфейса. В данном режиме устройство начинает работу, это происходит при включении системы зажигания. Если автомобиль оснащен клавише Старт/Стоп, то CAN-шина начинает работу при ее нажатии. Производится включение функции стабилизации напряжения, в результате чего питание начинает поступать на контроллеры и датчики.
  3. Включение активного режима приводит к началу процесса обмена информацией между исполнительными механизмами и регуляторами. Величина напряжения в сети возрастает, так как шина может потреблять до 85 мА тока.
  4. Режим отключения или засыпания. При остановке двигателя автомобиля все агрегаты и механизмы, подключенные по CAN-интерфейсу, выключаются. Питание на них перестает подаваться.

Пользователь Valentin Belyaev подробно рассказал о принципе действия цифрового интерфейса.

CAN-шина в других отраслях.

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

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

  • Велосипедном производстве, напрмер, знаменитая Японская в 2009 году, анонсировала велосипед с системой многоуровневого управления переключения скоростей по принципу CAN. Последовав этому размному решению, компания Байон-ИКС применил CAN-шину для системного прямого привода.
  • Также технология получила распространение и на бытовом уровне, при реализации системы «умного дома», стала активно применяться технология по принципу CAN-шины. Огромное количество электронных устройств, могут решать свои задачи при помощи сети интрнет и совершенно без человеческого вмешательства, например – системы охраны периметра дома (видеонаблюдение, сигнализации, датчики света, движения и пр..), полив травы, кондиционирование в помещение, да все что может подключаться к питанию.

Примечание! И это еще не предел, CAN шина обязательно помимо основного своего направления – автомобили и умного дома (а автомобиль, своего рода второй дом!), найдет и своего потребителя в других областях.

История разработки и унификации Controller Area Network

Компания BOSCH, производя исследования в области автоматизации в 80-х годах прошлого века, предложила стандарт микроконтроллерной связи, который можно было применять и в автомобилестроении.

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

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

Такой стандарт получил международную классификацию ISO 11898. Кадр (пакет) включает 11-битный информационный сигнал (либо 29-битный в расширенном режиме).

В общем, CAN-шина не обязательно может быть реализована при помощи витой пары проводников. Это может быть и оптоволокно, и радиоканал.

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

Преимущества CAN-шины и недостатки.

Положительные качества CAN шины в автомобиле строении:

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

Комплексная система защиты на базе IGLA.

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

  • Объем обрабатываемой информации, доступный для передачи данных одновременно ограничен учитывая современные технологии и требования различных систем;
  • Большая часть обладает техническим и служебным назначением, а на более полезные данные отводится крохотная часть трафика в сети (есть к чему стремиться, я думаю это временно);
  • Не стандартизирован протокол высшего уровня.

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

Помехи в шине

Все управляющие блоки присоединены к CAN-шине трансиверами. Они имеют приемники сообщений, представляющих собой избирательные усилители.

Описание шины CAN оговаривает поступление посланий по проводникам High и Low в усилитель дифференциальный, где он обрабатывается и направляется в блок управления.

Усилитель определяет этот выходной сигнал как разность напряжений проводов High и Low. Такой подход позволяет исключить влияние внешних помех.

Чтобы понять, что собой представляет КАН-шина и ее устройство, следует вспомнить ее облик. Это два проводника, скрученные между собой.

Что такое кан шина

Так как сигнал помехи поступает сразу на оба провода, в процессе обработки значение напряжения Low отнимается от напряжения High.

Далее из полученного показателя извлекается базовое напряжение, которое составляет 2,5 В. Остаток и есть помеха. Она в отфильтрованном сигнале не присутствует.

Благодаря этому CAN-шина считается надежной системой.

Хакаем CAN шину авто. Виртуальная панель приборов


В первой статье «Хакаем CAN шину авто для голосового управления» я подключался непосредственно к CAN шине Comfort в двери своего авто и исследовал пролетающий траффик, это позволило определить команды управления стеклоподъемниками, центральным замком и др.
В этой статье я расскажу как собрать свою уникальную виртуальную или цифровую панель приборов и получить данные с любых датчиков в автомобилях группы VAG (Volkswagen, Audi, Seat, Skoda).

Мною был собран новый CAN сниффер и CAN шилд для Raspberry Pi на базе модуля MCP2515 TJA1050 Niren, полученные с их помощью данные я применил в разработке цифровой панели приборов с использованием 7″ дисплея для Raspberry Pi. Помимо простого отображения информации цифровая панель реагирует на кнопки подрулевого переключателя и другие события в машине.

В качестве фреймворка для рисования приборов отлично подошел Kivy для Python. Работает без Иксов и для вывода графики использует GL.

  1. CAN сниффер из Arduino Uno
  2. Подслушиваем запросы с помощью диагностической системы VAG-COM (VCDS)
  3. Разработка панели приборов на основе Raspberry Pi и 7″ дисплея
  4. Софт панели приборов на Python и Kivy (UI framework)
  5. Видео работы цифровой панели приборов на базе Raspberry Pi

Под катом полная реализация проекта, будет интересно!


Водительская дверь открыта

CAN сниффер из Arduino Uno

Чтобы послушать, что отправляет VCDS в CAN шину я собрал сниффер на макетке из Arduino и модуля MCP2515 TJA1050 Niren.

Схема подключения следующая:


Для прослушивания трафика использовал анализатор CanHackerV2 и прошивку arduino-canhacker для Arduino, которая реализует API совместимое с этой программой. Прошивка в гите https://github.com/autowp/arduino-canhacker.

CanHackerV2 позволяет смотреть пролетающий трафик, записывать и проигрывать команды с заданным интервалом, что очень сильно помогает в анализе данных.

Подслушиваем запросы с помощью диагностической системы VAG-COM (VCDS)

Описание VCDS с официального сайта ru.ross-tech.com:
Программно-аппаратный сканер VCDS предназначен для диагностики электронных систем управления, устанавливаемых на автомобилях группы VAG. Доступ ко всем системам: двигатель, ACP, АБС, климат-контроль, кузовая электроника и т.п., считывание и стирание кодов неисправностей, вывод текущих параметров, активация, базовые установки, адаптация, кодирование и т.п.

Подключив сниффер к линиям CAN_L и CAN_H в диагностическом шнурке я смог увидеть какие запросы делает VCDS и что отвечает авто.

Особенность авто группы VAG в том, что OBD2 разъем подключен к CAN шине через шлюз и шлюз не пропускает весь гуляющий по сети трафик, т.е. подключившись в OBD2 разъем сниффером вы ничего не увидите. Чтобы получить данные в OBD2 разъёме нужно отправлять шлюзу специальные запросы. Эти запросы и ответы видно при прослушивании трафика от VCDS. Например вот так можно получить пробег.

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

  • температура масла
  • какая именно дверь открыта

Скорость, обороты, температура ОЖ, пробег, расход, место в баке и другие запросы я тоже получил, для справки размещу. // Двери 714 03 22 22 0D 55 55 55 55 77E 05 62 22 0D 55 65 AA AA — все закрыты 77E 05 62 22 0D 00 65 AA AA — все открыты 77E 05 62 22 0D 54 65 AA AA — водительская открыта 77E 05 62 22 0D 51 65 AA AA — пассажирская открыта 77E 05 62 22 0D 50 65 AA AA — водительская и пассажирская открыта 77E 05 62 22 0D 45 65 AA AA — задняя левая открыта 77E 05 62 22 0D 15 65 AA AA — задняя правая открыта 77E 05 62 22 0D 44 65 AA AA — водительская и задняя левая открыта 77E 05 62 22 0D 40 65 AA AA — водительская, пассажирская, задняя левая открыты 01010101 = 0x55 (все закрыты) 0 бит — водительская 2 бит — пассажирская 4 бит — задняя левая 6 бит — задняя правая // Ручник 714 03 22 22 05 55 55 55 55 77E 05 62 22 05 21 AA AA AA — нажат 77E 05 62 22 05 20 AA AA AA — не нажат // Наружная температура 714 03 22 22 0С 55 55 55 55 77E 04 62 22 0C 55 AA AA AA — -7.5°С 77E 04 62 22 0C 65 AA AA AA — 0.5 101°С 77E 04 62 22 0C 66 AA AA AA — 1 = 102°С 77E 04 62 22 0C 68 AA AA AA — 2 = 104°С // Наружная температура отображаемая 714 03 22 10 14 55 55 55 55 77E 04 62 10 14 84 AA AA AA — 16°С // Запас хода 714 03 22 22 94 55 55 55 55 77E 05 62 22 94 00 8E AA AA — 142км // Уровень топлива 714 03 22 22 06 55 55 55 55 77E 04 62 22 06 2C AA AA AA — 44л 77E 04 62 22 06 16 AA AA AA — 22л // Положение стрелки указателя уровня топлива 714 03 22 22 96 55 55 55 55 77E 05 62 22 96 01 9A AA AA — 41.0° // Температура ОЖ 714 03 22 F4 05 55 55 55 55 77E 04 62 F4 05 85 AA AA AA — 52.5°С 77E 04 62 F4 05 87 AA AA AA — 54°С 77E 04 62 F4 05 С5 AA AA AA — 100.5°С // Обороты двигателя 714 03 22 F4 0C 55 55 55 55 77E 05 62 F4 0C 0B C6 AA AA — 753.5 об/мин; 0BC6 = 3014/4 = 753 77E 05 62 F4 0C 0B DC AA AA — 759 об/мин; 0BDC = 3036 77E 05 62 F4 0C 0B E8 AA AA — 762 об/мин; 0BE8 = 3048 77E 05 62 F4 0C 1C 32 AA AA — 1804.5 об/мин // Температура масла 714 03 22 20 2F 55 55 55 55 77E 04 62 20 2F 36 AA AA AA — -4°С 77E 04 62 20 2F 67 AA AA AA — 45°С 77E 04 62 20 2F 68 AA AA AA — 46°С // Температура в салоне 746 03 22 26 13 55 55 55 55 7B0 05 62 26 13 00 5B AA AA — 9.1, 91 == 0x5B 7B0 05 62 26 13 00 5C AA AA — 9.2°С 7B0 05 62 26 13 00 5D AA AA — 9.3°С // Время 714 03 22 22 16 55 55 55 55 77E 05 62 22 16 11 1E AA AA — 17:30 // Кнопки подрулевого переключателя 714 03 22 22 1B 55 55 55 55 77E 05 62 22 1B 80 AA AA AA — не нажата 77E 05 62 22 1B 81 AA AA AA — нажата вверх 77E 05 62 22 1B 84 AA AA AA — нажата вниз // Средний расход 2 714 03 22 22 99 55 55 55 55 77E 03 62 22 99 00 91 AA AA — 14.5л/100км // Текущий расход 714 03 22 22 98 55 55 55 55 77E 05 62 22 98 00 00 AA AA — 0.0л/100км // Пробег 714 03 22 22 03 55 55 55 55 77E 05 62 22 03 24 С0 AA AA — 94080 км 0x24С0 * 10

Вам будет интересно  Калькулятор оптимального давления в шинах прицепа

Разработка панели приборов на основе Raspberry Pi и 7″ дисплея

В качестве аппаратной части я выбрал Raspberry Pi. Была идея использовать Android планшет, но показалось, что на Raspberry Pi будет проще и быстрее. В итоге докупил официальный 7″ дисплей, и сделал CAN шилд из модуля TJA1050 Niren.

OBD2 штекер использовал от старого ELM327 адаптера.

Используются контакты: CAN_L, CAN_H, +12, GND.

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

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

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

Софт панели приборов на Python и Kivy (UI framework)

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


Первая версия панели приборов
По мере разработки решил визуализировать данные более наглядно. Хотел гоночный дизайн, а получилось, что-то в стиле 80-х.


Вторая версия панели приборов

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


Третья версия панели приборов

Ранее, я никогда не разрабатывал графические приложения под Linux поэтому не знал с чего начать. Вариант на вебе простой в разработке, но слишком много лишних компонентов: иксы, браузер, nodejs, хотелось быстрой загрузки. Попробовав Qt PySide2 я понял, что это займет у меня много времени, т.к. мало опыта. Остановился на Kivy — графический фреймворк для Python, простой в понимании с полной библиотекой графических элементов и дающий возможность быстро создать мобильный интерфейс.

Kivy позволяет запускать приложение без Иксов, прямо из консоли, в качестве рендера используется OpenGL. Благодаря этому полная загрузка системы может происходить за 10 секунд.

import can import os import sys from threading import Thread import time os.environ[‘KIVY_GL_BACKEND’] = ‘gl’ os.environ[‘KIVY_WINDOW’] = ‘egl_rpi’ from kivy.app import App from kivy.properties import NumericProperty from kivy.properties import BoundedNumericProperty from kivy.properties import StringProperty from kivy.uix.label import Label from kivy.uix.image import Image from kivy.uix.floatlayout import FloatLayout from kivy.uix.widget import Widget from kivy.uix.scatter import Scatter from kivy.animation import Animation messageCommands = < ‘GET_DOORS_COMMAND’: 0x220D, ‘GET_OIL_TEMPERATURE’ : 0x202F, ‘GET_OUTDOOR_TEMPERATURE’ : 0x220C, ‘GET_INDOOR_TEMPERATURE’ : 0x2613, ‘GET_COOLANT_TEMPERATURE’ : 0xF405, ‘GET_SPEED’ : 0xF40D, ‘GET_RPM’ : 0xF40C, ‘GET_KM_LEFT’: 0x2294, ‘GET_FUEL_LEFT’: 0x2206, ‘GET_TIME’: 0x2216 >bus = can.interface.Bus(channel=’can0′, bustype=’socketcan’)
Полный код панели в одном python файле
# -*- coding: utf-8 -*- import can import os import sys from threading import Thread import time os.environ[‘KIVY_GL_BACKEND’] = ‘gl’ os.environ[‘KIVY_WINDOW’] = ‘egl_rpi’ from kivy.app import App from kivy.properties import NumericProperty from kivy.properties import BoundedNumericProperty from kivy.properties import StringProperty from kivy.uix.label import Label from kivy.uix.image import Image from kivy.uix.floatlayout import FloatLayout from kivy.uix.widget import Widget from kivy.uix.scatter import Scatter from kivy.animation import Animation messageCommands = < ‘GET_DOORS_COMMAND’: 0x220D, ‘GET_OIL_TEMPERATURE’ : 0x202F, ‘GET_OUTDOOR_TEMPERATURE’ : 0x220C, ‘GET_INDOOR_TEMPERATURE’ : 0x2613, ‘GET_COOLANT_TEMPERATURE’ : 0xF405, ‘GET_SPEED’ : 0xF40D, ‘GET_RPM’ : 0xF40C, ‘GET_KM_LEFT’: 0x2294, ‘GET_FUEL_LEFT’: 0x2206, ‘GET_TIME’: 0x2216 >bus = can.interface.Bus(channel=’can0′, bustype=’socketcan’) class PropertyState: def __init__(self, last, current): self.last = last self.current = current def lastIsNotNow(self): return self.last is not self.current class CanListener(can.Listener): def __init__(self, dashboard): self.dashboard = dashboard self.speedStates = PropertyState(None,None) self.rpmStates = PropertyState(None,None) self.kmLeftStates = PropertyState(None,None) self.coolantTemperatureStates = PropertyState(None,None) self.oilTempratureStates = PropertyState(None,None) self.timeStates = PropertyState(None,None) self.outDoorTemperatureStates = PropertyState(None,None) self.doorsStates = PropertyState(None,None) self.carMinimized = True def on_message_received(self, message): messageCommand = message.data[3] | message.data[2] << 8 if message.arbitration_id == 0x77E and messageCommand == messageCommands[‘GET_SPEED’]: self.speedStates.current = message.data[4] if self.speedStates.lastIsNotNow(): self.dashboard.speedometer.text = str(self.speedStates.current) self.speedStates.last = self.speedStates.current if message.arbitration_id == 0x77E and messageCommand == messageCommands[‘GET_RPM’]: self.rpmStates.current = message.data[5] | message.data[4] << 8 if self.rpmStates.lastIsNotNow(): self.dashboard.rpm.value = self.rpmStates.current/4 self.rpmStates.last = self.rpmStates.current if message.arbitration_id == 0x35B: self.rpmStates.current = message.data[2] | message.data[1] << 8 if self.rpmStates.lastIsNotNow(): self.dashboard.rpm.value = self.rpmStates.current/4 self.rpmStates.last = self.rpmStates.current if message.arbitration_id == 0x77E and messageCommand == messageCommands[‘GET_KM_LEFT’]: self.kmLeftStates.current = message.data[5] | message.data[4] << 8 if self.kmLeftStates.lastIsNotNow(): self.dashboard.kmLeftLabel.text = str(self.kmLeftStates.current) self.kmLeftStates.last = self.kmLeftStates.current if message.arbitration_id == 0x77E and messageCommand == messageCommands[‘GET_COOLANT_TEMPERATURE’]: self.coolantTemperatureStates.current = message.data[4] if self.coolantTemperatureStates.lastIsNotNow(): self.dashboard.coolantLabel.text = str(self.coolantTemperatureStates.current-81) self.coolantTemperatureStates.last = self.coolantTemperatureStates.current if message.arbitration_id == 0x77E and messageCommand == messageCommands[‘GET_OIL_TEMPERATURE’]: self.oilTempratureStates.current = message.data[4] if self.oilTempratureStates.lastIsNotNow(): self.dashboard.oilLabel.text = str(self.oilTempratureStates.current-58) self.oilTempratureStates.last = self.oilTempratureStates.current if message.arbitration_id == 0x77E and messageCommand == messageCommands[‘GET_TIME’]: self.timeStates.current = message.data[5] | message.data[4] << 8 if self.timeStates.lastIsNotNow(): self.dashboard.clock.text = str(message.data[4]) + «:» + str(message.data[5]) self.timeStates.last = self.timeStates.current if message.arbitration_id == 0x77E and messageCommand == messageCommands[‘GET_OUTDOOR_TEMPERATURE’]: self.outDoorTemperatureStates.current = float(message.data[4]) if self.outDoorTemperatureStates.lastIsNotNow(): self.dashboard.outDoorTemperatureLabel.text = str((self.outDoorTemperatureStates.current — 100)/2) self.outDoorTemperatureStates.last = self.outDoorTemperatureStates.current if message.arbitration_id == 0x77E and messageCommand == messageCommands[‘GET_DOORS_COMMAND’]: self.doorsStates.current = message.data[4] if self.doorsStates.lastIsNotNow(): self.doorsStates.last = self.doorsStates.current self.dashboard.car.doorsStates=message.data[4] # all doors closed -> minimize car if self.doorsStates.current == 0x55: self.dashboard.minimizeCar() self.carMinimized = True else: if self.carMinimized: self.dashboard.maximizeCar() self.carMinimized = False class Dashboard(FloatLayout): def __init__(self,**kwargs): super(Dashboard,self).__init__(**kwargs) # Background self.backgroundImage = Image(source=’bg.png’) self.add_widget(self.backgroundImage) # RPM self.rpm = Gauge(file_gauge = «gauge512.png», unit = 0.023, value=0, size_gauge=512, pos=(0,0)) self.add_widget(self.rpm) self.rpm.value = -200 # Speedometer self.speedometer = Label(text=’0′, font_size=80, font_name=’hemi_head_bd_it.ttf’, pos=(0,-15)) self.add_widget(self.speedometer) # KM LEFT self.kmLeftLabel = Label(text=’000′, font_name=’Avenir.ttc’, halign=»right», text_size=self.size, font_size=25, pos=(278,233)) self.add_widget(self.kmLeftLabel) # COOLANT TEMPEARATURE self.coolantLabel = Label(text=’00’, font_name=’hemi_head_bd_it.ttf’, halign=»right», text_size=self.size, font_size=27, pos=(295,-168)) self.add_widget(self.coolantLabel) # OIL TEMPERATURE self.oilLabel = Label(text=’00’, font_name=’hemi_head_bd_it.ttf’, halign=»right», text_size=self.size, font_size=27, pos=(-385,-168)) self.add_widget(self.oilLabel) # CLOCK self.clock = Label(text=’00:00′, font_name=’Avenir.ttc’, font_size=27, pos=(-116,-202)) self.add_widget(self.clock) # OUTDOOR TEMPERATURE self.outDoorTemperatureLabel = Label(text=’00.0′, font_name=’Avenir.ttc’, halign=»right», text_size=self.size, font_size=27, pos=(76,-169)) self.add_widget(self.outDoorTemperatureLabel) # CAR DOORS self.car = Car(pos=(257,84)) self.add_widget(self.car) def minimizeCar(self, *args): print(«min») anim = Animation(scale=0.5, opacity = 0, x = 400, y = 240, t=’linear’, duration=0.5) anim.start(self.car) animRpm = Animation(scale=1, opacity = 1, x = 80, y = -5, t=’linear’, duration=0.5) animRpm.start(self.rpm) def maximizeCar(self, *args): print(«max») anim = Animation(scale=1, opacity = 1, x=257, y=84, t=’linear’, duration=0.5) anim.start(self.car) animRpm = Animation(scale=0.5, opacity = 0, x = 80, y = -5, t=’linear’, duration=0.5) animRpm.start(self.rpm) class Car(Scatter): carImage = StringProperty(«car362/car.png») driverDoorClosedImage = StringProperty(«car362/driverClosedDoor.png») driverDoorOpenedImage = StringProperty(«car362/driverOpenedDoor.png») passangerDoorClosedImage = StringProperty(«car362/passangerClosedDoor.png») passangerDoorOpenedImage = StringProperty(«car362/passangerOpenedDoor.png») leftDoorClosedImage = StringProperty(«car362/leftClosedDoor.png») leftDoorOpenedImage = StringProperty(«car362/leftOpenedDoor.png») rightDoorClosedImage = StringProperty(«car362/rightClosedDoor.png») rightDoorOpenedImage = StringProperty(«car362/rightOpenedDoor.png») doorsStates = NumericProperty(0) size = (286, 362) def __init__(self, **kwargs): super(Car, self).__init__(**kwargs) _car = Image(source=self.carImage, size=self.size) self.driverDoorOpened = Image(source=self.driverDoorOpenedImage, size=self.size) self.passangerDoorOpened = Image(source=self.passangerDoorOpenedImage, size=self.size) self.leftDoorOpened = Image(source=self.leftDoorOpenedImage, size=self.size) self.rightDoorOpened = Image(source=self.rightDoorOpenedImage, size=self.size) self.driverDoorClosed = Image(source=self.driverDoorClosedImage, size=self.size) self.passangerDoorClosed = Image(source=self.passangerDoorClosedImage, size=self.size) self.leftDoorClosed = Image(source=self.leftDoorClosedImage, size=self.size) self.rightDoorClosed = Image(source=self.rightDoorClosedImage, size=self.size) self.add_widget(_car) self.add_widget(self.driverDoorOpened) self.add_widget(self.passangerDoorOpened) self.add_widget(self.leftDoorOpened) self.add_widget(self.rightDoorOpened) self.bind(doorsStates=self._update) def _update(self, *args): driverDoorStates = self.doorsStates&1 passangerDoorStates = self.doorsStates&4 leftDoorStates = self.doorsStates&16 rightDoorStates = self.doorsStates&64 if driverDoorStates != 0: try: self.remove_widget(self.driverDoorOpened) self.add_widget(self.driverDoorClosed) except: pass else: try: self.remove_widget(self.driverDoorClosed) self.add_widget(self.driverDoorOpened) except: pass if passangerDoorStates != 0: try: self.remove_widget(self.passangerDoorOpened) self.add_widget(self.passangerDoorClosed) except: pass else: try: self.remove_widget(self.passangerDoorClosed) self.add_widget(self.passangerDoorOpened) except: pass if leftDoorStates != 0: try: self.remove_widget(self.leftDoorOpened) self.add_widget(self.leftDoorClosed) except: pass else: try: self.remove_widget(self.leftDoorClosed) self.add_widget(self.leftDoorOpened) except: pass if rightDoorStates != 0: try: self.remove_widget(self.rightDoorOpened) self.add_widget(self.rightDoorClosed) except: pass else: try: self.remove_widget(self.rightDoorClosed) self.add_widget(self.rightDoorOpened) except: pass class Gauge(Scatter): unit = NumericProperty(1.125) zero = NumericProperty(116) value = NumericProperty(10) #BoundedNumericProperty(0, min=0, max=360, errorvalue=0) size_gauge = BoundedNumericProperty(512, min=128, max=512, errorvalue=128) size_text = NumericProperty(10) file_gauge = StringProperty(«») def __init__(self, **kwargs): super(Gauge, self).__init__(**kwargs) self._gauge = Scatter( size=(self.size_gauge, self.size_gauge), do_rotation=False, do_scale=False, do_translation=False ) _img_gauge = Image(source=self.file_gauge, size=(self.size_gauge, self.size_gauge)) self._needle = Scatter( size=(self.size_gauge, self.size_gauge), do_rotation=False, do_scale=False, do_translation=False ) _img_needle = Image(source=»arrow512.png», size=(self.size_gauge, self.size_gauge)) self._gauge.add_widget(_img_gauge) self._needle.add_widget(_img_needle) self.add_widget(self._gauge) self.add_widget(self._needle) self.bind(pos=self._update) self.bind(size=self._update) self.bind(value=self._turn) def _update(self, *args): self._gauge.pos = self.pos self._needle.pos = (self.x, self.y) self._needle.center = self._gauge.center def _turn(self, *args): self._needle.center_x = self._gauge.center_x self._needle.center_y = self._gauge.center_y a = Animation(rotation=-self.value*self.unit + self.zero, t=’in_out_quad’,duration=0.05) a.start(self._needle) class requestsLoop(Thread): def __init__(self): Thread.__init__(self) self.daemon = True self.start() canCommands = [ can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands[‘GET_DOORS_COMMAND’] >> 8, messageCommands[‘GET_DOORS_COMMAND’] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False), can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands[‘GET_SPEED’] >> 8, messageCommands[‘GET_SPEED’] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False), can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands[‘GET_KM_LEFT’] >> 8, messageCommands[‘GET_KM_LEFT’] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False), can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands[‘GET_RPM’] >> 8, messageCommands[‘GET_RPM’] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False), can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands[‘GET_OIL_TEMPERATURE’] >> 8, messageCommands[‘GET_OIL_TEMPERATURE’] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False), can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands[‘GET_FUEL_LEFT’] >> 8, messageCommands[‘GET_FUEL_LEFT’] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False), can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands[‘GET_OUTDOOR_TEMPERATURE’] >> 8, messageCommands[‘GET_OUTDOOR_TEMPERATURE’] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False), can.Message(arbitration_id=0x746, data=[0x03, 0x22, messageCommands[‘GET_INDOOR_TEMPERATURE’] >> 8, messageCommands[‘GET_INDOOR_TEMPERATURE’] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False), can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands[‘GET_COOLANT_TEMPERATURE’] >> 8, messageCommands[‘GET_COOLANT_TEMPERATURE’] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False), can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands[‘GET_TIME’] >> 8, messageCommands[‘GET_TIME’] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False) ] def run(self): while True: for command in self.canCommands: bus.send(command) time.sleep(0.005) class BoxApp(App): def build(self): dashboard = Dashboard(); listener = CanListener(dashboard) can.Notifier(bus, [listener]) return dashboard if __name__ == «__main__»: # Send requests requestsLoop() _old_excepthook = sys.excepthook def myexcepthook(exctype, value, traceback): if exctype == KeyboardInterrupt: print «Handler code goes here» else: _old_excepthook(exctype, value, traceback) sys.excepthook = myexcepthook # Show dashboard BoxApp().run() Алгоритм работы следующий, используется 3 потока:

  1. В главном потоке работаем с графическими элементы (спидометр, тахометр, часы, температуры и др) на экране
  2. Во втором потоке каждые 5 мс делаем опрос следующего датчика
  3. В третьем потоке слушаем CAN шину, получив ответ парсим его и обновляем соответствующий графический элемент

Работает стабильно, самый долгий процесс в разработке был связан с рисованием дизайна. На данный момент обкатываю решение и потихоньку пишу мобильное приложение для iOS, чтобы любой мог попробовать цифровую панель приборов.
Проект цифровой панель приборов открытый. Рад буду предложениям и комментариям!

Видео работы цифровой панели приборов на базе Raspberry Pi

Приложение на телефон Виртуальная панель приборов

Для телефона написал приложение — виртуальная панель приборов, данные от машины передаются через ELM327 Wi-Fi адаптер. Адаптер подключается в OBD2 разъем, делает запросы по CAN шине и возвращается ответы в приложение по Wi-Fi.

Приложение VAG Virtual Cockpit уже в AppStore. Пока, что только под iPhone/iPad, но Android версия планируется. Приложение решил сделать платным с минимальной символической стоимостью. Если есть желание поддержать проект, то вот ссылка на приложение, принимаю любые замечания и предложения! VAG Virtual Cockpit

Функциональность системы

Чтобы понять, что такое CAN-шина, следует разобраться в ее функциональном назначении.

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

Команда состоит из 3 разделов: имени, значения события, времени наблюдения за переменной величиной.

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

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

Источник https://topnewsrussia.ru/chto-takoe-can-shina-v-avtomobile-ystroistvo-i-shema-podklucheniia/

Источник https://zsm-miass.ru/obsluzhivanie-i-uhod/kak-rabotaet-can-shina.html

Источник

Источник

Author: mag

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *