Arduino UNO

Das Arduino UNO R3 ist die aktuelle Version des Arduino UNO. Dabei handelt es sich um das Standard-Arduino. Es ist für die meisten Projekte völlig ausreichend und ist sehr günstig.

Arduino UNO R3

Arduino UNO Überblick

Hauptkomponente ist ein Mikrocontroller von ATMEL, der ATMEGA 328P. Auf ihm befindet sich die Arduino-Bootloader-Software. Sie ermöglicht es, Arduino-Programme auszuführen.

Das Arduino UNO verfügt über 14 digitale I/O Pins, wovon sechs als PWM Kanäle (ermöglichen z.B. das Dimmen von LEDs) genutzt werden können. Darüber hinaus sind sechs analoge Input Pins verfügbar.

Das Board beherrscht die Kommunikation per UART, SPI und I2C (TWI).

Zum Datenaustausch und zur Programmierung wird es per USB mit dem Computer verbunden. Da der Mikrocontroller nicht direkt per USB kommunizieren kann, befindet sich ein zweiter Mikrocontroller (ATmega8U2) auf dem Arduino UNO, der die »Übersetzung« übernimmt.

Arduino UNO: Technische Daten

Mikrocontroller ATmega328P
Betriebsspannung 5V
Empfohlene Eingangsspannung 7-12V
Digitale I/O Pins 14 (of which 6 provide PWM output)
Digitale I/O Pins mit PWM 6
Analoge Input Pins 6
Ausgangsstrom pro I/O Pin 20 mA
Ausgangsstrom am 3.3V Pin 50 mA
Flash Speicher 32 KB (ATmega328P)

davon 0,5 KB vom Bootloader verwendet

SRAM 2 KB (ATmega328P)
EEPROM 1 KB (ATmega328P)
Clock Speed 16 MHz
LED_BUILTIN 13
Länge 68.6 mm
Breite 53.4 mm
Gewicht 25 g

Besondere Pins

Serielle Kommunikation (UART) 0 (RX), 1 (TX)
Externe Interrupts 2, 3
PWM Pins 3, 5, 6, 9, 10, 11
SPI 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK)
I2C (TWI) A4 oder SDA, A5 oder SCL
Analoge Referenzspannung AREF
Integrierte LED 13

Bezugsquellen

Um Projekte mit dem Arduino UNO umzusetzen, benötigt man in der Regel diverse weitere Bauteile wie Breadboard, LEDs oder Aktuatoren. Ein Arduino Starter Kit bildet hier eine gute Grundlage.

Das Original Arduino UNO kostet bei Amazon um die 22 Euro.
Link zum Produkt (http://amzn.to/2kEwCyV)

Der Arduino Nachbau von Elegoo ist deutlich günstiger, jedoch unterstützt man damit nicht die Weiterentwicklung der Plattform: Link zum Produkt (http://amzn.to/2jtRlUs)

Des Weiteren gibt es diverse Online-Händler, auf deren Seiten man sich in Ruhe umsehen und inspirieren lassen kann.

Serielle Kommunikation

In- und Outputs

(Dieses Beispiel ist noch in Bearbeitung)

Das Arduino-Board kann seriell mit einem angeschlossenen Computer kommunizieren. Dies ermöglicht z.B. die Steuerung von Software und ist damit ein wichtiger Bestandteil des Physical Computings.

Im folgenden Beispiel werden exemplarisch fünf LEDs über Processing an- und abgeschaltet. Drei Taster und ein Potentiometer senden Daten an Processing zurück.

Schritt 1: Daten von Arduino an Processing senden:

Die Schaltung besteht aus einem Potentiometer, dass am Analog In 0 und drei Tastern, die an den digitalen Kanälen 3, 4 und 5 angeschlossen sind.

Arduino-Code

Im ersten Teil werden die angeschlossenen Pins deklariert:

Im Setup wird die serielle Kommunikation mit dem Befehl Serial.begin(9600); gestartet. Das Parameter 9600 legt die Übertragungsgeschwindigkeit (Baud-Rate) fest. Des weiteren müssen die Button-Pins als Input deklariert werden:

In der Loop-Methode werden Daten an die serielle Schnittstelle des Arduino-Boards gesendet. Der Befehl Serial.print(X); sendet eine Zeichenkette (String), der Befehl Serial.println(X); dagegen sendet eine Zeichenkette und erzeugt einen Zeilenumbruch (Linefeed).

Der Buttonzustand wird mit der Methode digitalRead(button1) ausgelesen und per Serial.print(…); direkt versendet. Er ist entweder 0 oder 1.

Pro Methodendurchlauf wird also eine Zeichenkette der Form 0,0,0,0 + Zeilenumbruch versendet.

Processing-Code

In Processing wird zunächst die Serielle Bibliothek serial.h eingebunden, danach wird ein serielles Objekt erstellt.

Dann werden die Arrays button und data und die Fließkommazahl potWinkel deklariert.

Im Setup wird der Serielle Port für die Kommunikation mit Arduino geöffnet. Der Befehl println(Serial.list()); listet alle verfügbaren seriellen Geräte auf. Am Mac ist das letzte angeschlossene serielle Gerät immer an Position 0.

Bei PC-Benutzern ist es immer die letzt Stelle:

Der Befehl serialPort.bufferUntil(‚\n‘); veranlasst Processing, alle einkommenden Signale bis zu einem Zeilenumbruch (Linefeed) zwischenzuspeichern.

Die Methode serialEvent(serialPort) wird immer aufgerufen, wenn am seriellen Port Daten verfügbar sind. Die eingehenden Daten werden in die Variable dataString eingelesen:

Der eingehende String wird in ein Array umgewandelt. Als Trennzeichen wird ein Komma verwendet:

Nun werden die einzelnen Variablenfelder überprüft und ausgewertet:

Das Parameter des Potentiometers wird in einen Winkel umgewandelt:

Die grafische Ausgabe ist in der draw() Methode hinterlegt:

Nun wird das Skript um die Ausgabe erweitert:

Arduino-Code

Die Pins der LEDs werden deklariert:

Die LED-Pins werden im setup() als OUTPUT angelegt:

Im loop() wird der serielle Port nach eingehenden Daten überprüft. Diese Daten werden in die letzte Stelle eines Arrays eingelesen, alle anderen Stellen werden darin um eine Stelle nach vorn sortiert:

Das Processing-Übertragungprotokoll sendet eine Zeichenkette der Form *00000#. Enthält das Datenarray an der ersten Stelle einen Stern und an der letzten Stelle ein Rautezeichen, werden die zwischenstehenden Einträge an die LEDs übergeben. Enthält das Datenfeld eine Eins, wird die zugewiesene LED ein-, sonst wird sie abgeschaltet:

Unter anderem ist der Processing-Code mit der sendSerial() Methode erweitert:

Diese Methode wird immer ausgeführt, wenn das mousePressed()-Event ausgelöst wird. Es sendet jeweils den Zustand aller LEDs über den seriellen Port serialPort. Die gesendete Zeichenkette hat die Form *00000#.

Analog Input

Der Analog Input vom Arduino wird verwendet, um analoge Sensoren auszulesen. Dabei handelt es sich zum Beispiel um Potentiometer, Fotowiderstände (LDR), Druck- und Temperatursensoren. Im Gegensatz zu digitalen Signalen, die entweder HIGH oder LOW sind, liefern analoge Sensoren auch Zwischenwerte.

Analog Input Schaltplan

Im Beispiel ist ein Potentiometer ans Arduino-Board angeschlossen.

Arduino Analog Input Potentiometer

Ein Potentiometer ist am Analog Input 0 des Arduinos angeschlossen (Grafik mit Fritzing erstellt)

Die beiden äußeren Beine werden mit dem GND und dem 5V+ verbunden, das mittlere mit einem Analog Input. Das Arduino-Board kann nun das Verhältnis der Widerstände zu einander ermitteln und liefert durch den Befehl analogRead(Pin); Werte zwischen 0 und 1023.

Darüber hinaus ist eine LED mit der Anode (langes Beinchen) am Pin 13 und der Kathode (kurzes Beinchen) am nebenliegenden GND angeschlossen.

Codebeispiel

Das Beispiel AnalogInput (File>Examples>Analog>AnalogInput) aus der Arduino-Software lässt die LED verschieden schnell blinken.

Im Beispiel wird das mittlere Bein des Potentiometers im AnalogIn 0 ausgelesen. Der Wert, der zwischen 0 und 1023 liegt, wird als Verzögerung (delay) in das Programm eingefügt und reguliert so die Blinkgeschwindigkeit der LED.

Schaltplan mit Fotowiderstand (LDR)

Nun kann man das Potentiometer auch gegen einen anderen Sensor austauschen. Wie beim Potentiometer benötigt das Arduino-Board ein Verhältnis zweier Widerstände, um einen analogen Wert zu erfassen.

Arduino Analog Input LDR

Fotowiderstand (LDR) am Analog Input des Arduinos (Grafik mit Fritzing erstellt.)

Ein Fotowiderstand (LDR) im Beispiel allein kann dieses Verhältnis nicht liefern. Man benötigt einen zusätzlichen Referenzwiderstand. Die Größe (Widerstandswert) des Referenzwiderstands richtet sich nach dem verwendeten Sensor und dem Umfeld, in dem er betrieben wird.

Um den Referenzwiderstand des Fotowiderstands auszurechen, muss sein Widerstand in einem hellen und einem dunklen Umfeld bestimmt werden. Beide Werte werden mit einander multipliziert und aus dem Ergebnis die Wurzel gezogen.

Wurzel aus (Rmin * Rmax) = Rref

Es ergibt sich der Referenzwiderstand. Widerstände haben allerdings genormte Werte. Es reicht, einen Widerstand zu wählen, der nah dem Ausgerechneten liegt. Im Beispiel beträgt der Widerstand 100kOhm.

Alternativ kann man aber auch einfach ausprobieren, mit welchem Widerstand man ausreichende Ergebnisse erzielt.

Schaltplan mit drucksensitivem Sensor (FSR)

Dieses Beispiel zeigt, wie ein drucksensitiver Sensor (FSR) angeschlossen wird. Auch für diesen Sensor wird ein Referenzwiderstand benötigt.

Arduino Analog Input FSR

Schaltung mit drucksensitivem Sensor (Grafik mit Fritzing erstellt)

Analog Out

Sechs der digitalen Kanäle auf dem Arduino-Boards sind nicht nur digital, sondern auch analog ansteuerbar. Sie sind mit dem Aufdruck PWM gekennzeichnet (Kanal 3, 5, 6, 9, 10, 11).

PWM (Pulse Width Modulation) bedeutet, dass kein konstantes Signal an dem Kanal anliegt, sondern dass dieser Kanal kontinuierlich an- und abgeschalten wird. In der Arduino-Software übergibt man einen Wert zwischen 0 und 255 an den Kanal. 0 entspricht dem GND (Minus-Pol), 255 entspricht 5V+, Zwischenwerte bedeuten für träge Bauteile (LEDs, Motoren, etc.) also eine Spannung zwischen 0 und 5V. Damit kann man also die Geschwindigkeit von Motoren oder die Helligkeit einer LED regulieren.

(Motoren sollten nicht direkt an einen Arduino-Kanal angeschlossen werden. Mehr dazu im Abschnitt Motorsteuerung.)

Das Arduino-Beispiel Fading (File>Examples>Analog>Fading) zeigt, wie man eine LED dimmt. Hier der Code von David A. Mellis:

Im Gegensatz zur digitalen Ausgabe, muss ein analog angesprochener Kanal nicht im Setup deklariert werden. Der Befehl analogWrite erhält als Parameter den Pin, an dem die LED angeschlossen ist und den Wert (0 – 255), wie hell die LED leuchten soll.

Digital In

Button am Digital 2

Um ein digitales Signal zu erfassen (Schalter, Taster, usw.), erweitert man die Schaltung um einen 
Taster und einen Widerstand. Die eine Seite des Tasters wird mit dem 5V+ des Arduino-Boards, die andere Seite mit dem digitalen Pin 2 verbunden. Der Widerstand (1 – 10 kΩ) wird benötigt, um Spannungsschwankungen und Störsignale herauszufiltern. Man bezeichnet so einen Widerstand als Drop-Down-Widerstand. Er wird mit dem Digitalen Pin 2 und dem GND verbunden. Alle störenden Ströme werden somit über den Widerstand in den GND geführt. Ist der Taster nicht gedrückt, liegt am Pin 2 jetzt ein GND-Signal an (LOW), drückt man den Taster, so liegt ein 5V+ Signal an (HIGH).

Das Button-Beispiel aus der Arduino-Software (File > Examples > Digital > Button) sieht ohne Kommentare so aus:

Am Anfang werden drei ganzzahlige Variablen buttonPin, ledPin und buttonState erzeugt. Dabei sind die ersten beiden unveränderlich (Schlüsselwort const für Konstante). Die Variable buttonState wird verwendet, um den aktuellen Zustand des Tasters zu speichern.

Im Setup bekommt der ledPin die Funktion eines Outputs, der buttonPin die eines Inputs.

Im Loop wird der Variable buttonState mit dem Befehl = digitalRead(buttonPin) der aktuelle Zustand des Buttons übergeben (entweder HIGH oder LOW).

Durch eine if-Abfrage (Alle Anweisungen innerhalb der if-Abfrage werden nur ausgeführt, wenn die in Klammern angegebene Bedingung zutrifft.) wird die LED am ledPin eingeschaltet, also wenn buttonState HIGH ist, sonst (else) wird sie abgeschaltet.

Digital Out

LED im GND und dem Digital 13

Digital Out digitalOut(); ist eine Funktion, bei der ein digitaler Kanal des Arduino-Boards, das als Output deklariert ist, ein oder ausgeschaltet werden kann. Ein- oder Aus ist in diesem Fall eigentlich nicht ganz korrekt, denn der Kanal kann je nach Anweisung entweder ein 5V+ oder ein GND (Minus-Pol) sein.

Für das erste Beispiel benötigt man ein Arduino-Board und eine LED. Die LED wird mit dem kürzeren Beinchen (Kathode) in den GND-Pin (also den Minus-Pol), mit dem längeren Beinchen (Anode) in den Pin Digital 13 gesteckt.

In der Arduino-Software öffnet man das Beispiel Digital Blink (File > Examples > Digital > Blink).

Entfernt man die Kommentare, also alles, was in /* */ geschrieben ist, bleibt:

In der ersten Zeile wird eine ganzzahlige Variable (int) mit dem Namen ledPin angelegt und ihr wird der Wert 13 zugewiesen. Pin bedeutet in diesem Fall Anschluss oder Kanal. Der Befehl pinMode(ledPin, OUTPUT) setzt den digitalen Kanal 13 auf dem Arduino-Board als Output.

Er setzt sich aus dem Methoden-Aufruf pinMode(); und der Übergabe von zwei Parametern zusammen. Parameter 1 ist die Nummer des digitalen Kanals – in diesem Fall ledPin, Parameter 2 seine Funktion OUTPUT.

In der loop-Methode stehen vier Befehle:

Dieser Befehl schaltet den ledPin auf 5V+ (HIGH);

Dieser Befehl hält das Programm für 1000 Millisekunden an (also 1 Sekunde).

Dieser Befehl schaltet den ledPin auf GND (LOW);

Dieser Befehl hält das Programm noch einmal für 1000 Millisekunden an.

Um das Programm auf das Arduino-Board zu laden klickt man auf das Upload Symbol und der Upload beginnt. Nun sollte die LED am Pin 13 im Takt von 2 Sekunden blinken.

Struktur eines Sketches

Die grundlegende Programmstruktur eines Arduino-Programms setzt sich aus zwei Methodenblöcken zusammen. Die erste Methode ist void setup(). Hier werden Grundeinstellungen (z.B. ob ein Kanal ein In- oder Output ist) vorgenommen. Diese Methode wird nur beim Programmstart ausgeführt, also genau ein Mal.

Die void loop() Methode wird im Gegensatz zum Setup ständig wiederholt. Hier wird der eigentliche Programmablauf geschrieben.

Über dem Setup kann man noch Bibliotheken einbinden und globale Variablen deklarieren. (Wenn du nicht weißt, was global bedeutet, mach dir noch keinen Kopf darum. Das ist für die meisten Arduino-Programme völlig egal.)

Weiter mit Variablen.