Vorwort

Diese Einführung in die Programmierung eines Arduino-basierenden Systems wie den MAKERbuino soll lediglich Geschmack auf mehr machen. Sie erhebt nicht den Anspruch auf Vollständigkeit. Beim Programmieren kommt man nicht wirklich um die englische Sprache herum. Viele Begriffe und vor allem die Befehle sind englisch. Daher wird hier versucht die Zusammenhänge zwischen den englischen Begriffen herzustellen. Es ist wichtig, dass man diese Begriffe versteht, damit man versteht was passiert und wo man eingreifen muss.

Viel Spaß damit

Die Entwicklungsumgebung

Um Programme für den MAKERbuino oder andere Arduino-basierten Systems schreiben zu können benötigt man ein paar Programme. Zunächst benötigt man einen sogenannten Editor in dem man seinen Quelltext oder in Englisch Sourcecode schreiben kann. Ein Editor ist also ein Programm in dem man Texte schreiben kann. Das ist der Ausgangspunkt für jedes Programm, dass man schreiben möchte. Der Sourcecode ist die Beschreibung der eigentlichen Abläufe im Programm. Er wird in einer für uns Menschen „verständlichen“ Sprache der sogenannten Programmiersprache geschrieben. Leider kann der Prozessor diese Sprachen nicht direkt verstehen. Er spricht nur „binären Op-Code“ 1) Op-Code: Operationcode, also Befehle, die durch Zahlenwerte dargestellt werden . Damit der Prozessor trotzdem weiß, was er zu tun hat, muss der Sourcecode in binären Op-Code übersetzt werden. Diese Aufgabe übernimmt der ogenannte Compiler. Er versteht den Sourcecode und kann diesen dann in die nötigen Op-Code-Befehle, die der Prozessor benötigt übersetzen.

Es gibt noch weitere Helfer, aber dazu später mehr. Zunächst müssen wir also einen Editor und einen Compiler für den verwendeten Prozessor, den Arduino, installieren. Nun könnten wir alles einzeln installieren oder wir verwenden eine sogenannte IDE 2) IDE: integrated development enviroment; integrierte Entwicklungsumgebungen enthalten alle notwendigen Programme wie Editor, Compiler, Linker etc. und sind meist sehr komfortabel

Als IDE verwenden wir die Ardunio-IDE die hier heruntergeladen werden kann. Aktuell ist die Version 1.8.5 (Stand: Januar 2018). Im zweiten Abschnitt befinden sich die Download-Links für die verschiedenen Betriebssysteme. Weg zum Download: arduino.cc → Software

Download-Bereich Arduino-IDE

Die Arduino-IDE wird wie jedes Programm einfach installiert. Anschließend kann die Arduino-IDE gestartet werden. Es sollte der Dialog erscheinen, der sketch_… Arduino 1.8.5 im Titel anzeigt. Damit wir für den MAKERbuino einer speziellen Form des Arduino Programme entwickeln können, benötigen wir noch eine sogeannte Bibliothek oder im Englischen library in der spezielle bereits vorbereitete Programmteile zusammengefasst sind, die uns das Leben mit dem MAKERbuino vereinfachen. Der MAKERbuino ist kompatibel, also verhält sich genauso, zum Gamebuino. Daher benötigen wir die Bibliothek des Gamebuino. Diese kann einfach nachinstalliert werden. Über Sketch → Bibliothek einbinden → Bibliotheken verwalten… Hier kann im oberen rechten Bereich gamebuino eingegeben werden. Es sollte dann wie im Bild unten eine kurze Information zur Bibliothek angezeigt werden. Klickt man in diesen Bereich, dann erscheint ein Installieren-Button, den man anklickt. Nach einer kurzen Installation steht im oberen Bereich nun INSTALLED.

WICHTIG: Nach der Installation der Bibliothek muss die Arduino-IDE ggf. neugestartet werden, damit die neue Bibliothek eingebunden wird.

Das erste Programm "Hello World!"

Jetzt geht es an das erste Programm. Hierzu öffnen wir ein Beispielprogramm des Gamebuino.

Erstes Hello World Beispiel

Folgender Sourcecode sollte erscheinen:

Kurze Erklärung der Abschnitte (kann übersprungen werden)

Im Folgenden werden die Grundlagen einer Sourcecode-Datei erklärt.

Der erste Abschnitt: Einbinden von fremdem Sourcecode

Der erste Abschnitt des Sourcecodes bindet alle notwendigen Bibiliotheken ein. Dies geschieht mit dem Befehl #include3) include: Binde ein; macht z.B. eine fremde Bibliothek im eigenen Sourcecode nutzbar . Das Zeichen # gibt dem Compiler eine Anweisung, also ist include kein Befehl, der in binäre Code für den Prozessor übersetzt wird, sondern lediglich an den Compiler selbst gerichtet ist.

In spitzen Klammern wird nun die sogenannte Header-Datei der Bibliothek angegeben. In diesen Header-Dateien erklärt man normalerweise welche Variablen bzw. Funktionen innerhalb einer Bibliothek zur Verfügung stehen. Durch das #include wird der Inhalt genau diese Header-Dateien während der Übersetzung des Sourcecodes in den eigenen Sourcecode „kopiert“. Damit wird alles aus den entsprechenden Bibliotheken im eigenen Sourcecode nutzbar ohne den fremden Sourcecode tatsächlich immer kopieren zu müssen.

Hier werden also die beiden Bibliotheken SPI4) SPI: s*erial p*rogramming interface, serielle Programmierschnittstelle zum nutzen der Programmierschnittstelle und Gamebuino für den MAKERbuino selbst eingebunden.

Weiterhin wird hier noch die Variable gb definiert. Vor dieser Variable steht der sogenannte Type der Variable. Hier Gamebuino. Dieser Variablentype wird in der Heade-Datei Gamebuino.h definiert und enthält alles Wichtige um den MAKERbuino zu programmieren. Die Variable existiert zwar zu diesem Zeitpunkt, aber sie kann noch nicht genutzt werden. Um dies zu tun muss sie zunächst initialisiert werden, also quasi mit Leben gefüllt werden. Das heißt das Gerüst der Variablen existiert schon, aber der Inhalt ist noch leer.

Der zweite Abschnitt: Der Sourcecode

Im zweiten Abschnitt kommt der eigentliche Sourcecode. Hier sind zwei sogenannte Funktionen ( void setup(){…} und void loop(){…}) definiert.

Um zu verstehen was hier passiert, muss man wissen, dass es bei vielen Systemen festdefinierte Funktionen gibt, die bestimmte Aufgaben haben. Die beiden setup und loop gehören dazu.

Alle Funktionen haben denselben Aufbau:

RÜCKGABEWERT FUNKTIONSNAME(EINGANGSWERTE){
BEFEHLE, die innerhalb der Funktion abgearbeitet werden
}
Beispiel:
int myfunct(int var1) {
print(var1);
var1=var1+1;
return var1;
}

Die Funktion heißt hier myfunct sie erwartet als Eingangswert5) an sie gerichtet einen int-Wert6) int: integer; ganzzahlige Zahl zB. -3, 2 oder 5 und gibt ebenfalls einen int-Wert zurück hier return var1.

Bei void setup() bedeutet void in diesem Zusammenhang kein Rückgabewert und die leeren runden Klammern bedeuten kein Eingangswert.

setup(): Die Initialisierung des Systems

Die setup()-Funktion wird genau einmal beim Programmstart durchlaufen und dient dazu die Grundkonfiguration des Programms vorzunehmen. Hier werden meist die globalen Variablen wie gb initialisiert, also mit Werten befüllt gb.begin().

Auch kann man hier z.B. den Titelbildschirm gb.titleScreen einblenden lassen oder sogenannte popup-Nachrichten gb.popup (eingeblendete Nachrichten).

Wichtig: Hier gehört nicht hinein, dass mehrfach aufgeführt werden sollen. Also irgendwelche Steuerungen oder sonstige Programmteile. Ansonsten passiert alles genau einmal und danach passiert nichts mehr.

loop(): Die eigentliche Hauptroutine

Die loop()-Funktion ist die Hauptroutine, die immer und immer wieder durchlaufen wird. Das bedeutet das alle Befehle, die innerhalb dieser Funktion stehen immer wieder durchlaufen werden. Also sollte darüber gut nachgedacht werden, was hier passieren soll. Es wird ansonsten sehr oft wiederholt.

Im Kommentar wird erklärt, dass der Gamebuino 20 mal in der Sekunde ein update als eine Aktualisierung durchführt. Innerhalb dieses updates wird der Bildschirm, die Soundausgabe, die Hintergrundbeleuchtung usw. aktualisiert. Darum müssen wir also glücklicherweise nicht kümmern (sofern alles wie gewünscht funktioniert). Während eines solchen Aktualisierungszyklus sollte man keine Änderungen durch das eigene Programm durchführen. Dies könnte zu unschönen Ergebnissen führen z.B. ist der obere Teil des Bildschirms schon aktualisiert worden und kurz danach wird ein Wert für diesen Teil geändert.

Damit also nicht permanent etwas geschieht, kann man darauf warten, dass ein solcher update-Prozess durchlaufen wurde und im Anschluss einige Befehle abarbeiten. Das Objekt gb hat hierzu eine Funktion7) Methode definiert, die mit gb.update() aufrufen werden kann. Der .-Punkt zwischen gb und update() deutet daraufhin, dass die Funktion update() ein Teil des Objektes gb ist.

Mit Hilfe der Funktion gb.update() lässt darauf warten, dass der Gamebuino einen update-Zyklus beendet hat, in dem man innerhalb der loop-Funktion mit Hilfe einer if-Anweisung auf den Rückgabe werden true prüft.

if (gb.update()){ ... }