Ultraschall GPS

Ultraschall-GPS. Konzeptmodell


Bevor Sie sich auf eine so lange Reise begeben, sollten Sie prüfen, ob wirklich alles am Knie erledigt ist.

Worum es in diesem Artikel geht: Wie man schnell und kostengünstig ein einfaches Ultraschall-GPS herstellt.

Liste der erforderlichen Geräte


  • HC-SR04 3 Stk.
  • Arduino 1 Stck.
  • Eine Drahtspule.

Konzept


Bild
Abb. 1 - Allgemeine Vorstellung des Geräts

In den oberen Ecken des Raumes ist HC-SR04 installiert, die die Rolle von Sendern spielen, auf dem Boden mit dem Empfänger nach oben, ein Drittel, es spielt die Rolle eines Empfängers.

All dies hängt nach dem Schema zusammen:

Bild
Abb. 2 - Geräteanschlussdiagramm

Und natürlich verbinden Sie Arduino über USB mit einem Computer.

Wie das alles funktioniert:

  1. Messen Sie den Abstand vom Empfänger zum Sender 1
  2. Senden Sie ein Signal über den Beginn der Entfernungsmessung an Empfänger und Sender 1 (ziehen Sie die Trig-Beine damit).
  3. Warten Sie, bis der Empfänger uns die Länge gibt.
  4. Wiederholen Sie dies für Emitter 2.
  5. Empfängerkoordinaten berechnen.

Erinnern Sie sich an die Schulgeometrie


Bild
Abb. 3 - Geometrische Darstellung des Problems

Basierend auf dieser Abbildung erstellen wir die Formeln zur Berechnung der Koordinaten:

Bild

A, F ist die Höhe der Sender relativ zum Empfänger;
C, E sind die Längen, die durch Messen des Abstands von den Sendern zum Empfänger erhalten werden;
G ist der Abstand zwischen den Emittern.

Übe


Installieren Sie zwei Heizkörper unter der Decke in einem angemessenen Abstand voneinander (3 Meter) und richten Sie sie mit Heizkörpern an einer Stelle aus, um die sich Ihr Arbeitsbereich bildet.

Montieren Sie den Empfänger auf etwas Flachem (z. B. einem Stück Brett) und wickeln Sie ihn mit Klebeband mit Klebeband um, damit im Raum keine unnötigen Ultraschallgeräusche entstehen.
Verbinden Sie alles gemäß dem oben dargestellten Schema.

So könnten Befestigungselemente für Sender und das Substrat für den Empfänger aussehen:

Bild
Abb. 4 - Modultyp

Das Programm


Betrachten Sie die wichtigsten Teile des Codes genauer.

Wir zwingen den Sender 1 und den Empfänger, die Entfernung zu messen, indem wir den Trig-Eingang dieser Geräte von niedrig nach hoch, 10 Mikrosekunden und zurück nach niedrig bewegen.

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

In der Regel senden diese Geräte selbst ein Ultraschallsignal aus und warten, bis es von etwas reflektiert wird, und kehren zu ihnen zurück. Aber wir täuschen sie, in unserem Fall sendet einer und der andere empfängt, derjenige, der empfangen hat, denkt, es sei sein Signal, obwohl dies ein Signal von einem anderen Gerät ist, und gibt uns die Entfernung zu diesem anderen Gerät.

Wir warten, bis der Sensor beginnt, uns die Flugdauer des Ultraschallsignals mitzuteilen:

 while (digitalRead(echoPinRessiv) == LOW); 

Notieren Sie die Startzeit des Signals:

 timeStartSignal = micros(); 

Wir warten, bis der Sensor nicht mehr die Flugzeit des Ultraschallsignals anzeigt:

 while (digitalRead(echoPinRessiv) == HIGH); 

Wir schreiben die Endzeit:

  timeEndSignal = micros(); 

Mit einer einfachen Formel berechnen wir den Abstand vom Sender zum Empfänger:

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

Wir warten, bis das Ultraschallgeräusch im Raum nachlässt:

 delay(100); 

Es ist erwähnenswert, dass der Sensor die Entfernung anzeigt, indem er den Echo-Ausgang für einen Zeitraum direkt proportional zur gemessenen Entfernung auf Niedrig senkt.

Das gleiche wird für den zweiten Emitter wiederholt.

Anhand der Regeln für ein rechtwinkliges Dreieck projizieren wir den resultierenden Abstand auf die Bodenebene (Abb. 3).

Wir implementieren die Softwareformel für den Übergang von dreidimensionalen Koordinaten zur Ebene. Die Formel ist oben dargestellt:

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

Leider haben wir Fehler, und um sie zu entfernen, habe ich mir eine so erfahrene Formel ausgedacht, sie gelöscht und gesehen, was Sie bekommen.

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

Wiederholen Sie dies für Sensor 2.

Wir berechnen die Koordinaten in der Ebene

Finde den Winkel Alpha:

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

Finden Sie die Koordinaten selbst:

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

Wenn der Wert der Koordinaten über das Mögliche hinausgeht, ersetzen Sie ihn durch den vorherigen Wert:

  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; } 

Wir erstellen einen Puffer für 6 Koordinatenwerte und verschieben ihn ständig:

  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; 

Wir erhalten den Durchschnittswert für die letzten 6 Messungen:

  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; 

Senden Sie die Koordinaten an den PC:

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

Funktionen:

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

nimm einfach und benutze =)

Gesamter Code:

 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; } 

Wir haben also das einfachste Ultraschall-GPS-System mit einer Reichweite von Meter zu Meter. Das Video zeigt, wie alles funktioniert.


Die Visualisierung der Flugbahn erfolgt in Matlab. Im nächsten Artikel werde ich schreiben, wie dieselbe Visualisierung durchgeführt wird.

In zukünftigen Artikeln werde ich die verschiedenen Teile dieses Systems genauer betrachten und versuchen, sie zu verbessern.

Ich freue mich über Ihre Meinung und Ihr Feedback zu diesem Thema, das Projekt ist noch am Leben =)

Projektseite

Inspiriert von folgenden Quellen:

Wikipedia
Ein Beitrag auf dem Habr "Indoor" GPS "mit einer Genauigkeit von + -2cm"

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


All Articles