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

HUD Mobil - Tampilan Kaca Depan untuk Kecepatan &Kompas

Komponen dan persediaan

Arduino Nano R3
× 1

Tentang proyek ini

Deskripsi:

Saya menginginkannya! Saya iri dengan mobil besar teman saya Taggi yang menunjukkan kecepatan di kaca depan. Saya harus memilikinya, saya harus membuatnya sendiri tentunya!

Sudut pandang perangkat lunak:

Memproyeksikan rangkaian bagian yang paling sulit dan membingungkan adalah koneksi dari 7 segmen display ke decoder BCD karena angkanya "terbalik" (dicerminkan).

Ada 3 tombol :+ dan - untuk menambah/mengurangi kecerahan dan S/H untuk beralih antara Kecepatan dalam km/jam dan Menuju dalam derajat; dalam hal Pos juga LED merah menyala, itu berarti "derajat" kompas (1-360 °) saat bergerak. Ini bukan kompas elektronik, ini adalah GPS dan Anda perlu bergerak untuk mendapatkan informasi yang benar tentang arah yang Anda tuju. Kecerahan disimpan di EEPROM memori setelah satu menit. Kecerahan diubah baik pada tampilan maupun pada LED melalui pin PWM.

Bagian penting dari kode ini adalah untuk mengumpulkan data dari GPS, terutama kecepatan dan arah, mengeluarkannya dari setiap kalimat NMEA. Bahkan menggunakan kelas String, sebagian besar untuk manipulasi kalimat Serial NMEA, seluruh aliran elaborasi stabil dan solid; ia menggunakan "serialEvent()" untuk menerima data dari GPS satu kali per detik , kemudian memanggil "nmeaExtractData()" dan akhirnya memeriksa paket data dengan "nmea0183_checksum() untuk memastikan integritas data. Jika Anda menggunakan GPS merek dan model lain pastikan kalimatnya memiliki struktur yang sama atau Anda harus membuat beberapa perubahan di sini . Misalnya EM406A menggunakan id paket "$GPRMC", BT220 menggunakan "$GNRMC" alih-alih... hanya perubahan nama kecil... Tautan yang berguna dapat membantu Anda dengan tes checksum:https://nmeachecksum.eqth.net - Berikut contoh kalimat NMEA lengkap, berisi:id, waktu, validitas, lintang, bujur, kecepatan, arah sebenarnya, tanggal, variasi, dan checksum.

$GNRMC, 095836.000, A, 4551.9676, N, 01328.7118, E, 2.09, 341.84, 280519,, *08

Sketsa menyediakan untuk mengaktifkan kait untuk setiap dekoder BCD tampilan tunggal satu per satu, mengatur nomor kode pada bus 4 bit biner, menonaktifkan kait, dan seterusnya ketika nilai berubah. Sisi kiri angka nol yang tidak signifikan dikosongkan (tidak ditampilkan).

Sebelum memuat sketsa baru ke yang MCU ingat untuk mengeluarkan Jumper :terhubung ke pin Rx Arduino dan saat memuat pasti bertentangan dengan GPS Tx. Setelah memuat perangkat lunak, pasang kembali Jumper untuk memulihkan fungsi normal.

Daftar komponen:

  • 1 x MCU Arduino Nano
  • 3 x 5161sebagai tampilan tujuh segmen, katoda umum, merah
  • 1 x Beitian BN-220 serial TTL GPS (kalimat 1 Hz GNRMC)
  • 1 x Pelompat
  • 3 x tombol (biasanya terbuka) + 3 x tutup
  • Resistor 22 x 1/4W 220 ohm
  • LED 1 x 3mm, merah
  • 2 x 100n kapasitor
  • 3 x 14511 BCD decoder + kait
  • 1 x USB "B" perempuan
  • 1 x garis strip 2x pin pria (untuk Jumper)
  • 1 x garis strip 4x pin jantan untuk ditekuk hingga 90° (untuk GPS)
  • 1 x kabel pigtail yang menghubungkan GPS ke 4 pin onboard
  • 22 x strip strip pin male untuk menggabungkan dua PCB dalam satu tumpukan
  • 1 x perekat dua sisi untuk menempelkan GPS pada PCB
  • 6 x garis strip yang diputar 5x pin wanita (untuk tampilan)
  • 50 x tembaga 0,6 mm paku keling
  • Sekrup 8 x M3
  • Menara wanita 4 x M3 setinggi 20mm
  • 1 x kotak plastik + penutup (lihat file 3D saya yang siap dicetak, di bawah)

PCB (papan sirkuit tercetak):

Saya menggunakan dua PCB bermuka dua untuk alasan itu sekitar 50 melewati paku keling atau pin digunakan untuk memecahkan rute untuk seluruh sirkuit. Ada juga 5 lubang pelurusan untuk membuat terlebih dahulu. Saya merancang pada setiap PCB 5 titik penyelarasan ini. Di bagian unduhan, Anda memiliki semua file PCB, komponen, dan permukaan solder, yang dicerminkan, untuk diunduh dan dicetak melalui printer laser pada lembaran "kuning" atau "biru"; kali ini saya menggunakan yang biru tapi juga yang kuning bagus dan harganya lebih murah. Saya harus mengatakan lembaran biru lebih baik... Saat mencetak ingatlah untuk menonaktifkan pengaturan hemat toner, gunakan resolusi 1200 dpi untuk mendapatkan hasil hitam pekat yang nyata. Proses transfer toner dari lembaran ajaib ke PCB dilakukan dengan menggunakan setrika panas... Di Internet ada beberapa tutorial yang menunjukkan cara menghasilkan PCB yang baik tapi ingat poin-poin penting ini:bersihkan dengan sempurna dan sikat sedikit tembaga dengan spons dapur, 5 menit menyetrika, kejutan termal air, dua wajah sejajar dengan cara 5 lubang (saya menggunakan 5 pin pada permukaan LED putih besar untuk melihat lubang), melindungi wajah lainnya selama proses korosi. Mencetak juga komponen wajah membuat proyek "profesional" :-)

CATATAN: gambar diambil sebelum versi terakhir, itu berarti beberapa detail dapat berbeda:yaitu kabel hijau aneh di sekitar PCB di versi final menghilang, atau Jumper telah berpindah dari PCB #1 ke PCB #2. Anda harus mengatur GPS pada kecepatan 9600 bps, kalimat GNRMC NMEA 1Hz saja; ini dapat dibuat dengan menggunakan perangkat lunak pengaturannya sendiri. Terakhir, sebelum menyolder konektor perempuan USB, tempelkan selotip kecil di bawahnya untuk menghindari kontak yang tidak diinginkan dengan kabel tembaga, di sisi komponen, tepat di bawahnya.

Memberi kekuatan untuk pertama kalinya Anda akan menemukan angka-angka yang "tidak terbaca", karena dibuat untuk melihat mereka tercermin di kaca depan (cermin). Pasang di mobil di depan kursi pengemudi , cari tempat yang nyaman dan perbaiki. Saya sarankan untuk menghubungkan kabel daya USB setelah posisi pengapian maka akan on/off saat mesin on/off. Itu saja tuan dan nyonya!

Berita dan Peningkatan:

  • 25.03.2021:untuk menyelesaikan proyek, saya menyiapkan dua model .STL 3D di tautan ini:https://grabcad.com/library/car-hud-1 di mana Anda dapat mengunduh file tentang kotak berbentuk dan panel sampulnya untuk proyek ini untuk dicetak melalui printer 3D.
  • 20.07.2021:tersedia V2 (versi dua) dari perangkat lunak yang bersama-sama dengan dua kabel dan satu resistor Anda akan memiliki informasi ketinggian pada tampilan ribuan meter (yaitu 0,89 =890m), cukup tekan tombol S/H lain kali! Instruksi:1) atur GPS untuk mengeluarkan juga kalimat nmea $GNGGA melalui perangkat lunaknya sendiri; 2) potong koneksi aktual antara pin pwm Arduino d5 dan rangkaian lainnya, sambungkan ke pin titik desimal tampilan pusat dengan resistor 220ohm; 3) sambungkan pin digital Arduino d13 ke sirkuit tempat d5 terhubung; lihat beberapa gambar di bawah ini; 4) instal sketsa V2 di Arduino Nano Anda.
  • 01.11.2021:versi V2.2 sudah siap untukmu. Apa yang baru? Tentang ketinggian (sudah hadir dengan V2) hud menunjukkan nilai penuh hingga 999m, mulai dari 1000m itu menunjukkan nilai dalam ribuan, yaitu 1,24 (1240m) atau 2,02 (2020m). Saya menambahkan fotoresistor LDR GL5539, resistor 10kOhm dan 2 kabel. Lihat gambar di bawah untuk mod V2.2 dan instal sketsa V2.2 di Arduino Anda. Sensor LDR akan mengubah kecerahan secara otomatis (3 tingkat) tergantung pada tingkat cahaya (siang, mendung atau malam). Tombol (+) dan (-) masih berfungsi untuk mengubah kecerahan secara manual, mereka memiliki prioritas; untuk kembali ke otomatis cukup tekan bersamaan tombol (+) dan (-) beberapa saat. EEPROM internal untuk menyimpan tingkat kecerahan tidak digunakan lagi. Ayo lakukan mod V2 dulu!

Saat mengemudi, mengemudi saja. Berkendara dengan aman!

Kode

  • Sketsa Arduino Mobil-HUD
Sketsa Arduino Mobil-HUDArduino
/* Sketsa ini berfungsi sebagai HUD (head up display) kaca depan mobil, oleh Marco Zonca, 10/2020 Arduino Nano sebagai CPU, GPS BT-220 nmea setiap 1 detik, 3 tombol x, 3 x tujuh segmen menampilkan katoda umum , 3 x 14511 BCD latch decoder, memori MPU EEPROM (1 byte) dan banyak resistor; PERINGATAN:=======Sebelum mengupdate software lepaskan pin RX pada Arduino (TX dari GPS) dengan cara JUMPER*/#include #include String inputString ="";String nm_time ="00:00:00";String nm_validity ="V";String nm_latitude ="dd°mm.mmmm'N";String nm_longitude ="ddd°mm.mmmm'E";String nm_knots ="0,0 kn";float nmf_knots =0.0;float nmf_kmh =0.0;int nmi_kmh =0;String nm_truecourse ="360";float nmf_truecourse =360;String nm_date ="dd/mm/yyyy";int nmi_truecourse =0;byte kcourse =0;;byte kDeci =0;byte kUnit =0;byte tCent =0;byte tDeci =0;byte tUnit =0;byte brightness =120;byte latch_off =HIGH;byte latch_on =LOW;int n=0;unsigned long lastmemcheck =0;memcheck panjang tanpa tanda =60000; // centang untuk menyimpan nilai "brightness" di EEPROM setiap 60 detikbool stringComplete =false;bool isKMH=true;bool ret =false;const int disp001 =2; // unit menampilkan latchconst int disp010 =8; // tampilan puluhan latchconst int disp100 =12; // undreds tampilan latchconst int disp001dim =9; // unit tampilan peredup/mati pinconst int disp010dim =10; // puluhan tampilan peredup/mati pinconst int disp100dim =11; // undreds display dimmer/off pinconst int button_kt =14; // kmh/truecourse buttonconst int button_more =15; // kecerahan + buttonconst int button_less =16; // kecerahan - buttonconst int derajatLED =3; // derajat LEDconst int bit_3 =7; // bit 3const int bit_2 =6; // bit 2const int bit_1 =5; // bit 1const int bit_0 =4; // bit 0const int dly =10; // delay latch m/detik byte mati =0; // sama dengan brightness=0const int addr =0; // Alamat EEPROM untuk nilai kecerahan dengan bilangan byte[10] [4] ={{0,0,0,0},{1,0,0,0},{0,1,0,0},{1, 1,0,0},{0,0,1,0}, {1,0,1,0},{0,1,1,0},{1,1,1,0},{0, 0,0,1},{1,0,0,1}}; // bit 0,1,2,3hindari setup() { Serial.begin(9600); Kawat.mulai(); inputString.reserve(200); kecerahan =EEPROM.read(addr); if (kecerahan> 250 || kecerahan <10) { kecerahan=120; } // hindari nilai gila dari EEPROM pertama baca pinMode(disp001, OUTPUT); pinMode(disp010, OUTPUT); pinMode(disp100, OUTPUT); pinMode(derajatLED, OUTPUT); pinMode(button_kt, INPUT_PULLUP); pinMode(tanpa tombol, INPUT_PULLUP); pinMode(button_more, INPUT_PULLUP); pinMode(bit_3, OUTPUT); pinMode(bit_2, OUTPUT); pinMode(bit_1, OUTPUT); pinMode(bit_0, OUTPUT); analogWrite(disp001dim, mati); // mati dan nol menampilkan analogWrite(disp010dim, off); analogWrite(disp100dim, mati); analogWrite(LED derajat, mati); setBusNr(0); digitalWrite(disp001, latch_on); digitalWrite(disp010, latch_on); digitalWrite(disp100, latch_on); penundaan (setiap hari); digitalWrite(disp001, latch_off); digitalWrite(disp010, latch_off); digitalWrite(disp100, latch_off); analogWrite(disp001dim, kecerahan); // pada tampilan analogWrite(disp010dim, brightness); analogWrite(disp100dim, brightness);} // setup()void loop() { // GPS NMEA ------------------ if (stringComplete ==true) { // menerima kalimat nmea oleh port serial RX ret =nmeaExtractData(); inputString =""; stringLengkap =salah; if (ret ==true) { kCent=nmi_kmh/100; n=nmi_kmh-(kCent*100); kDeci=n/10; n=nmi_kmh-(kCent*100)-(kDeci*10); kSatuan=n; tCent=nmi_truecourse/100; n=nmi_truecourse-(tCent*100); tDeci=n/10; n=nmi_truecourse-(tCent*100)-(tDeci*10); tSatuan=n; menampilkan(); } } if (millis()> (lastmemcheck+memcheck)) { // masukkan nilai kecerahan memori (jika dimodifikasi) EEPROM.update(addr,brightness); lastmemcheck=milis(); } checkButtons();}void display() { if (isKMH ==true) { // kecepatan dalam km/j (isKMH=true) analogWrite(degreesLED, off); setBusNr(kUnit); digitalWrite(disp001, latch_on); penundaan (setiap hari); digitalWrite(disp001, latch_off); if (kDeci> 0 || kCent> 0) { // matikan puluhan if tens=0 (dan juga undreds=0) setBusNr(kDeci); digitalWrite(disp010, latch_on); penundaan (setiap hari); digitalWrite(disp010, latch_off); analogWrite(disp010dim, kecerahan); } else { analogWrite(disp010dim, mati); } if (kCent> 0) { // matikan undreds if=0 setBusNr(kCent); digitalWrite(disp100, latch_on); penundaan (setiap hari); digitalWrite(disp100, latch_off); analogWrite(disp100dim, kecerahan); } else { analogWrite(disp100dim, mati); } } else { // bantalan benar dalam derajat (isKMH=false) analogWrite(derajatLED, kecerahan); setBusNr(tUnit); digitalWrite(disp001, latch_on); penundaan (setiap hari); digitalWrite(disp001, latch_off); if (tDeci> 0 || tCent> 0) { // matikan puluhan if tens=0 (dan juga undreds=0) setBusNr(tDeci); digitalWrite(disp010, latch_on); penundaan (setiap hari); digitalWrite(disp010, latch_off); analogWrite(disp010dim, kecerahan); } else { analogWrite(disp010dim, mati); } if (tCent> 0) { // matikan undreds if=0 setBusNr(tCent); digitalWrite(disp100, latch_on); penundaan (setiap hari); digitalWrite(disp100, latch_off); analogWrite(disp100dim, kecerahan); } else { analogWrite(disp100dim, mati); } }} // display()void checkButtons(){ if (digitalRead(button_kt) ==RENDAH) { if (isKMH ==true) { isKMH=false; } else { isKMH=benar; } penundaan (250); } if (digitalRead(button_more) ==RENDAH) { if (brightness <=240) { brightness=brightness+10; } analogWrite(disp001dim, kecerahan); analogWrite(disp010dim, kecerahan); analogWrite(disp100dim, kecerahan); penundaan(100); } if (digitalRead(button_less) ==RENDAH) { if (brightness>=20) { brightness=brightness-10; } analogWrite(disp001dim, kecerahan); analogWrite(disp010dim, kecerahan); analogWrite(disp100dim, kecerahan); penundaan(100); }} // checkButtons()void setBusNr(int number) { // menetapkan 4 bit bus untuk (byte b=0; b<=3; b++) { if (angka[angka][b]==0) { if (b==0) {digitalWrite(bit_0, LOW);} if (b==1) {digitalWrite(bit_1, LOW);} if (b==2) {digitalWrite(bit_2, LOW);} if (b ==3) {digitalWrite(bit_3, LOW);} } else { if (b==0) {digitalWrite(bit_0, HIGH);} if (b==1) {digitalWrite(bit_1, HIGH);} if ( b==2) {digitalWrite(bit_2, HIGH);} if (b==3) {digitalWrite(bit_3, HIGH);} } }} // setBusNr()// ekstrak data dari nmea inputStringbool nmeaExtractData() { int t=0; int s=0; int y=0; int z=0; mengapung t=0; bool ret =salah; //benar jika nmea kalimat =$GNRMC dan CHKSUM valid jika ((inputString.substring(0,6) =="$GNRMC") &&(inputString.substring(inputString.length()-4,inputString.length()- 2) ==nmea0183_checksum(inputString))) { y=0; for (s =1; s <11; s ++) { y=inputString.indexOf(",",y); switch (s) { kasus 1://------------waktu z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_time=inputString.substring(y+1,y+2+1)+":"+inputString.substring(y+1+2,y+4+1)+" :"+inputString.substring(y+1+4,y+6+1); } y=z; merusak; kasus 2://-----------------------validitas z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_validity=inputString.substring(y+1,y+1+1); } y=z; merusak; case 3://-----------------------lintang z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_latitude=inputString.substring(y+1,y+2+1)+"°"+inputString.substring(y+1+2,y+10+1)+" '"; } y=z; merusak; kasus 4://----------------------- utara/selatan z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_latitude=nm_latitude + inputString.substring(y+1,y+1+1); } y=z; merusak; case 5://-----------------------bujur z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_longitude=inputString.substring(y+1,y+3+1)+"°"+inputString.substring(y+1+3,y+11+1)+" '"; } y=z; merusak; kasus 6://-----------------------timur/barat z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_longitude=nm_longitude + inputString.substring(y+1,y+1+1); } y=z; merusak; kasus 7://----------------------- kecepatan knot z=inputString.indexOf(",",y+1); if (z>(y+1)) { nmf_knots=inputString.substring(y+1,z).toFloat(); t=roundOneDec(nmf_knots); nm_knots=String(t,1)+"kn"; nmf_kmh=roundTwoDec(nmf_knots * 1,852); nmi_kmh=roundZeroDec(nmf_knots * 1,852); } y=z; merusak; kasus 8://------------- benar saja z=inputString.indexOf(",",y+1); if (z>(y+1)) { nmf_truecourse=inputString.substring(y+1,z).toFloat(); t=roundZeroDec(nmf_truecourse); nmi_truecourse=t; t=t; nm_truecourse=d; } y=z; merusak; kasus 9://-----------------------tanggal z=inputString.indexOf(",",y+1); if (z>(y+1)) { nm_date=inputString.substring(y+1,y+2+1)+"/"+inputString.substring(y+1+2,y+4+1)+" /20"+inputString.substring(y+1+4,y+6+1); } y=z; merusak; kasus 10:// pernyataan n.u. merusak; default:// pernyataan n.u. merusak; } } ret=benar; } return ret;} // nmeaExtractData()/* SerialEvent terjadi setiap kali data baru masuk ke serial perangkat keras RX. Rutin ini dijalankan di antara setiap kali loop() berjalan, jadi menggunakan penundaan di dalam loop dapat menunda respons. Beberapa byte data mungkin tersedia.*/void serialEvent() { while (Serial.available()) { char inChar =(char)Serial.read(); inputString +=inChar; // jika karakter yang masuk adalah baris baru, atur flag sehingga loop utama dapat // melakukan sesuatu tentangnya if (inChar =='\n') { stringComplete =true; } }} // serialEvent()//menghitung checksum dari nmea kalimatString nmea0183_checksum(String nmea_data) { int crc =0; String chSumString =""; di aku; // abaikan tanda $ pertama, checksum pada kalimat for (i =1; i <(nmea_data.length()-5); i ++) { // hilangkan - 5 jika tidak ada "*" + cksum + cr + jika ada crc ^=nmea_data[i]; } chSumString =String(crc,HEX); if (chSumString.length()==1) { chSumString="0"+chSumString.substring(0,1); } chSumString.toUpperCase(); return chSumString;} // nmea0183_checksum(String nmea_data)// putaran nol desimalfloat roundZeroDec(float f) { float y, d; y =f*1; d =y - (int)y; y =(mengambang)(int)(f*1)/1; jika (d>=0,5) { y +=1; } else { jika (d <-0,5) { y -=1; } } return y;}// bulatkan satu desimalfloat roundOneDec(float f) { float y, d; y =f*10; d =y - (int)y; y =(mengambang)(int)(f*10)/10; jika (d>=0,5) { y +=0,1; } else { jika (d <-0,5) { y -=0,1; } } return y;}// bulatkan dua desimalfloat roundTwoDec(float f) { float y, d; y =f*100; d =y - (int)y; y =(mengambang)(int)(f*100)/100; jika (d>=0,5) { y +=0,01; } else { jika (d <-0,5) { y -=0,01; } } kembalikan y;}

Skema

car-hud_m5RwPQqpxH.fzz ard-carhud-v2_3N5756haNI.ino ard-carhud-v2-2_XhXHFJu0T8.ino

Proses manufaktur

  1. Merobohkan mobil semi-otonom untuk pengemudi penyandang disabilitas
  2. AI Pengemudi Otomatis untuk Pengumpul Sampah Mobil Keledai
  3. Real-time Perencanaan Gerak Untuk Mobil Otonom dalam Berbagai Situasi, Di Bawah Simulasi Lingkungan Perkotaan
  4. Apa yang dapat diberikan 5G untuk mobil yang terhubung?
  5. Keselamatan:Prioritas utama untuk mobil masa depan
  6. Kabel Motor Untuk Penggerak Kecepatan Variabel
  7. Bubut yang Disempurnakan Untuk Poles Dan Deburring
  8. Bubut Dirancang Untuk Presisi Dan Kecepatan
  9. Pertukaran data produk:titik sakit bagi produsen mobil
  10. Bagaimana memilih turbocharger untuk mobil Anda?