Startseite

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

             _ 
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:

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.