Make Sonderheft 2017
S. 68
Einparkhilfe
Aufmacherbild

Das erste Projekt: Abstandsanzeige

Leider haben nicht alle Autos einen Parksensor. Damit nicht jeder Einparkversuch in der heimischen Garage zu einem Risiko für die Stoßstange des geliebten Gefährts wird, wäre eine Abstandsanzeige an der Garagenwand äußerst praktisch. In unserem ersten Projekt zeigen wir, wie man kostengünstig und ohne viel Zeitaufwand solch eine Anzeige selber bauen kann.

Der Bau einer Abstandsanzeige für die eigene Garagenwand ist schnell und ohne komplexe Programmierung oder handwerklichen Aufwand realisierbar und eignet sich daher besonders für Maker-Neulinge. Sowohl die Schaltung als auch der Programmiercode sind leicht nachvollziehbar und später bei Bedarf auch erweiterbar.

Der Aufbau unserer Abstandsanzeige ist ziemlich simpel und hat nur drei Hauptkomponenten: einen Ultraschallsensor, einen Modellbau-Servo und einen Arduino UNO. Der Ultraschallsensor misst die Entfernung zum Auto. Diese wird im Arduino-Programm ausgewertet und in einen Winkel umgerechnet, dass sie mit einem Zeiger auf einer Skala dargestellt werden kann. Der Zeiger wird direkt auf dem Servo montiert.

Der von uns verwendete Ultraschallsensor kann Entfernungen bis zu 3 Metern messen. Für unser Projekt wäre das etwas zu viel, da unsere Anzeige lediglich als Einparkhilfe dienen soll. Wir müssen die Messweite des Sensors also etwas beschränken. Praktisch wäre es, wenn die Anzeige nur bei einem Abstand von einem Meter oder weniger zeigt, wie viel Platz man noch zur Garagenwand hat. Dies lässt sich sehr einfach im Arduino-Sketch umsetzen.

Der Servo hat einen Drehbereich von 180 Grad. Denkbar wäre also eine Anzeige in Form eines skalierten Halbkreises, an dem man ablesen kann, wie weit man mit der Stoßstange von der Wand entfernt ist. Für unseren Prototypen haben wir eine Anzeige in A4-Größe gebaut. Um die Anzeige später in der Garage besser erkennen zu können, kann man das Ganze natürlich eine Nummer größer gestalten.

Der Ultraschallsensor

Ein weit verbreiteter und günstiger Ultraschallsensor zum Messen von Abständen ist der HC-SR04. Er ist mit zwei Ultraschall-Kapseln ausgestattet. Eine sendet ein Signal von 40 kHz aus, die andere empfängt das Echo dieses Signals.

Der Ultraschallsensor HC-SR04

Auch wenn ein menschliches Ohr solch eine hohe Frequenz nicht wahrnehmen kann, gelten für den Ultraschallton trotzdem dieselben physikalischen Gesetze wie für jede Schallquelle. Das heißt, dass das Signal eine Strecke von annähernd 330 Metern in der Sekunde zurücklegt. Wertet man die zeitliche Verzögerung zwischen dem Aussenden des Signals und dem Empfang des Echos aus, lässt sich die Entfernung genau ausrechnen. Zwar arbeitet der Sensor temperatur- und luftdruckabhängig, doch die Abweichungen sind in unserem Fall vernachlässigbar, da sie eher gering sind.

Die Empfangselektronik des Sensors erzeugt am Ausgang ein 5-Volt-Signal, welches vom Arduino zur Berechnung der Entfernung benutzt wird. Ein Messintervall dauert hierbei 20 ms, mit denen man auf 50 Messungen pro Sekunde kommt. Der HC-SR04 kann Entfernungen von 2 cm bis 3 m messen und hat laut Hersteller eine Messgenauigkeit von rund 3 mm. Da wir in unserem Projekt nicht auf den Millimeter genau messen müssen, ist dieser Sensor angesichts seiner Funktionalität und des günstigen Preises ein geeigneter Kandidat. In vielen Online-Versandhäusern wie AliExpress oder GearBest ist er für unter 5 zu bekommen.

Der Servo

Servos werden überall dort eingesetzt, wo es auf eine genau gesteuerte Positionierung ankommt. Sie bestehen aus einem Motor, einer Antriebsachse, einem Getriebe und einer Kontrolleinheit. Diese Kontrolleinheit enthält ein Potenziometer, welches Auskunft über die eingestellte Ist-Position gibt. Will man diese Position verändern, muss der Ist- mit dem Soll-Wert verglichen werden.

Zum Bewegen des Zeigers haben wir einen Modellbau-Servo verwendet.

Zum Verstellen der Position kommt die sogenannte Pulsweitenmodulation, kurz PWM, zum Einsatz. Der Ausgang des Arduinos, an den unser Servo angeschlossen ist, sendet unterschiedlich lange Impulse an die Kontrolleinheit des Servos, anhand derer sie die einzunehmende Position bestimmt. Die Mittelposition des Servos wird üblicherweise bei einer Impulslänge von 1,5 ms eingenommen. Eine Impulslänge von 1 ms stellt den Linksanschlag ein und zur Bewegung zum Rechtsanschlag wird ein Impuls von 2 ms benötigt (siehe Abbildung 1). Der Drehbereich eines handelsüblichen Modellbau-Servos, wie in unserem Fall, beträgt in der Regel 180 Grad – für unsere Abstandsanzeige also völlig ausreichend.

❶ Mit der Impulslänge verändern wir die Ausrichtung des Servo-Arms.

Diese Impulse können je nach Hersteller geringfügig länger oder kürzer sein. Der Servo hält die eingestellte Position so lange, wie der gesendete Impuls sich zyklisch wiederholt. In der Regel entspricht solch ein Zyklus 20 ms, was 50 Zyklen pro Sekunde entspricht.

Je nach Hersteller unterscheiden sich auch die Anschlüsse und Kabelfarben. Bitte lesen Sie vor dem Einbau unbedingt das Datenblatt des Servos. Die oben stehende Tabelle zeigt eine Übersicht der gebräuchlichsten Servo-Modelle und deren Belegung.

Tabelle: Die Servo-Farbcodes

Der richtige Anschluss

Der Anfang fast aller Arduino-Projekte findet auf dem Breadboard statt. So kann man mit der Verschaltung der Bauteile herumexperimentieren und den einen oder anderen Code in der Arduino-IDE ausprobieren. Funktioniert alles wie gewünscht, kann der Aufbau in ein dafür geeignetes Gehäuse umziehen. Auch unser Projekt testen wir zunächst auf einem Breadboard, auf dem alle Bauteile miteinander verkabelt werden.

Der Servo benötigt lediglich einen PWM-fähigen Pin, über den das Steuersignal übertragen wird. Der 5-Volt-Ausgang des Arduino reicht in unserem Fall aus, um den Servo mit ausreichend Spannung zu versorgen.

Der Aufbau der Abstandsanzeige

Der Ultraschallsensor wird ebenfalls vom Arduino mit 5 Volt Spannung versorgt. Zur Kommunikation benötigt er zwei Pins: Einen, um das Senden des Ultraschallsignals zu starten, und einen zweiten, um die Zeitverzögerung, mit der das Echo wieder am Sensor ankommt, an den Arduino weiter zu geben.

Der nachfolgende Arduino-Sketch steht Ihnen zum Download zur Verfügung. Gerne können Sie darin mit den Parametern experimentieren und zum Beispiel den Zeiger schneller oder langsamer drehen lassen. ade

01  #define trigPin 13
02  #define echoPin 11
03  #include <Servo.h>

Zuerst wird definiert, mit welchen Pins am Arduino die Trigger- und Echo-Anschlüsse des Ultraschallsensors verbunden sind. Dann wird die Servo-Library in unser Projekt eingebunden.



04  Servo myservo;


Die Servo-Library enthält Funktionen, die wir beim Programmieren unserer Anwendung brauchen. Um diese benutzen zu können, müssen wir mit myservo ein neues Servo-Objekt erzeugen.

05  void setup() {
06    Serial.begin (9600);
07    pinMode(trigPin, OUTPUT);
08    pinMode(echoPin, INPUT);
09    myservo.attach(6);
10  }

Im Setup-Block wird trigPin als Ausgang und echoPin als Eingang definiert. Dann wird festgelegt, dass unser Servo an Pin 6 angeschlossen ist.



11  void loop() {
12   int dauer, abstand, winkel;


Die Variablen für die Signaldauer, den daraus errechneten Abstand und den einzustellenden Winkel werden definiert.

13    digitalWrite(trigPin, LOW);
14    delayMicroseconds(2);
15    digitalWrite(trigPin, HIGH);
16    delayMicroseconds(10);
17    digitalWrite(trigPin, LOW);

Der Trigger-Pin veranlasst, dass der Ultraschallsensor ein Signal sendet.

18    dauer = pulseIn(echoPin, HIGH);
19    abstand = (dauer/2) / 29.1;
20    winkel = abstand*1.8;

Empfängt der Sensor ein Echo-Signal, wird der Echo-Pin in den HIGH-Zustand geschaltet. Mit der Funktion pulseIn wird die zeitliche Differenz zwischen Aussenden des Ultraschallsignals und der Schaltung des Echo-Pins in den HIGH-Zustand bestimmt. Daraus kann man den Abstand zum Sensor berechnen. Die Bewährte Formel hierfür ist, die gemessene Zeit (im Mikrosekunden) durch 2 und anschließend durch 29,1 zu teilen.

21     Serial.print(abstand);
22     Serial.println(" cm");

Daraus wird der einzustellende Winkel am Servo festgelegt. Da wir nur Abstände von einem Meter oder weniger messen wollen (siehe Schritt 8), bedeutet das, dass 100 cm = 180 Grad und 0 cm = 0 Grad am Servo sind. Also kann man den gemessenen Abstand der Einfachheit halber mit dem Faktor 1,8 multiplizieren.

Auf dem seriellen Monitor in der Arduino-IDE lässt sich der aktuell gemessene Abstand anzeigen. Damit kann man während des Programmierens überprüfen, ob die gemessenen Werte auch stimmen, und gegebenenfalls Korrekturen vornehmen.

23    if(abstand<100)
24    {
25      myservo.write(winkel);
26    }
27    else{
28      myservo.write(180);
29    }

Da der Ultraschallsensor bis zu 3 Meter weit messen kann, müssen wir den Messbereich etwas eingrenzen. Unser Servo soll ab einem Abstand von einem Meter aktiv werden. Wird der Abstand von einem Meter oder weniger erreicht, wird durch myservo.write der richtige Winkel am Servo eingestellt. Beträgt der Abstand mehr als einen Meter, springt die Anzeige auf ihre Ursprungsposition zurück.

30    delay(500);
31  }

Alle 500 Millisekunden, also zwei mal in einer Sekunde, soll der Messvorgang und die Einstellung des Winkels am Servo wiederholt werden. So kann gewährleistet werden, dass sich die Anzeige ruhig bewegt und nicht zu oft nach links oder rechts ausschlägt.

 

Der Arduino-Code steht Ihnen unter dem Download-Link im Info-Kasten zur Verfügung.