Эмулятор can шины для магнитолы своими руками
Хочу в старую бричку впихнуть современный ваговский приемник.
Логично что без кан-шины он не будет понимать регулировки подсветки и наличия ключа в замке.
Покопал инет - даже китайцы просят за сию симуляцию порядка 3к. Не совсем понял за что там такие бабки.
Соотв интересует возможность собрать сие самому на каком нить микроконтроллере.
Есть ли у кого то опыт?
зы: прошу писать по теме и не разводить флуд про жабу и "нафиг оно надо"
ten70
Оракул
Здоровья и умения не хватит самому сделать.
Но все равно ошибок будет много висеть, т.к. по кану дохрена чего идет.
error_404
Golf2Club
где ошибки будут висеть?
что магнитола может по кану получать кроме игнишена и подсветки?!
у меня такой магнитофон про который ты наверное не знаешь
еле нашел его в россии по адекватному ценнику - нет в нем никаких выводов информации о климате и прочих парктрониках, поэтому по шине он хавает минимум
ибеем я тоже умею пользоваться к слову
и книжку по ваговскому кану я тоже нашел.
просто думал что может кто уже заморачивался этим вопросом и подскажет нужные комбо.
ten70
Оракул
Понятно, тема называется - мне не хватает внимания, обнимите меня покрепче.
Языком почесать это в мусорке.
Оракул
error_404, я полностью не изучал, но объем работ приблизительно узнаешь;
easyelectronics
Я не знаю, насколько в открытом доступе имеются протоколы выше физического и канального уровня CAN шины VW, найти готовое устройство (самодельное) с прошивкой наверно проблематично.
error_404
Golf2Club
я уже изучил более глубоко вопрос
если делать на продажу - смысл возиться есть. для себя же решил что проще таки купить.
кан по скорости не совместим с большинством мк, нужно ставить отдельный интерфейс
я то надеялся что будет все легко как с каким нить i2c.
все что в открытом доступе лежит сводится к тому, что нужно сначала сниффером посмотреть что бегает по шине, расшифровать нужные сигналы и дальше уже дело техники
в открытом доступе все коды производители ессесно класть не будут. но по идее эта инфа должна быть ибо те же производители сигналок вряд ли сниффером ловят ))
Оракул
Тем не менее я до сих пор не вижу у Pandor`ы управления ЦЗ по CAN, а у StarLine вроде есть, это по MQB платформе, вот и пойми их, как и что.
Termit
Я здесь живу
Могу подсказать протоколы. Есть у меня СНифер который читает данные. быстро могу генерировать в CAN данные по зажиганию. Генерация света возможна, но дополнительный гимор с прошивкой, делать это не буду. Дорого мое время что бы экономить 3 т.р.. На самом деле там идет большой обмен информацией по КАНУ с разными блоками. Но в принципе могу попробовать поэмулировать магнитоллу, если очень нужно. Собрать устройство и залить в него прошивку будет сильно дороже чем купить готовое. Точно знаю так как сам участвую в разработке как программист. Время убъешь не одну неделю.
Я копался со своим TURAN-OM. Но у меня была обратная задача, Магнитолы нет, но я ее эммулировал, и на дисплее панели приборов появляется меню AUDIO и могу выводить туда всякие буковки и циферки, ну и значки всякие конечно.
Коды которая вещает магнитолла:
439
661
66с
67a
6c6 Похоже на запрос Вин номера, работает только при подключении к питанию
6cb Постоянно повторяет одно и тоже ID: STD=0x6cb RTR: DATA DLC: 2 DATA: 0x10 0x82
Коды машины учатвующие обмене
5c1 рулевые кнопки
361
625
67c Состояние диспля
ID: STD=0x67c RTR: DATA DLC: 8 DATA: 0x80 0x5 0x1c 0x56 0x80 0x2 0x0 0x4
ID: STD=0x67c RTR: DATA DLC: 2 DATA: 0xc0 0x0
ID: STD=0x67c RTR: DATA DLC: 2 DATA: 0x1a 0xc2
когда поподаем в экран АУДИО
Вот пример обмена.
ID: STD=0x439 RTR: DATA DLC: 8 DATA: 0x19 0x2 0x1e 0x4 0x0 0x0 0x0 0x0
ID: STD=0x661 RTR: DATA DLC: 8 DATA: 0x80 0x0 0x0 0x0 0x0 0x0 0x0 0x0
ID: STD=0x6cb RTR: DATA DLC: 2 DATA: 0x10 0x42
ID: STD=0x66c RTR: DATA DLC: 8 DATA: 0xc 0x42 0x3 0x0 0x31 0x0 0x3 0x1
ID: STD=0x67a RTR: DATA DLC: 2 DATA: 0x12 0x82
ID: STD=0x6c6 RTR: DATA DLC: 2 DATA: 0x1b 0xc2
ID: STD=0x361 RTR: DATA DLC: 5 DATA: 0x1d 0xa0 0x20 0x80 0x39
ID: STD=0x625 RTR: DATA DLC: 5 DATA: 0xc8 0x2a 0x25 0x8b 0x39
ID: STD=0x66c RTR: DATA DLC: 8 DATA: 0x80 0x2d 0x4c 0x41 0x3 0x0 0x31 0x0
ID: STD=0x6cb RTR: DATA DLC: 2 DATA: 0x10 0x43
ID: STD=0x67a RTR: DATA DLC: 2 DATA: 0x12 0x83
ID: STD=0x439 RTR: DATA DLC: 8 DATA: 0xb 0x1 0x1e 0x14 0x0 0x0 0x0 0x0
ID: STD=0x66c RTR: DATA DLC: 8 DATA: 0xc0 0x3 0x1 0x8 0x0 0x38 0x3 0xff
ID: STD=0x66c RTR: DATA DLC: 3 DATA: 0x4c 0x4e 0x1e
ID: STD=0x6cb RTR: DATA DLC: 2 DATA: 0x10 0x82
Audi A4 1.9 TD AVF 2004г. продана
VW Golf IV 1.4 AKQ 1998 г.
Golf6 2010 1.6 DSG
Touran 2.0 TDI 2012 г.
Современный автомобиль это не только средство передвижения, но и продвинутый гаджет с мультимедийными функциями и электронной системой управления агрегатами и кучей датчиков. Многие автопроизводители предлагают функции ассистентов движения, помощников при парковке, мониторинга и управления авто с телефона. Это возможно благодаря использованию в авто CAN шины к которой подключены все системы: двигатель, тормозная система, руль, мультимедиа, климат и др.
Я действовал поэтапно:
- Разработка CAN шилда для Raspberry Pi
- Установка ПО для работы с CAN шиной
- Подключение к CAN шине авто
- Разработка сниффера и изучение протокола CAN шины
- Разработка приложения для телефона
- Голосовое управление с помощью Homekit и Siri
Разработка CAN шилда для Raspberry Pi
Схему шилда взял здесь lnxpps.de/rpie, там же и описание выводов, для общения с CAN используются 2 микросхемы MCP2515 и MCP2551. К шилду подключаются 2 провода CAN-High и CAN-Low. В SprintLayout 6 развел плату, может кому пригодится CANBoardRPi.lay (на заглавном фото прототип шилда на макетке).
Установка ПО для работы с CAN шиной
Проверяем, что интерфейс CAN поднялся командой ifconfig:
Проверить, что все работает можно отправив команду и получив ее.
В одном терминале слушаем:
В другом терминале отправляем:
Более подробный процесс установки описан здесь lnxpps.de/rpie.
Подключение к CAN шине авто
Немного изучив открытую документацию на CAN шину VW я выяснил, что у меня используется 2 шины.
Шина CAN силового агрегата, передающая данные со скоростью 500 кбит/с, связывает все обслуживающие этот агрегат блоки управления.
Например, к шине CAN силового агрегата могут быть подключены следующие приборы:
- блок управления двигателем,
- блок управления АБС,
- блок управления системой курсовой стабилизации,
- блок управления коробкой передач,
- блок управления подушками безопасности,
- комбинация приборов.
Разработка сниффера и изучение протокола CAN шины
После того как я получил доступ к прослушиванию CAN шины, мне нужно расшифровать кто кому и что передает. Формат пакета CAN показан на рисунке.
Все утилиты из набора can-utils сами умеют разбирать CAN пакеты и отдают только полезную информацию, а именно:
- Идентификатор
- Длина данных
- Данные
Для macOS я написал простое приложение, которое для каждого адреса устройства добавляет ячейку в табличку и в этой ячейке я уже вижу какие данные меняются.
Нажимаю кнопку стеклоподъемника я нашел ячейку в которой меняются данные, затем я и определил какие команды соответствуют нажатию вниз, нажатию вверх, удержанию вверх, удержанию вниз.
Проверить, что команда работает, можно отправив из терминала, например команду поднять левое стекло вверх:
Команды, которые передают устройства по CAN шине в автомобилях VAG (Skoda Octavia 2011), полученные методом реверс-инжиниринг:
Мне было лень изучить все остальные устройства, поэтому в этом списке, только то что мне было интересно.
Разработка приложения для телефона
Используя полученные команды я написал приложение для iPhone, которое открывает/закрывает стекла и управляет центральным замком.
На Raspberry Pi я запустил 2 маленьких сервера, первый отправляет данные с candump в TCP/IP, второй принимает команды от iPhone и передает их cansend.
Есть способ не писать свое приложение для телефона, а воспользоваться готовым из мира умных домов, всего лишь потребуется установиться на Raspberry Pi систему автоматизации Z-Way командой:
После этого добавляем наши CAN устройства в Z-Way систему автоматизации
И управляем стеклоподъемником как обычным выключателем:
Мобильный приложения для Z-Way: ZWay Home Control и ZWay Control.
Голосовое управление с помощью Homekit и Siri
Мобильное приложение VAG Virtual Cockpit
Я продолжаю изучать CAN шину авто. В предыдущих статьях я голосом открывал окна в машине и собирал виртуальную панель приборов на RPi. Теперь я разрабатываю мобильное приложение VAG Virtual Cockpit, которое должно полностью заменить приборную панель любой модели VW/Audi/Skoda/Seat. Работает оно так: телефон подключается к ELM327 адаптеру по Wi-Fi или Bluetooth и отправляет диагностические запросы в CAN шину, в ответ получает информацию о датчиках.
По ходу разработки мобильного приложения пришлось узнать, что разные электронные блоки управления (двигателя, трансмиссии, приборной панели и др.) подключенные к CAN шине могут использовать разные протоколы для диагностики, а именно UDS и KWP2000 в обертке из VW Transport Protocol 2.0.
Программный сниффер VCDS
Программный сниффер VCDS: CAN-Sniffer
Чтобы узнать по какому протоколу общаются электронные блоки я использовал специальную версию VCDS с программным сниффером в комплекте. В этот раз никаких железных снифферов на Arduino или RPi не пришлось изобретать. С помощью CAN-Sniffer можно подсмотреть общение между VCDS и автомобилем, чтобы затем телефон мог прикинуться диагностической утилитой и отправлять те же самые запросы.
Я собрал некоторую статистику по использованию диагностических протоколов на разных моделях автомобилей:
VW/Skoda/Seat (2006-2012) - приборная панель UDS. Двигатель и трансмиссия VW TP 2.0
Audi (2006-2012) - приборная панель VW TP 2.0. Двигатель UDS. Трансмиссия VW TP 2.0
VW/Skoda/Seat/Audi (2012-2021) - везде UDS
Протокол UDS
Unified Diagnostic Services (UDS) - это диагностический протокол, используемый в электронных блоках управления (ЭБУ) автомобильной электроники. Протокол описан в стандарте ISO 14229-1 и является производным от стандарта ISO 14230-3 (KWP2000) и ныне устаревшего стандарта ISO 15765-3 (Diagnostic Communication over Controller Area Network (DoCAN)). Более подробно в википедии.
Диагностические данные от двигателя по протоколу UDS (Skoda Octavia A7)
Разбор UDS пакета в формате Single Frame
Пример запроса и ответа температуры моторного масла:
Запрос температуры моторного масла:
7E0 - Адрес назначения (ЭБУ двигателя)
Байт 0 (0x03) - Размер данных (3 байта)
Байт 1 (0x22) - SID идентификатор сервиса (запрос текущих параметров)
Байт 2, 3 (0x11 0xBD) - PID идентификатор параметра (температура моторного масла)
Байт 4, 5, 6, 7 (0x55) - Заполнитель до 8 байт
Ответ температуры моторного масла:
7E8 - Адрес источника (Диагностический прибор)
Байт 0 (0x05) - Размер данных (5 байт)
Байт 1 (0x62) - Положительный ответ, такой SID существует. 0x22 + 0x40 = 0x62. (0x7F) - отрицательный ответ
Байт 2, 3 (0x11 0xBD) - PID идентификатор параметра (температура моторного масла)
Байт 4, 5 (0x0B 0x74) - значение температуры моторного масла (20.1 °C формулу пока что не смог подобрать)
Байт 6, 7 (0x55) - Заполнитель до 8 байт
Первая версия мобильного приложения VAG Virtual Cockpit умела подключаться только к приборной панели по UDS.
VAG Virtual Cockpit - экран с данными от приборной панели по протоколу UDS
VW Transport Protocol 2.0
Volkswagen Transport Protocol 2.0 используется в качестве транспортного уровня, а данные передаются в формате KWP2000. Keyword Protocol 2000 - это протокол для бортовой диагностики автомобиля стандартизированный как ISO 14230. Прикладной уровень описан в стандарте ISO 14230-3. Более подробно в википедии.
Диагностические данные от двигателя по протоколу KWP2000 (Skoda Octavia A5)
Разбор протокола VW TP 2.0 на примере подключения к первой группе двигателя:
200 01 C0 00 10 00 03 01
Настраиваем канал с двигателем. Байт 0: 0x01 - двигатель, 0x02 - трансмиссия. Байт 5,4: 0x300 - адрес источника
201 00 D0 00 03 40 07 01
Получили положительный ответ. Байт 5,4: 0x740 - к двигателю обращаемся по этому адресу
740 A0 0F 8A FF 32 FF
Настраиваем ЭБУ на отправку сразу 16 пакетов и выставляем временные параметры
300 A1 0F 8A FF 4A FF
Получили положительный ответ
740 10 00 02 10 89
Отправляем команду KWP2000 startDiagnosticSession. Байт 0: 0x10 = 0b0001 - последняя строка данных + 0x0 счетчик отправляемых пакетов 0 (0x0 - 0xF)
Получили первый ACK
300 10 00 02 50 89
Получили положительный ответ. Байт 0: 0x10 - cчетчик принимаемых пакетов 0
Мы отправили первый ACK, что получили ответ
740 11 00 02 21 01
Делаем запрос. Байт 0: 0x11 - счетчик отправляемых пакетов 1. Байт 3: 0x21 - запрос параметров. Байт 4: 0x01 - из группы 1
Получили второй ACK
300 22 00 1A 61 01 01 C8 13
Байт 0: 0x22 - 0b0010 (не последняя строка данных) + 0x02 (cчетчик принимаемых пакетов 2). Байт 1,2: 0x00 0x1A длина 26 байт. Байт 3,4: 0x61 0x01 - положительный ответ на команду запроса параметров 0x21+0x40=0x61 из 0x1 группы. Байт 5: 0х01 - Запрос RPM (соответсвует протоколу KW1281). Байт 6,7: (0xC8 * 0x13)/5 = 760 RPM (формула соответствует протоколу KW1281)
300 23 05 0A 99 14 32 86 10
Байт 1: 0x05 - запрос ОЖ. Байт 2,3: (0x0A * 0x99)/26 = 57.0 C. Байт 4: 0x14 = запрос лямбда контроль %. Байт 5,6: 0x32*0x86; Байт 7: 0х10 - двоичная настройка
300 24 FF BE 25 00 00 25 00
0x25 0x00 x00 - Заполнитель, до 8 параметров
300 15 00 25 00 00 25 00 00
Байт 0: 0x15 - 0b0001 (последняя строка данных) + 0x5 (счетчик принимаемых пакетов 5)
Отправляем ACK. Прибывляем к нашему предыдущему ACK количество полученных пакетов 0xB1 + 0x4 = 0xB5
Запрос KeepAlive, что мы еще на связи
740 A1 0F 8A FF 4A FF
Мы разрываем связь
ЭБУ в ответ тоже разрывает связь
Во второй версии мобильного приложения VAG Virtual Cockpit появилась возможность диагностировать двигатель и трансмиссию по протоколу VW TP 2.0.
VAG Virtual Cockpit - экран с данными от двигателя по протоколу VW TP 2.0
Диагностический адаптер ELM327
Для меня некоторое время было вопросом, как получить данные из CAN шины и передать на телефон. Можно было бы разработать собственный шлюз с Wi-Fi или Bluetooth, как это делают производители сигнализаций, например Starline. Но изучив документацию на популярный автомобильный сканер ELM327 понял, что его можно настроить с помощью AT команд на доступ к CAN шине.
Копия диагностического сканера ELM327 Не все ELM327 одинаково полезны
Оригинальный ELM327 от компании elmelectronics стоит порядка 50$, в России я таких не встречал в продаже. У нас продаются только китайские копии/подделки, разного качества и цены 10-30$. Бывают полноценные копии, которые поддерживают все протоколы, а бывают и те которые умеют отвечать только на несколько команд, остальные игнорируют, такие адаптеры не имеют доступ к CAN шине. Я например пользуюсь копией Viecar BLE 4.0, который поддерживает 100% всех функций оригинала.
Последовательность ELM327 AT команд для работы с UDS по CAN шине:
Для работы с протоколом KWP2000 через ELM327 нужно только указать адреса назначения и источника.
Последовательность ELM327 AT команд для работы с VW TP 2.0 по CAN шине:
Мобильное приложение VAG Virtual Cockpit
Для разработки мобильного приложения подключаемого к автомобилю требовалось:
Сниффером собрать трафик от диагностической утилиты VCDS
Изучить работу протоколов UDS, VW TP 2.0, KWP2000
Настроить диагностический сканер ELM327 на работу с UDS и VW TP 2.0
Изучить новый для меня язык программирования Swift
В итоге получилось приложение, которое сочетает в себе функции отображения точных данных панели приборов и диагностика основных параметров двигателя и трансмиссии.
Пару слов про точность данных. Штатная панель приборов не точно показывает скорость - завышает показания на 5-10 км/ч, стрелка охлаждающей жидкости всегда на 90 °C, хотя реальная температура может быть 80 - 110 °C, стрелка уровня топлива до середины идет медленно, хотя топлива уже меньше половины и при нуле на самом деле топливо еще есть в баке. Производитель это делает для удобства и безопасности водителя.
На данный момент приложение показывает следующие параметры:
Приборная панель
Двигатель
Трансмиссия (температура)
1) Какая дверь открыта
2) Скорость
3) Обороты
4) Температура масла
5) Температура ОЖ
6) Топливо в баке в л.
7) Запас хода в км.
8) Средний расход
9) Время в машине
10) Пробег
11) Температура за бортом
1) Обороты
2) Массовый расход воздуха
3) Температура забора воздуха
4) Температура выхлопа (рассчитанная)
5) Критический уровень масла
6) Уровень масла
7) Наддув турбины (реальный)
8) Наддув турбины (ожидаемый)
9) Пропуски зажигания в цилиндрах
10) Углы откатов зажигания в цилиндрах
1) ATF AISIN (G93)
2) DSG6 (G93)
3) Блок управления DSG6 (G510)
4) Масло диска сцепления DSG6 (G509)
5) Мехатроник DSG7 (G510)
6) Процессор DSG7
7) Диск сцепления DSG7
Я стремлюсь чтобы приложение поддерживало как можно больше моделей автомобилей. Пока что поддерживаются производители: Volkswagen, Skoda, Seat, Audi. На разных комплектациях могут отображаться не все параметры, но это поправимо.
Сейчас я провожу тестирование версии 3.0. Приложение доступно только на iOS, после релиза 3.0 перейду к разработке версии для Android.
В этой статье я расскажу как собрать свою уникальную виртуальную или цифровую панель приборов и получить данные с любых датчиков в автомобилях группы VAG (Volkswagen, Audi, Seat, Skoda).
Мною был собран новый CAN сниффер и CAN шилд для Raspberry Pi на базе модуля MCP2515 TJA1050 Niren, полученные с их помощью данные я применил в разработке цифровой панели приборов с использованием 7″ дисплея для Raspberry Pi. Помимо простого отображения информации цифровая панель реагирует на кнопки подрулевого переключателя и другие события в машине.
В качестве фреймворка для рисования приборов отлично подошел Kivy для Python. Работает без Иксов и для вывода графики использует GL.
- CAN сниффер из Arduino Uno
- Подслушиваем запросы с помощью диагностической системы VAG-COM (VCDS)
- Разработка панели приборов на основе Raspberry Pi и 7″ дисплея
- Софт панели приборов на Python и Kivy (UI framework)
- Видео работы цифровой панели приборов на базе Raspberry Pi
CAN сниффер из Arduino Uno
Чтобы послушать, что отправляет VCDS в CAN шину я собрал сниффер на макетке из Arduino и модуля MCP2515 TJA1050 Niren.
Схема подключения следующая:
CanHackerV2 позволяет смотреть пролетающий трафик, записывать и проигрывать команды с заданным интервалом, что очень сильно помогает в анализе данных.
Подслушиваем запросы с помощью диагностической системы VAG-COM (VCDS)
Программно-аппаратный сканер VCDS предназначен для диагностики электронных систем управления, устанавливаемых на автомобилях группы VAG. Доступ ко всем системам: двигатель, ACP, АБС, климат-контроль, кузовая электроника и т.п., считывание и стирание кодов неисправностей, вывод текущих параметров, активация, базовые установки, адаптация, кодирование и т.п.
Подключив сниффер к линиям CAN_L и CAN_H в диагностическом шнурке я смог увидеть какие запросы делает VCDS и что отвечает авто.
Особенность авто группы VAG в том, что OBD2 разъем подключен к CAN шине через шлюз и шлюз не пропускает весь гуляющий по сети трафик, т.е. подключившись в OBD2 разъем сниффером вы ничего не увидите. Чтобы получить данные в OBD2 разъёме нужно отправлять шлюзу специальные запросы. Эти запросы и ответы видно при прослушивании трафика от VCDS. Например вот так можно получить пробег.
В VCDS можно получить информацию почти с любого датчика в машине. Меня в первую очередь интересовала информация, которой вообще нет на моей приборке, это:
- температура масла
- какая именно дверь открыта
Разработка панели приборов на основе 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 секунд.
Алгоритм работы следующий, используется 3 потока:
- В главном потоке работаем с графическими элементы (спидометр, тахометр, часы, температуры и др) на экране
- Во втором потоке каждые 5 мс делаем опрос следующего датчика
- В третьем потоке слушаем CAN шину, получив ответ парсим его и обновляем соответствующий графический элемент
Проект цифровой панель приборов открытый. Рад буду предложениям и комментариям!
Приветствую форумчане. Давно у меня появилась идея создать CANBUS decoder для Lada Vesta под ГУ на базе PX5. Суть в том, что таких устройств для этой машины нет (точнее недавно появилась под ГУ от какого-то производителя и есть еще один, который применяется только для динамических парковочных линий и по достаточно кусачей цене).
Прошу Вас помочь мне в этом деле. На данный момент хочу попробовать только для динамических линий, а далее как пойдет.
Как идет ход моих мыслей:
- на драйве нашел статью по снифферу для CAN.
Как я понял LS CAN мне в этой схеме пока что не нужен. А MS CAN я буду подключать к пинам 6 и 14 раъема OBD (в Весте одна CAN-шина, по факту у меня есть CAN-H и CAN-L, штатно выведенные к ГУ).
BT модуля по идее у меня не будет, вместо этого UART я подключу к ГУ?
Питание можно сделать, а можно по идее запитаться от USB ГУ?
И еще вопрос - возможно ли сделать прошивку микроконтроллера через ГУ, чтобы не выводить лишних проводов и каждый раз не разбирать? Апк написать возможно смогу, если это возможно.
Один форумчанин согласился предоставить мне несколько команд. Пока что я ограничусь углом поворота руля:
Угол поворота руля.
Протокол 6 (CAN).
Адрес блока ЭУР 742
Адрес приемника 762
Запрос блоку 220100
В ответе первые два байта, без учета заголовка. Угол поворота руля = E - 3276,7
Открытый на данный момент вопрос - в каком виде нужно передать информацию по UART в ГУ или где можно запросить эту информацию.
Исходный код MTCCanbus по ссылке
Добавляю код из поста на драйве. Буду пытаться переписать под считывание только нужной информации (пока только угол поворота угла. Кто поможет переписать, буду благодарен. Код буду обновлять по мере правки.
// Instanciation of CAN interface
HardwareCAN canBus(CAN1_BASE);
CanMsg msg ;
CanMsg *r_msg;
CAN_STATUS Stat ;
void CANSetup(CAN_GPIO_MAP remap, CAN_SPEED speed)
// Initialize CAN module
canBus.map(remap); // This setting is already wired in the Olimexino-STM32 board
Stat = canBus.begin(speed, CAN_MODE_NORMAL);
canBus.filter(0, 0, 0);
canBus.set_irq_mode(); // Use irq mode (recommended), so the handling of incoming messages
// will be performed at ease in a task or in the loop. The software fifo is 16 cells long,
// allowing at least 15 ms before processing the fifo is needed at 125 kbps
Stat = canBus.status();
if (Stat != CAN_OK)
* Your own error processing here */ ; // Initialization failed
Serial1.print("Initialization failed");
>
// Send message
// Prepare and send a frame containing some value
void SendCANmessage(long byte dlength=8, byte d0=0x00, byte d1=0x00, byte d2=0x00, byte d3=0x00, byte d4=0x00, byte d5=0x00, byte d6=0x00, byte d7=0x00)
// Initialize the message structure
// A CAN structure includes the following fields:
msg.IDE = CAN_ID_STD; // Indicates a standard identifier ; CAN_ID_EXT would mean this frame uses an extended identifier
msg.RTR = CAN_RTR_DATA; // Indicated this is a data frame, as opposed to a remote frame (would then be CAN_RTR_REMOTE)
msg.ID = id ; // Identifier of the frame : 0-2047 (0-0x3ff) for standard idenfiers; 0-0x1fffffff for extended identifiers
msg.DLC = dlength; // Number of data bytes to follow
// Prepare frame : send something
msg.Data[0] = d0 ;
msg.Data[1] = d1 ;
msg.Data[2] = d2 ;
msg.Data[3] = d3 ;
msg.Data[4] = d4 ;
msg.Data[5] = d5 ;
msg.Data[6] = d6 ;
msg.Data[7] = d7 ;
CANsend(&msg) ; // Send this frame
>
void setup()
pinMode(PC13, OUTPUT); // LED
digitalWrite(PC13, PC13ON);
Serial1.begin(115200);
Serial1.println("Hello World!");
Serial1.println("Starting Astra-H sniffer v01 program");
for (bool flag=0;flag==0;)
<
Serial1.print("trying MS CAN. ");
CANSetup(CAN_GPIO_PB8_PB9,CAN_SPEED_95);
canBus.free();canBus.free();canBus.free();canBus.free();canBus.free();canBus.free();canBus.free(); // make sure receive buffer is empty
delay(200); // wait for receiving something
if ( ( r_msg = canBus.recv() ) != NULL )
Serial1.println(" OK!");
flag=1;
>
else
Serial1.println(" FAILED!");
delay(500);
Serial1.print("trying LS(SW) CAN. ");
CANSetup(CAN_GPIO_PB8_PB9,CAN_SPEED_33);
canBus.free();canBus.free();canBus.free();canBus.free();canBus.free();canBus.free();canBus.free(); // make sure receive buffer is empty
delay(200); // wait for receiving something
if ( ( r_msg = canBus.recv() ) != NULL )
Serial1.println(" OK!");
flag=1;
>
else
Serial1.println(" FAILED!");
delay(500);
>
>
>
Serial1.println("Time (ms) ; ID ; Length ; B0 ; B1 ; B2 ; B3 ; B4 ; B5 ; B6 ; B7 ");
digitalWrite(PC13, PC13OFF);
>
void loop()
while ( ( r_msg = canBus.recv() ) != NULL )
digitalWrite(PC13, PC13ON); // LED shows that recieved data is being printed out
Serial1.print(millis());
Serial1.print("; ");
Serial1.print(r_msg->ID, HEX);
Serial1.print("; ");
Serial1.print(r_msg->DLC);
Serial1.print("; ");
Serial1.print(r_msg->Data[0], HEX);
Serial1.print("; ");
Serial1.print(r_msg->Data[1], HEX);
Serial1.print("; ");
Serial1.print(r_msg->Data[2], HEX);
Serial1.print("; ");
Serial1.print(r_msg->Data[3], HEX);
Serial1.print("; ");
Serial1.print(r_msg->Data[4], HEX);
Serial1.print("; ");
Serial1.print(r_msg->Data[5], HEX);
Serial1.print("; ");
Serial1.print(r_msg->Data[6], HEX);
Serial1.print("; ");
Serial1.println(r_msg->Data[7], HEX);
digitalWrite(PC13, PC13OFF);
canBus.free();
> // close while
> // close void loop
Читайте также: