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