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:

Der Atmel ATmega 328P


Technische Daten:

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 Sektch 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



Nun wollen wir dem Uno etwas zu tun geben. Wir wählen dazu im Menü aus: Datei / Beispiele / 01.Basics / Blink und folgender Code sollte im Editor erscheinen // 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:

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 und tat keinen Mucks mehr. Ich habe zwei neue nachbestellt. Jetzt heißt es erstmal warten, bis die Teile da sind.