Ultraschallsensor HC-SR04

Mit dem Ultraschallsensor HC-SR04 wollte ich schon länger experimentieren und im Nachgang des Posts zum Arduino Uno R4 hatte ich dann eine Idee.

Ultraschallsensor HC-SR04 (Frontansicht)
Ultraschallsensor HC-SR04 (Frontansicht)

Material

  • Arduino R4 Wifi
  • vier Jumperkabel (rot, gelb, blau, schwarz)
  • Ultraschallsensormodul HC-SR04, z.B. von AZDelivery
  • Breadboard (half-size)
Ultraschallsensor HC-SR04  auf einem Breadboard, im Hintergrund der Arduino Uno R4 und Jumperkabel
Ultraschallsensor HC-SR04 auf einem Breadboard, im Hintergrund der Arduino Uno R4 und Jumperkabel

Ultraschall

Als Ultraschall werden Frequenzen zwischen 20kHz bis 1GHz bezeichnet, die oberhalb des vom Menschen wahrnehmbaren Frequenzspektrums liegen. Dank der hohen Frequenz eignet er sich gut für Abstandsmessungen im Kurzbereich.

Ultraschallsensor HC-SR04

Das Sensormodul besteht im Wesentlichen aus folgenden Komponenten, ein Transmitter, der den Schall aussendet und ein Receiver. der das Echo auffängt, sie sind auf der Platine mit T und R gekennzeichnet. Dazu kommen vier Stifte zum Anschluss an den Arduino.

Arbeitsweise

Etwas physikalische Grundlagen kann ich dir jetzt nicht ersparen. Das Signal, das der Transmitter aussendet wird von einem Objekt reflektiert und nach einer gewissen Zeit vom Receiver aufgefangen. Da die Schallgeschwindigkeit in der Luft mit 343,2 m/s relativ konstant ist, lässt sich auf diese Weise der Signalweg zurückrechnen und damit der Abstand des reflektierenden Objekts bestimmen. Da der ausgesendete Schallimpuls die Strecke zweimal durchläuft (Hin- und Rückweg), müssen wir die gemessene Zeit halbieren. Der Sensor arbeitet in Mikrosekundenintervallen, daher müssen wir die Schallgeschwindigkeit dahin runter-rechnen

343,2 m/s = 0,03432 cm/µs

Der Sensor schickt einen Impuls über den Transmitter los, sobald der Triggerpin von low auf high gezogen wird. Sobald das Echo im Receiver empfangen wird, wird der Echo Pin auf high gesetzt, was wir im Arduino abfragen können.

Das Echo-Laufzeit-Verfahren (Quelle: Wikipedia / Alfaomega  CC BY-SA 3.0 de)
Das Echo-Laufzeit-Verfahren (Quelle: Wikipedia / Alfaomega CC BY-SA 3.0 de)

Hardware

Die Hardware wird vom Sensor zum Arduino folgendermaßen zusammengebaut:

rot: VCC -> +5V

gelb: Trigger/Tx -> GPIO Pin 9

blau: Echo/Rx -> GPIO Pin 8

schwarz: GND -> GND

Verschaltung der Hardware
Verschaltung der Hardware

Programmcode

Für den Ultraschallsensor HC-SR04 musst du keine spezielle Library in der Arduino IDE installieren.

In der loop() senden wir regelmäßig einen Ultraschallimpuls aus, in dem wir den Trigger von LOW auf HIGH ziehen. Mit pulseIn() warten wir dann, bis der Echo Pin auf HIGH geht und bekommen dann die Signallaufzeit in Mikrosekunden zurückgeliefert. Mit der oben stehenden Formel können wir damit den Abstand des Objekts berechnen. Die Distanz geben wir dann in der seriellen Console aus.

serielle Ausgabe der Abstände
serielle Ausgabe der Abstände

So weit, so gut, allerdings hat mir das nicht gereicht. Da wir auf dem Uno R4 Wifi die LED Matrix zur Verfügung haben, dachte ich, ich visualisiere den Abstand durch die Höhe einer LED Spalte und gehe nach jeder Sekunde zur nächsten weiter. Da nach 12 Sekunden alle Spalten benutzt sind, sorgt scroll_matrix() dafür, dass die ganze Matrix um eine Spalte nach links gescrollt wird. Die Anzahl der einzuschaltenden LED pro Spalte wird in calc_LED_Height() berechnet.

#include "Arduino_LED_Matrix.h"

# define PIN_TRIGGER 9 // Pin 9: PIN_TRIGGER
# define PIN_ECHO 8   // Pin 8 Empfang

// LED-Matrix leer initialisieren
byte led_frame[8][12] = {0};
ArduinoLEDMatrix matrix;

int maxDistance = 20;

// Funktion, um die LED-Höhe basierend auf der gemessenen Entfernung zu berechnen
int calc_LED_Height(int distance) {
  // Begrenze die Entfernung auf die maximale Entfernung
  if (distance > maxDistance) {
    distance = maxDistance;
  }
 // Berechne die Höhe der LEDs
  int ledHeight = (distance * 8) / maxDistance;
  return ledHeight;
}
void setup() {

  pinMode(PIN_TRIGGER, OUTPUT);
  pinMode(PIN_ECHO, INPUT);
  Serial.begin(9600);
  matrix.begin();
}

int count = 0; // Spaltenzähler in der LED-Matrix

// scroll the frame one column to the left
void scroll_matrix() {
  for(int col=1; col < 12;col++) {
    for(int row = 0;row <8;row++) {
      led_frame[row][col-1] = led_frame[row][col];
    }
  }

}
// draw the LED frame
void draw_matrix(int leds, int count) {
if(count == 12) {
  scroll_matrix();
}
 for(int l =7;l >leds; l--) {
    led_frame[l][count] = 1;
  }
  matrix.renderBitmap(led_frame, 8, 12);
 
}
void loop()
{
  long distance = 0;

  // Signalstörungen vermeiden, daher einmal kurz Trigger auf LOW
  digitalWrite(PIN_TRIGGER, LOW);
  delay(5);

  // Signal PIN_TRIGGER
  digitalWrite(PIN_TRIGGER, HIGH);
  delayMicroseconds(10);
  digitalWrite(PIN_TRIGGER, LOW);
  
  // pulseIn -> Signallaufzeit messen
  long Zeit = pulseIn(PIN_ECHO, HIGH);

  // distance in cm berechnen
  distance = (Zeit / 2) * 0.03432;

  // distance anzeigen
  Serial.print("distance in cm: ");
  Serial.println(distance);

  // Anzahl der LEDs in der Spalte berechnen
  int leds = calc_LED_Height(distance);

  // Matrix neu zeichnen
  draw_matrix(leds,count);
  delay(1000);
  if( count < 12) { // maximal 12 Spalten, danach wird gescrollt.
    count++;
  }
}

Auf der LED Matrix erhältst du jetzt unterschiedlich hohe Balken, wenn du den Abstand eines Objekts vor dem Sensor veränderst.

laufendes Programm mit Ausgabe in der LED-Matrix
laufendes Programm mit Ausgabe in der LED-Matrix

Raspberry Pi

Die Sensorverschaltung benutzt nichts, was nicht auch beim Raspberry Pi vorhanden ist, so dass ein entsprechender Aufbau mit dem Raspi möglich sein sollte.

Schreibe einen Kommentar

WordPress Cookie Hinweis von Real Cookie Banner