Всем привет. Любому автопилоту, очевидно, нужно не только принимать решения по управлению, но и заставлять автомобиль этим решениям подчиняться. Сегодня увидим, как весьма доступными средствами доработать обычный автомобиль полностью электронным рулевым управлением (steer-by-wire). Оказывается, сам авто для разработки не очень и нужен, а большинство функционала можно с комфортом отлаживать дома или в офисе. В главных ролях всем известные компоненты из хобби-магазинов электроники.


Электроника в сборе


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


Очень удобным для доработки оказался KIA Cee'd начиная с 2015 модельного года (скорее всего аналогично и его соплатформенники от KIA/Hyundai). Сошлись одновременно несколько факторов:


  • Усилитель руля полностью электрический, нет возни с гидравликой, стоит копейки (относительно) на разборках. Вся нужная проводка выведена наружу и легко доступна.
  • Усилитель интегрирован с рулевой колонкой, поэтому к нему есть легкий доступ на автомобиле и любая дополнительная электроника останется в салоне в тепличных условиях (в отличие от усилителей, интегрированных в рулевую рейку).
  • Очень важно — есть пример успешной доработки аналогичного KIA Soul. Американская PolySync разрабатывает апгрейд Soul до полностью drive-by-wire платформы для беспилотников, и на их гитхабе можно подсмотреть много полезного.

Итак, получена в распоряжение рулевая колонка в сборе:


Рулевая колонка KIA Cee'd JD


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


  1. Он находится в автомобиле с работающим двигателем.
  2. Водитель прикладывает вращающее усилие к рулевому колесу.

Пойдем по порядку.


Симуляция автомобиля


Нужно понять интерфейс между электронным блоком управления (ЭБУ) усилителя и остальным автомобилем. Нагуглив электрическую схему видим картинку:


Интерфейс ЭУР KIA Cee'd


Из схемы видно, что физически интерфейс очень прост:


  • Питание (12V постоянное) через разъем E29.
  • Сигнал включенного зажигания (12V) через разъем M46.
  • CAN-шина данных также через разъем M46.

Внешний вид и распиновки разъемов находим на том же сайте.


С питанием и зажиганием всё просто, берем 12V с обычного компьютерного блока питания. Но если просто подать питание и зажигание, усилитель полноценно не включится, и усиливать не будет. Дополнительно нужна информация от других блоков автомобиля: работает ли двигатель (чтобы не тратить энергию аккумулятора при выключенном), текущая скорость (чтобы делать руль "тяжелее" на скорости), наверняка что-то ещё.


Обмен данными между электронными блоками в современных автомобилях организован по шинам CAN (Controller Area Network). Это широковещательная (у пакетов нет адресов назначения) локальная сеть на витой паре, где каждый блок может публиковать свои данные. У каждого типа данных свой идентификатор. Например, в нашем случае усилитель руля рассылает значения угла поворота руля с ID 0x2B0. Часто бывает несколько физически разделенных шин, чтобы второстепенные блоки типа контроллеров стеклоподъемников не мешались обмену между критически важными компонентами. В Cee'd используется две шины: C-CAN и B-CAN (схема здесь, в части "Информация о канале передачи данных"). На C-CAN "висят" почти все блоки с ней и будем работать.


Выбор адаптера CAN-шины


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


  1. Адаптеры в сборе с алиэкспресса. Их не пробовал, по слухам довольно много брака и софт видимо только под Windows.
  2. Arduino шилды на MCP2515/MCP2551, в основном клоны дизайна от seeed в любом магазине ардуинной тематики. Но совмещать такой шилд надо не с Arduino (я так и не смог заставить связку работать на воспроизведение с нужной скоростью), а с Raspberry Pi. В приложении ниже подробная инструкция.
  3. USB адаптер CANHacker Baby, разработка Artemka86. Выгодно отличается от вариантов с алиэкспресса отличной поддержкой "из первых рук" от разработчика (проверено лично, Артём подходит к делу с душой). Также плюсом является поддержка стандартного протокола LAWICEL совместимого с широким набором софта.

Софта разного тоже много (за обзором опять сюда). Самый простой вариант — Linux c can-utils из SocketCAN, за который спасибо инженерам Volkswagen. Большой плюс SocketCAN в стандартизации — любое USB устройство с поддержкой протокола LAWICEL (pdf) видится системой как обычный сетевой интерфейс. Таким образом избегаем привязки к вендор-специфическому софту конкретного устройства. У текущей версии CANHacker есть небольшая несовместимость со стоковыми can-utils по работе с USB, поэтому берём патченную версию отсюда. Raspberry Pi с CAN шилдом работает со стоковым пакетом can-utils из Raspbian OS без проблем.


Подключение к шине, запись пакетов


С подключением к индивидуальному узлу на стенде всё просто: соединяем контакт CAN-High адаптера с CAN-High автомобильного узла, CAN-Low — c CAN-Low. По стандарту между CAN-High и CAN-Low должно быть 2 замыкающих резистора по 120 Ом, на практике обычно всё работает на довольно широком интервале сопротивлений, у меня например одно на 110 Ом.


На автомобиле замыкающий резистор не нужен (они там уже стоят, чтобы шина сама по себе работала). В зависимости от модели авто, возможно придется повозиться с физическим доступом к проводке шины. Самый удобный вариант — разъём OBD-II (on-board diagnostic), он обязателен на всех легковых автомобилях, выпущенных в Европе с начиная 2001-2004 года и находится не дальше 60 см от рулевого колеса. На Cee'd разъём слева под рулём, за пластмасовой крышкой блока предохранителей.


Диагностический разъём OBD-II KIA Cee'd


Распиновка OBD-II стандартизована и включает шину CAN (CANH на 6 контакте, CANL на 14). Нам повезло, корейцы пошли по пути наименьшего сопротивления и вывели C-CAN, на которой висят все важные узлы, прямо на диагностический разъём:


Шлюзы? Не, не слышали.


В результате на Cee'd можно прослушать весь внутренний трафик, ничего в авто не разбирая. Когда машина не твоя, а знакомые пустили повозиться — большой плюс. Но такая халява не везде. У Volkswagen например служебная CAN изолирована от OBD шлюзом, поэтому подключаться пришлось бы примерно так:


Подключение к служебной CAN шине на Skoda Oсtavia через разъем блока управления КПП.


Подключив все контакты, поднимаем сетевой интерфейс:


$ sudo slcand -o -c -s6 -S 115200 ttyACM0 slcan0 && sleep 1 && sudo ifconfig slcan0 up

Проверяем, что сеть работает и данные принимаются (включив зажигание):


$ cansniffer slcan0

И наконец, если всё нормально, можно записывать лог:


$ candump -L slcan0 > real-car-can-log.txt

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


Воспроизведение записи шины на стенде


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


$ $ candump slcan0
  slcan0  2B0   [5]  00 00 00 00 00
  slcan0  2B0   [5]  FF 7F FF 06 F1
  slcan0  2B0   [5]  FF 7F FF 06 C2
  slcan0  2B0   [5]  FF 7F FF 06 D3
  slcan0  2B0   [5]  FF 7F FF 06 A4
  slcan0  2B0   [5]  FF 7F FF 06 B5
  slcan0  2B0   [5]  FF 7F FF 06 86
  slcan0  2B0   [5]  FF 7F FF 06 97
  slcan0  2B0   [5]  FF 7F FF 06 68
  slcan0  5E4   [3]  00 00 00
  slcan0  2B0   [5]  FF 7F FF 06 79
  slcan0  2B0   [5]  FF 7F FF 06 4A
....

Видим, что рассылаются пакеты 2B0 (текущий угол поворота руля) и, реже, 5E4 (какой-то общий статус усилителя). Отфильтровываем их из общего лога:


$ cat real-car-can-log.txt | grep -v ' 2B0' | grep -v ' 5E4 ' > can-log-no-steering.txt

Фильтрованный лог можно подавать на воспроизведение:


% sudo ifconfig slcan0 txqueuelen 1000
$ canplayer -I can-log-no-steering.txt

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


Эмуляция усилия на руле


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


Провода к датчикам угла поворота руля и момента вращения на рулевом вале.


Блок управления обрабатывает сигналы датчиков и выдаёт команды сервоприводу на создание дополнительного усилия на поворот рулевого вала.


Проверка формата сигнала датчиков


По информации PolySync, на Soul, у которого с Cee'd общая платформа, два аналоговых датчика крутящего момента. Cигнал каждого — отклонение уровня постоянного напряжения от базовых 2.5V, провода в жгуте — зеленый и синий. Проверим, что у нас то же самое:


  • Размыкаем разъем на ЭБУ, пробрасываем нужные контакты через макетку и заводим на аналоговые входы arduino.

Кто сказал колхоз?!


  • Загружаем скетч, в цикле замеряющий напряжения и печатающий их в терминал.
  • Запускаем Serial Plotter в Arduino IDE, поворачиваем рулевой вал. Видим результат на графике, схема совпадает с Soul:
    График напряжения с датчиков момента силы на рулевом вале.
  • Радуемся сэкономленному времени.

Эмуляция сигнала датчиков


Переходим к эмуляции сигнала датчиков. Для этого поставим свой модуль в разрыв цепи между датиком и ЭБУ, будем транслировать настоящий сигнал с датчика и по команде сдвигать его на фиксированный уровень (изображая приложенное к рулевой колонке усилие). Силами одной arduino это не получится: там нет полноценного цифро-аналогового преобразователя, который мог бы выдавать постоянное напряжение. Аналоговые входы arduino нам тоже не очень подходят — хотя пинов для них целых 6, канал АЦП в контроллере только один, и его переключение между пинами занимает заметное время.


Нужно добавить к arduino внешние ЦАП/АЦП. Мне попались модули YL-40 (описание в pdf) на основе чипа PCF8591 — на каждой по 4 канала 8-бит АЦП и 1 8-бит ЦАП. Модуль может общаться с arduino по протоколу I2C. Потребуется небольшое допиливание (в буквальном смысле): китайские товарищи поставили на плату светодиод индикации напряжения на выходе ЦАП — его обязательно надо отсоединить. Иначе утекающий через диод ток не даст ЦАП поднять напряжение на выходе больше 4.2V (вместо штатных 5V). Диод отсоединяем, отковыривая резистор R4 с обратной стороны платы.


YL-40 отсоединяем диод от выхода ЦАП


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


YL-40 убираем перемычки


С интерфейсом к arduino есть нюанс — нам нужно 2 канала ЦАП, соотвественно 2 модуля, но у них одинаковые адреса I2C (зашиты в чип). Хотя чип позволяет менять свой I2C адрес, замыкая определенные ноги на +5V вместо земли, на плате эти перемычки не разведены. Вместо перепайки возьмем костыль — две разные библиотеки I2C на arduino (стандартная Wire и SoftI2CMaster), каждая на свою пару пинов. Получаем модули на разных шинах, конфликт пропадает.


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


  1. Включаем arduino, открываем Serial Monitor. Важно запустить arduino первой, не останавливать и не прерывать. Иначе напряжение на выходах ЦАПов сбросится, ЭБУ усилителя определит ошибку сигнала с датчиков, уйдет в безопасный редим и придется все перезапускать по новой.
  2. Запитываем усилитель, подключаем зажигание.
  3. Запускаем воспроизведение лога CAN-шины.
  4. Теперь по командам l и r через Serial Monitor усилитель будет поворачивать рулевой вал. Объявляется победа.


На сегодня всё, на очереди доработка софта (интеграция с CAN шиной, чтение оттуда текущего угла поворота и динамическое управление крутящим усилием, чтобы внешний контроллер мог задать фиксированный угол поворота руля и система его выдерживала), отработка на автомобиле (на стенде не смоделируешь сопротивление от колёс). Возможно замена 8-битных ЦАП/АЦП на 10 или 12 бит (взял первое, что под руку попалось). Рулящая нейросеть тоже в процессе, надеюсь скоро сделать пост.


Спасибо Artemka86 за ценные консультации по работе с CAN и помощь с оборудованием.


Ресурсы для дальнейшего погружения


  1. Car Hacking: The definitive source. Начинать можно с Car Hacking for Poories, там отлично покрыты основы. Остальное тоже интересно, но с упором на несанкционированный доступ.
  2. The Car Hacker's Handbook: A Guide for the Penetration Tester. Больше деталей, чем в Car Hacking: The definitive source, тоже акцент на несанкционированный доступ. Если читать как первое введение в тему, надо приспособиться пропускать большие куски.
  3. Car Hacking 101: Tools of the Trade, MCD Software — обзоры инструментов. В основном малоинтересная экзотика на мой взгляд.
  4. Open Source Car Control — открытая платформа для KIA Soul, в процессе разработки. Они делают полное решение (руль, акселератор, тормоза), включвя доработки по "железу" на машине (в основном для тормозов — ставятся дополнительные тормозные приводы, что-то меняется в тормозной гидравлике итд). Релиза ещё не было, но многие вещи уже можно подсмотреть.


Бонус. Совмещаем Raspberry Pi и Arduino CAN shield


Прежде всего, внимание, CAN шилд и raspberry pi нельзя соединять напрямую, они не совместимы по напряжению. На Arduino UNO-совместимых платах напряжение логики 5V, а на raspberry pi только 3.3V, поэтому прямое соединение только сожжет задействованные пины.


Нам понадобятся:


  • Raspberry Pi (проверялось на версии 3B).
  • Arduino CAN шилд на MCP2515/MCP2551.
  • Преобразователь уровня логики на 5 каналов или больше (можно 2 по 4 канала, но понадобится больше соединений). Мне попался этот

Нужно завести на CAN шилд питание (5V), соединения интерфейса данных SPI (4 пина: MOSI, MISO, SCLK, CS) и 1 пин сигнала прерывания. Всё, кроме питания, идет через преобразователь уровня, который в свою очередь тоже надо запитать.


На схемах ищем нужные пины.


Raspberry Pi:


Raspberry Pi pinout


CAN шилд:


Can shield pinout


Получаем результат:


  • SPI на raspberry pi 19, 21, 23, 24 (MOSI, MISO, SCLK, CS) соответствуют D11, D12, D13, D9 (или на некоторых версиях D10) на CAN шилде.
  • Прерывание с D2 на шилде можно завести на любой GPIO пин raspberry, у меня это пин 22 (GPIO 25). Номер пина укажем в софте при настройке.

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


Raspberry Pi + Arduino CAN shield


Всё, кроме 5V питания и земли на шилд идёт через преобразователь:


RPi - CAN shield converter connections labeled


Переходим к настройке софта (стандартный Raspbian).


  1. Включаем поддержку SPI и CAN модуля. В /boot/config.txt добавляем


    dtparam=spi=on
    dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25,spimaxfrequency=1000000
    dtoverlay=spi0-hw-cs

    Здесь interrupt=25 указывает пин, на который заведено прерывание с шилда. Индексация идёт по GPIO пинам, поэтому interrupt=25 это GPIO 25, он же пин 22 по сквозной индексации всех пинов. Также важно указать частоту интерфейса SPI spimaxfrequency, т.к. значение по умолчанию — 10 МГц — слишком высокое для шилда, он просто не соединится.


  2. Перезагружаем raspberry pi, проверяем соединение с шилдом:


    $ dmesg
    ...
    [   12.985754] CAN device driver interface
    [   13.014774] mcp251x spi0.0 can0: MCP2515 successfully initialized.
    ...

  3. Устанавливаем can-utils:


    $ sudo apt install can-utils

  4. Запускаем виртуальный сетевой интерфейс:


    $ sudo /sbin/ip link set can0 up type can bitrate 500000
    $ sudo ifconfig can0 txqueuelen 1000

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


  5. Готово, можно пользоваться candump, cansniffer и всем остальным из can-utils.

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


  1. VioletGiraffe
    20.09.2017 13:38

    А какая на данный момент цель вашего проекта?


    1. waiwnf Автор
      20.09.2017 13:46

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


  1. lonelymyp
    20.09.2017 13:50

    То есть управление будет аналоговое, имитацией сигнала датчика? Штатных функций поворота руля в контроллере двигателя ЭУРа нет?


    1. waiwnf Автор
      20.09.2017 14:04
      +1

      Да, будет аналоговое. Функции возможно есть (на каких-то сидах вроде бы есть система удержания в полосе, значит как-то она с ЭУРом в состоянии общаться). Но во-первых все протоколы закрытые, т.е. их пришлось бы тоже разбирать с нуля с дампов шины на реальном авто, это сложно. А во-вторых там часто ограничения по режимам (например, система удержания в полосе поворачивает руль не более, чем на 5 градусов; автопарковщик крутит рулём только на задней передаче, итд). В illmatics.com/car_hacking.pdf можно почитать примеры проблем с рулением по CAN. Через датчики получается сильно проще, хотя свою систему управления простенькую на удержание нужного угла придется писать.


      1. lokki7
        22.09.2017 09:06

        Удержания в полосе нет, а вот автопарковщик — есть.


        1. waiwnf Автор
          22.09.2017 09:08

          А, точно, там только предупреждение о покидании полосы, спасибо!


  1. valexey
    20.09.2017 18:30

    По поводу полного руления через обычный ЭУР — насколько это вообще надежно? Например в вики написано, что:

    При тяжёлом режиме работы, например, при длительном движении по раскисшей грунтовой дороге электродвигатель ЭУР перегревается. Для предовращения его отказа блок управления начинает ограничивать максимальный ток, соответственно руль «затяжеляется», и в конечном итоге отключается совсем. Для восстановления нормальной работы необходимо остановить автомобиль на некоторое время, с целью охлаждения обмоток электродвигателя, после чего работоспособность восстановится.

    Кажется это может быть весьма критичным для SDC. То есть по факту в SDC ЭУР будет эксплуатироваться в режиме для которого он не предназначен, что будет приводить к его отказам с большой вероятностью прямо во время рулежки.

    Т.е. такая эксплуатация просто не безопасна.


    1. dmitryredkin
      20.09.2017 18:41

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


      1. valexey
        20.09.2017 18:46
        -1

        Когда машина рулит сама, т.е. 100% через ЭУР, то на ЭУР нагрузка в любом случае много выше чем когда рулит человек (так как когда рулит человек, то часть работы делает человек, руками). На такой режим ЭУР просто не рассчитан.

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

        Два — обычный ЭУР, скорее всего, просто не сможет выдать достаточный момент, чтобы повернуть колеса на нужный угол если машина не двигается.


        1. dmitryredkin
          20.09.2017 18:58
          +1

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


        1. waiwnf Автор
          20.09.2017 19:16

          Я бы не был столь категоричен, вот например посмотрите демку от PolySync, SOUL со стоковым ЭУР: content.jwplatform.com/previews/1pCfzDxi-i83WwCkC


          1. valexey
            20.09.2017 19:33

            Противоречий не вижу — тут нет рулежки при нулевой скорости. И нет длительной езды с маневрами, чтобы ЭУР успел перегреться.

            Т.е. да, чтобы хоть как-то начать, ЭУР годится, но будет ряд ограничений в плане маневров и надежности. Чтобы ограничений не иметь, имеет смысл либо что-то допиливать руками (но могут быть проблемы с мощностью потребителя в сети машины), либо брать машину которая сразу приспособлена к полноценной самостоятельной рулежке, в том числе и при нулевой скорости (с фунцией автоматической парковки например).


            1. waiwnf Автор
              20.09.2017 19:37

              На cee'd есть опция автоматической паковки: youtu.be/w6in-pDUvqE?t=32s

              А вообще будем решать проблемы по мере возникновения :)


              1. valexey
                20.09.2017 19:42

                Ну, тогда звезды сошлись :-)

                Единственное, стоит глянуть отличается ли что-то в плане рулевого механизма и ЭУР у авто с этой опцией и без этой опции (если у вас конечно авто без этой опции).

                Но, думаю в любом случае допилить авто без опции до авто с опцией уже вполне посильаная задача, которая может быть решена по мере возникновения проблем :-)

                Удачи.


                1. waiwnf Автор
                  20.09.2017 19:51

                  Благодарю!

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


    1. waiwnf Автор
      20.09.2017 19:15

      Это конечно фактор, надо держать в голове, но больше в контексте разработки — сырая или недообученная система управления может «шуметь» и пытаться интенсивно дергать руль туда-обратно. В этом её надо ограничивать, иначе усилитель действительно можно убить. Что касаемо эксплуатации, когда и если до неё дойдет дело — то на асфальте современные усилители вполне справляются. Насколько я знаю, та же Udacity ездит на ЭУР вполне себе, Polysync, ещё пара компаний точно. Просёлки же по весне в деревне Гадюкино думаю не покорятся роботам ещё долго :)

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


      1. valexey
        20.09.2017 19:49

        Это конечно фактор, надо держать в голове, но больше в контексте разработки — сырая или недообученная система управления может «шуметь» и пытаться интенсивно дергать руль туда-обратно.

        Ага, как это было у Яндекса весной: www.youtube.com/watch?v=1Yc1v-LXl-0


  1. Ig_B
    21.09.2017 09:07

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


    1. waiwnf Автор
      21.09.2017 09:19

      Да, так должно быть надёжнее. Единственное нужно будет ещё как-то сделать, чтобы при зависании напряжение к нулю возвращалось относительно плавно, т.к. в усилителе есть детектор резких скачков напряжения на датчиках, и он просто отключается по нему. Вообще по надёжности тут просто конь не валялся, у меня опыта ноль в электронике и голова сейчас больше болит в направлении «нейросеть хочет уехать в канаву». А по уму конечно надо будет перепроектировать это всё.


  1. waiwnf Автор
    21.09.2017 09:18

    [ошибся веткой]


  1. nonpar
    21.09.2017 13:05

    «Интеграция с CAN шиной, чтение оттуда текущего угла поворота» — не вижу в существующей системе датчика положения РУ, который мог бы этот угол выдать. Ну хорошо, его можно присобачить.
    Но с точки зрения ТАУ, регулируемый параметр у вас — угол поворота, а в качестве уставки вы имеете возможность использовать лишь усилие, приложенное между рулевым валом и карданом к рулевой рейке. Передаточная функция между двумя этими величинами вряд ли тривиальна; даже её детерминированность, в реальных условиях, вызывает большие сомнения.
    Думаю, для решения конечной задачи следовало бы построить желаемый в теории контур регулирования, определить требуемые для него характеристики, а затем понять, можно ли доработать имеющееся железо и как это сделать. Навскидку, куда правильнее было бы подменять не сигнал от аналогового датчика, а целиком «мозги» усилителя, чтобы было возможно напрямую рулить его двигателем. Кроме того, могут потребоваться дополнительные датчики ( например, очень полезно было бы знать реальный момент на кардане к рулевой рейке).


    1. waiwnf Автор
      21.09.2017 13:46

      «Интеграция с CAN шиной, чтение оттуда текущего угла поворота» — не вижу в существующей системе датчика положения РУ, который мог бы этот угол выдать. Ну хорошо, его можно присобачить.

      Датчик есть, жгут проводов у него общий с датчиком момента (сами провода другие естественно). Я даже не стал разбираться, как он работает, т.к. ЭБУ его оцифровывает и с достаточно высокой частотой выдает текущий угол поворота в CAN (см. «Воспроизведение записи шины на стенде» в статье, первые 2 байта пакетов 2B0 и есть угол (в десятых долях градуса вроде бы).

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

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

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

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