Arduino Grundlagen

Aus eLAB Wiki
Wechseln zu: Navigation, Suche

Einleitung

Arduino ist eine Open-Source-Plattform für Hard- und Software und gedacht für das Physical Computing. Entwickelt wurde Arduino im Jahre 2005 am Interaction Design Institute in Ivrea, Italien. Der Name Arduino ist italienisch und bezieht sich nach offizieller Meinung auf Arduin von Ivrea (955-1015), der Markgraf von Ivrea und später König von Italien war. Nach inoffizieller Meinung ist der Name eher trivialer Natur und es handelt sich einfach um den Namen einer Studentenkneipe in Ivrea.

Mit dem Begriff Physical Computing werden interaktive Systeme bezeichnet, die über Sensoren (Schall, Licht, Entfernung) ihre Umwelt erfassen können und mit Hilfe eines Mikrocontrollers die entsprechenden Sensordaten verarbeiten, um auf diese Weise Aktoren (LEDs, Servos, Motoren) zu steuern.

Bei Arduino ist der Einstieg gerade für Anfänger im Bereich Elektronik und Mikrocontroller-Programmierung sehr einfach. Es sind weder um Toolchain-Einstellungen für Compiler, Linker und Makefiles noch spezielle Hardware-Tools wie ISP-Programmer, JTAG-Adapter und Ähnliches erforderlich. Es genügt ein PC/Laptop, ein Arduino-Board sowie ein USB-Kabel, und schon kann man loslegen.

Auch der Einstieg in die Mikrocontroller-Programmierung wurde mit Arduino so einfach wie nie zuvor. Zwar rümpfen manche Hardcore-Programmierer beim Namen Arduino die Nase und tun das Ganze als Spielerei für Künstler ab, doch gerade die Kapselung der Hardware ist es, die der Nutzer sehr schnell zu schätzen lernt, wenn er einmal einen anderen Controller eingesetzt hat. Statt sich mit Registereinstellungen für die Ein- und Ausgänge, Timer etc. herumzuschlagen, kann er sich hier auf die wesentliche Aufgabe konzentrieren, nämlich auf das, was das Programm tun soll.

Datei:Arduino-Pose.JPG

Hardware

Die Arduino-Hardware basiert auf den 8-Bit-Prozessoren der Atmel AVR-Mikrocontroller-Serie. Der Ur-Arduino besaß noch einen ATmega8 als Controller, während auf den aktuellen Arduino UNO-Boards der ATmega328 verbaut ist. Das Flaggschiff unter den Arduino-Boards vom Typ 8-Bit ist der Arduino Mega mit dem ATmega2560-Controller. Inzwischen steht mit dem Arduino Due bereits die nächste Generation von Arduino-Boards mit 32-Bit-ARM-Prozessoren zur Verfügung. In diesem Buch wollen wir unser Hauptaugenmerk aber auf die 8-Bit-Reihe richten.

Alle Arduino-spezifischen Hacks können sowohl für den Arduino UNO als auch mit dem Arduino Mega durchgeführt werden. Selbstverständlich funktionieren auch die diversen Arduino-Nachbauten.

Die wesentlichen Unterschiede zwischen Arduino UNO und Mega werden in der folgenden Tabelle aufgeführt.

Vergleich Arduino UNO/Mega
 
|===========================
|                     |UNO                              |Mega
|Prozessor            |ATmega328                        |ATmega2560
|Programmspeicher     |32kB (512B vom Bootloader belegt)|256kB (8kB vom Bootloader belegt)
|RAM                  |2kB                              |8kB
|EEPROM               |1kB                              |4kB
|digitale Ein-Ausgänge|14 (6 mit PWM)                   |54 (15 mit PWM)
|analoge Eingänge     |6 (10Bit Auflösung)              |16 (10Bit-Auflösung)
|Prozessor Takt       |16MHz                            |16Mhz
|Schnittstellen       |1xUART, 1xTWI, 1xSPI             |4xUART, 1xTWI, 1xSPI
|Timer                |3 (2x8Bit, 1x16Bit)              |6 (2x8Bit, 4x16Bit)
|===========================

Stromversorgung

Das Arduino-Board kann über verschiedene Wege mit Strom und Spannung versorgt werden. Ein Weg ist dabei der über den USB-Port. Hier beträgt die Eingangsspannung 5V. Sie ist somit identisch mit der Betriebspannung (VCC) des Controllers. Über den USB-Port können maximal 500mA an Strom fließen. Dies ist auch der Wert, auf den die Polyfuse-Sicherung auf dem Arduino-Board ansprechen würde.

Eine weitere Möglichkeit der Stromversorgung ist die Hohlsteckerbuchse. Hierbei ist eine externe Eingangsspannung im Bereich 6-20V erforderlich, empfohlen werden 7-12V. Um daraus wieder die 5V-Betriebspannung für den Controller zu erzeugen, befindet sich auf dem Board ein Spannungsregler. Der Power-Anschluss ist über eine Diode gegen Verpolung geschützt. Für die externe Stromversorgung wird ein Stecker-Netzteil mit Hohlstecker (5,5mm Außen- und 2,1mm Innendurchmesser) benötigt, wobei Plus am Innenpol liegt.

Die letzte Möglichkeit der Stromversorgung besteht im Vin-Pin. Auch dieser Anschluss führt über den Spannungswandler und es werden ebenso 6-20V erwartet. Allerdings ist dieser Pin nicht über eine Diode geschützt. Eine Verpolung führt zur Zerstörung des Boards, gekennzeichnet durch aufsteigende Rauchwolken aus "magischem Rauch".

Fun fact Magic Smoke

Magischer Rauch, englisch Magic oder Blue Smoke genannt, ist ein Running Gag unter Elektronikern. Dabei wird von der These ausgegangen, dass alle elektronischen Bauelemente bei der Fertigung mit "magischem Rauch" gefüllt werden. Nur so funktioniert das Bauteil, so die These. Wenn nun der "magische Rauch" aus dem Bauteil entweicht, ist dieses kaputt. Ein Indiz für die These. Gelänge es nun, den "magischen Rauch" wieder zurück in das Bauteil zu füllen, müsste es auch wieder funktionieren. Dieser Teil der These ist noch unbewiesen. Gelegentlich tauchen für nur kurze Zeit (um den 1. April) Magic Smoke Refill Kits zum Nachfüllen von Bauteilen mit magischen Rauch auf dem Markt auf. Da muss man dann schnell zuschlagen, denn ein solches Kit darf in keiner Bastelkiste fehlen.

Wahl der Spannungsversorgung

Bei der Wahl der externen Eingangsspannung sollten Sie sich an den empfohlenen Spannungsbereich von 7-12V halten, weil es sich bei dem Spannungsregler auf dem Board um einen einfachen Längsregler handelt. Je höher die Eingangsspannung ist, desto größer ist die Verlustleistung, die am Spannungsregler in Wärme umgewandelt werden muss. Da kommt schnell einiges zusammen. Bei 5V Betriebsspannung und einer Versorgungsspannung von 12V beträgt die Differenzspannung 7V, die der Spannungsregler in Wärme umsetzen muss. Bei 500mA Stromaufnahme wären das schon 3,5W.

Ein Arduino-Board kann ohne Gefahr über USB und extern gleichzeitig versorgt werden. Die Spannungsquelle wird automatisch gewählt. Auf älteren Boards war zu diesem Zweck noch ein Jumper zum Umschalten zwischen USB und extern vorhanden.

Ein- und Ausgänge

Um vom Arduino-Programm aus digitale Eingänge zu lesen, wird die Funktion +digitalRead()+ verwendet.

digitale Eingänge

Das geschieht unter Arduino mit der Funktion +pinMode()+. Dann kann durch Aufruf der Funktion +digitalWrite()+ ein LOW- oder HIGH-Pegel am Ausgang eingestellt werden. Damit lassen sich kleinere Lasten wie LEDs direkt oder größere Lasten wie Relais und Spulen über Transistoren betreiben. Jeder Pin des Arduinos kann maximal 40mA liefern.

analoge Eingänge

Da die Auflösung des A/D Wandler im Arduino nur 10-Bit beträgt, liegt dieser Digitalwert im Bereich von 0 bis 1023. Abhängig vom eingestellten Referenzwert (5V ist die Default-Einstellung) ergibt das eine Auflösung von 4,88mV. Um vom Arduino-Programm aus analoge Eingänge zu lesen, wird die Funktion +analogRead()+ verwendet. Beim Arduino liegen die analogen Eingänge auf dem Steckverbinder unten rechts (AD). Der Arduino UNO verfügt über 6 analoge Eingänge, beim Arduino Mega sind es 16.

Analoge Eingänge bei Arduino UNO/Mega
 
|===========================
|Pin|UNO |Mega
|A0 |ADC0|ADC0
|A1 |ADC1|ADC1
|A2 |ADC2|ADC2
|A3 |ADC3|ADC3
|A4 |ADC4|ADC4
|A5 |ADC5|ADC5
|A6 |-   |ADC6
|A7 |-   |ADC7
|A8 |-   |ADC8
|A9 |-   |ADC9
|A10|-   |ADC10
|A11|-   |ADC11
|A12|-   |ADC12
|A13|-   |ADC13
|A14|-   |ADC14
|A15|-   |ADC15
|===========================

analoge Ausgänge

Mit der Funktion +analogWrite()+ lassen sich z.B. LEDs nicht nur ein- und ausschalten, sondern auch dimmen. Da die PWM-Frequenz mit 1kHz recht hoch ist, wird kein Flackern wahrgenommen. Ähnliches gilt für Motoren. Durch die Masseträgheit dreht der Motor weiter und gerät nicht ins Stottern. Der Arduino UNO verfügt über 6 PWM-fähige Ausgänge, beim Arduino Mega sind es 15.

Analoge Ausgänge bei Arduino UNO/Mega

|===========================
|Pin|UNO   |Mega
|D2 |-     |PWM 3B
|D3 |PWM 2B|PWM 3C
|D4 |-     |PWM 0B
|D5 |PWM 0B|PWM 3A
|D6 |PWM 0A|PWM 4A
|D7 |-     |PWM 4B
|D8 |-     |PWM 4C
|D9 |PWM 1A|PWM 2B
|D10|PWM 1B|PWM 2A
|D11|PWM 2A|PWM 1A
|D12|-     |PWM 1B
|D13|-     |PWM 0A
|D44|-     |PWM 5C
|D45|-     |PWM 5B
|D46|-     |PWM 5A
|===========================

Schnittstellen

Jedes Arduino-Board verfügt über eine Reihe von Standard-Schnittstellen. Darüber lassen sich Kommunikationskanäle zu anderen Geräten aufbauen.

serielle Schnitstelle

Die UART-Schnittstelle ist beim Arduino an den Pins 0 und 1 herausgeführt. Gleichzeitig sind die Pins aber auch über den USB Seriell-Wandler mit dem USB-Port verbunden. Der Arduino Mega verfügt über insgesamt 4 UARTs. Die größte gemeinsame Geschwindigkeit bei PC und Arduino beträgt 115200 Baud (Bits pro Sekunde), allerdings ist die Fehlerrate hier schon recht hoch, aufgrund des 16MHz Taktfrequenz des Arduinos. Empfehlenswert sind deshalb 38400 oder 57600 Baud.

Für die Programmierung der seriellen Schnittstelle wird bei Arduino die Serial-Klasse verwendet. Mit +Serial.begin()+ wird die Schnittstelle geöffnet und initialisiert. Beim Arduino Mega stehen außerdem noch die +Serial1+-, +Serial2+- und +Serial3+-Klassen für die hier vorhandenen zusätzlichen seriellen Schnittstellen zur Verfügung.

UART-Pins bei Arduino UNO/Mega
 
|===========================
|   |UNO|Mega
|Rx0|0  |0
|Tx0|1  |1
|Rx1|-  |19
|Tx1|-  |18
|Rx2|-  |17
|Tx2|-  |16
|Rx3|-  |15
|Tx3|-  |14
|===========================

I2C

Beim Arduino UNO teilen sich der I2C-Bus und die A/D-Pins 4 und 5 die gleichen Pins. Der Arduino Mega besitzt für diesen Zweck eigene Pins (20, 21). Auf den Arduino-Boards mit R3-Layout befinden sich die I^2^C-Pins jeweils zusätzlich ganz links am oberen linken Steckverbinder (IOH). Für den korrekten Betrieb des I2C-Busses ist jeweils ein Pull-Up-Widerstand an der Takt- und Datenleitung erforderlich. Für die Programmierung der I2C-Schnittstelle mit dem Arduino steht die Wire-Bibliothek zur Verfügung. Es werden sowohl Slave- als auch Master-Funktion unterstützt.

I2C-Pins bei Arduino UNO/Mega
 
|===========================
|   |UNO|Mega|R3 IOH
|SDA|A4 |20  |9
|SCL|A5 |21  |10
|===========================

SPI

Beim Arduino teilt sich die SPI-Schnittstelle dieselben Pins mit dem ISP-Steckverbinder. Für die Programmierung steht die SPI-Bibliothek zur Verfügung. Unterstützt wird nur der Arduino als Master sowie die SPI-Modes 0 bis 3.

SPI-Pins bei Arduino UNO/Mega/ISP
 
|===========================
|    |UNO|Mega|ISP
|MISO|12 |50  |1
|MOSI|11 |51  |4
|SCK |13 |52  |3
|SS  |10 |53  |-
|===========================

Weiterführende Links