einführung in die arduino-programmierungmakerspace.hsnr.de/wiki/images/2/2e/arduino2.pdf ·...
Post on 06-Feb-2018
217 Views
Preview:
TRANSCRIPT
Einführung in dieArduino-Programmierung
Elektrotechnikund InformatikFaculty of Electrical Engineeringand Computer Science
Hochschule NiederrheinUniversity of Applied Sciences
1. Blinkende Leuchtdiode (LED)
In diesem ersten Versuch werden wir ein Progamm schreiben, dass eine Leuchtdiodezum Blinken bringt. Machen Sie sich mit den zur Verfügung gestellten Bauteilenvertraut und bauen Sie die Schaltung nach Abbildung 1.1 auf. Wenn Sie sich unsichersind fragen Sie einen der anwesenden Betreuer um Rat.
Abbildung 1.1.: Schaltplan für die Ansteuerung einer LED
Zum Verbinden der Bauteile nutzen Sie sogenannte Jumper Kabel (oder auch Steck-brücken genannt). Die Farben können dem Entwickler bei der Orientierung helfenund sollten wenn möglich wie gezeichnet verwendet werden. Die Farbe hat allerdingskeinen Einfluss auf elektrische Eigenschaften.
Der verwendete Widerstand hat einen Wert von 330 Ω und dient als Vorwiderstandzur Begrenzung des Stroms. Diesen Widerstand wegzulassen könnte sowohl die LEDals auch den Arduino beschädigen. Die Einbaurichtung ist beliebig.
Kaltenecker, Kremer, Radmacher, Toszkowski 2
1. Blinkende Leuchtdiode (LED)
Wie Sie aus dem Lötworkshop möglicherweise bereits wissen, ist bei der LED aufdie richtige Polarität zu achten. Das kürzere Beinchen und die flache Kante zeigenden negativen Pol der LED an.
Flache Kante
Kurzes Bein
Nun werden wir gemeinsam den Arduino programmieren. Die Bedienung der Ar-duino IDE1 wird auf den Bildschirmen und/oder auf dem Beamer vom Dozentengezeigt. Beachten Sie inbesondere die Einstellungen für die Platine (Menü Werk-zeuge - Platine - „Arduino Uno“) und die Auswahl des richtigen COM-Ports (MenüWerkzeuge - Port).
Folgendes Programm wird erstellt:
/* Blink: Eine Leuchtdiode wird
periodisch ein- und ausgeschaltet. */
int gruen = 3; // Port der gruenen LED definieren
void setup() // Funktion setup() wird 1x am Anfang ausgeführt
pinMode(gruen, OUTPUT); // Port 3 wird zum Ausgang definiert
void loop() // Funktion loop() wird ständig wiederholt
digitalWrite(gruen, HIGH); // Port 3 wird auf 5V geschaltet
delay(1000); // eine Sekunde warten (1000 ms = 1 s)
digitalWrite(gruen, LOW); // Port 3 wird auf 0V geschaltet
delay(1000); // eine Sekunde warten
Nach Eingabe des Programms können Sie es durch einen Klick auf die Schaltfläche„Hochladen“ (der Pfeil →) auf den Arduino überspielen2.
1IDE: Integrated Development Environment (zu deutsch: Integrierte Entwicklungsumgebung)2Falls Sie einen USB-Adapter ohne separate Resetleitung verwenden, so müssen Sie zu Beginn
3 Arduino Einführung
1. Blinkende Leuchtdiode (LED)
Nach dem erfolgreichen Upload sollte die LED im Sekundentakt umschalten. Solltedies nicht funktionieren, so sprechen Sie bitten einen Betreuer an.
Aufgaben
• Ändern Sie in Ihrem Programm die Blinkfrequenz. Testen Sie, ob es möglichist den Zustand (High/Low) zu schnell zu wechseln, dass dies mit dem bloßenAuge nicht mehr sichtbar ist.
• Erweitern Sie Ihre Schaltung um eine gelbe und eine rote LED. Lassen Siediese wie bei einer Ampel abwechselnd leuchten. Nutzen Sie für die rote LEDPort 6 und für die gelbe LED Port 5 wie in Abbildung 1.2 gezeigt.
Abbildung 1.2.: Schaltplan mit drei LEDs
des Hochladevorgangs den Resettaster auf dem Arduino gedrückt halten. Im Normalfall solltedies nicht erforderlich sein. Den richtigen Zeitpunkt zum Loslassen zu treffen erfordert etwasÜbung. Schalten Sie in der Arduino IDE unter „Voreinstellungen“ die „Ausführliche Ausgabe“für Kompilierung ein, um die internen Vorgänge besser zu sehen.
4 Arduino Einführung
2. Analoge Sensorwerte
In diesem Versuch werden wir Sensorwerte einlesen und über die serielle Schnittstelleauf dem PC darstellen. Lassen Sie die drei LEDs aus dem vorherigen Teil gestecktund ergänzen Sie die Schaltung entsprechend Abbildung 2.1.
Abbildung 2.1.: Schaltbild LEDs und Potentiometer
Das neue Bauteil ist ein sogenanntes Potentiometer. Ein „Poti“ ist ein variabler Wi-derstand, dessen Widerstandswert sich durch drehen von 0 Ω bis zum Maximalwert(hier: 10 kΩ) einstellen lässt. Angeschlossen wird das Potentiometer an einen der 6analogen Eingänge des Arduino. Das Potentiometer steht beispielhaft für verschie-dene Sensoren (Licht, Temperatur, Lautstärke, ...).
Mit dem folgenden Programm können Sie den Sensor auslesen:
Kaltenecker, Kremer, Radmacher, Toszkowski 5
2. Analoge Sensorwerte
/* Potentiometer */
int gruen = 3;
int gelb = 5;
int rot = 6;
int sensorwert = 0;
void setup()
pinMode(gruen, OUTPUT);
pinMode(gelb, OUTPUT);
pinMode(rot, OUTPUT);
Serial.begin(9600);
void loop()
sensorwert = analogRead(A0);
Serial.println(sensorwert);
delay(1);
Nach dem Upload des Programms auf den Arduino passiert zunächst einmal nichts.Damit man sich die Werte ansehen kann, öffnet man unter dem Menüpunkt „Werk-zeuge“ den „Serial Monitor“. Jetzt sollten kontinuierlich Werte angezeigt werden. Dader Mikrocontroller über einen 10 Bit Analog/Digital-Wandler verfügt werden SieWerte zwischen 0 und 1023 (210 = 1024) beobachten.
Aufgaben
• Erweitern Sie das Programm derart, dass mit dem Potentiometer die Blink-frequenz einer oder mehrerer LEDs eingestellt werden kann. Ergänzen Sie dasobige Programm dazu um die Ansteuerung der LEDs aus dem ersten Versuch.
• Alternativ können Sie den Sensorwert auch nutzen, um einzustellen, welcheLED aktiv sein soll. Im unteren Drittel des Wertebereichs leuchtet beispiels-weise die rote LED, im mittleren die gelbe LED und im oberen die grüneLED.
6 Arduino Einführung
2. Analoge Sensorwerte
0 1023682341
Abbildung 2.2.: Einteilung des Wertebereichs
Das Codegerüst für eine dafür nötige Bedingung (if/else) sieht so aus:
if (sensorwert >= 0 && sensorwert < 341)
digitalWrite(gruen, HIGH);
digitalWrite(gelb, LOW);
digitalWrite(rot, LOW);
...
7 Arduino Einführung
3. Ultraschallentfernungsmessung
In diesem Versuch werden wir einen weiteren Sensor kennenlernen. Der HC-SR04 istein Ultraschallsensormodul, dass man sehr günstig (ca. 3 €) im Internet erwerbenkann. Mit ihm lässt sich die Laufzeit eines kurzen Schallimpulses bestimmen. Dieskann man dann leicht verwenden, um den Abstand des Moduls zum nächsten Hinder-nis zu berechnen. Diese Technik wird in der Praxis häufig eingesetzt. Beispielsweisefunktionieren viele Rückfahrt-Abstandswarnsysteme in Autos nach diesem Prinzip.
Zunächst verkabeln wir das Modul wie in Abbildung 3.1 gezeigt. Die bestehendeSchaltung für die LEDs aus den vorherigen Versuchen bleibt zusätzlich bestehen.
Abbildung 3.1.: Schaltplan Ultraschallsensor und LEDs
Lassen Sie Ihren Aufbau anschließend von einem Betreuer prüfen.
Jetzt werden wir in der Arduino IDE ein Programm schreiben, dass uns die Ent-fernungswerte auf den PC Bildschirm ausgibt. Wie Sie sehen ist dieses Programmbereits geringfügig umfangreicher als die letzten Programme.
Kaltenecker, Kremer, Radmacher, Toszkowski 8
3. Ultraschallentfernungsmessung
/* Ultraschall: Ein Ultraschallsensor
liefert Werte zum PC.*/
int echoPin = 4; // Echo Pin
int trigPin = 2; // Trigger Pin
long laufzeit, entfernung;
void setup()
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
void loop()
digitalWrite(trigPin, LOW); // Trigger
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
laufzeit = pulseIn(echoPin, HIGH);
entfernung = laufzeit*0.017; // Berechnung der Distanz in cm.
Serial.println(entfernung);
delay(50); // 50 ms warten
Aufgaben
• Halten Sie testweise Ihre Hand und andere Objekte in verschiedenen Entfer-nungen vor den Sensor, die Werte auf dem Bildschirm sollten entsprechendvariieren.
• Stellen Sie das Messergebniss mittels LED(s) grafisch dar. Realisieren Sie da-zu einen Schwellwertschalter, indem Sie eine LED leuchten lassen sofern deraktuelle Wert kleiner 30 cm beträgt. Nutzen Sie dafür wieder eine Bedingung(if/else).
• (optional:) Stellen Sie den Sensorwert mit den drei LEDs dar, wobei jede Farbeeine unterschiedliche Entfernung signalisiert (z.B. Rot - nah).
9 Arduino Einführung
4. Liquid Crystal Display (LCD)
Als nächstes widmen wir uns der Darstellung auf LC Displays, wie sie in vielenGeräten zu finden sind. Zur Verfügung steht ein einfaches Modul mit zwei Zeilenund 16 Zeichen pro Zeile. Der verbaute Controller ist kompatibel zum bekanntenHitachi HD44780. Zunächst verbinden Sie das Display bitte wie in Abbildung 4.1gezeigt mit dem Arduino.
Abbildung 4.1.: Schaltplan LCD
Das eingezeichnete Potentiometer (10 kΩ) dient als einstellbarer Spannungsteiler.Durch Drehen lässt sich so der Kontrast des LCD verändern.
Lassen Sie Ihren Aufbau von einem Betreuer prüfen. Anschließend geben Sie dasfolgende Programm ein:
Kaltenecker, Kremer, Radmacher, Toszkowski 10
4. Liquid Crystal Display (LCD)
/* LCDtest: Gebe „Hello World!“ auf einem LCD aus.*/
#include <LiquidCrystal.h> // Einbinden der Bibliothek
LiquidCrystal lcd(8, 9, 10, 11, 12, 13); // Pins definieren
void setup()
lcd.begin(16, 2); // Anzahl Spalten und Zeilen
lcd.print("Hello World!"); // Ausgabe
void loop()
lcd.setCursor(0, 1); // Cursor auf 1. Zeichen in der
// 2. Zeile setzen
lcd.print(millis()/1000); // Ausgabe der Sekunden
// seit dem letzten Reset
Auf dem Display sollte nun der Schriftzug „Hello World!“ in der ersten Zeile undeine sich ändernde Sekundenanzeige sichtbar sein.
Aufgaben
• Modifizieren Sie das Programm, sodass es Ihren Namen oder einen anderenText ausgibt.
• (optional:) Öffnen Sie Ihr Programm zu Entfernungsmessung aus der vorhe-rigen Aufgabe und ergänzen Sie es so, dass die Messergebnisse auf dem LCDausgegeben werden. Sie können in der ersten Zeile den Zahlenwert als Textausgeben (z.B. „Distanz: 40 cm“) und in der zweiten Zeile proportional zurEntfernung schwarze Zeichen auf dem Display darstellen. Falls erforderlichkönnen Sie mit dem Befehl lcd.clear(); die vorherigen Werte auf dem Displaylöschen. Ein Zeichen mit allen Pixeln aktiviert erhalten Sie beispielsweise mitdem Befehl lcd.print("\377");.
11 Arduino Einführung
4. Liquid Crystal Display (LCD)
Exkurs
Im HD44780 sind bereits viele Zeichen vorgesehen. Eine kurze Suche im Internetfördert den Zeichensatz zutage. Für besondere Anwendungen ist es zusätzlich auchmöglich bis zu 8 eigene Zeichen zu definieren. Die Zeichen haben dabei eine Größevon 5x8 Pixeln.
Im folgenden ist der Beispielcode für ein Smiley abgebildet.
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
byte smiley[8] = B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000, ;
void setup()
lcd.createChar(0, smiley);
lcd.begin(16, 2);
lcd.write(byte(0));
void loop()
Definieren Sie sich doch ein individuelles Zeichen indem Sie den Programmcodeentsprechend ändern.
12 Arduino Einführung
Weiterführende Informationen
Dieser Workshop dient als erster Einstieg in die Arduino-Welt. Wenn Sie sich in ei-nem ähnlichen Stil weiter mit Arduinos beschäftigen möchten, so finden Sie im Inter-net viele ausführliche Tutorials, beispielsweise bei Adafruit (https://learn.adafruit.com)oder SparkFun (https://learn.sparkfun.com). Auch in der Bibliothek gibt es das Buch„Arduino Workshops“ von John Boxall.
Eine wichtige Anlaufstelle für weitergehende Schritte ist natürlich auch die offizielleSeite http://www.arduino.cc. Dort kann man die Entwicklungsumgebung herunter-laden und findet auch viel Dokumentation.
Leider können wir Ihnen aus Kostengründen die hier verwendeten Komponentennicht zur Verfügung stellen. Eine Liste der Bauteile mit Bezugsquellen finden Siehier:
http://makerspace.hsnr.de/wiki/index.php/Workshop_2
Für eigene Experimente gut geeignet sind Arduino Starter-Kits die man im Online-Versandhandel beziehen kann. Diese beinhalten für einen Preis von 30-50 € meistein Steckboard mit Kabeln sowie eine Sammlung von Sensoren und Aktoren.
Kaltenecker, Kremer, Radmacher, Toszkowski 13
Co
ntr
ol S
tru
ctu
res
if (x < 5) ... else ...
while (x < 5) ...
do ... while ( x < 5);
for (int i = 0; i < 10; i++) ...
break; // exit a loop immediately
continue; // go to next iteration
switch (myVar)
case 1:
...
break;
case 2:
...
break;
default:
...
return x; // just return; for voids
Bas
ic P
rog
ram
Str
uct
ure
void setup()
// runs once when sketch starts
void loop()
// runs repeatedly
Gen
eral
Op
erat
ors
= (assignment operator)
+ (add) - (subtract)
* (multiply) / (divide)
% (modulo)
== (equal to) != (not equal to)
< (less than) > (greater than)
<= (less than or equal to)
>= (greater than or equal to)
&& (and) || (or) ! (not)
Po
inte
r A
cces
s& (reference: get a pointer)
* (dereference: follow a pointer)
Bit
wis
e O
per
ato
rs& (bitwise and) | (bitwise or)
^ (bitwise xor) ~ (bitwise not)
<< (shift left) >> (shift right)
Co
mp
ou
nd
Op
erat
ors
++ (increment)
-- (decrement)
+= (compound addition)
-= (compound substraction)
*= (compound multiplication)
/= (compound division)
&= (compound bitwise and)
|= (compound bitwise or)
Co
nst
ants
HIGH | LOW
INPUT | OUTPUT
true | false
143 (Decimal)
0173 (Octal - base 8)
0b11011111 (Binary)
0x7B (Hexadecimal - base 16)
7U (force unsigned)
10L (force long)
15UL (force long unsigned)
10.0 (force floating point)
2.4e5 (2.4*10^5 = 240000)
Dat
a ty
pes
void
boolean (0, 1, true, false)
char (e.g. 'a' -128 to 127)
int (-32768 to 32767)
long (-2147483648 to 2147483647)
unsigned char (0 to 255)
byte (0 to 255)
unsigned int (0 to 65535)
word (0 to 65535)
unsigned long (0 to 4294967295)
float (-3.4028e+38 to 3.4028e+38)
double (currently same as float)
Str
ing
schar S1[8] =
'A','r','d','u','i','n','o';
// unterminated string; may crash
char S2[8] =
'A','r','d','u','i','n','o','\0';
// includes \0 null termination
char S3[]="Arduino";
char S4[8]="Arduino";
Arr
ays
int myInts[6]; // array of 6 ints
int myPins[]=2, 4, 8, 3, 6;
int mySensVals[6]=2, 4, -8, 3, 2;
myInts[0]=42; // assigning first
// index of myInts
myInts[6]=12; // ERROR! Indexes
// are 0 though 5
Typ
e C
on
vers
ion
schar() byte()
int() word()
long() float()
Qu
alif
iers
static (persists between calls)
volatile (in RAM (nice for ISR))
const (make read only)
PROGMEM (in flash)
Pin
Inp
ut/
Ou
tpu
t
Digital I/O (pins: 0-13 A0-A5)
pinMode(pin,[INPUT, OUTPUT])
int digitalread(pin)
digitalWrite(pin, value)
// Write HIGH to an input to
// enable pull-up resistors
Analog In (pins: 0-5)
int analogRead(pin)
analogReference(
[DEFAULT, INTERNAL, EXTERNAL])
PWM Out (pins: 3 5 6 9 10 11)
analogWrite(pin, value)
Ad
van
ced
I/O
tone(pin, freqhz)
tone(pin, freqhz, duration_ms)
noTone(pin)
shiftOut(dataPin, clockPin,
[MSBFIRST,LSBFIRST], value)
unsigned long pulseIn(pin,
[HIGH,LOW])
Tim
eunsigned long millis()
// overflows at 50 days
unsigned long micros()
// overflows at 70 minutes
delay(msec)
delayMicroseconds(usec)
Mat
hmin(x, y) max(x, y) abs(x)
sin(rad) cos(rad) tan(rad)
sqrt(x) pow(base, exponent)
constrain(x, minval, maxval)
map(val, fromL, fromH, toL, toH)
Ran
do
m N
um
ber
srandomSeed(seed) // long or int
long random(max)
long random(min, max)
Bit
s an
d B
ytes
lowByte(x) highByte(x)
bitRead(x, bitn)
bitWrite(x, bitn, bit)
bitSet(x, bitn)
bitClear(x, bitn)
bit(bitn) // bitn: 0=LSB 7=MSB
Ext
ern
al In
terr
up
tsattachInterrupt(interrupt, func,
[LOW, CHANGE, RISING, FALLING])
detachInterrupt(interrupt)
interrupts()
noInterrupts()
Ser
ial
(com
mun
icat
e w
ith P
C o
r vi
a R
X/T
X)
begin(long Speed) // up to 115200
end()
int available() // #bytes available
byte read() // -1 if none available
byte peek()
flush()
print(myData)
println(myData)
write(myBytes)
SerialEvent() // called if data rdy
EE
PR
OM
(#include <EEPROM.h>
)
byte read(intAddr)
write(intAddr, myByte)
Ser
vo
(#include <Servo.h>
)
attach(pin, [min_uS, max_uS])
write(angle) // 0 to 180
writeMicroseconds(uS)
// 1000-2000; 1500 is midpoint
int read() // 0 to 180
bool attached()
detach()
So
ftw
areS
eria
l (s
eria
l com
m. o
n an
y p
ins)
(#include <softwareSerial.h>)
SoftwareSerial(rxPin, txPin)
begin(long Speed) // up to 115200
listen() // Only 1 can listen
isListening() // at a time.
read, peek, print, println, write
// all like in Serial library
Wir
e (
I²C
com
m.)
(#include <Wire.h>
)
begin() // join a master
begin(addr) // join a slave @ addr
requestFrom(address, count)
beginTransmission(addr) // Step 1
send(myByte) // Step 2
send(char * mystring)
send(byte * data, size)
endTransmission() // Step 3
int available() // #bytes available
byte receive() // get next byte
onReceive(handler)
onRequest(handler)
Libraries
Arduino Programming Cheat Sheet
Pri
mar
y so
urc
e: A
rdu
ino
Lan
guag
e R
efer
ence
http://arduino.cc/en/Reference/
by
Mar
k Li
ffit
on
Structure & Flow
Operators
Built-in Functions
Variables, Arrays, and Data
Ad
apte
d f
rom
: -
Ori
gin
al b
y G
avin
Sm
ith
- S
VG
ver
sio
n b
y Fr
eder
ic D
ufo
urg
- A
rdu
ino
bo
ard
dra
win
g
ori
gin
al b
y Fr
itzi
ng.
org
DIGITAL (PWM~)
AREF
GND
13
12
~11
~10
~9
8
7
~6
~5
4
~3
2
TX→1
RX←0
L
TXRX
POWER
ANALOG IN
A0
A1
A2
A3
A4
A5
IOREF
RESET
3.3V
5V
GND
GND
Vin
ON
WWW.ARDUINO.CC - Made in Italy
RESET
ICSP
1
int1
int0
SDA
SCL
SCL
SDA
DC in
sugg. 7-12V
limit 6-20V
ATmega382:
16MHz, 32KB Flash (prog.),
2KB SRAM, 1KB EEPROM
ARDUINO UNO
top related