Делаем звуки поворотников с помощью Arduino; Cobalt

Делаем звуки поворотников с помощью Arduino; Cobalt

Имеется автомобиль Ravon R4, он же Chevrolet Cobalt в детстве. И чтобы жизнь мёдом не казалась от владения столь прекрасным пепелацем, подкинули нам искусственную сложность: при замене штатной магнитолы исчезают звуки поворотников. В статье по ссылке подобрано разобрана суть проблемы, а здесь мы будем её решать несколько костыльным путём.

Требования

  • Автомобиль Chevrolet Cobalt в комплектации LTZ или Ravon R4 любой комплектации;
  • Любой программируемый микроконтроллер, я использую Arduino UNO;
  • MCP2515 — CAN-контроллер с интерфейсом SPI;
  • DFPlayer Mini — аппаратный проигрыватель MP3 файлов с последовательным интерфейсом управления;
  • Любой динамик для воспроизведения звуков.

Стоимость такого удовольствия следующая: Arduino (250 руб.), MCP2515 (130 руб.), DFPlayer (60 руб.), динамик (50 руб.). Итого 490 рублей.

Подключение

Начнем с CAN-декодера. Прежде чем начать с ним работать, я по советам других пользователей сразу перепаял кварцевый резонатор c 8мГц на 16мГц. У платы MCP2515 в сторону шины два вывода: CAN High и CAN Low. Работать мы будем с шиной SWCAN, которая по своей природе является однопроводной. Значит, CAN High подключаем к шине, CAN Low на землю. Тут уже присутствуют варианты:

  • Взять SWCAN с диагностической колодки, пин №5. Там же кинуть землю;
  • Взять SWCAN с разъема для магнитолы, в нем он находится под номером №14, а земля №38:

Другой стороной MCP2515 подключаем к нашему микроконтроллеру — Arduino UNO. Делаем это как показано на схеме:

  • INT => D2;
  • SCK => D13;
  • SI — D11;
  • SO — D12;
  • CS — D10;
  • GND — GND;
  • VCC — 5V.

MP3 проигрыватель управляется по последовательному порту через пины RX и TX. По факту RX не используется, управление одностороннее. В случае с Arduino можно использовать как физический интерфейс, размещенный на пинах D0 (RX) и D1 (TX) Ардуины, так и воспользовавшись библиотекой SoftwareSerial поднять программный интерфейс на любом цифровом пине. Я выбрал второй вариант и использовал для него пин D6. При первом подключении я столкнулся с помехами на динамик, решением оказалось TX пин подключить через 1кОм резистор. Подключаем проигрыватель так:

  • VCC — 5V;
  • GND — GND;
  • TX — D6;
  • SPK_1 и SPK_2 — на динамик.

На этом подключение заканчивается и мы переходим к теории о шине SWCAN.

SWCAN шина и используемые в ней коды

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

В интернете мне удалось найти два кода соответствующих включению и выключению звука поворотников, но для меня так же критичны звуки незакрытых дверей и непристегнутого ремня. Потому пришлось прибегнуть к самостоятельному “отлову” необходимых кодов. Для этого я использовал программу Can Hacker и залитый соответствующий скетч в ардуино.

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

Поворотник (включить): Extended ID: 0×10400060 DLC: 5 Data: 0×82 0×08 0×01 0xFF 0xD4
Поворотник (выключить): Extended ID: 0×10400060 DLC: 5 Data: 0×81 0×08 0×01 0xFF 0xD5
Открытая водительская дверь на зажигании (включить): Extended ID: 0×10400040 DLC: 5 Data: 0×86 0x3C 0xFF 0xFF 0×58
Открытая водительская дверь на зажигании (выключить): Extended ID: 0×10400040 DLC: 5 Data: 0×86 0x3C 0×00 0xFF 0×58
Сброс одометра (единократный щелчок): Extended ID: 0×10400060 DLC: 5 Data: 0×85 0x1E 0×01 0×33 0×38
Непристегнутый ремень на скорости выше 20км/ч (включить): Extended ID: 0×10400058 DLC: 5 Data: 0×87 0×65 0×64 0xFF 0×05
Непристегнутый ремень на скорости выше 20км/ч (выключить): Extended ID: 0×10400058 DLC: 5 Data: 0×87 0×65 0×00 0xFF 0×05
Тройной писк при открытой двери в движении (единократно): Extended ID: 0×10400060 DLC: 5 Data: 0×86 0×28 0×04 0xFF 0×88
Движение на стояночном тормозе (включить): Extended ID: 0×10400060 DLC: 5 Data: 0×86 0x1E 0xFF 0xFF 0×78
Движение на стояночном тормозе (выключить): Extended ID: 0×10400060 DLC: 5 Data: 0×86 0x1E 0×00 0xFF 0×78

Полученных данных достаточно, а значит мы переходим к программированию микроконтроллера.

Скетч для Arduino

В Arduino IDE устанавливаем необходимые для работы библиотеки:

  • https://github.com/coryjfowler/MCP_CAN_lib — библиотека для работы с CAN-декодером;
  • https://github.com/Makuna/DFMiniMp3 — библиотека для работы с MP3 плеером.

Подготавливаем MicroSD флеш-карту для проигрывателя: форматируем в FAT32 и копируем в её корень файлы звуков строго под названием 0001.mp3, 0002.mp3, …, 000n.mp3. Для начала можете воспользоваться звуками, которые подготовил я:

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

Флешку вставляем в DFPlayer Mini и заливаем предложенный мною скетч для Arduino:

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

Читайте также:  Замена воздушного фильтра Матиз инструкция, описание, видео

Arduino bus can: заставляем микроконтроллер общаться по шине

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

Определение:

CAN – control area network, в переводе звучит что-то вроде «сети устройств управления и связи».

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

Микроконтроллеры Arduino can шину в обычном виде не поддерживают – для этого нужно использовать дополнительные блоки преобразования сигналов.

Как заставить Arduino общаться по can?

Во-первых, для связи по ардуины нужно использовать модуль mcp2515 или TJA1050. Это устройство выступает в роли посредника между контроллером и сетью, то есть вы отправляете битовые последовательности на него, указываете адресата, а он перенаправляет данные в нужном порядке и форме.

Связь ардуино и этой платы осуществляется по SPI интерфейсу.

Определение:

SPI – Serial Peripheral Interface, на русском языке это звучит так – последовательный интерфейс периферии.

Для связи нужно четыре цифровых сигнала (соответственно, 4 пина ардуины):

  • MOSI – выход ведущего устройства;
  • MISO – вход ведущего;
  • SCLK – последовательный тактовый сигнал;
  • CS (SS) – выбор кристалла или микросхемы (crystal select).

На схеме вы видите, что все сигналы, кроме SS(CS), – общие, а последний индивидуален для каждого устройства в системе, и нужен для определения устройства, с которым ведётся обмен данным. Когда сигнал 0 – устройства взаимодействуют, а когда 1 – нет. То есть управление производится инверсным сигналом, иначе говоря – низким уровнем, об этом свидетельствует полоса над надписью SS, в математике и электронике так обозначаются инвертированные (умноженные на минус единицу) значения чисел.

Для работы Arduino bus can системы нужно использовать соответствующую библиотеку для Arduino ide (https://github.com/Seeed-Studio/CAN_BUS_Shield), а для большего удобства – шилд, кстати, библиотека написана под такой шилд.

Варианты применения

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

Arduino и can шина

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

Предисловие
Никакой необходимости в том, что я сделал у меня не было. Мне просто было интересно попробовать.

Видел на Drive несколько статей про «ботовые компьютеры» на базе Arduino, а так как сам недавно начал изучить микроконтроллеры на примере данной «платформы», мне стало интересно попробовать сделать нечто подобное самому.

Очень коротко о главном
Нужно получать информацию от узлов автомобиля и выводить её на штатный LCD-дисплей (на котором информация с магнитолы отображается). Основные компоненты это Arduino Nano и CAN Bus Модуль MCP2515.

В комментариях к первой части, у меня с Red-ICE возникло некое недопонимание, возможно больше с моей стороны, поэтому я считаю нужным пояснить что же расположенно на плате этого модуля, а точнее что такое MCP2515 и TJA1050 и для чего они.

Стоит упомянуть сетевую модель OSI (open systems interconnection basic reference model — базовая эталонная модель взаимодействия открытых систем), так как CAN — это стандарт промышленной сети и он соответствует этой модели. Если коротко и о главном, то модель OSI описывает уровни взаимодействия, что и на каком уровне должно происходить. Если мы говорим о CAN-шине, то это канальный и физический уровень.

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

Физический уровень — это нижний уровень модели OSI, который определяет метод передачи данных, представленных в двоичном виде, от одного устройства к другому. Устройства, которые работают на этом уровне, осуществляют передачу электрических или оптических сигналов в кабель или в радиоэфир и, соответственно, их приём и преобразование в биты данных. Этим занимается TJA1050. Вот одна строчка из datasheet к TJA1050 «The TJA1050 is the interface between the Controller Area Network (CAN) protocol controller and the physical bus».

С этим я думаю всё более-менее понятно.

Про подключение CAN Bus Модуль MCP2515 к Arduino Nano
Модуль подключается к Arduino по SPI (Serial Peripheral Interface, SPI bus — последовательный периферийный интерфейс, шина SPI). В SPI используются четыре цифровых сигнала:
MOSI — выход ведущего, вход ведомого (Master Out Slave In). Служит для передачи данных от ведущего устройства ведомому.
MISO — вход ведущего, выход ведомого (Master In Slave Out). Служит для передачи данных от ведомого устройства ведущему.
SCLK — последовательный тактовый сигнал (Serial Clock). Служит для передачи тактового сигнала для ведомых устройств.
CS или SS — выбор микросхемы, выбор ведомого (Chip Select, Slave Select).
В Arduino Nano аппаратно установленные следующие цифровые выводы для подключения SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK).
На изображении модуля (выше) видно, что контакты J4 имеют немного другую маркировку, но это не меняет из назначения.

Читайте также:  Крыльчатка электродвигателя, конструкция, применение Компания; Вольт

Подключаем следующим образом (имя на модуле — номер вывода на Arduino):
SCK — 13
SI — 11
SO — 12
А вот вывод CS (он же SS) устанавливается программно в скетче. Почему так?

Потому что к шине SPI можно подключить несколько устройств Slave. И если сигналы SCK, MOSI, MISO являются «общими» для всех устройств Slave, то SS должен соответствовать своему устройству (отсюда и название Slave Select), т. е. Master подключается к каждому Slave отдельным проводом SS сигнала.
VCC и GND — питание (5 В) и земля, соответственно. Причём имеет смысл чтобы Arduino и модуль были на земле OBD разъёма.
INT на модуле не нужен, если не планируется работать с прерыванием. Я пока не планирую, поэтому я его не использовал.
К CAN-шине модуль подключается в соответсвии с маркировкой L (LOW) и H (HIGH) (J2 и J3 на модуле) к соответствующим контактам на разъёме OBD-II.

Ещё немного про CAN-шину
CAN (Controller Area Network — сеть контроллеров) — стандарт промышленной сети, ориентированный прежде всего на объединение в единую сеть различных исполнительных устройств и датчиков. Режим передачи — последовательный, широковещательный, пакетный… Передача ведётся кадрами, которые принимаются всеми узлами сети.
Это значит, что моё устройство будет получать все сообщения (кадры), которые «гуляют» по шине, а так же сможет отправлять сообщения, которе будет получать адресат, т.е. LCD-дисплей.
Кадры имеют определённый «формат» — последовательность битов, условно разделенных на группы по «смыслу». Подробно я не буду рассказывать, потому что для моей задачи это не нужно, ну и потому что я не разбирался с этим до конца. Кому интересно, информации полно.
Всего есть четыре вида кадров, но меня интересует только кадр данных, так как этот кадр передаёт «полезную» информацию.

Что нужно знать про кадр данных (в рамках моей задачи)
Как я написал выше, режим передачи в CAN-шине широковещательный. Это означает, что все устройства на шине получают сообщения от других устройств. Чтобы фильтровать сообщения и выбирать только нужные применяется идентификатор сообщения и маска. Идентификатор сообщения — это 11 бит в кадре (в расширенном 29, но у нас будет 11). Чтобы выбрать нужные сообщения, устройство указывает драйверу CAN-шины (через который оно подключено), последовательность бит идентификатора и последовательность бит маски и драйвер получает только «нужные» сообщения. Подробно описывать не буду, но те кто знаком с понятием IP-адреса и маски подсети поймут, принцип такой же.
Резюмируя: чтобы дисплей получил и отобразил сообщение, мы должны знать какой идентификатор (для отправки маску знать не нужна) указать в кадре.

Выясняем нужный(е) нам идентификатор(ы)
Первый способ (им я проверил правильность второго) — это подключиться к CAN-шине и «читать» сообщения, а потом заняться их расшифровкой. Долго и сложно.
Второй способ, и самый очевидный и простой — искать в интернете. И оно там есть, потому что нашлись те, кто воспользовался первым способом.
Тут www.madox.net/blog/projects/mazda-can-bus/ есть немножко информации в самой статье, но самое полезное в комментариях к статье. Вот тут docs.google.com/spreadshe…eieBFiGY/edit?usp=sharing более полный и подробный перечень того что «гуляет» по MS-CAN. Там есть вся информация, которая нам нужна, чтобы отправить «правильное» сообщение для LCD-дисплея.
Посмотрев перечень сообщений MS-CAN мы увидим, что для дисплея определено 3 идентификатора. 0x28F нам не сильно сейчас интересен, а вот 0x290 и 0x291 нужно объяснить отдельно.
LCD-дисплей может отобразить 12 символов. А вот кадр данных может передавать только 8 байт данных (каждый ASCII символ будет занимать 1 байт), т. е. мы сможет передать дисплею только 7 символов. Почему 7? Потому что первый байт в сообщениях с идентификаторами 0x290 и 0x0291 занят каким-то служебным значением, которое менять нельзя. И так, получается, чтобы заполнить 12 символьный экран (а пробел, ну или пустой символ, это тоже символ) нужно отправить 2 сообщения: в первом указываем первые 7 символов, а во втором 5 оставшихся (тут я нагло вру, читай правду в конце). Как это выглядит, я покажу ниже.

Ближе к практике
Так как CAN-шина она везде CAN-шина, то имея два Arduino (Nano и Uno) и два CAN Bus модуля я соединил оба Arduino и начал писать скетч. А точнее два, для отправки и получения сообщений. Как я писал выше, оба CAN Bus модуля можно было подключить к одному Arduino, но я сделал отправку и чтения на разных, а ниже покажу для чего.

Программировал я в стандартном Arduino IDE. Для работы с MCP2515 нужна библиотека, но правильная. Что значит правильная? Есть «официальная» библиотека Seeed-Studio/CAN_BUS_Shield, однако она не подойдёт, т. к. в ней поддерживается только работа на 16 МГц, а у меня плата с кварцевым генератором 8МГц. А правильной библиотекой будет эта (эту, крайне полезную информацию, я прочитал в статье у Red-ICE . Я думаю это сэкономило мне значительно времени).

Читайте также:  Представлен Nissan IMk - концепт электрического сити-кара в стилистике японских кей-каров

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

Сделав «черновые» скетчи и залив их на Arduino, я взял ту, которая читает с CAN-шины, взял переходник для OBD-II (который я упомянул в первой части) и пошёл в автомобиль проверять.
Так как ноутбука у меня нет, я подключал Arduino к смартфону. Вот так выглядит «это».

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

Определение:

CAN – control area network, в переводе звучит что-то вроде «сети устройств управления и связи».

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

Микроконтроллеры Arduino can шину в обычном виде не поддерживают – для этого нужно использовать дополнительные блоки преобразования сигналов.

Как заставить Arduino общаться по can?

Во-первых, для связи по ардуины нужно использовать модуль mcp2515 или TJA1050. Это устройство выступает в роли посредника между контроллером и сетью, то есть вы отправляете битовые последовательности на него, указываете адресата, а он перенаправляет данные в нужном порядке и форме.

Связь ардуино и этой платы осуществляется по SPI интерфейсу.

Определение:

SPI – Serial Peripheral Interface, на русском языке это звучит так – последовательный интерфейс периферии.

Для связи нужно четыре цифровых сигнала (соответственно, 4 пина ардуины):

  • MOSI – выход ведущего устройства;
  • MISO – вход ведущего;
  • SCLK – последовательный тактовый сигнал;
  • CS (SS) – выбор кристалла или микросхемы (crystal select).

На схеме вы видите, что все сигналы, кроме SS(CS), – общие, а последний индивидуален для каждого устройства в системе, и нужен для определения устройства, с которым ведётся обмен данным. Когда сигнал 0 – устройства взаимодействуют, а когда 1 – нет. То есть управление производится инверсным сигналом, иначе говоря – низким уровнем, об этом свидетельствует полоса над надписью SS, в математике и электронике так обозначаются инвертированные (умноженные на минус единицу) значения чисел.

Для работы Arduino bus can системы нужно использовать соответствующую библиотеку для Arduino ide (https://github.com/Seeed-Studio/CAN_BUS_Shield), а для большего удобства – шилд, кстати, библиотека написана под такой шилд.

Варианты применения

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

Опубликовал: Константин Александров / 30.10.2017

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

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

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

Сначала немного теории.

Многие из вас пользовались устройством ELM-327 для диагностики авто. Многие знают, что стандартный EML позволяет читать такие данные машины, как скорость, обороты, положение дрос. заслонки, температура впуска, показания лямбд, давление и прочее-прочее-прочее. Все эти данные наши программы получают, использую протокол диагностики OBD-II, который грубо говоря является оберткой вокруг других протоколов, в частности работы с CAN-шиной.

В наших фиатах существует две CAN-шины. Если вы посмотрите в диагностический разъем, то увидите, что у нас есть контакты на следующие пины: 1,9, 4, 5, 6, 14, 16.

Несколько лет назад, когда я вешал свой чип-тюнинг на провода 4, 16, 6, 14 я не задумывался, а за что они отвечают. Итак, 4, 5 и 16 — это «земли» и 12В соотвественно. 6 и 14 — это так называемая шина C-CAN. Шина имеет скорость 500 kbps и считается скоростной, отвечает за работу двигателя, abs и других критически важных узлов машины. Именно с ней работает хорошо нам известный ELM 327.

А что же 1 и 9. Эти пины стандартом OBD-II относятся к тем, которые могут использоваться производителем в своих целях. Фиат использует их для диагностики шины B-CAN. Это так называемая шина комфорта. Скорость ее работы 50 kbps.

На ней висят приборка, боди и прочие вещи.

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

Ссылка на основную публикацию
Дворники» прослужат дольше, если соблюдать эти простые правила
Как избежать примерзания дворников к лобовому стеклу Когда наступают холода, у автовладельцев постоянно прибавляются хлопоты. Чтобы решить проблему, которая возникает...
Двигатель троит на холодную, причины и как устранить проблему
Если пахнет бензином при запуске двигателя Если в салоне при запуске двигателя пахнет бензином – это тревожный «звоночек» Отметим сразу,...
Двигатель УД 25 характеристики, неисправности и тюнинг
Технические характеристики двигателя УД-25 Производство силовых установок УД15 и УД25 проводится уже долгие годы. За этот период их начали применять...
Дворовая Территория Определение В Законе — Советы от Юриста
Правила дорожного движения для жилой зоны и дворовой территории - ПДД в 2020 году В ПДД используется такой термин, как...
Adblock detector