Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

IoT4Car

Компоненты и расходные материалы

Arduino MKR1000
× 1
Преобразователь логического уровня SparkFun - двунаправленный
× 1
SparkFun OBD-II UART
× 1
Кабель SparkFun OBD-II - DB9
× 1

Приложения и онлайн-сервисы

IDE Arduino
надводный борт
dweet

Об этом проекте

Фон

Когда вы управляли автомобилем, глядя на приборную панель, вы когда-нибудь думали о сборе показаний счетчика и проведении некоторого анализа? Эти данные могут содержать спрятанные сокровища. Для отдельных людей он может отражать ваши привычки вождения, он может сказать вам вашу скорость, ваш средний расход на галлон, сколько у вас светофоров и время ожидания на каждом перекрестке. Для компаний эти данные имеют решающее значение для мониторинга в режиме реального времени при управлении автопарком. Состояние транспортного средства, распределение рабочей нагрузки, эффективность использования бензина и даже местоположение транспортного средства - все это может быть передано в центральную систему управления через облако. Компании могут использовать машинное обучение для ввода данных в модель обучения, чтобы спрогнозировать стоимость и даже проанализировать характеристики водителя. Поскольку Интернет вещей широко распространен, вышеперечисленные приложения будут недалеко. С платами Arduino MKR, ориентированными на приложения IoT, вы можете самостоятельно создать устройство, которое общается с вашим автомобилем и загружает телеметрические данные в облако. Разве это не круто?

Разговор с автомобилем

Нам нужен интерфейс для доступа к системе автомобиля. Где мы можем взломать машину? Ответ - интерфейс OBD-II.

Что такое OBD-II?

Бортовая диагностика (OBD) - это встроенная система самодиагностики автомобиля, с помощью которой мы можем общаться с нашими автомобилями. Впервые он был представлен в США в 1994 году и стал обязательным для всех автомобилей США 1996 года и более новых. Другие страны, включая Канаду, части Европейского Союза, Японию, Австралию и Бразилию, приняли аналогичное законодательство. OBD-II (второе поколение) имеет пять протоколов сигнализации, и сеть контроллеров (шина CAN) является одним из них. CAN-шина должна быть реализована во всех автомобилях США с 2008 года. CSS Electronics предоставила отличное введение в OBDII на Youtube. В этом проекте мы будем получать доступ к данным через 16-контактный интерфейс OBD-II.

Мой контроллер

Arduino - отличная платформа для любителей, производителей и профессионалов. У него есть множество плат, предназначенных для разных приложений. Здесь я использую плату Arduino MKR WiFi 1000 из-за ее возможности Wi-Fi. Вы также можете использовать другие доски, которые вам нравятся. Я бы порекомендовал Arduino MKR GSM 1400 просто потому, что GSM охватывает гораздо более широкие области, чем WiFi. Но не волнуйтесь, даже с Wi-Fi у нас может быть доступ в Интернет вдоль дорог. Я покажу вам обходной путь.

Доска переводчиков

Хотя сам Arduino имеет множество модулей ввода-вывода и множество библиотек, нам все еще нужна плата, которая может переводить протоколы OBD на язык, который может распознать Arduino. Я использую плату SparkFun OBD-II UART.

Эта плата позволяет взаимодействовать с шиной OBD-II вашего автомобиля. Он предоставляет вам последовательный интерфейс с использованием набора команд ELM327 и поддерживает все основные стандарты OBD-II, такие как CAN. Плата содержит микросхему STN1110, которая представляет собой интерпретатор OBD в UART, который можно использовать для преобразования сообщений между любым из используемых в настоящее время протоколов OBD-II и UART.

Однако следует отметить, что плата интерпретатора имеет напряжение ввода / вывода 5 В, что может привести к повреждению ввода / вывода платы Arduino MKR при прямом подключении. Arduino MKR WiFI 1000 работает при более низком напряжении, а его напряжение ввода / вывода составляет 3,3 В. Следовательно, для преобразования сигнала с 5 В в 3,3 В и наоборот необходим переключатель уровня. Ниже показано изображение сдвига уровня, который я использую.

Подключите

Подключить схему довольно просто. Просто подключите штырь 13 Rx и контакт 14 Tx Arduino MRK к контактам Tx и Rx платы OBD-II UART через переключатель уровня. Конечно, вам нужно соединить землю двух плат вместе.

Чтобы упростить отладку и демонстрацию, я также подключил к Arduino ЖК-экран 1602 для отображения данных в реальном времени. Подключение ЖК-дисплея к Arduino можно найти в этом руководстве, поэтому здесь мы подробно останавливаться не будем.

Ниже показано подключение макета. Зеленые линии предназначены для проводов, соединяющих плату Arduino и OBD-II UART, а желтые линии - для проводов, соединяющих Arduino и ЖК-дисплей. Схема также доступна во вложении.

Настоящее соединение немного беспорядочно из-за ограниченной площади макетной платы, но оно соответствует приведенной выше схеме. Я включил в картинку кабель micro USB и ODB-II - DB9.

Serial1 not Serial

Хорошо, пора запрограммировать нашу плату Arduino MKR. Поскольку моя плата Arduino MKR взаимодействует с платой интерпретации через UART, нет необходимости устанавливать сторонние библиотеки. Отправка команд на плату интерпретации похожа на общение с Serial Monitor. Единственное, что я хочу подчеркнуть, это то, что последовательный порт, связанный с контактами 13 и 14, - это Serial 1 . ! Плата Arduino MKR Последовательный порт относится к его USB-порту, который используется для связи с вашим компьютером. Не забудьте инициализировать Serial 1 . порт в функции setup ().

  Serial1.begin (9600);  

И используйте Serial 1 отправить команду на панель интерпретации.

  Serial1.println (сообщение);  

Сообщения

Как видите, я использую переменную message для хранения команд. Команды OBD состоят из шестнадцатеричных кодов, записанных в символах ASCII. Первые два шестнадцатеричных числа относятся к используемому сервисному режиму. В последнем стандарте OBD-II SAE J1979 описаны 10 диагностических услуг. Поскольку нас интересует мониторинг в реальном времени, мы будем использовать только 01 . код для отображения текущих данных в этом проекте.

Любое шестнадцатеричное число после сервисного режима представляет собой идентификатор параметра (PID) для выполнения специальных функций. Ниже приведен снимок экрана PID в сервисном режиме 01. Более подробную информацию можно найти в Википедии.

В этом проекте я продемонстрирую, как получить скорость автомобиля, обороты двигателя, уровень топлива и температуру охлаждающей жидкости двигателя. Команды OBD для этих четырех функций::

  • 010D // скорость автомобиля
  • 010C // обороты двигателя
  • 012F // уровень топлива
  • 0105 // температура охлаждающей жидкости.

Расшифровать данные

После отправки команд плата Arduino MKR будет прослушивать порт Serial 1 для любого ответа. Лучше после отправки команд поставить задержку в 200 мс. Для получения ответа я использую следующий код.

  void getResponse (void) {while (Serial1.available ()> 0) {// Начнем с проверки, получили ли мы символ конца сообщения ('\ r'). if (Serial1.peek () =='\ r') {// достигаем конца сообщения, очищаем последовательный буфер inChar =Serial1.read (); rxData [rxIndex] ='\ 0'; // Сбрасываем индекс буфера, чтобы следующий символ возвращался в начало строки rxIndex =0; } // Если мы не получили конец символа сообщения, просто добавьте новый символ в строку else {// Получите новый символ из последовательного порта:inChar =Serial1.read (); // добавляем новый символ в строку и увеличиваем индексную переменную:rxData [rxIndex ++] =inChar; }}}  

Ответ от доски интерпретатора соответствует формату

"> 1 повторяющиеся данные PID"

Например, на скриншоте выше я отправляю «010D», чтобы узнать скорость автомобиля. Ответ:«> 1 0D 00». Первые 5 символов показывают, что автомобиль принимает команду и повторяет PID 0x0D обратно. Последние две цифры возвращают данные скорости 0x00.

Затем я отправляю «010C», чтобы получить обороты двигателя, ответ «> 1 0C» показывает подтверждение команды, данные 0x098C в 4 раза превышают значение оборотов двигателя в шестнадцатеричном формате. 0x098C / 4 =611 уб, поэтому частота вращения двигателя составляет 611 об / мин.

После этого я отправляю команду «012F», чтобы узнать уровень топлива, и получаю данные 0x1D. Уровень топлива рассчитывается как 0x1D / 255 * 100 =11% dec.

Последняя команда - «0105», которая дает мне температуру охлаждающей жидкости 0x79. Реальная температура составляет 0x79 - 40 =81 градус по Цельсию. Затем последовательность команд повторяется.

Как видите, в строке ответа есть пробелы между двумя шестнадцатеричными цифрами, а первые 5 цифр просто повторяют команды. Следовательно, реальные данные начинаются с 6-го символа (первый начинается с индекса 0).

При программировании и отладке полезен последовательный монитор, но когда дело доходит до реального приложения, ЖК-экран более портативен и соответствует требованиям к мощности Интернета вещей. Просто замените серийный монитор ЖК-экраном, и вы сможете отслеживать данные о своем автомобиле в режиме реального времени. Ниже фото использования проекта на собственном автомобиле.

Облако наших данных

Преимущество Arduino MKR перед UNO - доступность Интернета. Arduino MKR, ориентированный на приложение IoT, сделает отрасли более интеллектуальными и взаимосвязанными. Для автомобильных приложений MKR WiFi 1000 может быть не лучшей платой, поскольку сигнал WiFi редко встречается на открытом воздухе, но я использую свой мобильный телефон в качестве личной точки доступа, так что это не проблема.

Существует множество других облачных платформ для хранения, просмотра и последующей обработки данных. Вы можете выбрать все, что захотите. Я буду использовать в качестве примера dweet.io и freeboard.io. Dweet.io предоставляет API, на который вы можете отправлять данные. Freeboard.io имеет ручки для получения данных dweet.io и их визуализации. Есть несколько руководств по настройке dweet.io и freebboard.io, поэтому я не буду вдаваться в подробности. Если вам интересно, вот несколько примеров, пример 1, пример 2.

Код отправки данных показан ниже в качестве иллюстрации того, как создавать команды dweet.

  void httpRequest () {client.stop (); // создаем строку данных для отправки на надводный борт if (client.connect (server, 80)) {Serial.println ("Connected"); Строковые данные ="POST / dweet / for / mkr1000? RPM ="; data.concat (vRPM); // загружаем данные об оборотах двигателя.concat ("&Speed ​​="); data.concat (vSpeed); // загружаем данные о скорости автомобиля.concat ("&Fuel ="); data.concat (vFuel); // загружаем данные об уровне топлива. concat ("&Temp ="); data.concat (vTemp); // загружаем температуру охлаждающей жидкости client.println (data); client.println («Хост:https://www.dweet.io»); client.println ("Соединение:закрыть"); // конец соединения client.println (); } еще {lcd.clear (); lcd.setCursor (0,0); lcd.println («Ошибка подключения»); }}  

На freeboard.io нам нужно создать новую панель мониторинга, а внутри этой панели создать новый источник данных. Свяжите этот источник данных с вашим файлом dweet.io, который вы определили в коде. В моем случае это 1000 мкр. Создайте новый виджет Gauge, который мы будем использовать для отображения данных. Дайте ему имя и свяжите его с одной из наших переменных. Ниже приведен снимок экрана моей панели инструментов. Он показывает СКОРОСТЬ, ОБОРОТЫ В МИНУТУ, УРОВЕНЬ ТОПЛИВА и ТЕМПЕРАТУРУ ОХЛАЖДАЮЩЕЙ ЖИДКОСТИ.

Заключение

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

Плата Arduino MKR WiFi достаточно хороша для этого приложения. Если у меня будет больше плат, я могу попробовать плату MKR GSM 1400. Не стесняйтесь использовать другие доски IoT с этим руководством и поделитесь своим мнением.

Работать над проектом весело и познавательно. Мне нравится отлаживать проблему. Мне также приятно поделиться тем, что я знаю, в Интернете. Спасибо за чтение. Дайте мне знать, если у вас возникнут вопросы или комментарии.

Код

  • IoT4Car_code
IoT4Car_code C / C ++
Эта программа будет разговаривать с транспортным средством с помощью платы OBDII-UART, отображать результаты на ЖК-дисплее и загружать на платформу IoT надводного борта
 / ** OBDII-UART-Serial version 9 * Эта программа будет разговаривать с транспортным средством, используя OBDII -UART, * и отображать результаты на ЖК-дисплее, и загружать на платформу IoT надводного борта * * Автор:zhaoshentech * Обновлено:2018-08-27 * * обновления:* v3:изменена функция getResponse (), чтобы буфер получал правильный ответ. * добавить getRPM (), чтобы получить обороты двигателя от транспортного средства. * v4:добавить функцию getSpeed ​​(), чтобы получить скорость транспортного средства * v5:добавить ЖК-модуль и отобразить скорость и обороты на LCD * v6:это версия Wi-Fi * v7:версия без Wi-Fi, непоследовательная версия. Удалите последовательную инициализацию *, чтобы плата могла работать без компьютера. * V8:версия без Wi-Fi, без последовательного интерфейса. Добавьте уровень топлива и температуру охлаждающей жидкости. * Измените расположение дисплея. * V9:это Wi-Fi, не серийная версия. Увеличьте скорость, число оборотов в минуту, уровень топлива и температуру охлаждающей жидкости * * Подключение схемы ЖК-дисплея:* Вывод RS ЖК-дисплея на цифровой вывод 12 * Вывод включения ЖК-дисплея на цифровой вывод 11 * Вывод ЖК-дисплея D4 на цифровой вывод 5 * Вывод ЖК-дисплея D5 на цифровой вывод 4 * ЖК-дисплей Вывод D6 к цифровому выводу 3 * Вывод D7 ЖК-дисплея к цифровому выводу 2 * Вывод ЖК-дисплея R / W на землю * Измеритель потенциала 10 K:* заканчивается на + 5 В и заземление * стеклоочиститель на вывод VO ЖК-дисплея (вывод 3) * ///// ////////////////////////////////////////////////// ////// Связано с Wi-Fi ////////////////////////////////////////// ///////////////#include#includechar ssid [] ="ВАШ WIFI SSID"; // Wi-Fi IDchar pass [] ="ВАШ WIFI PSWD"; // сервер пароля Wi-Fi [] ="www.dweet.io"; // надводный борт и dweet Settingsunsigned long lastConnectionTime =0; // отслеживаем время последнего подключенияconst unsigned long postingInterval =10L * 1000L; // отправляем данные каждые 10 секунд Wi-FiClient client; // Инициализируем wifi clientint status =WL_IDLE_STATUS; // статус радио WiFi // включает LDC libaray # include  const int rs =12, en =11, d4 =5, d5 =4, d6 =3, d7 =2; LiquidCrystal lcd (rs, en, d4, d5, d6, d7); // Это символьный буфер, в котором будут храниться данные из последовательного порта:char rxData [20]; char rxIndex =0; char inChar =0; String message; // Переменные для хранения данных о скорости и оборотах:int vSpeed ​​=0; int vRPM =0; int vFuel =0; int vTemp =0; void setup () {// Устанавливаем количество столбцов и строк ЖК-дисплея:lcd.begin ( 16,2); lcd.clear (); // проверяем наличие щита:if (WiFi.status () ==WL_NO_SHIELD) {lcd.println («WiFi не готов»); в то время как (правда); } // пытаемся подключиться к сети Wi-Fi:while (status! =WL_CONNECTED) {lcd.clear (); lcd.setCursor (0, 0); lcd.println («Подключение WiFi ...»); status =WiFi.begin (ssid, pass); // ждем 5 секунд соединения:delay (5000); } lcd.setCursor (0, 1); lcd.println («Подключено!»); // Serial1 - это фактический порт для связи с автомобилем Serial1.begin (9600); resetBuffer ();} void loop () {в то время как (статус! =WL_CONNECTED) {lcd.clear (); lcd.setCursor (0,0); // Подключение к сети Wi-Fi WPA / WPA2 Serial.println ("Подключение к Wi-Fi"); lcd.println («Подключить WiFi ...»); status =WiFi.begin (ssid, pass); // ждем 10 секунд задержки подключения (5000); } getSpeed ​​(); getRPM (); getFuel (); getCoolTemp (); если (millis () - lastConnectionTime> postingInterval) {httpRequest (); lastConnectionTime =миллис (); }} // getRPM данные отправляют команду «010C» на порт Serial1 // и вызывают getResponse () для сбора данных. Затем он печатает // данные об / мин на последовательном мониторе .void getRPM (void) {message ="010C"; Serial1.println (сообщение); задержка (200); // очищаем текущую строку для (int i =8; i <16; ++ i) {lcd.setCursor (i, 0); // 0 строка, i столбец lcd.write (''); } lcd.setCursor (8,0); // первая строка вторая половина на ЖК-экране // ждем ответа getResponse (); // Ответ RPM, деленный на 4, дает правильное значение. vRPM =((strtol (&rxData [6], 0,16) * 256) + strtol (&rxData [9], 0,16)) / 4; lcd.print (vRPM); lcd.print ("об / мин");} void getSpeed ​​(void) {message ="010D"; Serial1.println (сообщение); задержка (200); // очищаем текущую строку:for (int i =0; i <8; ++ i) {lcd.setCursor (i, 0); // 0 строка, i столбец lcd.write (''); } lcd.setCursor (0,0); // первая половина первой строки на ЖК-экране // ждем ответа от машины getResponse (); vSpeed ​​=strtol (&rxData [6], 0, 16); // в единицах км / ч vSpeed ​​=vSpeed ​​* 0.621371; // в единицах измерения миль / ч lcd.print (vSpeed); lcd.print ("миль / ч");} void getFuel (void) {message ="012F"; Serial1.println (сообщение); задержка (200); // очищаем текущую строку:for (int i =0; i <8; i ++) {lcd.setCursor (i, 1); // 1-я строка, i-й столбец lcd.write (''); } lcd.setCursor (0, 1); // вторая строка первая половина ЖК-экрана // ждем ответа от машины getResponse (); vFuel =strtol (&rxData [6], 0, 16); // в масштабе 255 // vFuel =244; // отладка использования vFuel =1.0 * vFuel / 255 * 100; // в масштабе 100 lcd.print (vFuel); lcd.print ("%"); //Serial.println(vFuel); // отладка использования} void getCoolTemp (void) {message ="0105"; Serial1.println (сообщение); задержка (200); // очищаем текущую строку:for (int i =8; i <16; i ++) {lcd.setCursor (i, 1); // 1-я строка, i-й столбец lcd.write (''); } lcd.setCursor (8, 1); // вторая половина второй строки на ЖК-экране // ждем ответа от машины getResponse (); vTemp =strtol (&rxData [6], 0, 16); // в единицах C, но со смещением на 40 градусов vTemp =vTemp - 40; // смещение на 0 lcd.print (vTemp); // выводим степень C lcd.write (0xDF); lcd.print ("C");} // Функция getResponse собирает входящие данные от UART в буфер rxData // и завершает работу при передаче ответа. Как только строка возврата каретки // обнаружена, буфер rxData завершается нулем (так что мы можем рассматривать его как строку) // и индекс rxData сбрасывается до 0, чтобы можно было скопировать следующую строку .void getResponse (void ) {while (Serial1.available ()> 0) {// Начнем с проверки, получили ли мы символ конца сообщения ('\ r'). if (Serial1.peek () =='\ r') {// достигаем конца сообщения, очищаем последовательный буфер inChar =Serial1.read (); rxData [rxIndex] ='\ 0'; // Сбрасываем индекс буфера, чтобы следующий символ возвращался в начало строки rxIndex =0; } // Если мы не получили конец символа сообщения, просто добавьте новый символ в строку else {// Получите новый символ из последовательного порта:inChar =Serial1.read (); // добавляем новый символ в строку и увеличиваем индексную переменную:rxData [rxIndex ++] =inChar; }}} void resetBuffer (void) {for (int i =0; i <20; i ++) {rxData [i] =0; }} void httpRequest () {client.stop (); // создаем строку данных для отправки на надводный борт if (client.connect (server, 80)) {Serial.println ("Connected"); Строковые данные ="POST / dweet / for / mkr1000? RPM ="; data.concat (vRPM); // загружаем данные об оборотах двигателя.concat ("&Speed ​​="); data.concat (vSpeed); // загружаем данные о скорости автомобиля.concat ("&Fuel ="); data.concat (vFuel); // загружаем данные об уровне топлива. concat ("&Temp ="); data.concat (vTemp); // загружаем температуру охлаждающей жидкости client.println (data); client.println («Хост:https://www.dweet.io»); client.println ("Соединение:закрыть"); // конец соединения client.println (); } еще {lcd.clear (); lcd.setCursor (0,0); lcd.println («Ошибка подключения»); }} 

Схема

Подключите Arduino MKR WiFi 1000, плату SparkFun OBD-II UART, SparkFun Logic Level Shifter и ЖК-дисплей 1602 frizling_schematics_M8kF26dafQ.fzz

Производственный процесс

  1. Номерной знак
  2. Антиблокировочная тормозная система
  3. Что такое трансмиссия?
  4. Что такое генератор переменного тока?
  5. Избегание препятствий с помощью искусственного интеллекта
  6. Игровой контроллер Arduino
  7. Костюм облака
  8. Что такое заземление шасси?
  9. Схема шасси автомобиля
  10. Понимание проводки автомобиля