Upload
phungkien
View
222
Download
1
Embed Size (px)
Citation preview
Einführung in dieArduino-Programmierung II
Elektrotechnikund InformatikFaculty of Electrical Engineeringand Computer Science
Hochschule NiederrheinUniversity of Applied Sciences
5. Dimmen einer LED mittelsPulsweitenmodulation (PWM)
Abbildung 5.1.: LED mit Pulsweitenmodulation
Bisher haben wir LEDs ein- und wieder ausgeschaltet. Für viele Anwendungen ist eswünschenswert neben den beiden Zuständen „Ein“ und „Aus“ auch Zwischenstufen(Hillgkeiten) realisieren zu können. Dazu benötigen wir eine Möglichkeit die Aus-gangsspannung zu regulieren. Da der Arduino nicht über einen eingebauten Digital-Analog-Wandler verfügt, bietet sich die sogenannte „Pulsweitenmodulation“ an. Einnormaler digitaler Ausgang wird dabei periodisch sehr schnell ein- und ausgeschaltet.Die LED wird umso heller leuchten, je länger der Ausgang einen „High“-Zustand an-nimmt (im Verhältnis zu der Zeit im „Low“-Zustand). Abbildung 5.2 veranschaulichtdieses Prinzip.
Kaltenecker, Kremer, Radmacher, Toszkowski 2
5. Dimmen einer LED mittels Pulsweitenmodulation (PWM)
90%
90%
50%
50%
0.5V
2.5V
4.5V
LOW (0 volts)
HIGH (5 volts)
LOW (0 volts)
HIGH (5 volts)
LOW (0 volts)
HIGH (5 volts)
10%
10%
Abbildung 5.2.: Funktionsweise PWM (Quelle: SparkFun Inventor’s Kit Guide)
Der Arduino ermöglicht den PWM Betrieb auf allen Pins, die mit einer Tilde („∼“)gekennzeichnet sind. Die PWM-Frequenz beträgt je nach Pin entweder 490 oder 980Hz. Wie Sie sehen, können die von uns bisher verwendeten Ports (3,5 und 6) allesamtauch für PWM genutzt werden. Die Schaltung muss also nicht verändert werden.
Nutzen Sie folgenden Code zum Test der PWM-Funktionalität:
/* PWM: Die Helligkeit einer
Leuchtdiode wird über PWM gesteuert. */
int gruen = 3; // Port der gruenen LED definieren
int helligkeit = 128; // Helligkeitswert definieren
void setup() {
pinMode(gruen, OUTPUT); // Port 3 wird zum Ausgang definiert
}
void loop() {
analogWrite(gruen, helligkeit); // Port 3 gesetzt.
}
Die LED sollte jetzt weniger hell leuchten als zuvor.
3 Arduino Einführung
5. Dimmen einer LED mittels Pulsweitenmodulation (PWM)
Aufgaben
• Testen Sie die Leuchtstärke für verschiedene Werte der Variable helligkeit. DieFunktion analogWrite akzeptiert Werte im Bereich 0 bis 255.
• Programmieren Sie einen „Sweep“-Modus. Die Helligkeit soll langsam zuneh-men, bis sie den Maximalwert erreicht. Sie können dazu ihr Progamm umfolgendes Codefragment ergänzen:
for (int helligkeit=0; helligkeit <= 255; helligkeit++){
analogWrite(gruen, helligkeit);
delay(25); // Warte 25 ms.
}
• (optional:) Erweitern Sie Ihr Programm so, dass die LED periodisch heller unddunkler wird.
4 Arduino Einführung
6. Motorsteuerung
Jetzt wollen wir nach dem selben Prinzip anstelle der LED einen Motor steuern. Wirverwenden hier einen kleinen Gleichstrommotor, der auch mit niedrigen Spannungenarbeitet. Gleichstrommotoren werden vielfältig eingesetzt, beispielsweise bei Lüfternim Computer, als Antrieb bei Modellautos (Carrera Bahn) usw.
Abbildung 6.1.: Motorsteuerung mit Transistor
Der Betrieb des Motors erfordert einen höheren Strom, als dies bei den LEDs der Fallgewesen ist. Die maximale Belastung eines Pin beträgt 40mA. Aus diesem Grundebenutzen wir einen Transistor1 zur Stromversorgung. Mit dem Pin des Arduino wird
1NPN-Bipolartransistor BC547C
Kaltenecker, Kremer, Radmacher, Toszkowski 5
6. Motorsteuerung
der Transistor ein- und ausgeschaltet.
Bauen Sie die Schaltung aus Abbildung 6.1 auf.
Aufgaben
• Nehmen Sie den Motor in Betrieb. Verwenden Sie das Programm aus dervorhergehenden Aufgabe.
• Vertauschen Sie testweise die Pole des Motors. Was können Sie dabei beob-achten?
• Bestimmen Sie den niedrigsten Spannungswert, bei dem der Motor noch läuft.Die Spannung können Sie mit folgender Formel berechnen:
Spannung =x
255· 5V
6 Arduino Einführung
7. Motortreiber
In der aktuellen Konfiguration lässt sich der Motor mit verschiedenen Geschwin-digkeiten betreiben. Es ist allerdings nicht möglich im Programm zwischen Links-und Rechtsdrehung zu wechseln. Diese Funktion lässt sich durch eine sogenannteH-Brücke realisieren. Anstatt sie aus einzelnen Bauteilen aufzubauen verwenden wirhier einen integrierten Schaltkreis (IC).
Abbildung 7.1.: Motorsteuerung mit Treiberbaustein
Der genutzte Motortreiber IC ist der bekannte L293D, dessen Datenblatt leicht imInternet zu finden ist. Er kann zwei Motoren parallel mit bis zu 600 mA betreiben(kurzzeitig bis 1,2 A). Der IC ist wie in Abbildung 7.1 gezeigt mit dem Motor zuverbinden. Die Funktion lässt sich dann über Pin 3,5 und 6 des Arduino einstellen.
Kaltenecker, Kremer, Radmacher, Toszkowski 7
7. Motortreiber
Pin 3 und 5 stellen die Drehrichtung ein und Pin 6 schaltet den Motor ein oder aus.Diesen Pin sprechen wir mittels PWM an, um die Geschwindigkeit zu steuern. Diefolgende Tabelle fasst die Bedeutung der Pinbelegungen zusammen.
A B E Funktion
X X LOW Motor läuft aus
LOW LOW HIGH Sofortiger Stopp
LOW HIGH HIGH Linksdrehung
HIGH HIGH HIGH Sofortiger Stopp
HIGH LOW HIGH Rechtsdrehung
Mit dem folgenden Code wird der Motor im Uhrzeigersinn mit voller Geschwindigkeitangetrieben.
/* Motortreiber */
int motor_A = 5;
int motor_B = 3;
int motor_E = 6; // E: Enable
void setup(){
pinMode(motor_A, OUTPUT);
pinMode(motor_B, OUTPUT);
pinMode(motor_E, OUTPUT);
digitalWrite(motor_A, HIGH); // A HIGH und B LOW
digitalWrite(motor_B, LOW); // => Motor dreht rechts
}
void loop() {
analogWrite(motor_E, 255);
}
Aufgaben
• Ergänzen Sie Ihr Programm so, dass der Motor für beispielsweise 20 Sekundenlangsam dreht, pausiert und dann 10 Sekunden schnell rückwärts fährt.
8 Arduino Einführung
8. Drehzahlmessung
Ziel dieser Aufgabe ist es einen Sensor zu entwickeln, der die Drehzahl des in Ka-pitel 7 entwickelten Motors erfasst. Auf die Achse des Motors wird eine Scheibeangebracht die halb weiß und halb schwarz ist. Die Scheibe dreht sich entsprechendmit der selben Frequenz wie die Motorachse. Zu Verfügung steht ein Sensormodulbestehend aus einer IR-LED und einem Fototransistor. Mit diesem Sensor ist esmöglich schwarz und weiß zu unterscheiden.
Sensorwert: 100 Sensorwert: 5 Sensorwert: 100
VCC
GND
OUT
VCC
GND
OUT
VCC
GND
OUT
1 2 3
Abbildung 8.1.: Drehung der Scheibe
Abbildung 8.1 zeigt anschaulich, wie die Messung ablaufen könnte. Solange der Sen-sor auf die schwarze Fläche gerichtet ist (1), wird kein bzw. wenig Licht reflektiertund der Sensor liefert hohe Werte. Sobald die Fläche weiß wird (2), werden die Sen-sorwerte deutlich geringer. Der Zeitpunkt des ersten Wertes unter einer Schwelledie schwarz und weiß trennt wird gespeichert. Ebenso wird der Zeitpunkt detek-tiert, an dem zum ersten Mal wieder hohe Werte (schwarz) gemessen werden(3).Aus dieser Zeitdifferenz lässt sich die Umdrehungsdauer der Scheibe und damit dieMotordrehzahl bestimmen.
Kaltenecker, Kremer, Radmacher, Toszkowski 9
8. Drehzahlmessung
VC
CG
ND
OU
T
11
55
1010
1515
2020
2525
3030
A
A
B
B
C
C
D
D
E
E
F
F
G
G
H
H
I
I
J
J
13
12
11
10
9
8
7
6
5
4
3
2
L
5V
A0
AN
ALO
G IN
AREF
1
GND
TX
RX
RESET
3V3
A1
A2
A3
A4
A5
VIN
GND
GND
DIG
ITAL (P
WM
=)
Ard
uin
oTM
IOREF
ICSP
ICSP2
ON
PO
WER
0
1TX0
RX0
RESET
Abbildung 8.2.: Schaltplan Drehzahlmessung
Aufgaben
• Machen Sie sich zunächst mit der Funktionsweise des Sensors vertraut, indemSie ihn an A0 anschließen (siehe Abbildung 8.2) und mit dem Beispielpro-gramm AnalogSerialRead testen. Der Motor muss dabei zunächst nicht aktivsein. Das Programm finden Sie unter:
Datei - Beispiele - 01. Basics - AnalogReadSerial
Die Werte können Sie sich wieder mit dem seriellen Monitor ansehen.
• Ermitteln Sie einen sinnvollen Schwellwert, um schwarz und weiß zu unter-scheiden.
10 Arduino Einführung
8. Drehzahlmessung
Nun erstellen Sie ein Programm, dass die Drehzahl auswertet. Das folgende Pro-gramm ist eine einfache Implementierung der oben vorgestellten Vorgehensweise.
/* Drehzahlmessung */
unsigned long zeit;
int flag = 0;
int sensorwert;
int schwelle = ___ ; // Hier sinnvollen Wert eintragen
void setup() {
Serial.begin(9600);
}
void loop() {
sensorwert = analogRead(A0);
if (sensorwert <= schwelle && flag == 0){
zeit=millis();
flag=1;
}
if (sensorwert > schwelle && flag == 1){
Serial.println((millis()-zeit)*2);
flag=0;
}
}
Die Funktion millis() gibt die Anzahl der Millisekunden seit dem Start des Arduinozurück.
Aufgaben
• Messen Sie die Umdrehungsdauer.
• Geben Sie Drezahl in Umdrehungen pro Minute an.
11 Arduino Einführung