Roboter Programmieren mit Blöcken

Google Blockly

Wie lernt man eigentlich gut programmieren? Als Antwort darauf bekommt man von den Erfahrenen meist Aussagen wie "Na klar, Learning by doing" oder "Tja, ist eben easy to learn, hard to master". Das gilt fürs Programmieren wie für viele andere Fähigkeiten. Für alle diejenigen, die trotz dieser ernüchternden Einschätzungen den Schritt wagen und sich ins Programmieren stürzen möchten: Das Blockly-Framework von Google bietet einen einfachen Einstieg.

Bei Blockly, einem webbasierten Entwicklungswerkzeug muss sich niemand mit der komplizierten Syntax von Programmiersprachen auseinandersetzen. An die Stelle der Sprachkonstrukte treten hier Blöcke, die per Ziehen-und-Fallenlassen zusammengesetzt werden können. So entstehen im Webbrowser einfache Programme mit wenigen Klicks ohne dass Codezeilen selber geschrieben werden müssen:

Blockly Hello World Blockly Hello World

Das fertige Programm lässt sich im Browser selbst ausführen. Hierzu wird von Blockly Javascript generiert, welches direkt im Browser läuft. Alternativ lässt sich mit Blockly aber auch Code für andere Sprachen erzeugen, mit Hilfe sogenannter Generatoren. Diese sind ausführlich in der Dokumentation beschrieben. Standardmässig umfasst die Auswahl Javascript, Python, PHP, Lua, Dart, oder XML. Der generierte Code lässt sich dann in einem anderen Programm weiterverwenden.

Mit wenig Aufwand kann Blockly auch um neue Blöcke erweitert werden. Ein guter Startpunkt sind hierfür die bereits vorhandenen Blöcke, die einfach kopiert und angepasst werden können. Zudem gibt es die sogenannten Blockly Developer Tools, einem einfachen Online-Codegenerator für neue Blöcke.

Der Drawbot

Wenn richtige Hardware ins Spiel kommt, kann das Programmierenlernen gleich viel mehr Spass machen. Hierfür wurde der sogenannte Drawbot entwickelt.

Der Drawbot ist ein Zeichenroboter, der speziell für den nationalen Zukunftstag in der Schweiz entworfen wurde. Er wird mit drei Servos angetrieben und bewegt somit einen Stift über die Zeichenunterlage. Beim Design des Roboters wurde darauf geachtet, dass keine Kenntnisse in Elektronik notwendig sind. Die tatsächliche Hardware befindet sich leider noch in der Produktion, aber letztendlich wird das Ergebnis ungefähr wie folgt aussehen:

Plotclock

Der Drawbot wird über die serielle Schnittstelle bedient und versteht eine kleine Anzahl an Befehlen. Diese reichen bereits aus, auch um komplexere Zeichnungen anzufertigen. Um beispielsweise den Stift an eine gewisse Position zu fahren, wird über die serielle Schnittstelle das Kommando

goto 123 456\r\n

übertragen.

Glue-Logic mit PyQt5

Wie können wir nun diese beiden Welten zusammenbringen? In einem "normalen" Browser lässt sich nicht so einfach die serielle Schnittstelle bedienen (andernfalls wäre dies auch ein enormes Sicherheitsrisiko). Es gibt aber eine Möglichkeit, wie ein Blockly-Programm die serielle Schnittstelle des Computers bedienen kann. Dafür bedienen wir uns Python, unser Lieblingssprache für kleine Hacks und Tricksereien zwischendurch. Mit den Qt5-Bindings für Python (a.k.a. PyQt5) stellen wir ohne großen Aufwand eine HTML-Seite dar und sind zudem in der Lage, Javascript darauf auszuführen.

Damit liegt die Lösung (nach Einlesen in die Qt-Dokumentaion) nahe. Wir müssen lediglich die Blockly-HTML-Seite mit der Klasse QWebEngineView darstellen. Auf der dargestellten Seite können wir mit Blockly programmieren, genauso wie in Firefox oder Chromium:

Hackly Hackly

Wenn wir soweit sind, wird mit einem Python-Aufruf der generierte Code aus der Webseite herausgesucht und lokal auf dem Computer ausgeführt. Somit können wir auch die serielle Schnittstelle bedienen, was mit dem herkömmlichen Browser nicht möglich war. Normalerweise wäre dies ein grosses Sicherheitsrisiko, aber nachdem wir nur unsere eigene HTML-Seite darstellen ist dies unbedenklich.

Damit auch alle Funktionen des Drawbot verwendet werden können, wurde die Blockly-Umgebung mit einer neuen Kategorie von Blöcken ergänzt. Diese Blöcke lassen sich ohne Einschränkungen mit den Standard-Blöcken von Blockly mischen.

Tests mit dem Pseudo-Terminal

Mit der grossen Auswahl an verschiedenen Blöcken kommen wir sehr schnell ans Ziel. Umso bedauerlicher ist es, wenn die zugehörige Hardware noch nicht fertig ist -- schliesslich wollen wir doch auch sehen, was unser Zeichenroboter tatsächlich malt! Auch bei diesem Problem behelfen wir uns wieder des Qt-Frameworks.

Wir nutzen aus, dass unter Linux sogenannte Pseudo-Terminals verwendet werden können, die sich wie eine serielle Schnittstelle verhalten. Eine solches Pseudo-Terminal, auch pts genannt, betten wir in eine kleine Qt-Applikation ein, die genau die gleichen Kommandos akzeptiert, wie der echte Roboter. Dieses Verfahren wird in der Software-Entwicklung oft auch Mocking genannt. Es bietet den Vorteil, dass die Schnittstelle des Programms getestet werden kann, ohne dass das nötige Gegenstück benötigt wird.

Mit diesem Sammelsurium an Programmen und Glue-Logic dazwischen können wir schon erahnen, was der echte Drawbot für hübsche Bilder zeichnen können wird. Hier einige Beispiele:

Koch-Snowflake Sierpinski-Kurve Hilbert-Kurve

Hoffen wir also, dass die Präzision der Servo-Motoren ausreicht! Wer diese reine Software-Lösung ausprobieren möchte, der ist dazu eingeladen, den Code von Github auszuchecken. Wir wünschen viel Vergnügen!