С огромным увлечением исследую протоколы CAN шины и разрабатываю устройства взаимодействующие с автомобилем. У меня уже есть голосовое управление центральным замком, виртуальная панель приборов и даже мобильное приложение для моей Skoda Octavia A5.

Теперь я решил разработать диагностический бортовой компьютер для автомобилей группы VAG (VW, Audi, Skoda, Seat). Моими техническими требованиями было: OLED дисплей, лёгкая установка и подключение, множество диагностических параметров. В качестве компонентной базы выбрал:

  • STM32F103C8T6 — дешёвый МК с поддержкой CAN шины на отладочной плате
  • 2,8" OLED 256*64 — дисплей с достаточным количеством точек на драйвере SSD1322
  • SN65HVD230DR — CAN приёмопередатчик с питанием 3.3 В
  • Mini-360 — импульсный регулируемый понижающий DC-DC стабилизатор напряжения на чипе MP2307



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



▍ Разработка печатной платы в Proteus


Первая рабочая версия была собрана на макетке за один вечер и ещё день потребовался для выяснения, что приёмопередатчику для функционирования нужна перемычка (Rs — GND), которая включает режим HIGH SPEED MODE:



На всякий случай оставлю свои заметки здесь из даташита на SN65HVD230DR.

Убедившись, что на макетной плате всё работает, я перешёл к разработке печатной платы в Proteus 8. Можно было бы все компоненты дисплея и Blue Pill перенести на одну плату, но я поленился так много паять, для первой версии и так сойдёт!



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



Конечно в первой версии трудно всё продумать, но не предусмотреть кнопку ВЫКЛЮЧЕНИЯ, для этого нужен талант. Устройство подключается в OBD2 разъём, в котором всегда присутствует напряжение 12 В. Придётся теперь скальпелем дорабатывать печатную плату, чтобы установить тумблер включения. Хотя возможно имеет смысл сделать включение/выключение на программном уровне, определяя, что двигатель заведён по CAN шине или повышенному напряжению бортовой сети.

▍ Разработка прошивки для STM32


Это мой первый опыт работы с STM32, но каких-то сложностей я пока не испытал. Разработку веду в STM32CubeIDE, код решил писать на Си и так как я новичок в этом деле, то отказываться от HAL не стал, хотя в процессе разработки осознал его избыточность. После выпуска стабильной прошивки займусь оптимизацией и погружусь в изучение STM32 более серьёзно, чтобы исключить HAL и уменьшить размер прошивки.



В бортовом компьютере самое главное это отображаемые диагностические параметры. Для компьютерной диагностики моей Skoda Octavia я использую автомобильный сканер VCDS.



Если подслушать сниффером, как VCDS общается с машиной по CAN шине, то можно воспроизвести протокол в моём бортовом компьютере. Более подробно я рассказывал как исследую CAN шину в прошлой статье.



В машинах группы VAG выпущенных с 2004 по 2012 год для диагностики двигателя и коробки передач используется протокол либо TP2.0 (KWP2000), либо UDS, на машинах после 2012 только UDS.

UDS очень удобный для программиста протокол, длина CAN фрейма всегда 8 байт, запрос состоит из одного фрейма и ответ, чаще всего тоже из одного фрейма. А в TP2.0 применяется несколько проверок целостности пакета, но зато TP2.0 обращается к группе параметров и за один запрос можно получить до 4 различных параметров.



На экране бортового компьютера отображаются 4 параметра, это оптимальное количество по нескольким причинам: а) полная группа TP2.0; б) видны пропуски зажигания всех 4-х цилиндров сразу; в) элементы оптимального размера. Точный список параметров, которые будет показывать прибор, я ещё не сформировал, но есть параметры, которые очень важны:

  • Уровень масла в двигателе
  • Наддув турбины (реальный)
  • Наддув турбины (ожидаемый)
  • Пропуски зажигания в цилиндрах
  • Углы откатов зажигания в цилиндрах
  • Температура коробки передач DSG/AISIN

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

▍ Разработка корпуса из акрила


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



Первым делом я попытался найти готовую коробочку, но в нужных размерах и близко ничего не было. Напечатанный на 3D принтере корпус из ABS мне не понравился. Я решил попробовать нарезать лазером корпус из чёрного оргстекла, получилось красиво и производство штучных экземпляров недорогое, порядка 500р за корпус:



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

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



К прибору кабель подключается XH2.54 разъёмом. Сначала я припаивал пины к проводам, но после нескольких дней тестирования они благополучно отвалились. Тогда я открыл для себя кримпер с губками SN-2549 (SN28B + SN01BM). Использование этого инструмента принесло множество положительных эмоций, как легко и красиво им можно делать разъёмы! Теперь не понимаю, как я жил без него раньше, это супер удобная и супер необходимая вещь в хозяйстве электронщика:


Как говорит Джорж из «Свинка Пеппа»: Динозаврррррррррр!

▍ Заключение


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

Прилагаю видео с демонстрацией работы VAG диагностического бортового компьютера:

ОБНОВЛЕНО 19.12.2021
В статье я задавался вопросом, как лучше организовать функцию включения/выключения. Я рассматривал 3 варианта: физический тумблер, уход в сон при отключении CAN шины, уход в сон при проседании напряжения ниже 12.5В. Но в комментариях мне подсказали, что на ВАГах в OBD2 разъем на контакт №1 заведена «клемма 15», которая дает питание только при заведённом автомобиле. В OBD2 разъёме первый контакт это OEM контакт и каждый производитель сам задаёт его функцию. Для питания бортового компьютера буду использовать «клемму 15».


Скриншот из Wikipedia

Комментарии (32)


  1. dlinyj
    17.12.2021 12:43
    +1

    Потрясающе! Вообще, мне очень нравятся проекты доработки автомобиля. Снимаю шляпу!
    Подскажите, что вообще можно почитать по данной теме?
    У меня просто американец, и далеко не все диагностические программы с ним корректно работают (я бы сказал полторы программы). Иной раз проще посмотреть коды ошибок прямо в приборке.


    1. dlinyj
      17.12.2021 12:45
      +1

      Посмотрел ваши предыдущие публикации, оказывается там просто исчерпывающая информация. Спасибо!


      1. aivs Автор
        17.12.2021 12:54

        Вот много информации по исследованию безопасности автомобильной электронике и сетей, если коротко, то всё плохо.

        http://illmatics.com/carhacking.html


        1. dlinyj
          17.12.2021 13:16

          Большое спасибо!


  1. EnterSandman
    17.12.2021 12:49

    Пару лет назад игрался с приборками - ардуино, canbus шилд и вперед,

    сейчас с ГУ ваговскими - приятно удивлен что там стоит QNX в качестве системы

    вот так можно зажать педаль газа в пол с открытой дверью и ручником):

    https://youtu.be/YOPD6Hldqf0


    1. aivs Автор
      17.12.2021 12:59

      Когда Apple разрабатывал CarPlay, то в качестве платформы выбрала QNX. Возможно это и повлияло на то, что в ГУ теперь используется QNX.


      1. corvair
        17.12.2021 14:24
        +1

        Ещё задолго применялся, скорее Apple использовала QNX как одно из стандартных решений автопрома.


    1. mmulesa
      17.12.2021 13:08
      +1

      Начиная с MIB3 перешли с QNX на Automotive Grade Linux (AGL)


      1. EnterSandman
        17.12.2021 13:22

        спасибо, не знал, пощупаю на досуге

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


        1. TinyQ
          18.12.2021 00:49

          на VW уже есть магнитолы и на Андроид


        1. pin2t
          18.12.2021 03:20

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


  1. AB_AG
    17.12.2021 15:01

    Переключение карт прошивки двигателя можно реализовать таким способом?


    1. aivs Автор
      17.12.2021 15:07

      У Revo есть свой приборчик для переключения. Я не знаю, как он работает. Но если данные передаются в незашифрованном виде, то можно воспроизвести команды. Нужно сниффером смотреть, что делает прибор.


  1. eteh
    17.12.2021 17:31

    А вот мне интересно - я в промке с CAN работал только у отечественных ПЛК - там была жёсткая адресациях устройств и сопротивления на оконечниках, так вот вопрос - если необходимо добавить в CAN шину машины, например эмулирующее устройство, там тот же принцип работает?


    1. aivs Автор
      17.12.2021 20:19

      У CAN шине везде один принцип, и в машине, и в умном доме, и в промышленных сетях. Любое устройство на шине может реагировать на любое другое устройство на шине, поэтому в CAN шине нет конкретного адресата и отправителя. Любое устройство в машине может отправить сообщение с ID управления центральным замком и замок закроется. Как раз этим я и пользуюсь для голосового управления https://habr.com/ru/post/399043/


  1. desertkun
    17.12.2021 22:39

    Интересовался этой темой, хотелось скорость проецировать на лобовое, а тут все готовенькое. В китайщине и цифры некрасивые и много мусора. Большое спасибо.


  1. TinyQ
    18.12.2021 00:29
    +1

    А что за проблема с выключателем питания? Разве на 1 контакт ОБД2 разъема не выведена 15 клемма(зажигание)?


    1. aivs Автор
      18.12.2021 00:29

      На obd2 всегда есть питание.


      1. TinyQ
        18.12.2021 00:37
        +1

        на VW: 16 контакт - 30 клемма(постоянный +), 1 контакт - 15 клемма (зажигание)

        проверьте у себя в машине


        1. aivs Автор
          18.12.2021 01:32

          Проверю, первый раз про это слышу. Я ориентируюсь на пинаут obd2 разъема с википедии.


          1. rencom66
            18.12.2021 06:33
            +1

            Это не жёсткий стандарт.

            Есть много вариантов


        1. aivs Автор
          19.12.2021 22:57

          Спасибо, дополнил статью.


  1. im_stD
    18.12.2021 13:13

    Здравствуйте. Спасибо за статью. Пдскажите пожалуйста, в чём вы рисовали приборную панель из поста https://habr.com/ru/post/442184/


    1. aivs Автор
      18.12.2021 17:14

      Inkscape и Photoshop


      1. im_stD
        18.12.2021 19:20

        Спасибо.


  1. yackmutus
    18.12.2021 17:14

    Зачем тумблер? Можно запитаться от клеммы 15 - там есть напряжение как раз только при включенном зажигании.


    1. aivs Автор
      18.12.2021 17:16

      Выше в комментария уже сказали, я не знал. Думаю так и сделаю, еслито на всех Вагах работает.


      1. aivs Автор
        19.12.2021 22:57

        Спасибо, дополнил статью.


  1. Mike-M
    19.12.2021 01:54

    ещё день потребовался для выяснения, что приёмопередатчику для функционирования нужен резистор (Rs — GND), который включает режим HIGH SPEED MODE:
    При этом на скриншоте даташита сказано, что при подключении резистора на землю приемопередатчик работает в режиме slope control, а не high speed.
    Кому верить?


    1. aivs Автор
      19.12.2021 13:46
      +1

      Ага, понял, для High speed mode нужно подтянуть к земле перемычкой. У меня то стоит 10К резистор. Спасибо что обратили внимание.

      Вот не зря я этот скриншот разместил )


  1. zaco
    20.12.2021 00:23

    я думаю вам будет интересно посмотерть на проект comma.ai и на их репо https://github.com/commaai/openpilot


    1. aivs Автор
      20.12.2021 00:27

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

      Никак руки не дойдут самому разработать эту функцию.