Ultraschall Sensor HC-SR04
Mit diesem Ultraschall Sensor kann man die Distanz zu einem Objekt messen. Der Sensor sendet ein klickendes Geräusch im Ultraschall-Bereich aus, um anschließend die Verzögerung des Echos zu messen. Je größer die Distanz zum nächsten Objekt, umso später kommt das Echo zurück.
Ich bin mit diesem Sensor sehr zufrieden. Er ist mit seinen 2€ pro Stück äußerst preisgünstig und liefert trotzdem zuverlässige stabile Messergebnisse.
Im obigen Aufbau benutze ich ein Arduino Nano Modul, um den Sensor anzusteuern und die Messergebnisse in einem Terminalprogramm auf meinem PC anzuzeigen. Der Sensor ist an Port D2 (Trigger) und D3 (Echo) angeschlossen.
Technische Daten
- Spannungsversorgung: 5 V 15 mA
- Ruhestromaufnahme: < 2 mA
- Distanz: 2 cm - 400 cm
- Erfassungs-Winkel: ca. 45° im Nahbereich und ca. 15° bei maximaler Distanz
- Trigger-Eingang: positiver Impuls, mindestens 10 µs lang
- Echo-Ausgang: Positiver Impuls, 58 µs pro Zentimeter, 148 µs pro Inch
_
Trigger ____/ \______________________________________________
________________
Echo _________________________/ \__________
|←―――――Länge――――→|
Der Ausgangs-Impuls beginnt 200 bis 500 µs nach dem Trigger. Die Länge des Impulses ist ein Indiz für die Distanz zum nächsten reflektierenden Objekt. Wenn der Sensor kein Echo empfängt, ist der Ausgangsimpuls 38 ms lang. Zwischen den Messungen soll man mindestens 50 ms abwarten, um Refexionen des vorherigen Impulses abklingen zu lassen.
Programmierung
Die Programmierung ist ganz simpel:
- Zuerst sendet man einen Trigger-Impuls mit 10 µs Dauer.
- Kurze Zeit später antwortet der Sensor mit einem Echo-Impuls.
- Nun ermittelt das Programm die Puls-Breite in 58 µs Intervallen.
- Die Anzahl der Intervalle ist schon das Messergebnis in Zentimetern.
Wenn man so vorgeht, braucht man keine "teure" Division mit Fließkommazahlen.
#include <stdio.h>
#include <stdint.h>
#include <util/delay.h>
#include <avr/io.h>
#include "driver/serialconsole.h"
// The settings for the serial port are in driver/serialconsole.h
// The LED is connected to Port B5 and GND.
#define LED_ON { DDRB |= (1<<PB5); PORTB |= (1<<PB5); }
#define LED_OFF { PORTB &= ~(1<<PB5); }
// The Ultrasonic sensor is connected to Port D2 and D3
#define TRIGGER_ON { DDRD |= (1<<PD2); PORTD |= (1<<PD2); }
#define TRIGGER_OFF { PORTD &= ~(1<<PD2); }
#define ECHO_SIGNAL ( PIND & (1<<PD3) )
int main(void) {
initSerialConsole();
while(1) {
int16_t cm=0;
LED_ON;
// Trigger a measurement
TRIGGER_ON;
_delay_us(10);
TRIGGER_OFF;
// Wait for response
while (!ECHO_SIGNAL);
// Measure pulse width
while (ECHO_SIGNAL) {
_delay_us(58);
cm++;
}
LED_OFF;
// Output the result
printf("%i cm\n",cm);
// Delay 1 second before next loop
_delay_ms(1000);
}
}
Das vollständige Beispielprogramm kann mit der AVR Toolchain mit dem Befehl make program compiliert und in den Mikrocontroller übertragen werden.
