GPS ultrasonik

GPS Ultrasonik. Model konseptual


Sebelum memulai perjalanan yang begitu panjang, ada baiknya memeriksa apakah semuanya benar-benar dilakukan dengan lutut.

Apa artikel ini tentang: cara cepat dan murah membuat GPS ultrasonik sederhana.

Daftar perangkat yang diperlukan


  • HC-SR04 3 Pcs.
  • Arduino 1 Pcs.
  • Gulungan kabel.

Konsep


gambar
Fig. 1 - Gagasan umum perangkat

Di sudut atas ruangan, HC-SR04 dipasang, yang memainkan peran sebagai penghasil emisi, yang ketiga terbalik di lantai dengan penerima, dan memainkan peran sebagai penerima bagi kami.

Semua ini terhubung sesuai dengan skema:

gambar
Fig. 2 - Diagram koneksi perangkat

Dan tentu saja Anda menghubungkan Arduino melalui USB ke komputer.

Bagaimana cara kerjanya:

  1. Ukur jarak dari penerima ke emitor 1
  2. Kirim sinyal tentang awal pengukuran jarak ke penerima dan emitor 1 (tarik kaki Trig dengannya).
  3. Tunggu sampai penerima memberi kami panjangnya.
  4. Ulangi hal yang sama untuk emitor 2.
  5. Hitung koordinat penerima.

Ingat geometri sekolah


gambar
Fig. 3 - Representasi geometris masalah

Berdasarkan gambar ini, buat rumus perhitungan koordinat:

gambar

A, F adalah ketinggian penghasil emisi relatif terhadap penerima;
C, E adalah panjang yang diperoleh dengan mengukur jarak dari emitor ke penerima;
G adalah jarak antara emitor.

Berlatih


Pasang dua radiator di bawah langit-langit, pada jarak yang layak dari satu sama lain (3 meter), arahkan mereka dengan radiator pada satu titik, di mana area kerja Anda akan terbentuk.

Pasang gagang telepon pada sesuatu yang rata (misalnya, selembar papan) dan bungkus dengan selotip dengan selotip sehingga kita tidak menciptakan suara ultrasonik yang tidak perlu di dalam ruangan.
Hubungkan semuanya sesuai dengan skema yang disajikan di atas.

Beginilah pengencang untuk penghasil emisi dan substrat untuk penerima terlihat:

gambar
Fig. 4 - Jenis modul

Programnya


Pertimbangkan bagian-bagian penting dari kode secara lebih rinci.

Kami memaksa emitor 1 dan penerima untuk mulai mengukur jarak dengan memindahkan input Trig perangkat ini dari rendah ke tinggi, 10 mikrodetik dan kembali ke rendah.

digitalWrite(trigPinRessiv, LOW); digitalWrite(trigPinTransmit1, LOW); delayMicroseconds(5); digitalWrite(trigPinRessiv, HIGH); digitalWrite(trigPinTransmit1, HIGH); delayMicroseconds(10); digitalWrite(trigPinRessiv, LOW); digitalWrite(trigPinTransmit1, LOW); 

Biasanya, perangkat ini sendiri memancarkan sinyal ultrasonik dan menunggu sampai tercermin dari sesuatu, dan kembali kepada mereka. Tapi kami menipu mereka, dalam kasus kami, satu mengirim dan yang lain menerima, yang menerima menganggap itu adalah sinyalnya, meskipun ini adalah sinyal dari perangkat lain, dan memberi kami jarak ke perangkat lain ini.

Kami menunggu sampai sensor mulai memberi tahu kami durasi penerbangan dari sinyal ultrasonik:

 while (digitalRead(echoPinRessiv) == LOW); 

Catat waktu mulai sinyal:

 timeStartSignal = micros(); 

Kami menunggu hingga sensor berhenti memberi tahu kami waktu penerbangan sinyal ultrasonik:

 while (digitalRead(echoPinRessiv) == HIGH); 

Kami menulis waktu akhir:

  timeEndSignal = micros(); 

Dengan menggunakan rumus sederhana, kami menghitung jarak dari emitor ke penerima:

  lenC = ((timeEndSignal-timeStartSignal)/58.00)*10.00; 

Kami menunggu sampai suara ultrasonik mereda di ruangan:

 delay(100); 

Perlu dicatat bahwa sensor memberi tahu kita jarak dengan menurunkan output Echo ke Rendah untuk jangka waktu yang berbanding lurus dengan jarak yang diukur.

Hal yang sama diulang untuk emitor kedua.

Dengan menggunakan aturan pada segitiga siku-siku, kami memproyeksikan jarak yang dihasilkan ke bidang lantai (Gbr. 3).

Kami menerapkan rumus perangkat lunak untuk transisi dari koordinat tiga dimensi ke pesawat, rumusnya disajikan di atas:

 lenB = sqrt((lenC*2.00)*(lenC*2.00) - lenA*lenA); 

Sayangnya, kami memiliki kesalahan, dan untuk menghapusnya saya datang dengan formula yang berpengalaman, hapus dan lihat apa yang Anda dapatkan.

  measurementError = 26.437 - 0.08*lenC/10; lenB = (lenB + measurementError*10)/10.00; 

Ulangi hal yang sama untuk sensor 2.

Kami menghitung koordinat di pesawat

Temukan sudut Alpha:

  alfa = acos(((lenG*lenG + lenD*lenD - lenB*lenB)*1.00) / ((2*lenE*lenG)*1.00)); 

Temukan koordinatnya sendiri:

  koord_X = lenE*cos(1.57-alfa); koord_Y = lenE*cos(alfa); 

Jika nilai koordinat melampaui kemungkinan, maka ganti dengan nilai sebelumnya:

  if((koord_X > 0) && (koord_X < 500) && (koord_Y > 0) && (koord_Y < 500)) { oldKoord_X = koord_X; oldKoord_Y = koord_Y; }else{ koord_X = oldKoord_X; koord_Y = oldKoord_Y; } 

Kami membuat buffer untuk 6 nilai koordinat dan terus-menerus mengubahnya:

  koord_X5 = koord_X4; koord_X4 = koord_X3; koord_X3 = koord_X2; koord_X2 = koord_X1; koord_X1 = koord_X; koord_Y5 = koord_Y4; koord_Y4 = koord_Y3; koord_Y3 = koord_Y2; koord_Y2 = koord_Y1; koord_Y1 = koord_Y; 

Kami mendapatkan nilai rata-rata untuk 6 pengukuran terakhir:

  averageKoord_X = (koord_X + koord_X1 + koord_X2 + koord_X3 + koord_X4 + koord_X5)/6; averageKoord_Y = (koord_Y + koord_Y1 + koord_Y2 + koord_Y3 + koord_Y4 + koord_Y5)/6; 

Kirim koordinat ke PC:

  Serial.println(averageKoord_X); Serial.println(averageKoord_Y); 

Fungsi:

 float asin(float c) float acos(float c) float atan(float c) 

ambil dan gunakan =)

Seluruh kode:

 int trigPinRessiv = 8; int echoPinRessiv = 9; int trigPinTransmit1 = 2; int trigPinTransmit2 = 3; int i; long lenA = 2700; //sensor height in mm long lenG = 305; // distance between sensors in cm long koord_X, koord_Y; long koord_X1, koord_Y1; long koord_X2, koord_Y2; long koord_X3, koord_Y3; long koord_X4, koord_Y4; long koord_X5, koord_Y5; long oldKoord_X = 0, oldKoord_Y = 0; long averageKoord_X, averageKoord_Y; long measurementError; float alfa; long timeStartSignal, timeEndSignal; long lenC, lenE, lenB, lenD; void setup() { Serial.begin (115200); pinMode(trigPinRessiv, OUTPUT); pinMode(echoPinRessiv, INPUT); pinMode(trigPinTransmit1, OUTPUT); pinMode(trigPinTransmit2, OUTPUT); } void loop() { averageKoord_X = 0; averageKoord_Y = 0; digitalWrite(trigPinRessiv, LOW); digitalWrite(trigPinTransmit1, LOW); delayMicroseconds(5); digitalWrite(trigPinRessiv, HIGH); digitalWrite(trigPinTransmit1, HIGH); delayMicroseconds(10); digitalWrite(trigPinRessiv, LOW); digitalWrite(trigPinTransmit1, LOW); while (digitalRead(echoPinRessiv) == LOW); timeStartSignal = micros(); while (digitalRead(echoPinRessiv) == HIGH); timeEndSignal = micros(); lenC = ((timeEndSignal-timeStartSignal)/58.00)*10.00; delay(100); digitalWrite(trigPinRessiv, LOW); digitalWrite(trigPinTransmit2, LOW); delayMicroseconds(5); digitalWrite(trigPinRessiv, HIGH); digitalWrite(trigPinTransmit2, HIGH); delayMicroseconds(10); digitalWrite(trigPinRessiv, LOW); digitalWrite(trigPinTransmit2, LOW); while (digitalRead(echoPinRessiv) == LOW); timeStartSignal = micros(); while (digitalRead(echoPinRessiv) == HIGH); timeEndSignal = micros(); lenE = ((timeEndSignal-timeStartSignal)/58.00)*10.00; delay(100); lenB = sqrt((lenC*2.00)*(lenC*2.00) - lenA*lenA); measurementError = 26.437 - 0.08*lenC/10; lenB = (lenB + measurementError*10)/10.00; lenD = sqrt((lenE*2.00)*(lenE*2.00) - lenA*lenA); measurementError = 26.437 - 0.08*lenD/10; lenD = (lenD + measurementError*10)/10.00; alfa = acos(((lenG*lenG + lenD*lenD - lenB*lenB)*1.00)/((2*lenE*lenG)*1.00)); koord_X = lenE*cos(1.57-alfa); koord_Y = lenE*cos(alfa); if((koord_X > 0) && (koord_X < 500) && (koord_Y > 0) && (koord_Y < 500)) { oldKoord_X = koord_X; oldKoord_Y = koord_Y; }else{ koord_X = oldKoord_X; koord_Y = oldKoord_Y; } koord_X5 = koord_X4; koord_X4 = koord_X3; koord_X3 = koord_X2; koord_X2 = koord_X1; koord_X1 = koord_X; koord_Y5 = koord_Y4; koord_Y4 = koord_Y3; koord_Y3 = koord_Y2; koord_Y2 = koord_Y1; koord_Y1 = koord_Y; averageKoord_X = (koord_X + koord_X1 + koord_X2 + koord_X3 + koord_X4 + koord_X5)/6; averageKoord_Y = (koord_Y + koord_Y1 + koord_Y2 + koord_Y3 + koord_Y4 + koord_Y5)/6; } float asin(float c) { float out; out = ((c+(pow(c,3))/6+(3*pow(c,5))/40+(5*pow(c,7))/112 +(35*pow(c,9))/1152 +(0.022*pow(c,11))+(0.0173*pow(c,13))+(0.0139*pow(c,15)) + (0.0115*pow(c,17))+(0.01*pow(c,19)))); if(c >= .96 && c < .97) { out=1.287+(3.82*(c-.96)); } if(c>=.97 && c<.98) { out=(1.325+4.5*(c-.97)); } if(c>=.98 && c<.99) { out=(1.37+6*(c-.98)); } if(c>=.99 && c<=1) { out=(1.43+14*(c-.99)); } return out; } float acos(float c) { float out; out=asin(sqrt(1-c*c)); return out; } float atan(float c) { float out; out=asin(c/(sqrt(1+c*c))); return out; } 

Jadi kami mendapatkan sistem GPS ultrasonik yang paling sederhana dengan rentang meter per meter, video menunjukkan bagaimana semuanya bekerja.


Visualisasi lintasan dilakukan di Matlab, saya akan menulis bagaimana melakukan visualisasi yang sama di artikel selanjutnya.

Dalam artikel mendatang, saya akan mempertimbangkan secara lebih mendalam berbagai bagian dari sistem ini dan mencoba untuk memperbaikinya.

Saya akan senang mendengar pendapat dan tanggapan Anda tentang topik ini, proyek ini masih hidup =)

Halaman Proyek

Terinspirasi oleh sumber-sumber berikut:

Wikipedia
Posting di Habr "Indoor" GPS "dengan akurasi + -2cm"

Source: https://habr.com/ru/post/id451408/


All Articles