This is an old revision of the document!


Ultraschall-Entfernungsmesser

Necessary knowledge: [HW] Controller module, [HW] lcd, [AVR] Counters/Timers, [LIB] Timers, [LIB] Alphanumeric LCD, [LIB] Sensors

Theorie

Ultrasonic distance sensor SRF04

Ein Ultraschall-Entfernungsmesser bestimmt die Entfernung zu einem Objekt, durch das Messen der Zeit die ein Schall zum Objekt und zurück benötigt. Die Frequenz des Geräusches ist irgendwo im Bereich des Ultraschalls, das ermöglicht eine konzentrierte Bündlung der Schallwelle, da hochfrequenter Schall sich in der Umgebung weniger zerstreut. Ein typischer Ultraschall-Entfernungsmesser besteht aus zwei Membranen. Eine Membran produziert den Schall, die andere empfängt das Echo. Also eigentlich eine Box und ein Mikrofon. Der Schallgenerator generiert kurze (Länge weniger Perioden) ultraschall Impulse und startet den Timer. Die zweite Membran registriert die Ankunft des Echos und stoppt den Timer. Mit der Zeit des Timers ist es möglich die zurückgelegte Entfernung des Schalls zu berechnen. Die Entfernung zum Objekt ist die Hälfte der zurückgelegten Entfernung des Schalls.

Working principle of the ultrasonic distance sensor.

Der Ultraschall-Entfernungsmesser hat eine große Breite an Anwendungen um tägliche Leben. Sie werden anstatt von Messbändern als Messgeräte auf Baustellen genutzt. Autos haben Ultraschall-Entfernungsmesser als Parksensoren. Außer das Messen von Entfernungen, können Sie auch einfach das Dasein eines Objekts in der Messentfernung registrieren, z.B. in der Gefahrenzonen einer Arbeitsmaschine. Wenn Transmitter und Empfänger getrennt sind, kann die Fließgeschwindigkeit einer Substanz bestimmt werden, da die Schallwellen langsamer Stromaufwärts fließen.

Übung

HomeLab hat einen Devantech SRF04/SRF05 Ultraschall-Entfernungsmesser. SRF04/SRF05 ist jedoch nur ein Sensor und gibt keine direkte Information über die Distanz. Außer den Stromversorgungspins, hat der Sensor auch einen Trigger- und einen Echo-Pin. Wenn der Trigger-Pin high ist generiert der Sensor eine 40 kHz Ultraschall-welle welche 8 Perioden lang ist. In diesem Moment wird der Echo-Pin high und bleibt high bis das Echo zurück kommt. Also ist das Echo-Signal die Zeit die der Schall brauchte um das Objekt zu erreichen und zurück zum Sensor zu kommen. Diese Zeit wird mit der Schallgeschwindigkeit multipliziert und durch zwei dividiert, das Ergebnis ist die Entfernung zum Objekt. Der folgende Graph zeigt den Zusammenhang zwischen Zeit und den Signalen des Transmitters, Trigger und Echo:

The signals of the SRF04

Um den SRF04/SRF05 mit dem AVR zu nutzen, müssen Trigger- und Echo-Pin an AVR Pins angeschlossen werden. Um Zeit zu messen, sollte man einen 16-Bit Timer nutzen, z.B. timer3. Das folgende ist eine Funktion welche alle Messprozeduren ausführt - sie generiert das Signal des Triggers, startet den Timer, misst die Länge des Echosignals und konvertiert dies zur Entfernung in cm. Die Funktion blockt, d.h. Sie hält den Prozessor beschäftigt, bis die Messung abgeschlossen ist, oder die Messung zu lange dauert. Um so schneller die Messung dauert, um so schneller ist das Ergebnis da. Falls kein Echo ankommt, wartet die Funktion 36 ms und gibt eine 0 aus. Es ist wichtig mindestens eine 20ms Pause zwischen den Messungen zu lassen, um den Soundgenerator komplett zum Stillstand kommen zulassen, so dass die neue Messung nicht durch die alte beeinträchtigt wird. Es ist wichtig sich zu merken, dass die Schallwellen sich nicht gegenseitig Stören, wenn man mehrere Ultraschallsensoren simultan nutzt.

#define ULTRASONIC_SPEED_OF_SOUND 33000 // cm/s
 
//
// Instant ultrasonic distance measuring
//
unsigned short ultrasonic_instant_measure(pin trigger, pin echo)
{	
	// Pin setup
	pin_setup_output(trigger);
	pin_setup_input_with_pullup(echo);
 
	// Set timer 3 to normal mode
	// with period of F_CPU / 8
	timer3_init_normal(TIMER3_PRESCALE_8);
 
	// Create trigger pulse
	pin_set(trigger);
 
	// Reset timer
	timer3_overflow_flag_clear();
	timer3_set_value(0);	
 
	// Wait ~10 us
	while (timer3_get_value() < 18) {}
 
	// End trigger pulse
	pin_clear(trigger);
 
	// Wait for echo start
	while (!pin_get_value(echo))
	{
		// Timeout ?
		if (timer3_overflow_flag_is_set())
		{
			return 0;
		}
	}
 
	// Reset timer again
	timer3_set_value(0);
 
	// Wait for echo end	
	while (pin_get_value(echo))
	{
		// Timeout ?
		if (timer3_overflow_flag_is_set())
		{
			return 0;
		}
	}
 
	// Convert time to distance:
	//   distance = timer * (1 / (F_CPU / 8)) * speed / 2
	return (unsigned long)timer3_get_value() *
		ULTRASONIC_SPEED_OF_SOUND / (F_CPU / 4);
}

Die gegebene Funktion erlaubt es dem Nutzer den Echo-und den Trigger-Pin zu wählen, so dass der Sensor da angeschlossen werden kann wo es am nützlichsten ist. Zusätzlich, erlaubt dies, die Funktion auch außerhalb von HomeLab zu nutzen. die gegebene Funktion gehört schon zur HomeLab Library, daher muss man sie nicht schreiben. Eine Sache muss bedacht werden: Die Funktion in der Library ist streng an die Taktrate des Controller-Moduls von HomeLab gekoppelt. Die Taktrate ist 14,7456 MHz und wenn man die Funktion mit anderen Taktraten nutzt, würde sie falsche Ergebnisse liefern. Um die Funktion mit anderen Taktraten zu nutzen sollte man sie manuell programmieren. Der folgende Code demonstriert das Nutzen des SRF04/SRF05 Ultraschall-Entfernungsmessers mit der HomeLab Library:

//
// The example program of the ultrasonic distance sensor of the HomeLab
// Measuring the distance is blocking.
//
#include <stdio.h>
#include <homelab/pin.h>
#include <homelab/delay.h>
#include <homelab/module/sensors.h>
#include <homelab/module/lcd_alpha.h>
 
//
// Pins of ultrasonic sensor
//
pin pin_trigger = PIN(G, 1);
pin pin_echo    = PIN(G, 0);
 
//
// Main program
//
int main(void)
{ 		 
	unsigned short distance;
	char text[16];	
 
	// Initialization of the LCD
	lcd_alpha_init(LCD_ALPHA_DISP_ON);
 
	// Clearing of the LCD
	lcd_alpha_clear();
 
	// Name of the program
	lcd_alpha_write_string("Ultra sound");
 
	// Little break
	sw_delay_ms(100);
 
 	// Endless loop.
	while (true)
	{
		// Measuring
		distance = ultrasonic_measure(pin_trigger, pin_echo);
 
		// Was the measuring successful ?
		if (distance > 0)
		{			
			// converting the distance to text.
			sprintf(text, "%d cm   ", distance);
		}
		// Were there errors during the measuring ?
		else
		{
			// Text of the errer.
			sprintf(text, "Error    ");
		}			
 
		// Displaying the text in the beginning of the second row of the LCD
		lcd_alpha_goto_xy(0, 1);
		lcd_alpha_write_string(text);
 
		// Little break.
		sw_delay_ms(500);
	}
}
de/examples/sensor/ultrasonic_distance.1290763051.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0