Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

IoT4Mobil

Komponen dan persediaan

Arduino MKR1000
× 1
Konverter Level Logika SparkFun - Dua Arah
× 1
SparkFun OBD-II UART
× 1
Kabel SparkFun OBD-II ke DB9
× 1

Aplikasi dan layanan online

Arduino IDE
freeboard
dweet

Tentang proyek ini

Latar belakang

Saat mengendarai kendaraan Anda, melirik dashboard Anda, pernahkah Anda berpikir untuk mengumpulkan pembacaan meteran dan melakukan beberapa analisis? Data ini mungkin mengandung harta terpendam. Untuk individu, ini dapat mencerminkan kebiasaan mengemudi Anda, ini dapat memberi tahu Anda kecepatan Anda, mpg rata-rata Anda, berapa banyak lampu lalu lintas yang Anda miliki, dan waktu tunggu Anda di setiap persimpangan. Bagi perusahaan, data ini sangat penting untuk pemantauan waktu nyata dalam manajemen armada. Kondisi kendaraan, distribusi beban kerja, efisiensi bahan bakar, dan bahkan lokasi kendaraan semuanya dapat diumpankan kembali ke sistem kontrol pusat melalui cloud. Perusahaan dapat menggunakan pembelajaran mesin untuk memasukkan data ke dalam model pelatihan untuk memprediksi biaya dan bahkan menganalisis karakteristik pengemudi. Karena IoT menyebar luas, aplikasi di atas tidak akan jauh. Dengan papan Arduino MKR, yang menargetkan aplikasi IoT, Anda dapat membangun perangkat yang berbicara dengan mobil Anda dan mengunggah data telemetri ke cloud sendirian. Bukankah itu keren?

Berbicara dengan kendaraan

Kita membutuhkan sebuah interface untuk mengakses ke dalam sistem kendaraan. Di mana kita bisa meretas mobil? Jawabannya adalah antarmuka OBD-II.

Apa itu OBD-II?

On-Board Diagnostics (OBD) adalah sistem diagnostik mandiri bawaan kendaraan, yang melaluinya kita dapat berkomunikasi dengan mobil kita. Ini pertama kali diperkenalkan di Amerika Serikat pada tahun 1994, dan menjadi persyaratan pada semua kendaraan AS tahun 1996 dan yang lebih baru. Negara-negara lain, termasuk Kanada, bagian dari Uni Eropa, Jepang, Australia, dan Brasil mengadopsi undang-undang serupa. OBD-II (generasi kedua) memiliki lima protokol pensinyalan, dan Controller Area Network (CAN bus) adalah salah satunya. CAN bus diwajibkan untuk diterapkan di semua mobil AS sejak 2008. Ada pengenalan besar OBDII yang disediakan oleh CSS Electronics di Youtube. Dalam proyek ini, kami akan mengakses data melalui antarmuka OBD-II 16 pin.

Pengontrol saya

Arduino adalah platform yang sangat baik untuk penghobi, pembuat, dan profesional. Ini memiliki berbagai papan yang menargetkan aplikasi yang berbeda. Disini saya menggunakan board Arduino MKR WiFi 1000 karena kemampuan WiFi-nya. Anda juga dapat menggunakan papan lain yang Anda suka. Saya akan merekomendasikan Arduino MKR GSM 1400, hanya karena GSM mencakup area yang jauh lebih luas daripada WiFi. Tapi jangan khawatir, bahkan dengan WiFi kita bisa memiliki akses internet di sepanjang jalan. Saya akan menunjukkan solusinya.

Dewan penerjemah

Meskipun Arduino sendiri memiliki banyak I/O dan banyak perpustakaan, kami masih membutuhkan papan yang dapat menerjemahkan protokol OBD ke dalam bahasa yang dapat dikenali Arduino. Papan yang saya gunakan adalah Papan UART SparkFun OBD-II.

Papan ini memungkinkan Anda untuk berinteraksi dengan bus OBD-II mobil Anda. Ini memberi Anda antarmuka serial menggunakan set perintah ELM327 dan mendukung semua standar OBD-II utama seperti CAN. Papan berisi chip STN1110, yang merupakan penerjemah OBD ke UART yang dapat digunakan untuk mengonversi pesan antara protokol OBD-II yang saat ini digunakan, dan UART.

Namun, harus ditunjukkan bahwa papan interpreter memiliki tegangan I/O 5 V, yang dapat merusak papan I/O Arduino MKR, jika menghubungkannya secara langsung. Arduino MKR WiFI 1000 berjalan pada tegangan yang lebih rendah dan tegangan I/O nya adalah 3,3 V. Oleh karena itu, diperlukan level shifter untuk mengubah sinyal dari 5 V menjadi 3,3 V dan sebaliknya. Di bawah ini adalah gambar pergeseran level yang saya gunakan.

Hubungkan

Menghubungkan sirkuit cukup mudah. Cukup sambungkan pin Arduino MRK 13 Rx dan pin 14 Tx Anda, ke pin OBD-II UART board Tx dan Rx melalui level shifter. Tentu saja, Anda harus menghubungkan ground kedua papan bersama-sama.

Untuk memudahkan debugging dan demonstrasi, saya juga menghubungkan layar LCD 1602 ke Arduino untuk menampilkan data secara real-time. Kabel LCD ke Arduino dapat ditemukan di tutorial ini, dan karenanya tidak akan dijelaskan di sini.

Di bawah ini adalah gambar koneksi papan tempat memotong roti. Garis hijau adalah untuk kabel yang menghubungkan Arduino dan papan UART OBD-II, sedangkan garis kuning untuk kabel yang menghubungkan Arduino dan LCD. Skema juga tersedia di lampiran.

Koneksi sebenarnya agak berantakan karena area papan roti yang terbatas, tetapi mengikuti skema di atas. Saya menyertakan kabel micro USB dan ODB-II ke DB9 dalam gambar.

Serial1 bukan Serial

Baiklah, sekarang saatnya memprogram board Arduino MKR kita. Karena papan MKR Arduino saya berbicara dengan papan interpreter melalui UART, tidak perlu menginstal perpustakaan pihak ke-3. Mengirim perintah ke interpret board sama seperti berkomunikasi dengan Serial Monitor. Satu-satunya hal yang ingin saya tekankan adalah port serial yang terkait dengan Pin 13 dan Pin 14 adalah Serial 1 ! Papan MKR Arduino Port serial mengacu pada port USB yang digunakan untuk berkomunikasi dengan komputer Anda. Jangan lupa untuk menginisialisasi Serial 1 port dalam fungsi setup().

 Serial1.begin(9600); 

Dan gunakan Serial 1 untuk mendorong perintah ke papan interpretasi.

 Serial1.println(pesan); 

Pesan

Seperti yang Anda lihat, saya menggunakan variabel "pesan" untuk menyimpan perintah. Perintah OBD terdiri dari kode heksadesimal yang ditulis dalam karakter ASCII. Dua angka heksadesimal pertama mengacu pada mode layanan yang akan digunakan. Ada 10 layanan diagnostik yang dijelaskan dalam standar OBD-II SAE J1979 terbaru. Karena kami tertarik dengan pemantauan waktu nyata, kami hanya akan menggunakan 01 kode untuk menampilkan data terkini dalam proyek ini.

Setiap nomor hex setelah mode layanan mewakili ID Parameter (PID) untuk mencapai fungsi khusus. Di bawah ini adalah tangkapan layar PID dalam mode layanan 01. Informasi lebih lanjut dapat ditemukan di Wikipedia.

Dalam proyek ini, saya akan mendemonstrasikan cara mendapatkan kecepatan mobil, RPM mesin, ketinggian bahan bakar, dan suhu cairan pendingin mesin. Perintah OBD untuk keempat fungsi ini adalah:

  • 010D // kecepatan mobil
  • 010C // putaran mesin
  • 012F // ketinggian bahan bakar
  • 0105 // suhu cairan pendingin.

Dekode data

Setelah perintah dikirim, papan Arduino MKR akan mendengarkan port Serial 1 untuk respons apa pun. Lebih baik untuk menunda 200 ms setelah mengirimkan perintah. Saya menggunakan kode berikut untuk menerima tanggapan.

void getResponse(void){ while(Serial1.available()> 0) { // Mulai dengan memeriksa apakah kita telah menerima akhir karakter pesan ('\r'). if(Serial1.peek() =='\r'){ // mencapai akhir pesan, hapus Serial buffer inChar =Serial1.read(); rxData[rxIndex] ='\0'; // Reset indeks buffer sehingga karakter berikutnya kembali ke awal string rxIndex =0; } // Jika kita tidak mendapatkan akhir dari karakter pesan, tambahkan saja karakter baru ke string else{ // Dapatkan karakter baru dari port Serial:inChar =Serial1.read(); // tambahkan karakter baru ke string, dan tingkatkan variabel indeks:rxData[rxIndex++] =inChar; } }} 

Tanggapan dari dewan interpreter mengikuti format

">1 Data PID Berulang"

Misalnya, pada tangkapan layar di atas, saya mengirimkan "010D" untuk mendapatkan kecepatan mobil. Jawabannya adalah ">1 0D 00". 5 karakter pertama menunjukkan bahwa mobil menerima perintah dan mengulangi PID 0x0D kembali. Dua digit terakhir mengembalikan data kecepatan 0x00.

Kemudian saya mengirimkan "010C" untuk mendapatkan RPM mesin, respons ">1 0C" menunjukkan pengakuan perintah, data 0x098C adalah 4 kali nilai RPM mesin dalam heksadesimal. 0x098C / 4 =611 dec, jadi RPM mesin adalah 611 rpm.

Setelah itu, saya mengirimkan perintah "012F" untuk mendapatkan level bahan bakar, dan saya mendapatkan data 0x1D. Level bahan bakar dihitung sebagai 0x1D / 255 * 100 =11% dec.

Perintah terakhir adalah "0105", yang memberi saya suhu cairan pendingin 0x79. Suhu sebenarnya adalah 0x79 - 40 =81 derajatC desember. Kemudian urutan perintah berulang.

Seperti yang Anda lihat, baris respons memiliki spasi di antara dua digit heksadesimal, dan 5 digit pertama hanya mengulangi perintah. Oleh karena itu, data sebenarnya dimulai dari karakter ke-6 (karakter pertama dimulai dari indeks 0).

Dalam pemrograman dan debugging, monitor serial sangat membantu, tetapi ketika menyangkut aplikasi nyata, layar LCD lebih portabel dan memenuhi kebutuhan daya IoT. Cukup ganti serial monitor dengan layar LCD, Anda bisa memantau data mobil Anda secara real time. Di bawah ini adalah foto penggunaan proyek di mobil saya sendiri.

Cloud data kami

Keunggulan Arduino MKR dibandingkan UNO adalah aksesibilitas internetnya. Menargetkan pada aplikasi IoT, Arduino MKR akan membuat industri lebih cerdas dan terhubung. Dalam aplikasi otomotif, MKR WiFi 1000 mungkin bukan papan terbaik karena sinyal WiFi jarang ada di lingkungan luar, tapi saya menggunakan ponsel saya sebagai hotspot pribadi, jadi tidak masalah.

Ada banyak platform cloud lain untuk menyimpan, melihat, dan memposting proses data. Anda dapat memilih apa pun yang Anda suka. Saya akan menggunakan dweet.io dan freeboard.io sebagai contoh. Dweet.io menyediakan API tempat Anda dapat mengirim data. Freeboard.io memiliki pegangan untuk mengambil data dweet.io dan memvisualisasikannya. Ada beberapa tutorial untuk mengatur dweet.io dan freebboard.io, jadi saya tidak akan menjelaskannya lagi. Jika Anda tertarik, berikut beberapa contohnya, contoh 1, contoh 2.

Kode push data ditampilkan di bawah sebagai ilustrasi cara membuat perintah dweet.

void httpRequest() { client.stop(); // buat string data untuk dikirim ke freeboard if (client.connect(server, 80)){ Serial.println("Connected"); String data ="POST /dweet/for/mkr1000?RPM="; data.concat(vRPM); // unggah data RPM mesin.concat("&Kecepatan="); data.concat(vSpeed); // upload data kecepatan mobil.concat("&Fuel="); data.concat(vFuel); // upload data level bahan bakar.concat("&Temp="); data.concat(vTemp); // upload suhu cairan pendingin client.println(data); client.println("Host:https://www.dweet.io"); client.println("Koneksi:tutup"); // akhir koneksi client.println(); } else { lcd.clear(); lcd.setCursor(0,0); lcd.println("Koneksi gagal"); }} 

Di freeboard.io, kita perlu membuat dasbor baru, dan di dalam dasbor ini, buat sumber data baru. Tautkan sumber data ini ke hal dweet.io Anda yang Anda tetapkan dalam kode. Dalam kasus saya, ini adalah mkr1000. Buat widget Gauge baru yang akan kita gunakan untuk menampilkan data. Beri nama, dan tautkan ke salah satu variabel kami. Di bawah ini adalah tangkapan layar dasbor saya. Ini menunjukkan KECEPATAN, RPM, TINGKAT BAHAN BAKAR, dan SUHU PENDINGIN.

Kesimpulan

Saya mencoba papan di mobil saya sendiri, dan itu bekerja dengan baik. Saya sedang merancang PCB yang mencakup semua fungsi dalam sirkuit terpadu. Mudah-mudahan, saya akan menulis lebih banyak tutorial di masa depan. Saya mungkin menyertakan demo video juga. Maaf kali ini, saya tidak bisa merekam video serta mengendarai mobil saya. Dan Anda juga ingin berhati-hati saat men-debug kode Anda saat mengemudi di jalan!

Papan WiFi Arduino MKR cukup baik untuk aplikasi ini. Jika saya memiliki lebih banyak papan, saya pikir saya bisa mencoba papan MKR GSM 1400. Jangan ragu untuk menggunakan papan IoT lain dengan tutorial ini dan beri tahu saya tanggapan Anda.

Mengerjakan proyek ini menyenangkan dan mendidik. Saya menikmati perasaan men-debug masalah. Saya juga senang berbagi apa yang saya ketahui di web. Terima kasih telah membaca. Beri tahu saya jika Anda memiliki pertanyaan atau komentar.

Kode

  • IOT4Car_code
IoT4Car_codeC/C++
Program ini akan berbicara dengan kendaraan menggunakan papan OBDII-UART, dan menampilkan hasilnya pada LCD, dan mengunggah ke platform IoT papan bebas
/** OBDII-UART-Serial versi 9* Program ini akan berbicara dengan kendaraan menggunakan OBDII -UART board, * dan tampilkan hasilnya di LCD, dan unggah ke platform IoT freeboard* * Penulis:zhaoshentech* Diperbarui:27-08-2018* * pembaruan:* v3:memodifikasi fungsi getResponse() sehingga buffer menerima respon yang benar.* tambahkan getRPM() untuk mendapatkan RPM mesin dari kendaraan.* v4:tambahkan fungsi getSpeed() untuk mendapatkan kecepatan kendaraan* v5:tambahkan modul LCD dan tampilkan kecepatan dan RPM pada LCD* v6:adalah versi wifi* v7:adalah versi non-wifi, non-serial. Hapus inisialisasi serial,* sehingga papan dapat bekerja tanpa komputer.* v8:adalah versi non-wifi, non-serial. Tambahkan level bahan bakar dan suhu cairan pendingin.* atur ulang lokasi tampilan.* v9:adalah wifi, versi non-serial. Kecepatan upolad, RPM, ketinggian bahan bakar, dan suhu cairan pendingin* * Sambungan sirkuit LCD:* Pin RS LCD ke pin digital 12* LCD Aktifkan pin ke pin digital 11* Pin LCD D4 ke pin digital 5* Pin LCD D5 ke pin digital 4* LCD Pin D6 ke pin digital 3 * Pin LCD D7 ke pin digital 2* Pin R/W LCD ke ground* Pengukur potensial 10 K:* berakhir ke +5V dan ground* wiper ke pin VO LCD (pin 3)*///// ////////////////////////////////////////////////////////////////// ////// WiFi terkait ////////////////////////////////////////////////////////// ////////////////#include#includechar ssid[] ="WIFI SSID ANDA"; // wifi IDchar pass[] ="WIFI PSWD ANDA"; // wifi passwordchar server[] ="www.dweet.io"; // pengaturan freeboard dan dweetunsigned long lastConnectionTime =0; // lacak waktu koneksi terakhirconst unsigned long postingInterval =10L * 1000L; // memposting data setiap 10 detik klien WiFiClient; //Inisialisasi status klien wifi =WL_IDLE_STATUS; // status radio WiFi // termasuk perpustakaan LDC#include const int rs =12, en =11, d4 =5, d5 =4, d6 =3, d7 =2;LiquidCrystal lcd(rs, en, d4, d5, d6, d7);// Ini adalah karakter buffer yang akan menyimpan data dari port serial:char rxData[20];char rxIndex =0;char inChar =0;String message;// Variabel untuk menahan kecepatan dan data RPM:int vSpeed ​​=0;int vRPM =0;int vFuel =0;int vTemp =0;void setup() { // Mengatur jumlah kolom dan baris LCD:lcd.begin( 16,2); lcd.clear(); // periksa keberadaan perisai:if (WiFi.status() ==WL_NO_SHIELD) { lcd.println("WiFi tidak siap"); sementara (benar); } // mencoba menyambung ke jaringan WiFi:while (status !=WL_CONNECTED) { lcd.clear(); lcd.setCursor(0, 0); lcd.println("Menghubungkan Wi-Fi..."); status =WiFi.begin(ssid, pass); // tunggu 5 detik untuk koneksi:delay(5000); } lcd.setCursor(0, 1); lcd.println("Terhubung!"); // Serial1 adalah port acutal untuk berbicara dengan kendaraan Serial1.begin(9600); resetBuffer();}void loop() { while ( status !=WL_CONNECTED) { lcd.clear(); lcd.setCursor(0,0); // Hubungkan ke jaringan Wi-Fi WPA/WPA2 Serial.println("Menghubungkan ke Wifi"); lcd.println("Hubungkan Wi-Fi..."); status =WiFi.begin(ssid, pass); // tunggu 10 detik untuk penundaan koneksi(5000); } getSpeed(); getRPM(); dapatkanBahan Bakar(); getCoolTemp(); if (millis() - lastConnectionTime> postingInterval) { httpRequest(); lastConnectionTime =milis(); }}// data getRPM mengirimkan perintah "010C" ke port Serial1// dan memanggil getResponse() untuk mengumpulkan data. Kemudian ia mencetak// data RPM pada Serial Monitor.void getRPM(void){ message ="010C"; Serial1.println(pesan); penundaan (200); //menghapus baris saat ini untuk (int i =8; i <16; ++i) { lcd.setCursor(i, 0); // 0 baris, i kolom lcd.write(' '); } lcd.setCursor(8,0); // baris pertama babak kedua di layar LCD //tunggu respon getResponse(); // Respon RPM dibagi 4 memberikan nilai yang benar. vRPM =((strtol(&rxData[6],0,16)*256) + strtol(&rxData[9],0,16))/4; lcd.print(vRPM); lcd.print(" rpm");}void getSpeed(void){ pesan ="010D"; Serial1.println(pesan); penundaan (200); //hapus baris saat ini:for (int i =0; i <8; ++i) { lcd.setCursor(i, 0); // 0 baris, i kolom lcd.write(' '); } lcd.setCursor(0,0);// baris pertama babak pertama di layar LCD //menunggu respon dari mobil getResponse(); vKecepatan =strtol(&rxData[6], 0, 16); // dalam satuan km/jam vKecepatan =vKecepatan * 0,621371; // dalam satuan mph lcd.print(vSpeed); lcd.print(" mph");}void getFuel(void){ pesan ="012F"; Serial1.println(pesan); penundaan (200); // hapus baris saat ini:for (int i =0; i <8; i++){ lcd.setCursor(i, 1); // baris pertama, i kolom lcd.write(' '); } lcd.setCursor(0, 1); // baris kedua paruh pertama di layar LCD //tunggu respon dari mobil getResponse(); vFuel =strtol(&rxData[6], 0, 16); // dalam skala 255 //vFuel =244; // debug penggunaan vFuel =1,0* vFuel / 255 *100; // dalam skala 100 lcd.print(vFuel); lcd.print("%"); //Serial.println(vFuel); // debug penggunaan}void getCoolTemp(void){ pesan ="0105"; Serial1.println(pesan); penundaan (200); // hapus baris saat ini:for (int i =8; i <16; i++){ lcd.setCursor(i, 1); // baris pertama, i kolom lcd.write(' '); } lcd.setCursor(8, 1); // baris kedua babak kedua di layar LCD //menunggu respon dari mobil getResponse(); vTemp =strtol(&rxData[6], 0, 16); // dalam satuan C tetapi diimbangi dengan 40 derajat vTemp =vTemp - 40; // diimbangi dengan 0 lcd.print(vTemp); // mencetak derajat C lcd.write(0xDF); lcd.print("C");}// Fungsi getResponse mengumpulkan data yang masuk dari UART ke buffer rxData// dan keluar saat respons ditransfer. Setelah carriage return string// terdeteksi, buffer rxData dihentikan null (sehingga kita dapat memperlakukannya sebagai string)// dan indeks rxData direset ke 0 sehingga string berikutnya dapat disalin.void getResponse(void ){ while(Serial1.available()> 0) { // Mulai dengan memeriksa apakah kita telah menerima akhir karakter pesan ('\r'). if(Serial1.peek() =='\r'){ // mencapai akhir pesan, hapus Serial buffer inChar =Serial1.read(); rxData[rxIndex] ='\0'; // Reset indeks buffer sehingga karakter berikutnya kembali ke awal string rxIndex =0; } // Jika kita tidak mendapatkan akhir dari karakter pesan, tambahkan saja karakter baru ke string else{ // Dapatkan karakter baru dari port Serial:inChar =Serial1.read(); // tambahkan karakter baru ke string, dan tingkatkan variabel indeks:rxData[rxIndex++] =inChar; } }}void resetBuffer(void){ for (int i =0; i <20; i++){ rxData[i] =0; }}void httpRequest() { client.stop(); // buat string data untuk dikirim ke freeboard if (client.connect(server, 80)){ Serial.println("Connected"); String data ="POST /dweet/for/mkr1000?RPM="; data.concat(vRPM); // unggah data RPM mesin.concat("&Kecepatan="); data.concat(vSpeed); // upload data kecepatan mobil.concat("&Fuel="); data.concat(vFuel); // upload data level bahan bakar.concat("&Temp="); data.concat(vTemp); // upload suhu cairan pendingin client.println(data); client.println("Host:https://www.dweet.io"); client.println("Koneksi:tutup"); // akhir koneksi client.println(); } else { lcd.clear(); lcd.setCursor(0,0); lcd.println("Koneksi gagal"); }}

Skema

Hubungkan Arduino MKR WiFi 1000, papan UART SparkFun OBD-II, Pergeseran Level Logika SparkFun, dan LCD 1602 frizling_schematics_M8kF26dafQ.fzz

Proses manufaktur

  1. Plat Nomor
  2. Sistem Rem Antilock
  3. Apa itu Powertrain?
  4. Apa itu Alternator?
  5. Penghindaran Rintangan menggunakan Kecerdasan Buatan
  6. Pengontrol Game Arduino
  7. Kostum Cloud
  8. Apa itu Tanah Sasis?
  9. Tata Letak Chassis kendaraan
  10. Memahami kabel kendaraan