| Next revision | Previous revision |
| de:examples:sensor:ultrasonic_distance [2010/11/26 09:17] – angelegt Wember | de:examples:sensor:ultrasonic_distance [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
|---|
| ====== Ultraschall-Entfernungsmesser ====== | ====== Ultraschall-Entfernungsmesser ====== |
| |
| //Necessary knowledge: [HW] [[en:hardware:homelab:controller]], [HW] [[en:hardware:homelab:lcd]], [AVR] [[en:avr:timers]], [LIB] [[en:software:homelab:library:timer]], [LIB] [[en:software:homelab:library:module:lcd_alphanumeric]], [LIB] [[en:software:homelab:library:module:sensor]]// | //Notwendiges Wissen: [HW] [[en:hardware:homelab:controller]], [HW] [[en:hardware:homelab:lcd]], [AVR] [[en:avr:timers]], [LIB] [[en:software:homelab:library:timer]], [LIB] [[en:software:homelab:library:module:lcd_alphanumeric]], [LIB] [[en:software:homelab:library:module:sensor]]// |
| |
| ===== Theorie ===== | ===== Theorie ===== |
| |
| [{{ :examples:sensor:ultrasonic_distance:sensor_ultrasonic_srf04.jpg?160|Ultrasonic distance sensor SRF04}}] | [{{ :examples:sensor:ultrasonic_distance:sensor_ultrasonic_srf04.jpg?160|Ultraschall-Entfernungsmesser 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 Ultraschall-Entfernungsmesser bestimmt die Entfernung zu einem Objekt, indem er die Zeit misst, die ein Schall zu einem Objekt hin und zurück benötigt. Die Frequenz des Geräusches liegt im Bereich des Ultraschalls. Dies garantiert, dass die Schallwelle gebündelt gelenkt wird, da sich hochfrequenter Schall weniger in der Umgebnung zerstreut. Ein typischer Ultraschall-Entfernungsmesser besteht aus zwei Membranen. Eine Membran produziert den Schall, die andere empfängt das Echo. Im Grunde besteht er also aus einem Lautsprecher und einem Mikrophon. Der Schallgenerator generiert kurze (wenige Perioden umfassende) Ultraschallimpulse 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 zu einem Objekt entspricht der Hälfte der zurückgelegten Entfernung des Schalls. |
| 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. | |
| |
| [{{ :examples:sensor:ultrasonic_distance:sensor_ultrasonic_principle.png?280|Working principle of the ultrasonic distance sensor.}}] | [{{ :examples:sensor:ultrasonic_distance:sensor_ultrasonic_principle.png?280|Funktionsweise eines Ultraschall-Entfernungsmessers.}}] |
| |
| 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. | Der Ultraschall-Entfernungsmesser findet im täglichen Leben eine Vielzahl von Anwendungsmöglichkeiten. Er wird beispielsweise als Ersatz für Maßbänder auf Baustellen eingesetzt, Autos besitzen Ultraschall-Entfernungsmesser als Parksensoren. Neben der Entfernungsmessung dient er auch dazu, das bloße Vorhandensein eines Objekts im Messbereich zu erkennen, z. B. in der Gefahrenzone einer Arbeitsmaschine. Sind Ultraschalltransmitter und -empfänger getrennt, kann die Fließgeschwindigkeit des Materials zwischen ihnen bestimmt werden, da Schallwellen langsamer aufwärts fließen. |
| |
| ===== Übung ===== | ===== Ü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. | Das HomeLab enhält einen Devantech SRF04/SRF05 Ultraschall-Entfernungsmesser. Der SRF04/SRF05 ist jedoch nur ein Sensor und gibt keine direkte Information über die Distanz. Neben den Stromversorgungspins besitzt 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: | Ist der Trigger-Pin "high", generiert der Sensor eine acht Perioden lange 40 kHz Ultraschallwelle. Daraufhin wird der Echo-Pin "high" und bleibt "high", bis das Echo zurück kommt. Das Echo-Signal gibt also generell die Zeit an, die der Schall benötigt um das Objekt zu erreichen und zum Sensor zurück zu kommen. Die Entfernung zum Objekt ergibt sich daraus, dass die gemessene Zeit mit der Schallgeschwindigkeit multipliziert und dann durch zwei dividiert wird. Der folgende Graph zeigt den Zusammenhang zwischen Zeit und den Signalen des Empfängers, Triggers und des Echos: |
| |
| [{{ :examples:sensor:ultrasonic_distance:sensor_ultrasonic_signals.png?280|The signals of the SRF04}}] | [{{ :examples:sensor:ultrasonic_distance:sensor_ultrasonic_signals.png?280|Die Signale des 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. | Um den SRF04/SRF05 mit dem AVR zu nutzen, müssen Trigger- und Echo-Pin an den AVR Pins angeschlossen werden. Zur Zeitmessung, sollte ein 16-Bit Timer genutzt werden, z.B. //timer3//. Nachfolgend ist eine Funktion dargestellt, die alle Messvorgänge ausführt - sie generiert das Signal des Triggers, startet den Timer, misst die Länge des Echosignals und konvertiert dies zur Entfernung in Centimetern. Die Funktion blockt, das bedeutet sie hält den Prozessor beschäftigt, bis die Messung abgeschlossen ist oder zu lange dauert. Je schneller das Echo ankommt, desto schneller erhält man ein Ergebnis. Falls kein Echo ankommt, wartet die Funktion 36 ms und geht dann auf 0 zurück. Es ist wichtig zwischen den Messungen eine Pause von mindestens 20 ms Pause einzuhalten, 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. | Außerdem sollte darauf geachtet werden, dass die Schallwellen sich nicht gegenseitig stören, wenn verschiedene Ultraschallsensoren gleichzeitig genutzt werden. |
| |
| <code c> | <code c> |
| |
| // | // |
| // Instant ultrasonic distance measuring | // Sofortige Ultraschall-Entfernungsmessung |
| // | // |
| unsigned short ultrasonic_instant_measure(pin trigger, pin echo) | unsigned short ultrasonic_instant_measure(pin trigger, pin echo) |
| { | { |
| // Pin setup | // Pin-Setup |
| pin_setup_output(trigger); | pin_setup_output(trigger); |
| pin_setup_input_with_pullup(echo); | pin_setup_input_with_pullup(echo); |
| |
| // Set timer 3 to normal mode | // Timer 3 auf den normalen Modus setzen |
| // with period of F_CPU / 8 | // mit der Periode des F_CPU / 8 |
| timer3_init_normal(TIMER3_PRESCALE_8); | timer3_init_normal(TIMER3_PRESCALE_8); |
| |
| // Create trigger pulse | // Erzeugung des Aulöse-Impulses |
| pin_set(trigger); | pin_set(trigger); |
| | |
| // Reset timer | // Timer zurücksetzen |
| timer3_overflow_flag_clear(); | timer3_overflow_flag_clear(); |
| timer3_set_value(0); | timer3_set_value(0); |
| | |
| // Wait ~10 us | // ~10 us warte |
| while (timer3_get_value() < 18) {} | while (timer3_get_value() < 18) {} |
| | |
| // End trigger pulse | // Auslöse-Impuls beenden |
| pin_clear(trigger); | pin_clear(trigger); |
| | |
| // Wait for echo start | // Warten auf den Echo-Start |
| while (!pin_get_value(echo)) | while (!pin_get_value(echo)) |
| { | { |
| } | } |
| | |
| // Reset timer again | // Timer erneut zurücksetzen |
| timer3_set_value(0); | timer3_set_value(0); |
| | |
| // Wait for echo end | // Warten auf Beendigung des Echos |
| while (pin_get_value(echo)) | while (pin_get_value(echo)) |
| { | { |
| } | } |
| | |
| // Convert time to distance: | // Konvertierung von Zeit in Entfernung: |
| // distance = timer * (1 / (F_CPU / 8)) * speed / 2 | // Entfernung = Timer * (1 / (F_CPU / 8)) * Geschwindigkeit / 2 |
| return (unsigned long)timer3_get_value() * | return (unsigned long)timer3_get_value() * |
| ULTRASONIC_SPEED_OF_SOUND / (F_CPU / 4); | ULTRASONIC_SPEED_OF_SOUND / (F_CPU / 4); |
| </code> | </code> |
| |
| 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. | Die gegebene Funktion erlaubt dem Nutzer den Echo-und den Trigger-Pin so zu wählen, dass der Sensor dort angeschlossen werden kann wo es am günstigesten ist und genug Platz vorhanden ist. Zusätzlich erlaubt dies, die Funktion auch außerhalb von HomeLab zu nutzen. Die dargestellte Funktion ist bereits in der HomeLab Library enthalten und muss somit nicht geschrieben werden. Es gibt noch eine Sache zu beachten: Die Funktion in der Library ist streng an die Taktrate des Controller-Moduls von HomeLab gekoppelt. Die Taktrate beträgt 14,7456 MHz, wenn die Funktion mit anderen Taktraten genutzt wird, liefert sie falsche Ergebnisse. Um die Funktion mit anderen Taktraten zu nutzen sollte sie manuell programmiert werden. Der folgende Code demonstriert die Nutzung des SRF04/SRF05 Ultraschall-Entfernungsmessers mit der HomeLab Library: |
| Der folgende Code demonstriert das Nutzen des SRF04/SRF05 Ultraschall-Entfernungsmessers mit der HomeLab Library: | |
| <code c> | <code c> |
| // | // |
| // The example program of the ultrasonic distance sensor of the HomeLab | // Beispielprogramm für den Ultraschall-Entfernungsmesser des HomeLab |
| // Measuring the distance is blocking. | // Die Entfernungsmessung wirkt blockierend. |
| // | // |
| #include <stdio.h> | #include <stdio.h> |
| |
| // | // |
| // Pins of ultrasonic sensor | // Pins des Ultraschallsensors |
| // | // |
| pin pin_trigger = PIN(G, 1); | pin pin_trigger = PIN(G, 1); |
| |
| // | // |
| // Main program | // Hauptprogramm |
| // | // |
| int main(void) | int main(void) |
| char text[16]; | char text[16]; |
| | |
| // Initialization of the LCD | // Initialisierung des LCD |
| lcd_alpha_init(LCD_ALPHA_DISP_ON); | lcd_alpha_init(LCD_ALPHA_DISP_ON); |
| | |
| // Clearing of the LCD | // Löschen des LCD |
| lcd_alpha_clear(); | lcd_alpha_clear(); |
| | |
| // Name of the program | // Name des Programms |
| lcd_alpha_write_string("Ultra sound"); | lcd_alpha_write_string("Ultra sound"); |
| |
| // Little break | // Kleine Unterbrechung |
| sw_delay_ms(100); | sw_delay_ms(100); |
| |
| // Endless loop. | // Endlosschleife. |
| while (true) | while (true) |
| { | { |
| // Measuring | // Messen |
| distance = ultrasonic_measure(pin_trigger, pin_echo); | distance = ultrasonic_measure(pin_trigger, pin_echo); |
| |
| // Was the measuring successful ? | // War die Messung erfolgreich? |
| if (distance > 0) | if (distance > 0) |
| { | { |
| // converting the distance to text. | // Konvertierung von Entfernung in Text. |
| sprintf(text, "%d cm ", distance); | sprintf(text, "%d cm ", distance); |
| } | } |
| // Were there errors during the measuring ? | // Sind während der Messung Fehler aufgetreten? |
| else | else |
| { | { |
| // Text of the errer. | // Text des Fehlers. |
| sprintf(text, "Error "); | sprintf(text, "Error "); |
| } | } |
| |
| // Displaying the text in the beginning of the second row of the LCD | // Darstellung des Textes am Anfang der zweiten Zeile des LCD |
| lcd_alpha_goto_xy(0, 1); | lcd_alpha_goto_xy(0, 1); |
| lcd_alpha_write_string(text); | lcd_alpha_write_string(text); |
| | |
| // Little break. | // Kleine Unterbrechung. |
| sw_delay_ms(500); | sw_delay_ms(500); |
| } | } |
| } | } |
| </code> | </code> |