Arduino - Ersteinrichtung
Das Starter-Set, dass ich eigentlich für meinen Raspberry gekauft habe, und dass mir bis dato auch viele spannende Experimente geschenkt hat, war ja eigentlich für den Arduino gedacht. Und der lag dankenswerterweise gleich dabei. Natürlich nicht das Original, aber wohl Arduino Uno R3 kompatibel. Auf jeden Fall ziert ihn ein Original Atmel MEGA328P.Dem Set lag auch ein LM35 Silizium-Thermistor bei, den ich auf dem Raspi aber nicht so recht zum Laufen gebracht habe. Jetzt stellt sich die Frage: Ist der Thermistor defekt, oder spinnt der Analog-Digital-Wandler? Da der Arduino direkt über Analog-Eingänge verfügt, ist der richtige Zeitpunkt gekommen für einen Ausflug in die Arduino-Welt.
Man muss sich klar machen: der Arduino ist ein Mikrocontroller während der Raspberry Pi ein Einplatinencomputer mit Betriebssystem (Linux) ist. Auf dem Arduino gibt es keine Shell, auf die man schnell mal etwas ausgeben könnte. In den Arduino müssen die Programme per USB-Schnittstelle in den Arduino geladen werden und laufen dann dort ab, auch ohne PC. Bei jeder Programmänderung muss man aber das Programm neu hochladen.
Der Arduino hat aber neben dem günstigeren Preis noch den Vorteil, dass er weniger Strom verbraucht.
Die Hardware des Arduino Uno R3
Das Board ist schnell erklärt:
- ganz oben links ist der Reset-Taster
- darunter die USB-Buchse zum Anschluss an den PC zum Programmieren
- unten links die schwarze Buchse ist der Anschluss für die Versorgungsspannung. Die sollte zwischen 7 und 12 Volt liegen, mit dem Pluspol innen. Das Board soll aber wohl auch 6 bis 20 Volt vertragen. Ich verwende derzeit ein übriggebliebenes 12V Stecker-Netzteil mit 2A. Das funktioniert gut. Weniger Ampere tun es sicher auch.
- rechts an die Strombuchse sitzen die Spannungswandler, die auf die Buchsenleite unten links 3.3V und 5V sowie Masse bringen.
- rechts daneben die 6 Analogeingänge A0 bis A5
- darüber der Atmel Mega 328P, das Herz der Platine und der eigentliche Mikrocontroller
- rechts unten vom UNO-Schriftzug ist die Power On- LED
- die obere Buchsenleiste liefert die Digital Ein/Ausgänge 0 bis 13, also insgesamt 14, sowie Masse (GND)
Der Atmel ATmega 328P
Technische Daten:
- 8 bit Microcontroller
- RISC Befehlssatz mit 131 Befehlen
- 20 Mhz Takt / 1 MIPS per MHz
- 32 KB Flash Programmspeicher
- 2 KB SRAM Variablenspeicher
- 1 KB EEPROM
- 10K-100K Flash-Zyklen, Datenerhalt 100 Jahre bei 25°C (20 Jahre bei 85°C)
- 6 Kanäle analog (A0-A5), 10 Bit AD-Wandler
- gesamt 23 programmierbare IO-Kanäle
- unterstützt I2C, SPI, UART
- Stromverbrauch: 0.1 bis 0.75 µA im Power- Down/Save-Mode, 0.2 mA im Active-Mode
Arduino IDE (Sketch) installieren und einrichten
Bevor wir mit dem Uno etwas anfangen können, müssen wir erstmal die passende Software installieren. Die finden wir unter https://www.arduino.cc/en/Main/Software. Dort downloaden wir die passende Windows-Software, Sketch genannt.Das Setup installiert ein paar Treiber, die u. U. (bei mir war das so) ein wenig zur Installation brauchen und einzeln abgenickt werden wollen. Ist das Setup fertig, dann können wir den Uno an den PC anschließen und mit Strom versorgen.
Der PC erkennt dann eine serielle Schnittstelle am USB-Port und installiert einen virtuellen COM-Port dafür.
Jetzt starten wir die arduino.exe-Software, die sich "Sketch" nennt.
Hier sollten wir als erstes das richtige Arduino-Board auswählen, denn davon gibt es eine Vielzahl.
Ich habe ein Uno, also wähle ich Arduino/Genuino Uno.
Außerdem müssen wir Sketch noch mitteilen, auf welchem COM-Port Windows den Arduino gefunden hat. Bei mir war das COM-Port 12.
Zum Test klicken wir jetzt einmal unter Werkzeuge auf Boardinformationen holen. Dann sollten uns Dinge wie die Seriennr. angezeigt werden. Das ist der Beweis, dass die Kommunikation zum Arduino Uno funktioniert.
Nun ist der Arduino bereit für Aufgaben.
Wie ich gerade feststelle, reicht auch der Strom, der über die USB-Verbindung zum PC geliefert wird aus, damit der Uno läuft.
Ein erstes Programm hochladen und ausführen
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Entwickler, die schon einmal in C programmiert haben, sollten die Syntax gleich wiedererkennen. Es handelt sich um den Klassiker unter den Programmiersprachen: C.Außer der Syntax, die ein bisschen anders als als in Python, das wir beim Raspberry Pi benutzen, wird hier genau das gleich getan:
In der Funktion mit dem festen Namen setup(), die einmal beim Start des Uno ausgeführt wird, wird der Pin für die LED als Output definiert: pinMode(LED_BUILTIN, OUTPUT). LED_BUILTIN ist damit eine globale Variable, die schon vorbelegt ist mit dem Pin der internen LED. Im Fall des Uno ist dies Pin 13, was man mit einem Multimeter zwischen Pin 13 und GND leicht überprüfen kann.
Die Funktion loop() ist der Name der Dauerschleife, die nach einem Reset oder Einschalten des Arduino wieder und immer wieder durchlaufen wird. Hier kommen die Befehle hinein, die mehr als einmal ausgeführt werden müssen: digitalWrite(LED_BUILTIN, HIGH); schaltet den Ausgang auf High, lässt die LED also leuchten und delay(1000); wartet eine Sekunde (1000 ms). digitalWrite(LED_BUILTIN, LOW); schaltet den Ausgang wieder auf Low und die LED aus. Das immer abwechseln ergibt ein Blinken.
C ist eine Sprache, die wohl zu den best dokumentierten gehört. Nur kurz ein paar Syntax-Eigenheiten:
- Blöcke werden mit { für den Anfang und } für das Ende markiert. Alles, was mehr als eine Zeile hat, muss als Block geschrieben werden. Die Einrückungen sind in C rein kosmetisch und haben keine syntaktische Aussagekraft.
- Jeder Befehl wird mit einem Semikolon ; abgeschlossen
- C liebt Klammern. If: mit Klammern, For: mit Klammern, While: mit Klammern. Häufig müssen auch Klammern gesetzt werden, wo der Compiler auch die Syntax ohne Klammern korrekt interpretieren könnte. Muss man nicht mögen. Die Klammern aber muss man trotzdem setzen.
C (Arduino) vs. Python (Raspberry Pi)
Hier eine Gegenüberstellung von Raspi / Python und Arduino / C, siehe auch die Seite Erste Schritte mit GPIO-Ansteuerung und LED auf dem Raspberry Pi zum Vergleich.Arduino / C Raspi / Python
pinMode(LED_BUILTIN, OUTPUT); GPIO.setup(led, GPIO.OUT)
digitalWrite(LED_BUILTIN, HIGH); GPIO.output(led, GPIO.HIGH)
delay(1000); time.sleep (1)
digitalWrite(LED_BUILTIN, LOW); GPIO.output(led, GPIO.LOW)
delay(1000); time.sleep (1)
Im Prinzip also das Gleiche, nur anders geschrieben.Mit dem Häkchen kann man die Syntax vor dem Kompilieren überprüfen. Ist es fehlerfrei, wird es gleich kompiliert und wir erhalten eine Statusmeldung. Mit dem Pfeil nach rechts oben in der Befehlsicon-Leiste wird das Programm dann hochgeladen. Dort steht es im Flash-Speicher und bleibt auch vorhanden, wenn der Arduino stromlos ist. Wird der Arduino wieder eingeschaltet, führt er das abgelegte Programm ohne Verzögerung (naja, bis auf ein paar Dezisekunden) aus.
Der Sketch verwendet 928 Bytes (2%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, 2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
Arduino Uno vs. Raspberry Pi Zero
Wie wir sehen, ist der Programmspeicher beim Arduino Uno nicht so üppig wie beim Raspberry Pi, aber ich glaube, auch für größere Rechnereien ausreichend. Mit dem Variablenspeicher muss man aber ein bisschen haushalten, der scheint nur 2KB groß zu sein.Sketch hält noch viele weitere Beispiele für alle möglichen Anwendungen bereit, aus denen man viel über die Syntax und die Funktionsweise lernen kann.
Der große Unterschied ist: Der Raspberry ist interaktiver. Ich kann über die Kommandozeile auf die GPIO-Ports zugreifen und mir den Status anzeigen lassen. Beim Uno muss ich das Programm immer erst neu kompilieren und hochladen. Dafür wird es dann aber auch sofort ausgeführt ohne langen Bootvorgang und viele weniger Ressourcenverbrauch.
Der Raspberry bringt auch schon alles mit: WLAN, Speichermöglichkeit auf micro SD Card, HDMI für die Videoausgabe, viel RAM und einen schnellen Prozessor - allerdings keine Analog-Eingänge. Ist dafür aber auch 4 mal so teuer (im Vergleich zu einem China-Uno). Aber es wäre nicht so, dass man einem Uno nicht auch WLAN per Modul beibringen könnte, oder über einen Raspberry Pi einen Analog-Digital-Wandler ansteuern, um Analog-Eingänge zu lesen.
Der LM35 war übrigens defekt bzw. eine Fälschung und tat keinen Mucks mehr. Ich habe zwei neue nachbestellt. Jetzt heißt es erstmal warten, bis die Teile da sind.