24
Seite -1- A A r r d d u u i i n n o o J. Gräber 2013 Seite -2-

Arduino - SFZ Standort FN · Seite -5- Vorbemerkung Zum Aufbau dieser Anleitung: • Nach einer kurzen Vorstellung der Hard- und Software werden die neuen elektronischen Bauelemente

Embed Size (px)

Citation preview

Seite -1-

AArrdduuiinnoo

J. Gräber 2013

Seite -2-

Seite -3-

IInnhhaallttssvveerrzzeeiicchhnniiss__________

Tabellarischer Überblick

Bauelemente (mit Schaltzeichen) und Befehle

Kapitel Nr.

Neue Bauelemente

Schaltzeichen Neue Befehle

1 & Einführung

LED

• pinMode

• digitalWrite

• delay

2 Wechselschalter

• digitalRead

• if (else)

• vergleichende Operatoren

• int

3 Taster

4 Potentiometer

• analogRead

• Rechenoperatoren

• Serial.begin

• Serial.print / Serial.println

5 LDR Fotowiderstand

6 • analogWrite

7 • for

8 L293D Motosteuer IC

9 Unterprogramme und definierte Funktionen

Seite -4-

________________________________________

Kapitel Nr.

Neue Bauelemente

Schaltzeichen Neue Befehle

10 • Serial.read

11 Lautsprecher

• tone

12 Reflexoptokoppler

13 Servo

• Servo-Befehle

• map

14 Temperatursensor LM35

Seite -5-

VVoorrbbeemmeerrkkuunngg

Zum Aufbau dieser Anleitung: • Nach einer kurzen Vorstellung der Hard- und Software werden die neuen

elektronischen Bauelemente und Befehle schrittweise eingeführt. So besteht der „praktische“ Teil immer aus dem Aufbau:

o Neue Bauelemente o Neue Befehle o Aufgabe o „weitere“ Aufgaben

• Das Erlernen der Programmiersprache stützt sich dabei auf die zahlreichen

Beispielprogramme (Sketches), die bereits hinterlegt sind. Danach soll aktiv mit den neuen Befehlen umgegangen werden, um weitere Aufgaben zu lösen. Dabei werden früher erlernte Befehle immer wieder aufgegriffen.

• Nach diesem Kurs sollten die Schülerinnen und Schüler in der Lage sein, selbständig ein Projekt mit dem Arduino durchzuführen.

LLiinnkkss • Arduino Homepage:

http://www.arduino.cc/

• Tutorials: http://www.kriwanek.de/arduino/wie-beginnen.html http://www.arduino-tutorial.de/einfuhrung/ http://popovic.info/html/arduino/arduinoUno_1.html http://www.netzmafia.de/skripten/hardware/Arduino/Arduino_Programmierhandbuch.pdf (Arduino Handbuch)

• Video-Tutorials: http://www.arduino-tutorial.de/category/videoworkshop/ http://mr.intermediadesign.de/tag/arduino/ http://maxtechtv.de/category/arduino/beginner/

• Projekte: http://www.maxpie.de/Projekt_arduino.htm

Seite -6-

IInnssttaallllaattiioonn

Auswahl des Arduino-Boards

Auswahl des Seriellen Ports:

Normalerweise wird der Arduino über den Seriellen Port mit der höchsten Nummer verbunden. Ansonsten bitte im Gerätemanager (Systemsteuerung) nachschauen

Seite -7-

EEiinnffüühhrruunngg ____________________

Die Hardware

Das Grundprinzip eines Mikrocontrollers Um Leuchtdioden leuchten zu lassen oder Motoren zu steuern, erzeugt ein Mikrocontroller an seinen Pins (Anschlüssen) verschiedene Spannungen.

• Digitale Pins: Sie haben entweder den Zustand HIGH oder LOW. Es liegen dann entweder 0V oder 5V an.

• Analoge Pins:

Ihr Spannungswert kann zwischen 0V und 5V liegen. Über die Pins können auch Spannungswerte eingelesen werden. Damit kann man z.B. überprüfen, ob ein Schalter geöffnet ist oder geschlossen, ob viel Licht auf eine Photozelle fällt oder wenig. Auch hier gibt es die Unterscheidung zwischen digitalen Pins (Entweder HIGH oder LOW) und den analogen Pins (Spannungswerte zwischen 0V und 5V).

Seite -8-

__________________________________ 11

Die Software

Beispielprogramme (Sketches)

Sketch

überprüfen

Sketch upload Sketch

neu

Sketch

öffnen

Sketch speichern

Seite -9-

EEiinnffüühhrruunngg ____________________ Ein Programm wird allgemein mit „Sketch“ bezeichnet. Alle Sketches haben den gleichen Aufbau:

Beispielprogramm für eine blinkende LED:

Dieser Programmteil wird einmal durchlaufen! (Setzen von Pinmode oder Start der seriellen Kommunikation)

Dieser Programmteil wird unendlich oft durchlaufen! Hier befindet sich das eigentliche Programm, der so genannte Programmcode.

Seite -10-

____________________________________ 22 Neue Befehle:

• int led = 13; Die Variable led wird mit dem (Integer-) Wert 13 belegt.

• pinMode(led, OUTPUT) Da die Variable led mit dem Wert 13 belegt wurde, wird PIN13 als OUTPUT deklariert. D.h. er kann die Werte HIGH (5V) und LOW (0V) annehmen und damit eine Leuchtdiode ansteuern.

• digitalWrite(led, HIGH) PIN13 wird HIGH (5V) gesetzt.

• delay(1000) Bis zur Verarbeitung des nächsten Befehls wartet der Arduino 1000 ms.

Info Datentypen:

• byte Byte speichert einen 8-bit numerischen, ganzzahligen Wert ohne Dezimalkomma. Der Wert kann zwischen 0 und 255 sein. byte y = 180; // deklariert y als einen 'byte' Datentyp

• int Integer ist der meist verwendete Datentyp für die Speicherung von ganzzahligen Werten ohne Dezimalkomma. Sein Wert hat 16 Bit und reicht von -32.767 bis 32.768. int x = 1500; // deklariert y als einen 'integer' Datentyp

Bemerkung: Integer Variablen werden bei Überschreiten der Limits 'überrollen'. Zum Beispiel wenn x = 32767 und eine Anweisung addiert 1 zu x, x = x + 1 oder x++, wird 'x' dabei 'überrollen' und den Wert -32,768 annehmen.

• long Datentyp für lange Integer mit erweiterer Größe, ohne Dezimalkomma, gespeichert in einem 32-bit Wert in einem Spektrum von -2,147,483,648 bis 2,147,483,647. long z = 9000; // deklariert z als einen 'long' Datentyp

• float Ein Datentyp für Fliesskomma Werte oder Nummern mit Nachkommastelle. Fliesskomma Nummern haben eine bessere Auflösung als Integer und werden als 32-bit Wert mit einem Spektrum von -3.4028235E+38 bis 3.4028235E+38. float pi = 3.14; // deklariert pi als einen 'float' Datentyp

Seite -11-

KKaappiitteell ____________________________ Neue Bauelemente: LED, Steckplatine Neue Befehle: - Ziel: Eine bzw. mehrer LED zum Leuchten bringen

Aufgabe A1.1: • Schließe eine rote LED am Pin 13

Achte auf die Polung (siehe Info)

• Öffne im Ordner „Sketches“ den Sketch „A011_Blink“

• Übertrage den Sketch auf den Arduino.

• Beobachte die eingebaute LED.

INFO: LED

• Auf dem Arduinoboard befindet sich an Pin 13 eine eingebaute LED. Man hätte auf eine zusätzliche LED wie in der Aufgabe A1.1 verzichten können.

• Wird an einem anderen Pin eine LED

angeschlossen muss ein Vorwiderstand von 220 Ohm verwendet werden. (Dieser ist bei Pin 13 bereits mit eingebaut)

Info: Steckplatine

Die seitlichen Kontakte (blau bzw. rot umrandet) sind in der Regel über die ganze Länge leitend miteinander verbunden. Ansonsten sind die 5er-Reihen (schwarz umrandet) leitend miteinander verbunden.

Seite -12-

____________________________________ 11 Aufgabe A1.2 :

• Ändere den Sketch „A011_Blink“ so ab, dass die LED 3 Sekunden lang leuchtet und 1 Sekunde lang dunkel bleibt.

• Speichere den neuen Sketch im Ordner „Sketches“ unter „A012_Blink2_(xx)“ ab. xx = Dein Name.

Aufgabe A1.3 :

• Baue eine Schaltung auf, bei der abwechselnd eine rote und gelbe LED blinkt.

• Verwende dazu eine Steckplatine. • Vorwiderstände nicht vergessen! • Ändere den Sketch „A011_Blink“ entsprechend ab. • Speichere den neuen Sketch unter „A013_Blink_2LED_(xx)“ ab. • Zeichne den Schaltplan.

Steckbeispiel für 2 LEDs:

Aufgabe A1.4: • Baue eine Ampelschaltung aus einer roten, gelben und grünen LED auf. • Schreibe den Sketch. • Übertrage das Programm. • Speichere den Sketch unter dem Namen „A014_Ampel_(xx)“ ab. • Zeichne den Schaltplan.

Seite -13- Pin 0V 5V

KKaappiitteell ____________________________

Neue Bauelemente: Wechselschalter

Neue Befehle:

• const • digitalRead • if (else)

Ziel: Eine LED mit einem Wechselschalter an- und ausschalten.

Aufgabe A2.1: • Baue die Schaltung wie in der Abbildung auf. • Öffne den Sketch „A021_LED_mit_Schalter“. • Starte den Sketch. • Verändere die Schalterstellung und beobachte die LED.

INFO: Wechselschalter Bei dem Wechselschalter in dieser Abbildung liegen die beiden äußeren Kontakte auf 5V bzw. 0V. Je nach Schalterstellung ist der Mittenkontakt mit einem der beiden äußeren Kontakte verbunden. Damit ist der Zustand von Pin10 eindeutig festgelegt. Es liegen entweder 5V (HIGH) oder 0V (LOW) an. Bemerkung: Nicht alle Schalter sind so aufgebaut, dass der Mittenkontakt auch in der Mitte ist.

Seite -14-

______________________________________ 22

Neue Befehle: • const

Der Wert dieser Variablen bleibt konstant und kann auch später nicht verändert werden.

• digitalRead(buttonPin) Liest den Zustand (HIGH oder LOW) eines Pins aus. (Hier Pin 10)

• if (else) Mit diesem Befehl wird abgefragt, ob ein Aussage wahr ist. In diesem Fall, ob ein Pin im Zustand HIGH ist. Ist die Aussage nicht wahr geht das Programm zu dem Teil else weiter. Vergleichende Operatoren

Seite -15-

KKaappiitteell ____________________________

Aufgabe A2.2: • Schließe eine weitere LED an. • Ändere den Sketch so ab, dass bei gedrücktem Schalter LED1 leuchtet und bei

geöffnetem Schalter LED2 leuchtet. • Speichere den Sketch unter dem Namen „A022_2LED_mit_Schalter_(xx)“. • Zeichne den Schaltplan.

Tipp: Übersicht beim Programmieren

a) Kommentare (//) und Block Kommentare (/*... */) Kommentare sind Textbereiche die vom Programm ignoriert werden. Sie werden für längere Beschreibungen oder Kommentare verwendet und helfen anderen Autoren Programmteile zu verstehen. • Einzeilige Kommentare fangen mit // an. • Blockkommentare fangen mit /* an und enden mit */ und umfassen

mehrere Zeilen.

b) Einrücken Durch „Einrücken“ in den Befehlszeilen wird der Sketch übersichtlicher gestaltet. So wird z.B. jede Zeile die zu „void setup“ gehört um 2 Zeichen eingerückt.

Seite -16-

______________________________________ 22

Seite -17-

KKaappiitteell ____________________________ Neue Bauelemente: Taster Neue Befehle: - Ziel: Eine LED soll leuchten, wenn ein (einfacher) Taster gedrückt wird.

Aufgabe A3.1: • Baue die Schaltung wie in der Abbildung auf. • Lies den Abschnitt „INFO: Der Spannungsteiler“ durch. • Öffne und starte den Sketch „A031_LED_mit_Taster“.

(Dieser Sketch entspricht dem Sketch „A02_LED_mit_Schalter“)

INFO: Der Spannungsteiler Was geschieht, wenn man einen Eingangspin sowohl an ein Potential von 5V als auch an ein Potential von 0V anschließt? Wird der Pin dann HIGH oder LOW sein? Wenn man einen Pin ganz direkt sowohl mit 5V als auch mit 0V verbindet, erzeugt man einen Kurzschluss. Das ist keine gute Idee: Der Spannungsregler wird überhitzen und sich hoffentlich rechtzeitig abschalten, bevor etwas kaputt geht.

Seite -18-

______________________________________ 33

Interessanter wird es, wenn man die beiden Verbindungen vom Pin zu 5V bzw. vom Pin zu 0V jeweils mit Widerständen erzeugt (Siehe Abbildung Seite -13-). So entsteht kein Kurzschluss, da nur ein schwacher Strom durch die beiden Widerstände fließt. Diese Schaltung bezeichnet man als Spannungsteiler mit einem Mittelkontakt. Der Pull-Up-Widerstand Rup und der Pull-Down-Widerstand Rdown teilen sich die Gesamtspannung entsprechend ihrer Anteile am Gesamtwiderstand in die Spannung Uup und Udown auf. Das Potential am Port des Mikrocontrollers entspricht Udown und lässt sich aus den Widerstandswerten und der Gesamtspannung berechnen:

Mit Hilfe eines Spannungsteilers kann man damit auch normale Taster oder Schalter an den Eingängen eines Mikrocontrollers einsetzen. Setzt als Pull-Up-Widerstand einen Widerstand von 10 kΩ ein, an Stelle des Pull-Down-Widerstands einen Schalter bzw. Taster. Er hat in geöffnetem Zustand einen Widerstand von nahezu unendlich (über 100 MΩ), im geschlossenen Zustand einen Widerstand von unter 1Ω. Im geschlossenen Zustand liegen damit am Pin 0V an (LOW), im geöffneten Zustand 5V (HIGH).

Aufgabe A3.2: • Berechne das Potential am Mittelkontakt (also Udown ) für Rup=10 kΩ und

Rdown= 10 kΩ . • Berechne das Potential am Mittelkontakt (also Udown ) für Rup=8 kΩ und

Rdown= 2 kΩ . • „Berechne“ das Potential am Mittelkontakt (also Udown ) für Rup=10 kΩ und für

den Fall dass der Taster geöffnet bzw. geschlossen ist.

Aufgabe A3.3:

• Vertausche den Taster und den 10 kΩ-Widerstand (s. Abb.) • Wie ändert sich das Verhalten der Schaltung?

Seite -19-

KKaappiitteell ____________________________ Neue Bauelemente: Potentiometer Neue Befehle:

• analogRead • Serial.begin(9600) • Serial.print / Serial.println • Rechenoperatoren

Ziel: Ein Potentiometer wird an einem analogen Eingang angeschlossen. Der

anliegende Wert wird ausgelesen und über die serielle Verbindung an den Computer zurückgesendet.

Bemerkung: Der Arduino muss in diesem Fall mit dem Computer verbunden bleiben. Alternativ kann später ein LCD-Display eingesetzt werden.

Aufgabe A4.1: • Baue die Schaltung wie in der Abbildung auf • Öffne den Sketch „A041_Poti“. • Starte das Programm. • Öffne den „seriellen Monitor“ (STRG+UMSCHALT+M). • Verändere die Stellung des Potentiometers und beobachte die Werte im

Fenster des seriellen Monitors.

Seite -20-

______________________________________ 44

Neue Befehle: • analogRead(pin)

Liest den Wert eines festgelegten analogen Pins aus. Die resultierenden Integer Werte haben ein Spektrum von 0 bis 1023. Bemerkung: Analoge Pins müssen im Gegensatz zu digitalen nicht zuerst als Eingang oder Ausgang deklariert werden.

• Serial.begin(9600) Öffnet den seriellen Port und setzt die Datenrate auf 9600 bps.

• Serial.print / Serial.println Sendet eine Nachricht oder einen Wert an den seriellen Monitor. Serial.print("Das ist eine Nachricht ohne Zeilenumbruch"); Serial.println("Das ist eine Nachricht mit Zeilenumbruch am Ende"); Serial.print(sensorValue); Sendet den Wert der Variable sensorValue.

Seite -21-

KKaappiitteell ____________________________ Aufgabe A4.2:

• Rechne die ausgelesenen Werte so um, dass sie den Werten der am analogen Eingang anliegenden Spannung entsprechen.

• Ändere den Sketch so ab, dass auf dem seriellen Monitor der Spannungswert ausgegeben wird, wie z.B.: „Die Spannung beträgt: 2,1 V“

• Speichere den Sketch unter dem Namen „A042_Poti_Spannung_(xx)“ ab.

INFO: Rechenoperatoren Arithmetische Operatoren umfassen Addition, Subtraktion, Multiplikation und Division. Sie geben die Summe, Differenz, das Produkt oder den Quotienten zweier Operatoren zurück. y = y + 3; x = x - 7; i = j * 6; r = r / 5; Die Operation wird unter Beibehaltung der Datentypen durchgeführt. 9 / 4 wird so zum Beispiel zu 2 und nicht 2,25, da 9 und 4 Integer sind und keine Nachkommastellen unterstützen. Dies bedeutet auch, dass die Operation überlaufen kann wenn das Resultat größer ist als der Datentyp zulässt. Wenn die Operanden unterschiedliche Datentypen haben wird der größere Typ verwendet. Hat zum Beispiel eine der Nummern (Operanden) den Datentyp 'float' und der andere 'int', so wir Fliesskomma Mathematik zur Berechnung verwendet. Bemerkung: Wähle variable Größen die groß genug sind um die Werte der Ergebnisse zu speichern. Sei Dir bewusst an welcher Stelle die Werte überlaufen und auch was in der Gegenrichtung passiert. z.B. bei (0 - 1) oder (0 - - 32768). Für Berechnungen die Brüche ergeben sollten immer 'float' Variablen genutzt werden. Allerdings mit dem Bewusstsein der Nachteile: Großer Speicherbedarf und langsame Geschwindigkeit der Berechnungen. Nutze den Form Operator z.B. (int)myFloat um einen Variablen Typen spontan in einen anderen zu verwandeln. Zum Beispiel wird mit i = (int)3.6 die Variable i auf den Wert 3 setzen. Gemischte Zuweisungen Gemischte Zuweisungen kombinieren eine arithmetische Operation mit einer Variablen Zuweisung. Diese werden üblicherweise in Schleifen gefunden, die wir später noch genauer Beschreiben werden. Die gängigsten gemischten Zuweisungen umfassen: x ++ // identisch mit x = x + 1, oder Erhöhung von x um +1 x -- // identisch mit x = x - 1, oder Verminderung von x um -1 x += y // identisch mit x = x + y, oder Erhöhung von x um +y x -= y // identisch mit x = x - y, oder Verminderung von x um -y x *= y // identisch mit x = x * y, oder Multiplikation von x mit y x /= y // identisch mit x = x / y, oder Division von x mit y Bemerkung: Zum Beispiel führt x *= 3 zur Verdreifachung des alten Wertes von 'x' und weist der Variablen 'x' des Ergebnis der Kalkulation zu.

Seite -22-

______________________________________ 44

Seite -23-

KKaappiitteell ____________________________ Neue Bauelemente: LDR (Light Dependent Resistor) Lichtsensor Neue Befehle: - Ziel: Eine LED soll leuchten, wenn ein LDR abgedunkelt wird.

Aufgabe 5.1: • Baue die Schaltung wie in der Abbildung, jedoch ohne LED und

Vorwiderstand, auf. • Öffne den Sketch „A051_LDR“ • Starte den Sketch. • Öffne den seriellen Monitor. • Dunkle mit deiner Hand den LDR ab und beobachte dabei die

Werte auf dem seriellen Monitor.

Info: LDR Ein Fotowiderstand ist ein Halbleiter, dessen Widerstandswert lichtabhängig ist. Ein LDR besteht aus zwei Kupferkämmen, die auf einer isolierten Unterlage (weiß) aufgebracht sind. Dazwischen liegt das Halbleitermaterial in Form eines gewundenen Bandes (rot). Fällt das Licht (Photonen) auf das lichtempfindliche Halbleitermaterial, dann werden die Elektronen aus ihren Kristallen herausgelöst (Paarbildung). Der LDR wird leitfähiger, das heißt, sein Widerstandswert wird kleiner. Je mehr Licht auf das Bauteil fällt, desto kleiner wird der Widerstand.

Seite -24-

______________________________________ 55

Aufgabe 5.2: • Ergänze die Schaltung durch die rote LED mit Vorwiderstand. • Ändere den Sketch so ab (Befehl IF und ELSE), dass die LED ab einem

bestimmten Schwellenwert anfängt zu leuchten. • Speichere den Sketch unter dem Namen „A052_LDR_(xx)“ ab. • Zeichne den Schaltplan.

Aufgabe 5.3: • Füge eine grüne LED mit Vorwiderstand hinzu. • Ändere den Sketch so ab, dass nur die rote LED oberhalb eines

bestimmten Schwellenwerts leuchtet und die grüne LED nur unterhalb des Schwellenwerts leuchtet.

• Speichere den Sketch unter dem Namen „A053_LDR_2LED_(xx)“ ab. • Zeichne den Schaltplan.

Seite -25-

KKaappiitteell ____________________________ Neue Bauelemente: - Neue Befehle: analogWrite Ziel: Eine LED soll mit einem LDR gedimmt werden.

Aufgabe 6.1: • Baue die Schaltung wie in der Abbildung auf. • Öffne und starte den Sketch „A061_LDR_Dimmen“ • Verändere die Stellung des Potentiometers und beobachte dabei die LED.

Notiere deine Beobachtungen.

Seite -26-

______________________________________ 66

INFO: PWM (PulsWeitenModulation) Ein digitaler Pin kennt die beiden Zustände HIGH und LOW. Dann liegen an diesem Pin entweder 0V oder 5V an. Einige der digitalen Pins auf dem Arduino-Board sind mit „PWM“ (oder „~“) gekennzeichnet. Mit dem Befehl analogWrite(pin, value) kann man an diesen Pins eine pseudo-analoge Spannung erzeugen: Der Befehl analogWrite(11, 0) generiert eine gleichmäßige Spannung von 0 Volt an Pin11, der Befehl analogWrite(11, 255) generiert eine gleichmäßige Spannung von 5 Volt an Pin11. Für Werte zwischen 0 und 255 wechselt der Pin sehr schnell zwischen 0 und 5 Volt - je höher der Wert, desto länger ist der Pin HIGH (5 Volt). Der Befehl analogWrite(11, 127) führt dazu, dass die Ausgangsspannung zur Hälfte der Zeit auf HIGH steht und zur anderen Hälfte auf LOW. Bei analogWrite(11, 192) 192 misst die Spannung am Pin zu einer Viertel der Zeit 0 Volt und zu Dreivierteln die vollen 5 Volt. Weil dies eine hardwarebasierte Funktion ist, läuft die konstante Welle unabhängig vom Programm bis zur nächsten Änderung des Zustandes per analogWrite (bzw. einem Aufruf von digitalRead oder digitalWrite am selben Pin).

Aufgabe 6.2: • Ersetze in der Schaltung das Potentiometer durch einen Spannungsteiler

aus einem 10 kΩ Widerstand und einem LDR. (Siehe Praktikum 5) • Starte den Sketch. • Öffne den seriellen Monitor. • Dunkle den LDR mit der Hand ab und beobachte die LED. • Notiere deine Beobachtungen. • Zeichne den Schaltplan.

Seite -27-

KKaappiitteell ____________________________ Neue Bauelemente: - Neue Befehle: For (Schleife) Ziel: Eine LED soll ein- und ausfaden, d.h. langsam heller und dunkler werden.

Aufgabe 7.1: • Baue die Schaltung wie in

der Abbildung auf. • Öffne den Sketch

„A071_LDR_Faden“ • Starte den Sketch.

Seite -28-

______________________________________ 77 Neuer Befehl: for Die for-Schleife wird verwendet um einen Block von Anweisungen in geschweiften Klammern eine festgelegt Anzahl von Wiederholungen durchlaufen zu lassen. Es gibt im Header der for-Schleife drei Elemente, getrennt durch Semikolon ';'.

for (Initialisierung; Bedingung; Ausdruck/Anweisung) doSomething;

1. Die Initialisierung einer lokalen Variablen, einem ansteigenden oder absteigenden Zähler.

2. Bei jedem Durchlaufen der Schleife wird die Bedingung an der zweiten Stelle getestet. (siehe vergleichende Operatoren Seite 12)

3. Wenn die Bedingung wahr ist läuft die Schleife weiter und die folgenden Ausdrücke und Anweisungen werden ausgeführt und die Bedingung wird erneut überprüft. Ist die Bedingung nicht mehr wahr so endet die Schleife.

Das folgende Beispiel startet mit einem Integer Wert 'i' bei 0, die Bedingung testet ob der Wert noch kleiner als 20 ist und wenn dies wahr ist so wird 'i' um einen Wert erhöht und die Anweisungen innerhalb der geschweiften Klammern werden ausgeführt:

Aufgabe 7.2: • Ergänze zwei weitere LEDs • Ändere den Sketch so ab, dass eine LED nach der anderen hell und dunkel

wird. • Speichere den Sketch unter dem Namen „A072_3LED_Faden_(xx)“ ab.

Aufgabe 7.3: • Ergänze einen Taster. • Ändere den Sketch so ab, dass der Taster gedrückt werden muss, damit

die nächste (erste) LED hell wird. • Speichere den Sketch unter „A072_3LED_Faden_Taster_(xx)“ ab. • Zeichne den Schaltplan.

Seite -29-

KKaappiitteell ____________________________ Neue Bauelemente: L293D (Motorsteuerungs IC) Neue Befehle: - Ziel: Ein oder zwei Gleichstrommotoren sollen angesteuert werden.

INFO: Motorsteuerung für 1 Motor: Ein einfacher Elektromotor hat zwei Anschlüsse. Wenn eine Spannung anliegt, dreht sich der Motor in die eine Richtung, kehrt man die Spannung um, dreht sich der Motor in die andere Richtung. Welches Pin man dazu wo am L293D anschließen muss und wie man die Drehrichtung vom Mikrocontroller aus steuern kann, wird hier erklärt:

Pinbelegung L293D

Bedeutung und Belegung

4,5,12,13 Erdung (0V) 16 Energieversorgung des IC (5V) 1 Enable-Pin des IC. Ist dieses mit 5V verbunden, sind die Motor-

Pins 3 und 6 aktiv. 8 Energieversorgung des Motors. Der Minus-Pol der

Energieversorgung muss mit Erde (0V) verbunden sein, also z.B. mit Pin4.

3 und 6 Anschluss des Motors 2 und 7 Anschluss an die Pins 2 und 3 des Arduino.

Pin2: HIGH Pin3: LOW Motor dreht sich Pin2: LOW Pin3: LOW Motor dreht sich nicht Pin2: LOW Pin3: HIGH Motor dreht sich umgekehrt Pin2: HIGH Pin3: HIgH Motor dreht sich nicht

Seite -30-

______________________________________ 88 Aufgabe 8.1:

• Baue die Schaltung wie in der Abbildung auf. • Öffne den Sketch „A081_Motorsteuerung“. • Starte den Sketch.

Aufgabe 8.2: • Ändere den Sketch „A081_Motorsteuerung“ so ab, dass sich der Motor 3

mal hintereinander (Befehl: for) jeweils 2 Sekunden in eine Richtung und nach einer Pause von 1 Sekunde 2 Sekunden in die andere Richtung dreht.

• Speichere den Sketch unter dem Namen „A082_Motorsteuerung_(xx)“ ab.

Seite -31-

KKaappiitteell ____________________________ INFO: Motorsteuerung für 2 Motoren:

Pinbelegung L293D

Bedeutung und Belegung

4,5,12,13 Erdung (0V) 16 Energieversorgung des IC (5V) 1 und 9 Enable-Pin des IC. Ist dieses mit 5V verbunden, sind die Motor-

Pins 3 und 6 bzw. 11 und 14 aktiv. 8 Energieversorgung des Motors. Der Minus-Pol der

Energieversorgung muss Erde (0V) verbunden sein (Siehe Schaltung)

3 und 6 Anschluss Motor 1 11 und 14 Anschluss Motor 2 2 und 7 Anschluss an die Pins 2 und 3 des Arduino. 10 und 15 Anschluss an die Pins 4 und 5 des Arduino.

Aufgabe 8.3: • Ändere den Sketch „A081_Motorsteuerung“ so ab, dass sich die Motoren

zunächst in die gleiche Richtung, in die umgekehrte Richtung und anschließend in verschiedene Richtungen drehen. (Pause 1 Sekunde)

• Erzeuge eine Ausgabe auf den seriellen Monitor, die über die Drehrichtung der einzelnen Motoren informiert.

• Zeichne den Schaltplan

Seite -32-

______________________________________ 88

Aufgabe 8.4: • Um die Geschwindigkeit der Motoren steuern zu können kann man die

beiden „enable Pins“ 1 und 9 des L293D an einen PWM-Ausgang des ARDUINO anschließen. Damit lässt sich die Leistung des L293D drosseln, indem man ihn z.B. nur 50% der Zeit aktiviert.

• Erweitere deine Schaltung. • Ändere den Sketch „A083_Motorsteuerung2_(xx)“ entsprechend ab und

speichere ihn unter dem Namen „A084_Motorsteuerung2_PWM_(xx)“ ab. • Zeichne den Schaltplan.

Aufgabe 8.5: Jetzt wird´s richtig kompliziert… • Regle die Geschwindigkeit der Motoren mit Hilfe eines Potis. • Erzeuge eine Ausgabe auf dem seriellen Monitor, die die Leistung der

Motoren in Prozent angibt. • Speichere den Sketch unter dem Namen

„A085_Motorsteuerung2_PWM_(xx)“ ab. • Zeichne den Schaltplan.

Seite -33-

KKaappiitteell ____________________________ Neue Bauelemente: - Neue Befehle: Unterprogramme und selbst definierte Funktionen Ziel: Sketches einfacher und übersichtlicher gestalten. Sketches lassen sich einfacher und übersichtlicher gestalten, wenn immer wieder auftretende Programmteile in Unterprogrammen „ausgelagert“ werden und mit nur einem Befehl aufgerufen werden. Dabei bilden die beiden Programmteile und die Grundstruktur eines Sketches. Entsprechend lassen sich weitere Unterprogramme erstellen. Allgemeine Form eines Unterprogramms:

Rückgabetyp: Gibt den Datentyp des Werts an, der zurückgegeben wird. (Siehe Beispiel 3) Wird kein Wert zurückgegeben, dann wird hier der Befehl void verwendet. (Siehe Beispiel 1 und 2) Funktionsname: Frei wählbarer Namen des Unterprogramms bzw. der Funktion. Paramaterliste Hier stehen die Werte, die an das Unterprogramm übergeben werden. Die Parameterliste kann auch leer bleiben (Siehe Beispiel 1)

Seite -34-

____________________________________ 99 1. Beispiel: Motorsteuerung

Das Unterprogramm ‚vorwaerts’ wird aufgerufen.

Seite -35-

KKaappiitteell ____________________________

2. Beispiel: Motorsteuerung (mit Übergabe von Werten)

‚x’ ist eine lokale Variable und nur gültig innerhalb des Unterprogramms.

Seite -36-

______________________________________ 99

3. Beispiel: Multiplikation zweier Werte (mit Rückgabe des Ergebnisses)

Aufgabe A9.1:

• Schreibe den Sketch „A081_Motorsteuerung_(xx)“ bzw. „A082_Motorsteuerung_(xx)“ neu mit Hilfe von Unterprogrammen.

• Speichere den Sketch unter „A091_Motorsteuerung_(xx)“ bzw. „A092_Motorsteuerung_(xx)“ ab

Die Funktion „multipliziere“ wird aufgerufen und die beiden Werte werden mit übergeben. Das Ergebnis wird in der Variablen ‚produkt’ abgelegt.

Die Funktion „multipliziere“ kann auch direkt aufgerufen werden.

Seite -37-

KKaappiitteell ____________________________ Neue Bauelemente: - Neue Befehle: Serial.read Ziel: Daten von der Tastatur einlesen. Um Programmabläufe zu steuern kann es geschickt sein, Daten von der Tastatur einzulesen. Mit dem folgenden Sketch wird über die Tastatur eine Leuchtdiode an- und ausgeschalten.

Aufgabe A10.1: • Schließe an Pin2 eine LED an. • Öffne den Sketch „A101_Serial_Read“ und übertrage ihn auf den Arduino. • Öffne den seriellen Monitor.

Gib in der Kommandozeile “1“ für LED on “2“ für LED off ein, und drücke auf „Send“ (oder „Enter“).

• Beobachte die LED.

Seite -38-

____________________________________ 1100

Neue Befehle:

• Serial.Read() Zunächst wird überprüft, ob überhaupt Daten (hier: von der Tastatur) anliegen. Dies geschieht mit dem Befehl: if (Serial.available()>0) Sind Daten verfügbar, dann werden sie mit Serial.read () ausgelesen.

Aufgabe A11.2: • Starte den Sketch erneut und öffne den seriellen Monitor. • Gib in der Kommandozeile

“3“, „a“ oder „A“ ein, und drücke auf „Send“. • Welches Ergebnis liefert der serielle Monitor? Notiere!

Seite -39-

KKaappiitteell ____________________________

Neue Bauelemente: Lautsprecher Neue Befehle: tone Ziel: Töne und Melodienauf einem Lautsprecher erzeugen.

Aufgabe A11.1: • Schließe an Pin8 einen Lautsprecher an. • Öffne den Sketch „A111_Lautsprecher“ und übertrage ihn auf den ARDUINO.

Aufgabe A11.2

• Erzeuge eine eigene Abfolge von Tönen. • Speichere den Sketch unter „A112_Lautsprecher_(xx)“

Seite -40-

____________________________________ 1111

Neue Befehle:

• tone( pin, Frequenz, Tonlänge) Die Frequenz wird in Hz, die Tonlänge in Millisekunden angegeben. Werden mehrere Töne nacheinander gespielt, muss dazwischen eine Pause gemacht werden, damit das Programm nicht gleich den nächsten Befehl (in diesem Fall der nächste Ton) ausführt. Die Länge der Pause entspricht ungefähr der Tonlänge.

Melodien lassen sich natürlich leichter erstellen, wenn man die Note, z.B. „c“ oder „g“, und deren Länge „1/4“ oder „1/8“, direkt eingeben kann:

Aufgabe A11.3: • Öffne den Sketch „A113_Lautsprecher“ • Starte den Sketch • Erzeuge eine eigene Melodie. • Speichere den Sketch unter „A113_Lautsprecher_(xx)“ • Zeichne den Schaltplan.

Seite -41-

KKaappiitteell ____________________________

Neue Bauelemente: Reflexoptokoppler CN70 Neue Befehle: - Ziel: Ein Kurzstrecken-Lichtschranke erstellen. Jede Lichtschranke besteht aus einem Sender und einem Empfänger. Hier verwenden wir die Kurzstrecken-Reflexlichtschranke CNY70, bei der sich Sender und Empfänger im gleichen Gehäuse befinden - das ausgesendete Licht muss also reflektiert oder zurückgestreut werden, damit es den Empfänger trifft. Dazu genügt ein helles Objekt, das sich in wenigen mm Abstand vor der Reflexlichtschranke befindet. Tipps:

Schaltplan:

Der Sender (hellblaue Linse) ist eine LED, die für das menschliche Auge unsichtbares Licht (Infrarot-Licht) aussendet.

Der Empfänger (dunkelblaue Linse) ist ein sogenannter Phototransistor. Je mehr Licht auf den Phototransistor fällt, desto geringer ist sein Widerstand.

Zur Orientierung: Hier steht die Beschriftung!

5 V

GND

Infrarot-LED mit Vorwiderstand

Phototransistor mit Pullup-Widerstand (Spannungsteiler)

5 (analog)

Seite -42-

____________________________________ 1122

Bemerkung: Das Infrarot-Licht der sendenden Leuchtdiode ist zwar für das menschliche Auge nicht sichtbar, die meisten Handykameras und einfache Digitalkameras erkennen das Licht aber als weißes Leuchten. So könnt ihr leicht überprüfen, ob die LED auch leuchtet.

Aufgabe A12.1: • Baue die Schaltung gemäß Schaltplan auf. • Schreibe einen Sketch, bei dem die Werte vom analogen Pin 5 auf dem

seriellen Monitor ausgegeben werden. • Teste deine Lichtschranke, indem du einen Gegenstand vor den

Reflexoptokoppler hälst. • Speichere den Sketch unter „A121_Reflexoptokoppler_(xx)“

Aufgabe A12.2: • Verändere den Pullup-Widerstand. • Wie ändert sich damit die Empfindlichkeit der Reflexoptokopplers?

Notiere deine Beobachtungen.

Aufgabe A12.3: (Alarmanlage) • Ergänze die Schaltung um eine Leuchtdiode und einen Lautsprecher. • Erweitere den Sketch so, dass ab einem bestimmten Wert die Leuchtdiode

anfängt zu blinken und der Lautsprecher ein Warnsignal ausgibt. • Speichere den Sketch unter „A123_Reflexoptokoppler_Alarm_(xx)“ • Zeichne den Schaltplan.

Da zwei der vier Anschlüsse mit GND verbunden werden müssen, kann man den CNY70 einfach diagonal auf das Steckbrett setzen.

Seite -43-

KKaappiitteell ____________________________

Neue Bauelemente: Servo Neue Befehle: Servo-Befehle, map Ziel: Einen Servo ansteuern

Aufgabe A13.1: • Baue die Schaltung auf.

Der Servo muss mit einer eigenen Stromquelle versorgt werden. Achte auf die gemeinsame Erdung von Mikrocontroller und Stromquelle!

• Öffne den Sketch „A131_Servo“ und starte ihn. • Verändere die Position des Potentiometers. • Beobachte den Servo.

Tipp: Um die Bewegung des Servos besser beobachten zu können, kannst du einen Zeiger an ihm befestigen.

Seite -44-

____________________________________ 1133

Info: Positionsregelung eines Servos Bei Modellbauservos wird der Winkel der Ausgangswelle geregelt. Zur Ermittlung des Winkels befindet sich im Servoinnern ein Potentiometer, das mit der Ausgangswelle verbunden ist. Über dieses Potentiometer ermittelt die Servoelektronik den Ist-Winkel der Ausgangswelle. Dieser wird mit dem Soll-Winkel verglichen, der vom Mikrocontroller übermittelt wird. Bei einer Abweichung zwischen Ist- und Soll-Winkel, regelt die Elektronik über den Motor und das Getriebe den Winkel der Ausgangswelle nach. Die Ausgangswelle kann eine Position zwischen 0° und 180° einnehmen.

Die Servo-Library wird eingelesen.

Der angeschlossene Servo bekommt die Bezeichnung „myservo“. Diese Bezeichnung ist frei wählbar.

Der Servo wird an Pin 2 angeschlossen.

Umrechnung des ausgelesenen Werts auf die 180°-Skala

Die Gradzahl wird auf den Servo übertragen

Der Servo benötigt Zeit, um die neue Position anzufahren.

Das Potentiometer wird am analogen Pin 0 angeschlossen.

Seite -45-

KKaappiitteell ____________________________

Neue Befehle:

• y = map(Wert, a1, a2, b1, b2) Rechnet einen Wert von einem Intervall in ein zweites Intervall um:

Beispiel:

• y = map(20, 0, 50, 0, 100)

• Die Umrechnung erfolgt linear und das Ergebnis sind immer ganzzahlige Werte (integer). Um Dezimalwerte zu erhalten muss man die Intervalle z.B. verzehnfachen und anschließend das Ergebnis durch 10 dividieren.

• Dieser Befehl ist immer dann sinnvoll, wenn Skalen ineinander umgerechnet werden müssen: Mit dem Befehl analogRead() bekommt man Werte zwischen 0…1023. Für analogWrite() werden Werte zwischen 0…255 benötigt:

y = map(767, 0, 1023, 0, 255) Ergebnis: y = 192

a2 a1 Wert

b2 b1 y

50 0 20

100 0 40

1023 0 767

255 0 192

Seite -46-

____________________________________ 1133 Aufgabe A13.2:

• Ändere den Sketch so ab, dass sich der Zeiger nur im Bereich 0°-90° bewegt. • Auf dem seriellen Monitor sollen die Winkelwerte ausgegeben werden. • Speichere den Sketch unter „A132_Servo_Serial_(xx)“ ab. • Zeichne den Schaltplan.

Aufgabe A13.3: • Ergänze die Schaltung mit einer grünen und einer roten LED. • Die grüne LED soll bei der Position „0°“ leuchten, die rote LED bei der Position

„90°“. Bei allen anderen Positionen sollen die LEDs nicht leuchten. • Ändere den Sketch und speichere ihn unter „A133_Servo_LED_(xx)“ ab. • Zeichne den Schaltplan.

Aufgabe A13.4: • Baue eine Schaltung auf, bei der ein Servo (mit Zeiger) die Lichtintensität

(LDR) auf einer Helligkeitsskala (dunkel – hell) darstellt. • Schreibe den Sketch und speichere ihn unter „A134_Servo_LDR_(xx)“ ab. • Zeichne den Schaltplan.

Seite -47-

KKaappiitteell ____________________________

Neue Bauelemente: Temperatursensor LM35 Neue Befehle: - Ziel: Umgebungstemperatur messen.

Aufgabe A14.1: • Baue die Schaltung auf. • Öffne den Sketch „A141_Temperatur“. • Starte den Sketch und öffne den seriellen Monitor. • Berühre den Temperatursensor und beobachte die Werte.

Der Temperatursensor LM35 mit seiner Anschlussbelegung in einem TO-92-Plastikgehäuse. Quelle: Die elektronische Welt mit Arduino entdecken (Erik Bartmann).

Der Dieser Sensor wandelt die gemessene Temperatur in einen analogen Spannungswert um, der sich proportional zur Temperatur ändert. Der Sensor hat eine Empfindlichkeit von 10mV/°C und einen messbaren Temperaturbereich von 0°C bis 100°C Celsius. Die Formel zur Berechnung der Temperatur in Abhängigkeit vom gemessenen Wert am analogen Eingang lautet wie folgt:

Die Formelwerte haben folgende Bewandtnis: • 5.0 : Arduino-Referenzspannung von 5V • 100.0: Maximal messbarer Wert des Temperaturfühlers • 1024 : Auflösung des analogen Eingangs

Seite -48-

____________________________________ 1144

Bemerkung: Der vom Temperatursensor LM35 ermittelte Wert wird über die eben genannte Formel berechnet:

float temperature = (5.0 * 100.0 * analogValue) / 1024; und über eine for-Schleife gemittelt. Dies erfolgt über das Aufsummieren der Messwerte und die Bildung des Durchschnittes. Im Anschluss wird der gemittelte Wert an die serielle Schnittstelle übertragen:

Serial.println(resultTemp);