Schlagwort-Archive: PWM

Projekt 1: DIY PDC

Jetzt wird es Zeit für das erste kleine Projekt mit dem Arduino. Es eignet sich sehr gut um Euch die grundlegende Funktionsweise des Microcontrollers zu erklären und ist außerdem ein gute Ausgangsbasis für Euren ersten Roboter. Außerdem wisst Ihr danach, wie der Abstandswarner für das Einparken im Auto funktioniert. 😉

Wenn Ihr Euch das Funduino Lernset aus meinem ersten Artikel bestellt (gibt es entweder direkt auf der Funduino Homepage oder bei Amazon), dann habt Ihr alle erforderlichen Teile zusammen.

I. Die benötigten Teile für das erste Projekt

Um das „Park Distance Control“ (PDC) nachbauen zu können benötigt Ihr folgende Teile:

1.) Arduino Uno R3 (oder Funduino Uno oder einen anderen Arduiono Uno Clone)

Funduino

2.) Ein USB Kabel (ist beim Funduino schon dabei)

USB_Kabel

3.) Ein sogenanntes „Breadboard“ oder Steckboard. Damit könnt Ihr einfache Schaltungen aufbauen, ohne Die Bauteile löten zu müssen.

Breadboard

4.) Dazu passende Steckkabel

Steckkabel

5.) 3 LEDs (rot, gelb, grün)

LED

6.) 3 Widerstände (mit je 330 Ohm); einen für jede LED. Die richtigen Widerstände erkennt Ihr an den Farbringen. Bei 330 Ohm sind es zwei Ringe in Orange und einer in Schwarz. Der letzte Ring ist meistens Gold (kann aber auch Silber sein). Alternativ könnt Ihr einen Widerstand auch mit einem Multimeter messen (wenn Ihr eins habt und wisst, wie das geht).

330_Ohm

7.) Einen Ultraschallsensor (Typ HC-SR04)

Ultraschallsensor

Alle Teile könnt Ihr natürlich auch einzeln erwerben, wenn Ihr das Lernset nicht kaufen möchtet, oder einige der Komponenten schon zu Hause habt.

II. Der Arduino im Überblick

Wenn Ihr alle Zutaten zusammen habt, dann kann es los gehen. Als erstes schauen wir uns den Arduino näher an.

arduino-board

Auf der linken Seite (hellgraues Rechteck, links oben) findet Ihr den USB Anschluss. Mit dem oben aufgeführten USB Kabel könnt Ihr den Arduino mit Eurem Computer verbinden um ihn zu programmieren oder Informationen (im laufenden Betrieb) mit ihm auszutauschen. Wenn Ihr den Arduino über den USB Port mit dem Computer verbindet, wird er auch direkt mit Strom versorgt und ist damit auch sofort funktionsfähig. Alternativ könnt Ihr auch den Stromanschluss links unten (schwarzes Rechteck in der Zeichnung) mit 9 Volt (z.B. einem 9V Block) versorgen. Dann ist der Arduino auch ohne Verbindung über den USB Port einsatzfähig.

Am oberen Rand seht Ihr zwei schwarze Steckerleisten. Die linke ist etwas länger als die rechte. Das sind die digitalen Ein- und Ausgänge des Arduino und damit der interessanteste Teil des Microcontrollers. Die einzelnen Ein-/ bzw. Ausgänge (Ports) sind von rechts nach links durchnummeriert. Pin 0 (RX) und Pin 1 (TX) sind für die serielle Datenübertragung reserviert und nicht frei programmierbar. Von Pin Nr. 2 bis Pin 13 sind die frei programmierbaren Ports, mit denen wir gleich arbeiten werden). Die Ports 3,5,6,9,10 und 11 sind zusätzlich noch mit „PWM“ beschriftet.

PWM steht für PulsWeitenModulation. Während alle anderen Ports nur mit 0 Volt (Port ist aus) oder 5 Volt (Port ist aktiviert) angesteuert werden können, können die PWM Ports auch Rechtecksignale in unterschiedlichen Frequenzen ausgeben. Damit lassen sich zum Beispiel Motoren mit einer Information zur gewünschten Geschwindigkeit ansteuern. Wenn hier nur 0 Volt oder 5 Volt als Signal möglich wäre, dann könnte man den Motor nur ein- oder ausschalten und nicht die Geschwindigkeit vorgeben. Das wäre aber sehr unpraktisch, weil z.B. ein Roboter entweder nur Vollgas fahren oder stehen bleiben könnte. Das Rechtecksignal müsst Ihr Euch ungefähr so vorstellen… pwmDazu aber später mehr, wenn wir uns mit der Steuerung von Motoren beschäftigen. Für unsere Einparkhilfe ist das noch nicht wichtig.

Am unteren Rand findet Ihr ebenfalls zwei schwarze Steckerleisten. Der rechte Teil der linken Leiste ist mit „Power“ überschrieben. Hier habt Ihr die Möglichkeit, Schaltungen mit 5 Volt Spannung zu versorgen. Das werden wir gleich auch bei unserem PDC machen.

III. Die Schaltung für das Park Distance Control Projekt aufbauen

Zunächst legt Ihr das Breadboard bzw. Steckboard vor Euch auf den Tisch. Ihr werdet feststellen, dass die Stecklöcher spaltenweise durchnummeriert sind,. Häufig in Abständen von 5 Spalten. Es ist wichtig zu wissen, dass alle Löcher in einer Spalte miteinander verbunden sind. In der Mitte des Boards verläuft horizontal eine „Rille“, die wiederum die Spalten in einen oberen und einen unteren Teil auftrennt, die auch nicht miteinander verbunden sind. Um einzelne Spalten (sowie die unteren und oberen Hälfte) miteinander zu verbinden müsst Ihr entweder die bunten Kabel, oder ein Bauteil (z.B. einen Widerstand) verwenden.

Dem nachfolgenden Bild könnt Ihr den Aufbau der Schaltung entnehmen.

PDC_Schaltung

Die Pins 2,3 und 4 (s.o.) versorgen die LEDs mit 5V Spannung und funktionieren wie Lichtschalter, die man über ein kleines Programm auf dem Arduino ansteuern kann. Wenn sie mit dem Wert „Low“ angesteuert werden, dann fließt kein Strom über den entsprechenden Pin. Wenn „High“ programmiert wird, dann fließen 5V und die LED leuchtet.

Die Vorwiderstände werden benötigt, weil der Arduino an seinen digitalen Pins 5 V Spannung liefert, eine rote LED aber nur 1,7 V Spannung bei 5 bis maximal 20 mA Stromstärke verträgt. Mit Hilfe eines Vorwiderstandes können wir aber dafür sorgen, dass nur die maximal benötigte Spannung bei der LED ankommt. Den Rest „verbraucht“ der Vorwiderstand. Aber wie stark muss der Widerstand sein? Das ermitteln wir mit dem Ohmschen Gesetz und der folgenden Formel:

R = (U1 – U2) / I

R bezeichnet dabei den Widerstand in Ohm, U die Spannung in Volt und I den Strom in Ampere oder Milliampere. Für unseren konkreten Fall setzten wir die folgenden Werte ein:

U1 = 5V = Spannung des Arduino
U2 = 1,7V = Maximale Spannung, die die LED verträgt
I = 0,01 A = 10 mA (Milliampere) = Strom, der fließen soll.

R = (5V – 1,7V) / 0,01 A =  330 Ohm

Wenn Ihr Euch dazu noch ein bisschen Hintergrundwissen aneignen wollt, dann könnt Ihr das hier tun.

Die LEDs lassen den Strom übrigens nur in einer Richtung durch. Sie haben eine „+ Seite“ bzw. Anode und eine „- Seite“ bzw. Kathode. Die Anode erkennt Ihr bei der LED an dem längeren der beiden Füßchen. In unserer Schaltung müsst Ihr dieses längere Füßchen beim Stecken der LED in das Breadboard auf der rechten Seite haben, denn der Strom fließt immer von Plus (+5V) nach Minus (GND).

Die rote Linie, die ich bei der roten LED eingezeichnet habe, verdeutlicht, wie Ihr die Teile in das Board stecken müsst. Das gilt für die gelbe und grüne LED gleichermaßen.

Pin 7 versorgt den „Trigger“ des Ultraschallsensors mit 5V Spannung, wenn er über das Programm entsprechend angesteuert wird. das Prinzip ist wie bei den LEDs. Nur das in diesem Fall der Sensor ein kurzes Ultraschallsignal abschickt, wenn die 5V anliegen. Der „Echo“ Pin (Pin 8) wird per Software als Eingang (Input) konfiguriert. Wenn die Schallwelle (die durch den Trigger versendet wurde) wieder beim Sensor eintrifft, wird der Pin 8 des Arduino mit 5V Strom (durch den Sensor) versorgt. In dem Programm können wir dann die Zeit messen, die zwischen Aussenden des Ultraschallsignals bis zur Rückkehr des Schallsignals vergangen ist. Wenn man de Schallgeschwindigkeit kennt, kann man daraus sehr einfach die Entfernung zum Objekt errechnen. Das ist das gleiche Prinzip, das Fledermäuse für die Ortung von Hindernissen verwenden. Damit das Echo auch empfangen werden kann, muss der Ultraschallsensor permanent mit einer Betriebsspannung von 5 Volt versorgt werden. Das erfolgt durch die beiden äußeren der 4 Pins des Sensors. Den einen verbinden wir mit dem „gesammelten Minuspol“ der Schaltung, den anderen mit dem +5 V Pin des Arduino (s.o.).

Beim „gesammelten Minuspol“ der Schaltung müsst Ihr beachten, dass die „Ritze“ in dem Breadboard mit einer Kabelbrücke „überbrückt“ werden muss. Sonst gibt es zwischen dem oberen Teil und dem unteren Teil des Boards keine Verbindung. Diese „Minuspol Spalte“ (wo alle weißen Kabel der Schaltung zusammenlaufen) verbinden wir zum „abführen“ der Spannung mit dem „GND“ Pin des Arduino. Damit schließt sich der Stromkreislauf. „GND“ steht dabei übrigens für Ground (englisch für Erde). Der Minuspol einer Schaltung wird auch als Erde bezeichnet.

IV. Den Arduino anschließen und die Software installieren

Ihr könnt die Software auf der Seite des original Herstellers downloaden. http://arduino.cc/en/Main/Software

Sie läuft natürlich auch mit allen gängigen Clones (Funduino & Co.) und unter Windows, Mac OS und Linux.

Führt einfach das Installationsprogramm nach dem Download aus und folgt den Anweisungen. Nach der Installation verbindet ihr den Arduino per USB mit dem Rechner und schon kann es los gehen. Die Programme, die auf den Arduino hochgeladen werden können nennen sich „Sketch“.

Die Syntax der Sprache erinnert an Java. Einen kompletten Überblick über die Syntax und die zur Verfügung stehenden Befehle und Bibliotheken in englischer Sprache bekommt Ihr hier… http://arduino.cc/en/Reference/HomePage

Im nachfolgenden Kapitel habe ich den Sketch für unser PDC Projekt hinterlegt. Den könnt Ihr entweder abtippen, oder gleich per Copy & Paste in das Programmierfenster der Arduino Software kopieren und in den Arduino hochladen. Wie der Sketch funktioniert, erkläre ich unten über die eingefügten Kommentare.

V. Die Programmierung des Arduino

Der Sketch

————————————————————————————

//  Im oberen Teil des Sketches werden immer alle Variablen deklariert. „int“ steht für ganzzahlige
// Variablen. Variablen vom Typ „long“ sind Zahlen mit Nachkommastellen.

int trigger=7; // „trigger“ ist mit dem Digitalport (Pin 7) des Auslösers des Ultraschallsensors belegt.
int echo=8; // „echo“ ist mit dem Digitalport (Pin 8) bzw. Eingang des Ultraschallsensors belegt.
long dauer=0; // „dauer“ speichert die Zeit zwischen Trigger (Auslöser) und Eingang des Echos.
long entfernung=0; // „Entfernung“ nimmt die errechnete Entfernung zum Objekt auf
int gruen = 4; // Digitalport für die grüne LED (Pin 4)
int gelb = 3; // Digitalport für die gelbe LED (Pin 3)
int rot = 2; // Digitalport für die rote LED (Pin 2)

// Im nachfolgenden Abschnitt werden die Ports definiert Pin Mode OUTPUT bedeutet, 
// dass der Port ein +5V Ausgangssignal aufnimmt und etwas ansteuert, wie z.B. die LEDs
// oder den Auslöser des Sensors. INPUT steht dafür, dass der Port ein eingehendes Signal 
// aufnimmt, z.B. das Echo Signal des Sensors, wenn die Schallwelle zurück kommt. 

void setup()

{
pinMode(gruen, OUTPUT);
pinMode(gelb, OUTPUT);
pinMode(rot, OUTPUT);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);

}

// Bei „loop“ handelt es sich um eine sogenannte Schleife, die immer wieder von Anfang bis Ende
// durchlaufen wird. 

void loop()
{

// Digital Write ist ein Befehl, der eine Ausgabe an einem Port (Pin) des Arduino bewirkt.
// Der erste Wert in der Klammer gibt den Pin an, auf dem die Ausgabe erfolgen soll.
// Der zweite Wert (hinter dem Semikolon) gibt den Wert an, der an den Port geschickt wird.
// Die Variable „trigger“ hatten wir oben mit der Zahl 7 belegt. Damit steuert die nachfolgende
// Codezeile Pin 7 (ist mit dem Trigger des Sensors verbunden) mit dem Wert „LOW“ an.

digitalWrite(trigger, LOW); // Hier wird der Auslöser mit „LOW“ abgeschaltet (sicher ist sicher)

delay(5); // Dies bewirkt eine kurze Verzögerung von 5 Millisekunden.
digitalWrite(trigger, HIGH); // Hier wird der Auslöser mit „HIGH“ eingeschaltet und die Schall-
// welle verlässt den Ultraschallsensor.
delay(10); // 10 Millisekunden warten
digitalWrite(trigger, LOW); // Auslöser mit „LOW“ wieder abschalten.
dauer = pulseIn(echo, HIGH); // Mit „pulseln“ wird die Dauer zwischen Auslösen de Schall-
// welle und wieder Eingang des Echos am Echo Eingang des Sensors gemessen. Bzw.
// die Messung am Eingang des Sensors (bzw. Pin 8 am Arduino) aktiviert.

entfernung = (dauer/2) / 29.1; // Die Dauer muss durch 2 geteilt werden, weil wir die ja die
// Zeit gemessen haben, die der Schall benötigt um vom Sensor zum Hindernis und
// wieder zurück zu kommen. Die halbe Dauer wird dann durch die Schallgeschwindigkeit
// geteilt. Das Ergebnis ist die Entfernung in Zentimetern.

pulseIn(echo, LOW); // Messeingang wieder ausschalten.

if (entfernung >= 50) // Wenn die Entfernung größer 50 cm ist, grüne LED einschalten.
{
digitalWrite(gelb, LOW);
digitalWrite(rot, LOW);
digitalWrite(gruen, HIGH);
}

// Wenn die Entfernung zwischen 15 und 50 cm ist, gelbe LED einschalten.

if (entfernung < 50 & entfernung >= 15)
{
digitalWrite(gruen, LOW);
digitalWrite(rot, LOW);
digitalWrite(gelb, HIGH);
}

// Wenn die Entfernung kleiner 15 cm ist, rote LED einschalten.

if (entfernung < 15)
{
digitalWrite(gruen, LOW);
digitalWrite(gelb, LOW);
digitalWrite(rot, HIGH);
}
}

————————————————————————————

Jetzt müsst Ihr den Sketch nur noch per USB in den Arduino hochladen. Wenn er fertig hochgeladen ist, wird er automatisch ausgeführt und ihr könnt das PDC ausprobieren. Viel Spaß dabei. Bei Fragen könnt Ihr gerne in das Kommentarfeld posten. Ich versuche möglichst zeitnah zu antworten. Als nächstes poste ich ein kleines Projekt für einen ersten autonomen Roboter mit Ultraschallsensor, der Hindernisse umfahren kann. Das sollte nach dieser Einführung für jeden beherrschbar sein.