Mazda can шина и ардуино


Нескучные выходные или «тачка на прокачку»

Некоторое время назад я сказал: "«Тюнить» авто лично мне как-то не интересно...", но «никогда не говори „никогда“». Звезды встали в таком порядке, что пришлось экстренно сменить машину Peugeot 307sw на Mazda5. Машина ездит, все хорошо, но некоторые «плюшки», которые были в прежней машине штатно, почему-то отсутствовали в текущей. Одна из таких полезных вещей — парктроник. Установка парктроника не является проблемой, но вот как-то «неродной» дисплей парктроника меня в салоне не устраивал. Внутренний перфекционист был жутко против «чужеродного тела». Некоторое время погуглил и узнал, что, оказывается, несколько лет назад один товарищ из СПб сделал специальное «дополнение», которое с одной стороны подключалась к блоку парктроника, с другой — к машине. И при этом информация с парктроника выводилась на штатный дисплей. Даже видео нашлось Казалось бы, надо купить, поставить и расслабиться, но тот проект «умер», автор на контакт не выходит: купить — нельзя. Но это ж не наш метод… раз нельзя купить, значит, можно «изобрести заново» (и прокачать свои навыки по программированию микроконтроллеров). Сначала нужно было выбрать парктроник. В исходном проекте использовался Parkmaster (модель, которая уже была совершенно недоступна — снята с производства). Пришлось выбирать из того, что можно свободно приобрести. Выбор пал на Parkmaster 4-DJ-06 (та же марка — была надежда, что «кто-то его уже расковырял, значит, я тоже смогу», но по сравнению с исходной моделью — «повышена скорость обнаружения препятствий, улучшена стабильность, датчики новой конструкции с эффективным отводом воды и т.п.»).

Первое, что было сделано — разобран дисплейчик и изучено подключение кабеля к нему. Обнаружилось, что дисплей подключен 5 проводами: GND, +5V, DATA, CS, CLK. Те, кто знаком с шиной SPI, сразу заметят некоторое сходство (у парктроника DATA = MOSI). Связь дисплея с основным блоком — одностороняя (основной блок — master, дисплей — slave), поэтому до «полноценного» SPI не хватает одного проводника (MISO).

Подключение осциллографа полностью подтвердило эту гипотезу: Канал A — CS, B — CLK, D — DATA. Дальше — дело техники: надо было придумать, каким образом «снять» все кодовые посылки и декодировать то, что там передается.

Про реверс-инжиниринг протокола другого парктроника уже говорили, поэтому подобно описывать это не буду, лишь приведу ссылку на ветку форума, где «родилась истина» для моего конкретного случая (там же есть и код, с помощью которого велся «захват» кодовых посылок. Мой ник на том форуме — ustas).

Работа была достаточно рутинная, но для того, чтобы сделать все «красиво и интересно» использовал два прерывания. Первое прерывание следило за CS, второе — за CLK. Больше в этой части ничего особенно интересного не было. Пару выходных дней, несколько вечеров и у меня был уже готовый прототип на макетке (с ардуино-nano), который уверенно получал данные от основного блока парктроника и производил их декодирование. Выбор парктроника оправдался — даже уровни согласовывать не пришлось. После этого парктроник был установлен в автомобиль и основное место разработки переместилось туда.

Часть вторая: Слушаем

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

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

Перед тем, как что-то посылать в шину, решил, что сначала следует «послушать» свою машину и убедиться, что представленная информация соответствует действительности. Поскольку не было под рукой соответствующего шилда с CAN-интерфейсом, от «ардуины» пришлось отказаться (да и все равно для установки в машину решил сделать соответствующее устройство) — развел несложную плату, на которой содержался бы МК (atmega328p), контроллер CAN-шины (MCP2515/MCP2551), пищалка… и… часовой модуль. Что не собирай на avr, а в итоге все равно получаются часы с радиолюбительских форумов Ну вот кто бы мог подумать, что у машины, которая произведена в этом тысячелетии есть часы, но нет календаря? Поскольку я тот еще склеротик — решил, что календарь мне точно не помешает, поэтому DS1307 тоже «прописался» на плате устройства. Схема устройства совершенно не блещет какой-то оригинальностью: используются типовые схемы включения всех составляющих (из их даташитов). На всякий случай вывел почти все свободные порты ввода-вывода на дополнительный разъем (вдруг что-то еще придет в голову в процессе реализации?). Естественно, для программатора развел ICSP.

Питание решено взять от USB-зарядки, поэтому на плате есть miniUSB-разъем. От блока парктроника (в процессе его установки) проложил дополнительный кабель, который «дублирует» основной кабель между дисплеем и парктроником (чтобы можно было одновременно иметь подключение как штатного дисплейчика парктроника, так и моего «изделия»). Кабель взял первый попавшийся… Вы же не очень удивитесь узнав, что это оказался длинный пачкорд? Поэтому на плате есть соответствующий разъем (черный, слева). Форму платы продиктовал имеющийся корпус.

Eagle, ЛУТ, хлорное железо и далее по списку... На первом этапе решил (для простоты) подключиться к диагностическому разъему, благо в нем MS-шина присутствует. Где именно в разъеме следует искать, подсмотрел тут.

С аппаратной частью, надеюсь, все понятно… переходим к софту. Для работы с CAN-шиной воспользовался готовой библиотекой. Тестовые примеры очень помогли — они позволили практически сразу начать «слушать». Единственное, что пришлось поправить — указать в скетче правильную скорость MS-шины (CAN_125KBPS).

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

Часть третья: Говорим

Первые попытки отправить сообщения на дисплей потерпели неудачу. Штатный дисплей авто просто игнорировал мои посылки. Для того, чтобы разобраться с этой проблемой (да и для удобства) — на «разборке» приобрел дисплей от Mazda3 (существенно более распространенная запчасть, чем аналогичный от Mazda5). Наиболее заметное отличие дисплеев — это цвет подсветки (Mazda5 — зеленый, Mazda3 — красный). Остальное практически идентично и я надеялся, что отличия только «косметические» (и оказался прав). Собрал дома небольшой тестовый стенд, состоящий из моего устройства и этого дисплея. Отработка на стенде — значительно комфортнее, чем в машине, зимой на улице. Параллельно нашел замечательный комментарий:You can send the 3 frames with the following IDs: 0x28F: LCD settings and probably some other settings (you just send the same data you receive in a normal 0x28f frame). 0×290: 0xC0 (first byte) followed by first 5 alfanum signs 0×291: 0×85 (first byte) followed by the next 7 alfanum signs all of them, just after you receive the 0×291 frame id sent by the HU. This will make your text being visible with almost no flicker at all. The reason for sending the 0x28F is that it is required for displaying the 0×290 and 0×291 text, otherwise the LCD seems to simply ignore the 0×290 and 0×291. Another method would be to set a timer with a 150ms interrupt and send the 3 frames described above. … 0x28F frame content that I have used:

hex: D1 00 00 00 80 00 00 01

Таким образом, для того, чтобы дисплей отобразил передаваемый текст нужно передавать три посылки (при первых тестах я передавал только две и из-за этого дисплей отказывался отображать мой текст). Но почему-то дома на стенде и правильная последовательность не отрабатывала — дисплей оставался пустым. Сходил в машину: тот же код — отработал отлично. Стал разбираться и понял, что для тестового стенда не хватает на шине резистора в 120 Ом (между CAN-H и CAN-L). Как только поставил этот резистор — дисплей «ожил».

Часть четвертая: Логика

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

Часть пятая: «Грабли»

Проблема заключалась в том, что штатная магнитола «флудит» в шину своими сообщениями на дисплей с периодом примерно раз в 150мс (даже если информация на дисплее не менялась). Это приводило к тому, что «нештатные» сообщения практически сразу же «перетирались» штатными.

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

Подход, возможно, сработал бы на более быстром МК, но быстродействия атмеги не хватило — периодически «проскакивали» штатные сообщения и это приводило к очень неприятной для взгляда «мешанине» сообщений (особенно с учетом того, что текст передается двумя порциями: иногда возникала ситуация, что первая часть сообщения — от машины, а вторая — от моего модуля). В общем, работает, но совсем не так, как хотелось бы. Для решения этой проблемы надо было как-то «оторвать» слишком «разговорчивую» магнитолу от шины. Можно было бы поставить «реле», которое бы отключало магнитолу от CAN-шины в моменты отображения нештатной информации, но это бы нарушило логику (например, я бы начал изменять громкость, при этом штатно на дисплей выводится сообщение типа «VOL 7» с соответствующим уровнем и это сообщение было бы пропущено). Т.е. надо было решить задачку: слушать CAN-шину, анализировать сообщения и передавать нужные сообщения на дисплей. «Правильно заданный вопрос – половина ответа». Придумал, что надо добавить второй CAN-интерфейс. При этом мое устройство включается «в разрез» CAN-шины между машиной и дисплеем. Устройство «слушает» то, что сообщает машина (и вообще берет из шины все, что нужно), проводится анализ данных и только нужное передается на дисплей. Чтобы не переделывать плату полностью — сделал «шилд» (как раз пригодились разведенные дополнительные порты ввода/вывода и ICSP), ведь контроллер CAN-шины подключается к МК через SPI-шину. Получилось вот такое устройство:

Для удобства ICSP сделал «сквозным», чтобы не надо было каждый раз разбирать «бутерброд» для обновления прошивки.

Часть шестая: Тесты

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

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

Пропала информация блока климат-контроля (правая часть дисплея). Как оказалось, это не единственная пропажа — маршрутный компьютер тоже отказался показывать свою информацию. Это не было большой неожиданностью, поскольку в прошивке я «следил» только за сообщениями на центральную часть дисплея (принимал, анализировал и при необходимости — выводил на дисплей), все остальные сообщения — просто игнорировались. Очевидно, что надо было найти идентификаторы сообщений, которые содержали «пропавшую» информацию. Это не заняло много времени. Обнаружены следующие идентификаторы
  • 0x38A обязательная отправка, без этого не работает маршрутник
  • 0x400 данные маршрутника
  • 0x3BA климат
  • 0x201 текущие параметры (скорость, обороты)
После того, как в код прошивки добавлены правила для прямой трансляции собщений с этими идентификаторами на дисплей — все заработало так, как надо.

Часть седьмая: "… и поскакал!"

В процессе поиска различной информации зарегистрировался на форуме владельцев Mazda5 — поделился своими наработками, показал, как получается. Оказалось, что этот проект интересен не только мне. В конференции помогали искать необходимую информацию, подсказывали возможные функции. В ходе обсуждения выяснилось, что не во всех комплектациях есть маршрутный компьютер, но замена дисплея на другой — добавляет эту функцию. Это говорило о том, что данные есть в шине, а функцию отображения в каких-то комплектациях реализовали, в других — нет (причем, это реализовано в прошивке дисплея). Проверил эту гипотезу и убедился, что она верна. Достаточно просто получилось выделить следующие данные:
  • средняя скорость,
  • мгновенный расход топлива,
  • средний расход топлива,
  • запас хода на остатке топлива.
«Копнул» чуть глубже — обнаружились еще и текущие данные: скорость, обороты двигателя. Вообще о процессе поиска данных надо рассказать более подробно - это может показаться интересным (и полезным для подобного реверсинжиниринга).Первый взгляд на эту задачу пугает: в шине присутствует много сообщений с различными идентификаторами и отследить, какой из них поменялся — достаточно сложно. Но оказалось, что при должном подходе, задача может существенно упрощаться. Я поступал следующим образом (например, при поиске данных о состоянии стояночного тормоза):
  • включал логирование всех сообщений (чтобы объем данных для анализа был не слишком большим — ограничивал временной интервал в 5-10 секунд),
  • в отведенное для теста время поднимал и опускал «ручник»,
  • полученные данные загружал в Excel,
  • включал «автофильтр»,
  • обнаруживал идентификатор сообщений, где данные изменялись (при таких «атомарных» действиях обычно изменялся один бит),
  • выделял такие идентификторы сообщений (обычно такой идентификатор был один),
  • включал в прошивке «фильтрацию» (чтобы фиксировались только «интересные» сообщения),
  • повторял анализ с отфильтрованными данными.
В ходе таких исследований сообщений выяснил, что в шине есть информация о состоянии всех дверей авто, стояночного тормоза, «поворотников» и т.п. Раз данные есть — нужно их как-то использовать. Сразу же добавил своему модулю функцию оповещения о незакрытых дверях на скорости выше 10 км/ч.Да, на приборной панели есть штатный индикатор незакрытых дверей, но он только сигнализирует об этом факте, но не уточняет, какая именно дверь не закрыта. Потом вспомнил, что на Peugeot была штатная функция автоматического запирания дверей на скорости. Очевидно, что тут тоже такую же функцию добавить… но уже не на прототипе (к сожалению, управление центральным замком в Mazda невозможно через CAN-шину, хотя в некоторых других машинах это вполне реально). Таким образом, список функций несколько расширился:
  • парктроник,
  • календарь,
  • вывод данных маршрутного компьютера,
  • контроль открытых дверей,
  • автозапирание дверей на скорости,
  • автоприглушение музыки при парковке (чтобы лучше слышать «пищалку» парктроника),
  • контроль напряжения бортовой сети.
Поскольку результат моей работы заинтересовал соконфетников — решил полностью переделать схему устройства (сделав его «одноплатным» и «самодостаточным»): включил все необходимые интерфейсы, мощные транзисторные ключи, DC/DC-преобразователь питания. При этом сделал плату первоначального размера:

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

Часть восьмая: Продакшн

Плата получилась довольно компактная благодаря тому, что перешел на типоразмер 0603 (в прототипе был 0805), довольно много переходных отверстий (хотя и многократно оптимизировал трассировку), дорожки/зазоры — 0.2мм. В принципе, можно было изготовить и дома ЛУТом, но проект и так занял слишком много моего времени, решил, что гораздо проще будет кому-то заплатить, чтобы плату сделали в нужном количестве и распаяли компоненты (было 9 заинтересованных соконфетников, «плюс» для моего авто вместо прототипа). Подобный опыт заказа в «поднебесной» у меня уже был — доверил это «своему» подрядчику. Получилось относительно бюджетно (дешевле, чем просто закупить комплектующие в московских магазинах), но не слишком (маленькая партия). Оплату производства сделал на средства, собранные с желающих («микро-краудфандинг»). Устройства произвели не слишком оперативно — на это ушло почти 3 недели. Но почта увеличила срок ожидания еще почти на месяц. Но не будем о грустном, поскольку получилось неплохо:

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

Часть девятая: Настройки

Из-за того, что устройство должно ставиться в машины разных комплектаций (и разным пользователям), необходимо было придумать, как реализовать режим настройки (включение/отключение нужных сообщений, функций, установку даты/времени). Безусловно, «для себя» я бы вообще над этой задачей не стал бы задумываться — нет ничего проще, чем подключить программатор, но не в этом случае. Нужно думать о «потребителях» устройства. При этом, согласно части «Логика», все должно выглядеть максимально штатно и без добавления дополнительных кнопок в салон (даже скрытой установки). И тут удачно вспомнилось, что можно легко получить данные о состоянии дверей, стояночного тормоза, «поворотников», причем, у последних в шине состояние полностью повторяло состояние ламп («моргал» соответствующий бит в посылке). Вход в режим настроек реализовал по «шаманской» последовательности: на стоящей машине (нулевая текущая скорость) надо приоткрыть водительскую дверь (следим за ее состоянием) и в течение 15 секунд с момента открытия дверей три раза поднять-опустить ручник. После этого на дисплее появляется надпись «SETUP?» и для подтверждения — закрыть водительскую дверь. Т.е. «неслучайная» последовательность действий (которую вряд-ли случайно кто-то воспроизведет в режиме нормальной эксплуатации авто). Перемещение по «меню настроек» с помощью подрулевого переключателя указателей поворота: левый — вниз, правый — вверх. Включение/выключение функций/сообщений — ручником. Словесное описание выглядит очень сложным, но в реальной эксплуатации все гораздо проще (напротив машины — забор из поликарбоната, обратите внимание на отражение — видно, когда используются «поворотники»):

Вообще было достаточно сложно и интересно было придумывать реализацию такого меню, когда доступен дисплей в одну строку и всего в 12 символов. Несколько дней тестировал изделие в своем авто — никаких нареканий, все работает отлично.

Часть десятая: Продолжение?

На текущий момент все платы отправлены их новым владельцам. Как только они будут установлены, надеюсь, получу дополнительные отзывы. Перед отправкой успел одну из плат подключить к Mazda CX-7 — почти все заработало сразу (некоторые данные маршрутного компьютера закодированы чуть иначе), но в целом — подключение прошло успешно. Сейчас устройство (с текущей прошивкой) проверено на Mazda3, 5, 6 (там где дисплеи похожи на те, что я использовал в процессе разработки). После адаптации прошивки, думаю, устройство может оказаться полезным практически на любом современном авто, где вывод на дисплей (или приборную панель) осуществляется через MS-CAN.

Часть последняя: Arduino?

После прочтения такой длинной записи (прошу прощения за это у тех, кто дочитал), может возникнуть вопрос: «При чем тут Arduino?». Ответ очень прост: все программирование я делал в среде Arduino. После этого некоторые могут начать «кидаться в меня помидорами», но мое личное мнение: лучше использовать тот инструмент, что доступен и знаком. Arduino — один из таких инструментов, который с одной стороны позволяет новичкам очень быстро и относительно просто приобщиться к такой интересной области, как программирование микроконтроллеров, а «наборы» и «шилды» — еще и существенно расширить область применения «железа» в своих проектах (хотя это и недешево). Arduino (в моем понимании) — эдакий фреймворк для «быстрого старта». Безусловно, использование профессиональных инструментов могло бы помочь реализовать необходимый функционал быстрее/лучше/более оптимально (нужное подчеркнуть), но для «проекта выходного дня» это может быть избыточно. Дерзайте! И еще раз то, ради чего все затевалось:

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

P.S. Если будут желающие — выложу схему, плату, BOM (поддержу «open hardware»). Качать тут.

P.P.S. Прошивку выкладывать в открытый доступ не буду. Метки:

habrahabr.ru

Arduino CAN шина

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

Для этого примера я взял недорогой китайский клон Arduino  и такой же недорогой CANbus шилд

    

CAN контроллер реализован на микросхеме MCP2515, управляется эта микросхема по интерфейсу SPI, на плате Arduino этот интерфейс так же используется для непосредственного программирования микроконтроллера, поэтому нужно быть готовым к тому, что интерфейс SPI у нас будет занят CAN модулем.

Теперь установим библиотеку для CAN шилда. Скачать ее можно по ссылке

Важный момент:

В качестве сигнала CS (chip select) текущая версия библиотеки использует на плате Arduino цифровой вывод  D9 а первые ревизии CAN шилда используют D10, поэтому нужно будет на CAN шилде дорожку ведущую на порт D10 отрезать, и перепаять на D9.

Библиотека устанавливается стандартным для Arduino IDE методом, в меню Файл->Примеры->CAN bus shield master появятся отлаженные, готовые к употреблению примеры.

Выберем пример "send"

// demo: CAN-BUS Shield, send data// the cs pin of the version after v1.1 is default to D9// v0.9b and v1.0 is default D10const int SPI_CS_PIN = 9;MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin    while (CAN_OK != CAN.begin(CAN_500KBPS))              // init can bus : baudrate = 500k        Serial.println("CAN BUS Shield init fail");        Serial.println(" Init CAN BUS Shield again");    Serial.println("CAN BUS Shield init ok!");unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7};    // send data:  id = 0x123, standrad frame, data len = 8, stmp: data buf    CAN.sendMsgBuf(0x123, 0, 8, stmp);    delay(100);                       // send data per 100ms/******************************************************************************************************************************************************************************************************************/

В этом примере мы  с интервалом 100мс отправляем пакет с постоянным ID=123 и восемью байтами данных 0,1,2,3,4,5,6,7

Все готово, компилируем и заливаем.

Код начинает работать сразу. Если посылки по CAN шине не летят, то на самой Arduino будет мигать светодиод а по RS232 будем передаваться сообщение об ошибке (нога TX Arduino)/

 

can.web-box.ru

BigBarrel.ru

Всем привет. Давно ни чего не писалось.   Сегодня речь пойдет о базах данных. Да, именно о них. Почему данная тема стала актуальной? В процессе внедрения системы умного дома, я столкнулся с большой проблемой: Добавление новых датчиков в свою систему. Это в свою очередь, приводит к добавлению новых параметров и данных, которые нужно передавать от ... Всех с наступающим Новым Годом! В преддверии праздника речь пойдет о новогодней гирлянде, управляемой с планшета или смартфона по bluetooth. Список компонентов проекта: RGB светодиодная лента(гирлянда) с микросхемой управления Ардуино pro mini Bluetooth модуль Планшет(смартфон) на базе Андроид В продаже существует очень много разных RGB лент, на разных микросхемах. Ниже список микросхем, с которыми мы сможем ... Датчик влажности DHT В прошлой статье мы рассмотрели управление вентилятором в ванной с использованием обычного фоторезистора. Пришла пора добавить в нашу схему умного дома новый тип датчика. Датчик влажности и температуры — DHT(пины 9,10 ). Описание и пример работы с датчиком можно посмотреть в статье При помощи датчика DHT мы будем замерять влажность в ванной ... В одной из прошлых статей, я рассказывал об автоматической светодиодной подсветке в ванной. Хочется более подробно остановиться именно на схемах подключения. Схема ленты 12v Светодиодная лента, как видно из схемы, состоит из групп светодиодов с ограничительным резистором, подключенных параллельно. Сложность подключения ленты заключена в ее питании. Во-первых — необходимая нагрузка, которую Ардуино не выдает. Во-вторых ... Даташит датчика dht11 Схема подключения одного датчика dht11 к Ардуино. Если Вы купили датчик припаянный на плату, и у платы всего 3 ножки для подключения, то резистор уже на ней есть, и по маркировки этих выводов подключаете к Ардуино (в нашем случае это, «-» минус, «S» сигнал к ардуино, третий на +). Описание работы библиотеки ... Всем привет. Хочу поделиться мыслями о программе Тесла. С чего все начиналось… Два года назад появилось увлеченность радиоэлектроникой. Это увлечение связано с появление в нашей жизни «Ардуино». Программист по призванию и увлеченный Ардуиной, пришлось тесно знакомиться с электроникой. Вечера изучений теории, многие тесты на практике с макетными платами, распайка и восстановление электроники привели к тому, ... Автоматическую ночную подсветку в ванной будем делать с использованием датчика движения и датчика света(фоторезистора). В качестве светящегося элемента будем использовать светодиодную ленту 12v Профиль со светодиодной лентой Датчик движения в боксе Фоторезистор(временный монтаж) Алгоритм управления довольно простой. Если темно и сработал датчик движения — включаем подсветку на некоторое время. Также необходимо предусмотреть случай, когда выходишь ... После написания последней статьи, появилась проблема с перегревом одного из датчиков DS18B20. Через разное время после включения, начал наблюдать, что данные с датчиков DS не приходят. После перезагрузки всей системы один из датчиков показывал 35-40 градусов, и в течении 15 минут температура падала до реальной. Пробовал менять датчик на новый, ничего не помогало. Как потом ... Следующим этапом в проектировании нашего умного дома будет проектирование управления вентиляцией. В наличие у нас 3 вентилятора, питающихся от сети 220 нагрузкой 180Вт — Вентилятор в ванной, совмещенной с санузлом — Вентилятор на кухни для потолочной вентиляции — Вентилятор для блока управления умным домом и рабочего стола(пк, зона пайки) Управление вентилятором осуществляется через реле, которые ... При умножении на Ардуино необходимо помнить о размерах переменных в которые мы записываем результат вычислений. Так, например, на Ардуино UNO переменная int — двух байтовая и может принимать значения от -2^15 до 2^15 (-23 768

bigbarrel.ru

Побеждаем шину CAN. Часть 1. Технология

Сегодня я хочу познакомить вас с интересной микроконтроллерной платформой CANNY. Это обзорная статья в которой вы узнаете о технологии, а в последующих статьях я расскажу вам о работе с сообщениями CAN, интеграции CANNY c Arduino Mega Server и о тех возможностях, которые предоставляет эта связка.

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

Шина CAN

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

Контроллеры CANNY

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

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

Кроме CANNY 7 в линейке контроллеров присутствует ещё несколько моделей, мы будем проводить свои эксперименты с более простой встраиваемой моделью CANNY 5 Nano. Она также поддерживает работу с CAN шиной, но при этом похожа на уже знакомую нам Arduino Nano.

Визуальное программирование

Развитая поддержка шины CAN это не единственная особенность этих контроллеров, кроме этого CANNY имеют свою собственную среду программирования, CannyLab, но не «обычную», а визуальную, где весь процесс написания программ сводится к манипулированию готовыми структурными блоками, заданию их параметров и соединению входов и выходов этих блоков в определённой последовательности, в соответствии с алгоритмом решаемой задачи. Ни одной строчки кода! Хорошо это или плохо? На мой взгляд, это дело привычки. Мне, как человеку привыкшему к «традиционному» программированию, было непривычно манипулировать блоками, вместо написания строк кода. С другой стороны, существует множество приверженцев именно такого подхода к составлению алгоритмов и считается, что для инженеров и «не программистов» это наиболее простой и доступный метод программирования микроконтроллеров. Мне, как минимум, было «прикольно» составлять программы таким образом и через некоторое время мне это стало даже нравиться. Возможно, что если продолжить этим заниматься, то через некоторое время уже написание кода покажется неудобным.

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

Подключение

Подключение CANNY 5 Nano к компьютеру мало чем отличается от подключения контроллеров Arduino. При наличии в системе драйвера Silicon Labs CP210x, либо после его установки из скаченного дистрибутива CannyLab, Windows создаёт виртуальный COM порт и CANNY готов к работе. В моём случае понадобилось ещё перезагрузить компьютер, но возможно это особенность моей системы.

Практические примеры

Давайте на простых примерах разберём, как в CannyLab выполнять действия, привычные нам в Arduino IDE. Начнём с традиционного мигания светодиодом. В контроллере CANNY 5 на выводе С4 (Channel 4) присутствует тестовый светодиод (аналог светодиода, находящегося на 13 выводе в Arduino). И его тоже можно использовать для индикации и экспериментов, чем мы и воспользуемся. Что же нужно, чтобы помигать светодиодом в контроллере CANNY? Нужно сделать всего две вещи — сконфигурировать пин четвертого канала как выход и подать на этот выход сигнал с ШИМ генератора. Все эти действия мы уже не раз проделывали в Arduino IDE, посмотрим как это выглядит в CannyLab. Итак, конфигурируем пин четвертого канала как выход

Настраиваем генератор ШИМ. Задаём период 500 миллисекунд, заполнение — 250 миллисекунд (то есть 50 %) и 1 (true) на входе генератора «Старт» и… всё! Больше ничего делать не нужно — программа готова, осталось только залить её в контроллер.

Режим симуляции

Тут нужно сказать пару слов о процессе симуляции на компьютере работы контроллера и заливке разработанной программы в память «железного» контроллера.

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

Заливка в контроллер

Для работы контроллеров CANNY, перед заливкой программы (в терминологии разработчиков «диаграммы») нужно сначала залить операционную систему «Устройство/Системное ПО/Записать». Это нужно сделать только один раз, для этого нужно выбрать соответствующий вашему контроллеру файл с расширением .ccx. После того, как программа написана и отлажена, её можно загрузить в ваш контроллер. Это делается просто — в меню выбираете пункт «Устройство/Диаграмма/Записать» и через несколько секунд программа оказывается записанной в контроллер. Далее нужно отключить контроллер от USB порта компьютера, снять перемычку на плате и можно включать запрограммированный контроллер, который после включения будет работать по вашей программе.

Аналоговые входы

Для того, чтобы лучше понять принцип программирования контроллеров CANNY в среде разработке CannyLab, давайте ещё разберём пример работы с аналоговым входом в этой системе. Мы будем отслеживать уровень напряжения на 10 пине контроллера и если он находится в диапазоне 2,5 В ± 20%, будем зажигать встроенный в плату светодиод. Как и в предыдущем примере, конфигурируем 4-й пин как выход для того, чтобы иметь возможность управлять работой светодиода.

Включаем АЦП на 10-м канале.

Далее пользуемся двумя логическими блоками, которые выдают 1 на выход, если напряжение находится в заданном диапазоне. Полный диапазон от 0 до 4095.

Блок «Логическое И» довершает работу и со своего выхода управляет работой светодиода на плате. Вот и всё. То, что мы привычно делали на Arduino, мы легко сделали в CannyLab. Осталось только освоиться в этой среде программирования и вы сможете легко и непринуждённо создавать свои проекты на этой платформе. Эти простые примеры составления программ даны для того, чтобы вы могли понять принцип визуального программирования микроконтроллеров CANNY. В дальнейшей работе вам поможет отличная справочная документация и поддержка разработчиков на сайте и форуме системы.

Заключение по вводной статье цикла

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

Если вам нравится визуальное программирование в стиле CannyLab, то контроллеры CANNY могут стать для вас интересной альтернативой Arduino или работать в связке с контроллерами Arduino. Об этом мы поговорим во второй статье цикла, в которой я расскажу вам об интеграции контроллеров CANNY с системой Arduino Mega Server.

Напомню, что AMS теперь работает не только на платах Arduino, но и на беспроводных Wi-Fi модулях ESP8266 и именно о такой связке пойдёт речь в следующий раз.

И как обычно, оставайтесь с нами, будет интересно!

Метки:
  • сделай сам
  • DIY
  • сеть
  • CAN
  • CANNY
  • Arduino Mega Server
  • AMS
  • iot
  • авто
  • автомобиль

geektimes.ru

Бортовой компьютер для авто на Arduino своими руками

Приветствую!

UPD 27.12.2017: Решил дополнить статью что проект был доработан другим пользователем, улучшен скетч в плане автоматической задержки, восстановления связи в случае разрыва соединения и много других нюансов… спасибо!!! Oleg его почта для вопросов: [email protected]

Ссылка на скетч и библиотеки: www.dropbox.com/s/9ioe43694kxxccw/OBD.rar?dl=0

Его комментарии к переработке:

1.вся проводка и соединение всех модулей и узлов сохранены из первоначального проекта.(кроме подключения блутуз модуля, он теперь на серийном порте «1») 2.программа жестко заточена под ардуино МЕГА 2560!!! на серийном порте «0» присутствует Дебаг при условии раскоментирования дефайна. 3.убран параметр задержки между опросами, задержка полностью интелектуальна и динамична, новый запрос не отправится пока не будет получен ответ на предыдущий с учетом таймаута. 4.добавлена функция восстановления связи в случае разрыва соединения (параметром потери связи служит отсутствие оборотов двигателя). 5.для работы требуется библиотека OBD.h вложенная в архив с проектом, этот экземпляр имеет несколько изменений от оригинала который можно скачать из интернета, и без неё скорее всего проект не будет работать или будет нестабилен.

папку нужно скопировать в папку " \Documents\Arduino\libraries"

Android приложение со всеми нюансами в Google Play: OliviaDrive

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

Еще фото
Список требуемых деталей для сборки БК
1) Arduino Uno R3 — 1 шт. ~ 7 долларов:

2) LCD2004 жк-модуль ~ 6 долларов:

3) Модуль Bluetooth HC-05 ~ 4 доллара:

4) OBD ELM327 Bluetooth сканер ~ 4 доллара:

5) Резистор 10 кОм подстроечный, бипер для звука, 2 кнопки для смены экранов, провода для соединений, корпус ~ 3 доллара.
Настройка блютуз модуля HC-05 для работы
Подпаиваем провода к пинам блютуза: (картинку с выходами смотреть в описании требуемых деталей)
  • 1 — это TX
  • 2 — это RX
  • 12 — это 3.3V
  • 13 — это GND
  • 34 — на этот вход тоже кидаем 3,3 V (нужен для перевода модуля в режим настройки с помощью AT команд).
Подключаем блютуз модуль к ардуине для его настройки

  • 1 — TX модуля в 6 пин ардуины. (внимание будет TX в TX это не ошибка!)
  • 2 — RX модуля в 7 пин ардуины. (аналогично не ошибка!)
  • 12 — и 34 пин к 3,3V ардуины.
  • 13 — GND ардуины.
Открываем Aduino IDE 1.0.6 (использовал эту версию) и заливаем скетч через USB порт в плату.

#include SoftwareSerial BTSerial(6, 7); // TX | RX void setup() { Serial.begin(9600); Serial.println('Enter AT commands:'); BTSerial.begin(38400); } void loop() { if (BTSerial.available()) Serial.write(BTSerial.read()); if (Serial.available()) BTSerial.write(Serial.read());

}

После успешной загрузки скетча открываем: Сервис->Монитор порта. Далее снизу ставим скорость 9600 бод и NL+CR вместе.

Далее вводим команды по одной и нажимаем [Послать]. После каждого ввода должен быть ответ ok.

AT // (возможно 1 раз вылетит Error, не пугайтесь… это нормально, повторите опять) AT+NAME=Car //Присваиваем имя модулю Car AT+ROLE=1 // Переводим модуль в режим Мастер AT+PSWD=1234 // Ставим пароль 1234 как на OBD ELM327 AT+BIND=AABB,CC,112233 //Прописываем Mac адрес OBD ELM327. AT+CMODE=1 // Подключение модуля с фиксированным адресом

AT+UART=9600,0,0 // Скорость работы по UART

Заметьте, что mac-адрес вида: «AA:BB:CC:11:22:33» вводится как «AABB,CC,112233». MAC- адрес своего модуля ELM327 можете посмотреть, подключившись для начала на него со своего мобильника. (Стандартные пароли обычно: 1234, 6789, 0000).

Всё, настройка модуля Bluetooth закончена.
Теперь нужно собрать схему Arduino + блютуз + LCD-экран
Схема:

1.Начнем с подключения HC-05 Bluetooth модуля.

  • 1 — TX модуля засовываем в 7 Pin (Rx) арудины (именно TX в RX, не так как ранее);
  • 2 — RX модуля засовываем в 8 Pin (Tx) арудины;
  • 12 — Pin (3,3V) модуля в Pin 3,3V ардуины;
  • 13 — Pin (Gnd) в Gnd арудуины;
  • 34 — Pin мы никуда не подключаем (заизолируйте или отпаяйте).
2. Подключаем монитор LCD.
  • VSS экрана к GND ардуины;
  • VDD экрана к 5V ардуины;
  • V0 экрана к центральному выходу резистора;
  • RS экрана к 12 пину ардуины;
  • RW экрана к GND ардуины;
  • E экрана к 11 пину ардуины;
  • DB4 экрана к 5 пину ардуины;
  • DB5 экрана к 4 пину ардуины;
  • DB6 экрана к 3 пину ардуины;
  • DB7 экрана к 2 пину ардуины;
  • A — к 5V ардуины;
  • K — GND ардуины.
Одну из оставшихся ног потенциометра пустить на GND ардуины. Переменный резистор на 10кОм нужен, чтобы управлять контрастностью монитора, так что если при первом включении вы включите и ничего не увидите, попробуйте отрегулировать контрастность шрифта поворотом резистора.

3. Подключаем дополнительную кнопку для переключения экранов с данными.

[1 кнопка]: один конец от нормально-открытой кнопки подключаем в GND ардуино, а второй конец в пин 10. [2 кнопка]: GND + пин 9. Бипер для звуковых предупреждений подключить по следующей схеме "+" к пину 13, а минус к GND ардуино.
Заливаем скетч в Arduino с помощью Aduino IDE 1.0.6 (использовал эту версию).
Единственное, в скетче присутствуют переменные, которую нужно подправить. Нужно будет обязательно учесть три переменных:

1) ED=1.998 Например объем двигателя в литрах 1.398;

2) VE_correct=1.0; Корректировка объёмного КПД ДВС по таблице: (если расход реально меньше — то уменьшаем значение в процентном соотношении). Если не хотите калибровать добейтесь чтобы при прогретом двигателе мгновенный расход в л/час был в районе половины обьема двигателя; 5)speed_korrect_val=1; Корректировка скорости машины, смотреть по GPS/
Управление
[Кнопка 1], [кнопка 2] — листать экран вперед назад. При включении при надписи «Connecting»… держать [кнопку 1] вход в режим показывания технологических экранов и параметров отдаваемых ЭБУ в 16-чном формате. Если будете включать БК не в машине то нужно отключить функцию опроса блютуз, надо продолжать держать две кнопки при надписи «Recovery»… до появлении надписи «All off»… а то экран будет все время пустой. [Кнопка 1] + [кнопка 2]: 4 секунды — Сброс журнала общего пробега и потраченного бензина на втором экране, также это сброс ошибок на экране информации об ошибках.
Скетч:
Старый скетч был удален в плане многих дефектов в работе… новая версия по ссылке вверху статьи… он был доработан пользователем Oleg, спасибо ему большое!!!!.. его почта для вопросов: [email protected]

Все, идем в машину, вставляем ELM327 в порт, ардуину в зарядку для авто и проверяем.

Метки:
  • бортовой компьютер
  • автомобиль
  • arduino
  • elm327
  • bluetooth
  • hc-05

geektimes.ru


Смотрите также