HC-SR04 ist ein Sensor, die Längemessung ohne Berührung durchführen kann.
Der Messbereich ist von 2cm - 4m.
Dieser Sensor wird von 5V betrieben.
Untere Abbildung zeigt, wie der Sensor aussieht.
Abbildung 1: Ultraschallsensormodul
Quelle: HC-SR04 Ultraschall Modul Entfernungsmesser Sensor für Raspberry Pi – AZ-Delivery
Wie man gesehen habe, es insgesamt 4 Anschlüsse gibt. Der mit Vcc bzw. Gnd gekennzeichneter Anschluss ist die Stromversorgung bzw. die Masse. Trig und Echo sind für TTL Signal also Steuersignal und Rücksignal.
Hier ist das Arbeitsprinzip des Sensors:
Abbildung 2:Arbeitsprinzip des Sensors
Die Abbildung zeigt, ein 10-mus High-Level-TTL Signal notwendig ist. Nachdem das Signal von Sensor erhalten hat, sendet der Sensor 8-Zyklus 40 kHz Impuls. Greift der Sensor die rücklaufende Welle, gibt er ein Signal in der Form von PWM-Signal zurück. Die Dauer der High-Level-Zeit des Signals entsprechend die Zeit, die hinlaufende Zeit und die rücklaufende Zeit addiert.
Jetzt würde ich Ihnen den Code zeigen, es gibt zwei Möglichkeiten.Eine davon ist, dass wir die von Arduino bietete Bibliothek benutzen. Die andere ist, eigenes Steuersignal zu schreiben.
Zunächst ist der Code mit Arduino-Bibliothek:
// Head-Dokument einfügen, alle notwendige Funktionen werden enthalten
#include<SR04.h>
// GPIO 12 und 11 werden definiert für Trigger-Signal und Rücksignal
#define Trigger 12
#define Echo 11
// Sensor Objekt mit dem Name sr definieren
// Zwei Parameters ,ein für Rücksignal,anderes für Trigger-Signal
SR04 sr = SR04(Echo,Trigger);
void setup() {
// put your setup code here, to run once:
// Baut einstellen
Serial.begin(9600);
delay(1000);
}
//Schleife,jedes Mal wird der Abstand gemessen und im Bildschirm gedruckt
void loop() {
// put your main code here, to run repeatedly:
// sr.Distance()ist die Funktion,den Abstand messt
Serial.print(sr.Distance());
Serial.println(" cm");
delay(1000);
}
Unten ist der Code, den wir selbst geschrieben haben:
// GPIO 12 und 11 werden definiert für Trigger-Signal und Rücksignal
#define Trigger 12
#define Echo 11
// GPIO 10 wird definiert für Schalter
#define s 10
// Funktion wird definiert, sie ermittelt den Abstand
// 3 Parameters sind Pin-Nummer für Trigger-Signal,Rücksignal und Schallgeschwindigkeit
double messung(int tri,int ech,double v);
void setup() {
// put your setup code here, to run once:
// GPIO initialisieren
pinMode(Trigger,OUTPUT);
pinMode(Echo,INPUT);
pinMode(s,INPUT_PULLUP);
digitalWrite(Trigger,LOW);
Serial.begin(9600);
delay(500);
}
void loop() {
// put your main code here, to run repeatedly:
// Entscheiden,ob den Schalter gedrückt wird.
// Nach einer Messung und dem Druck wird eine Verzögerung von 500 ms genommen.
// Damit vermeidet,zu viel Mals Messungen bei einem Druck des Schalters
if(digitalRead(s) == LOW)
{
Serial.print(messung(Trigger,Echo,343.0));
Serial.println(" cm");
delay(500);
}
}
// Die gegebene Schallgeschwindigkeit hat die Einheit von m/s
double messung(int tri,int ech,double v){
long t;
// Die Einheit der Schalgeschwindigkeit von m/s in cm/mus umgewandelt
v *= 1e-4;
// Zuerst wird Pin für TTL-Signal auf LOW-Pegel eingesetzt
// Dann wird 10 mus TTL Signal erzeugt
digitalWrite(tri,LOW);
delayMicroseconds(2);
digitalWrite(tri,HIGH);
delayMicroseconds(10);
digitalWrite(tri,LOW);
// Ermitteln die Laufzeit der hinlaufende Welle und rücklaufende Welle
t = pulseIn(ech,HIGH);
// 计算出距离并返回
return (double)(t)*v/2;
}
Bisher kann die Entfernung schon ermittelt. Aber die Genauigkeit kann noch verbessert werden.
Der Sensor besitzt schon eine sehr gute Auflösung, aber der Parameter der Schallgeschwindigkeit kann duch folgende Gleichung korrigiert werden:
Dabei sind alles für Ultraschallsensormodul. Ich danke Ihnen für das Lesen.
Ich freue mich, wenn Sie mir den Fehler zeigen und darüber diskutieren.
Viel Spaß beim lernen und schönen Tag.