14
Einführung in die Arduino-Programmierung Elektrotechnik und Informatik Faculty of Electrical Engineering and Computer Science Hochschule Niederrhein University of Applied Sciences

Einführung in die Arduino-Programmierungmakerspace.hsnr.de/wiki/images/2/2e/Arduino2.pdf · Einführung in die Arduino-Programmierung Elektrotechnik und Informatik Faculty of Electrical

  • Upload
    ledan

  • View
    215

  • Download
    0

Embed Size (px)

Citation preview

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