Mit Arduino einfach einen PC aus einen Mikrocontroller programmieren
Die meisten Programmierer unter Euch werden wohl Programme für ihre PCs, vielleicht auch für ihre Handys oder Tabletts geschrieben und kompiliert haben. Dank dem Internet der Dinge sind aber auch Mikrocontroller, jene winzig kleinen Computer auf einem Chip, die Sensoren und Aktoren wie Relais und Schalter programmierbar machen, ins Interesse der breiteren Öffentlichkeit gerückt.
Dank Projekten wie dem Arduino ist es einfach geworden, vom PC aus einen Mikrocontroller zu programmieren. Aber auch ohne Arduino-Oberfläche ist es, mit den klassischen Tools der Embedded-Programmierer mit geringem Aufwand möglich, einen Mikrocontroller zu programmieren.
Wir wollen Euch mit diesem Artikel den Einstieg in die Welt der Mikrocontroller erleichtern und einige Tipps bei der Auswahl der richtigen Plattform für Euer Projekt geben.
Wo bekomme ich meinen Mikrocontroller her und wie beschalte ich ihn?
Mikrocontroller kann man als reinen Chip von verschiedenen Herstellern erwerben. Häufig ist der Umgang mit einem solchen nackten Chip aber kompliziert. Um den Chip an sich an den Rechner anzuschließen, braucht man einen Programmer, um die Signale, die der PC an der USB-Schnittstelle erzeugt, elektrisch in etwas umzusetzen, was auch der Mikrocontroller versteht. Darüberhinaus muss ein Mikrocontroller mit Strom versorgt werden, damit er seine Arbeit verrichten kann.
Außerdem muss man seine Sensoren und Aktoren an den Controller anschließen. Wenn Dein Projekt noch nicht so weit gereift ist, dass Du Deine eigene Platine geätzt und alle Anschlüsse verschaltet hast, empfiehlt sich ein sogenanntes Developer-Board. Alle großen Hersteller von Mikrocontrollern bieten diese Boards, auch Prototyping-Boards genannt, an. Dort ist meist für einen Stromanschluss, eine Programmierschnittstelle und eine einfache Möglichkeit, Deine Sensoren und Aktoren anzuschließen, gesorgt. Die wohl berühmtesten Boards tragen das Arduino-Label. Die Controller auf diesen Boards sind aber vergleichsweise langsam und haben wenig Speicher. Deswegen sind in den letzten Jahren viele andere beliebte Prototyping-Plattformen wie Intels Galileo, STM32, oder das LaunchPad von Texas Instruments entstanden. Auch PIC-Controller, die besonders kostengünstig und weit verbreitet sind, gibt es seit einiger Zeit auf fertigen Prototyping-Boards. Welches Board das richtige ist, hängt auch davon ab, welche weiteren Komponenten Ihr kaufen möchtet. Arduinos haben mit ihren Shields einen Standard geschaffen, der es auch Neulingen in der Welt der Elektronik ermöglicht, relativ komplexe Schaltungen mit einem Handgriff an einen Mikrocontroller anzuschließen. STM32 ist ein Board mit einem relativ schnellen ARM Cortex Prozessor, das Arduino-Shields unterstützt. Galileo bietet neben der Unterstützung für Shields einen Mini-PCI-express Port, der das Board sehr einzigartig macht. Welche Funktionalität Ihr für Euer Projekt benötigt, solltest Ihr vor dem ersten Entwurf sorgsam abwägen, das spart nachher viel Zeit und unnötige Investitionen.
Wenn Ihr genau entschieden habt, was in Eurem Projekt passieren soll, müsst Ihr neben dem Prototyping-Board auch noch die restlichen Komponenten besorgen. Ein Breadboard und Jumper Kabel helfen Euch dabei, die Komponenten, die Ihr nicht als Shield kaufen könnt, an den Controller anzuschließen. Dabei müsst Ihr den Stromverbrauch, aber auch die Betriebsspannung und auch die Wärme-Entwicklung Eurer Komponenten genau im Auge behalten. Elektronische Grundkenntnisse sind hier von großem Vorteil; habt Ihr diese nicht, solltet Ihr versuchen, soweit möglich mit fertigen Shields zu arbeiten oder Euch an gut dokumentierte Anleitungen beispielsweise aus dem arduino-playground oder von lady ada zu halten.
Im Gegensatz zu reiner Software-Programmierung besteht bei der Hardware-Entwicklung immer die Möglichkeit, durch Unwissen oder grobe Fehler Hardware zu beschädigen. Kauft also zum Einstieg lieber ein günstiges Board und günstige Sensoren und Aktoren, wenn dieses dann kaputt geht, müsst Ihr nicht allzu traurig sein.
Falls Ihr noch Mühe habt, Eure Schaltung vor dem Beginn der Programmierung zusammenzustellen, kann Funktionalität zunächst auch mittels LEDs und einfachen Potentiometern, die die Sensor-Eingabe simulieren, getestet werden. Dieses Vorgehen solltet Ihr aber nur in Ausnahmefällen wählen.
Wie programmiere ich mein Board?
Bei der Auswahl des richtigen Boards sollten auch Deine Programmierkenntnisse eine Rolle spielen. Arduinos kann man dank der einfachen Struktur der processing-Sprache auch mit einem geringen Hintergrundwissen programmieren. Es existieren sehr viele fertige Projekte, die mit wenig Aufwand abgewandelt werden können, und so schnell zu ersten Erfolgen führen.
Wer C++ kann, kann seinen Arduino auch mit einem professionellen Werkzeug wie dem Atmel-Studio verwenden. STM32-boards können mit dem mbed-Framework, dessen Syntax weitestgehend C++ identisch ist, relativ schnell zum
Leben erweckt werden. PIC-Controller können in mehreren Sprachen programmiert werden, unter anderem in einer grafischen Sprache, die sich besonders für Benutzer mit sehr geringen Vorkenntnissen eignet.
Die auf den Prototyping-Boards enthaltenen Programmer benötigen teilweise einen Treiber, der mit dem Board mitgeliefert wird. Diesen Treiber solltet Ihr installieren, bevor Ihr Eure Entwicklungsumgebung das erste Mal startet.
Egal für welche Plattform und für welches Tool Ihr Euch entscheidet, Ihr werdet neben einem Editor, wo Ihr wie gewohnt Euren Quellcode eingebt, eine sogenannte Tool-chain brauchen. Da Ihr als klassischer Programmierer meist an dem System, für das Ihr programmiert, sitzt, ist die Auswahl des Compilers dort eher Formsache. Da Ihr aber jetzt ein Programm übersetzt, dessen Assembler-Code auf einer anderen Maschine laufen soll, braucht Ihr einen sogenannten cross-platform-compiler oder einfach cross-compiler (cross-platform heißt in diesem Zusammenhang einfach für eine andere Ziel-Plattform). Ihr braucht auch libraries, die hardware-spezifische Aspekte in Euren Programmablauf einfügen. Und Ihr braucht einen Linker, der alles nach den Vorgaben, die Ihr in einem Makefile macht, zusammenschnürt und für die Ausführung vorbereitet.
Wenn Ihr die Kommandos an den Compiler nicht von Hand auf der Konsole eingeben wollt, solltet Ihr Euch nach einer sogenannten Integrated Development Environment (integrierte Entwicklungsumgebung, IDE) umsehen. Eine beliebte kostenlose Lösung ist Eclipse. Visual Studio, Atmel-Studio oder WIN-AVR sind weitere, ebenfalls populäre Produkte.
Makefiles erhaltet Ihr meist zusammen mit den libraries vom Hersteller Eures Controllers. Natürlich könnt Ihr auch Eure eigenen Makefiles schreiben, wenn Ihr mit der make-file-syntax Eures Compilers vertraut seid.
Damit Eure Entwicklungsumgebung dann wie gewohnt funktioniert, müsst Ihr im Menü, das den Build-Prozess steuert, zunächst Eure libraries und Euer Makefile hinterlegen. Dann müsst Ihr den von Euch ausgewählten Compiler und Linker, ggf. auch den Debugger einbinden. Für alle Umgebungen gibt es für die beliebtesten Boards fertige Plugins und Zusatzprogramme, die Euch die meiste Arbeit abnehmen. Gerade für Anfänger sind diese Hilfen eine gute Möglichkeit, Fehlerquellen auszuschließen.
Seid nicht frustriert, wenn dieser Konfigurationsprozess gefühlt sehr lange dauert. In Desktop-Projekten habt Ihr bisher kaum Zeit mit so etwas verbringen müssen, aber in embedded-Projekten ist dies eine wichtige Aufgabe, die bei wenig Übung durchaus ein paar Stunden in Anspruch nehmen kann.
Für jede der bisher genannten Plattformen und für alle Entwicklungswerkzeuge gibt es spezifische Pakete und Anweisungen für Euren Mikrocontroller. Ihr müsst darauf achten, genau das richtige Paket für Eure Plattform zu verwenden, sonst ist Euer übersetzter Maschinencode am Ende nicht ausführbar.
Warum macht mein Controller das?
Genau wie in der klassischen Desktop-Programmierung wird auch hier nicht von Anfang an alles richtig funktionieren. Wer mit dem Einsatz eines Debuggers nicht vertraut ist, sollte darüber nachdenken, Ausgaben in seinen Quellcode einzubauen. Ein Mikrocontroller hat keinen Bildschirm, aber er verfügt über eine serielle Verbindung zu dem PC, von dem aus er programmiert wird.
Mit einem Terminal-Programm, wie dem in Windows eingebauten HyperTerminal, ist es möglich, eine Verbindung zum Controller aufzubauen, Steuerbefehle zu senden (wenn Euer Programm solche Befehle akzeptiert!) und Ausgaben aufzufangen. Diese serielle Verbindung müsst Ihr in Eurem Mikrocontrollerprogramm aktivieren und benutzen. Wenn Ihr so beispielsweise Messwerte Eurer Sensoren ausgebt oder Zustandsinformationen, habt Ihr eine gute Möglichkeit zu überwachen, was Euer Controller gerade tut und auf Fehlerquellen zu schließen.
Später, wenn Euer Programm gut funktioniert, könnt Ihr auf diese Weise (über USB-Kabel oder auch über Bluetooth, ZigBee oder andere Protokolle, die eine serielle Verbindung unterstützen) mit einem Programm auf dem Desktop kommunizieren, das Daten speichert, auswertet oder visualisiert.