E10_com_protocoder

Herzlich willkommen!

In diesem Beitrag lernen wir, wie man einen PrintBot von einem Terminal mit Hilfe von Protocoder programmieren und steuern kann.

Protocoder ist ein Prototyping-Werkzeug für mobile Anwendungen, das es ermöglicht, Schnittstellen und Programme auf schnelle Art und Weise zu erstellen. Entwickelt wurde Protocoder von Victor Díaz.

Hier findest du weitere Informationen und kannst das Programm downloaden. Wir verwenden Protocoder als Schnittstelle und setzen diese dazu ein, uns über Bluetooth mit der Platine ZUM BT-328 zu verbinden. Wir können den PrintBot Evolution frei bewegen oder einen der automatischen Modi wählen: Er kann Linien oder dem Licht folgen oder Objekten ausweichen.

Für die Steuerung des PrintBot Evolution werden wir zwei Programme verwenden:

  1.  Protocoder Code: speichert die Grafik-Schnittstelle sowie die Funktionen, die dazu dienen, über das Bluetooth des Terminals Daten an die Platine zu senden.
  2.  ZUM BT-328 Code: speichert die Programmierung des PrintBot Evolution, wie zum Beispiel die Funktionsweise oder die Bluetooth-Kommunikation.

Am Ende dieses Beitrags kannst du beide Codes herunterladen. Denk daran, dass du für das Ausführen des Protocoder-Codes, Protocoder bereits in deinem Terminal installiert haben musst (du kannst es hier herunterladen).

Protocoder-Code

Um den Protocoder-Code sehen und modifizieren zu können, musst du zunächst von deinem Terminal aus auf die Anwendung zugreifen und die IP-Adresse eingeben, die im unteren Teil auf dem Bildschirm deines Webbrowsers erscheint. ip_protocoderLade den Code am Ende dieses Beitrags herunter und verschiebe die Datei printbot_evolution_protocoder.proto auf dein Terminal. Dort öffnest du im Datei-Explorer den Ordner, in dem du die Datei gespeichert hast (für gewöhnlich Downloads). Klicke auf den Protocoder-Code, damit sich ein Dialogfenster öffnet. Wähle „mit Protocoder öffnen“ aus. Wähle anschließend im Pop-up-Fenster die Option „installieren“ aus. Jetzt kannst du den Code verwenden und modifizieren.E10_com_protocoderWenn du die Datei .proto, importiert hast, kannst du das Projekt in dem Reiter des Browsers MY PROJECTS sehen. Klicke auf das Bild, um den Code zu visualisieren. Innerhalb des Codes unterscheiden wir verschiedene Teile:

  1. Textfeld erstellen: Eine Schaltfläche mit einem Text zu erstellen ist hilfreich, um mehr Informationen über die Funktion dieser Schaltfläche zu geben. Der Code dafür sieht folgendermaßen aus:

    Im Code erstellen wir die Schaltfläche mit var btnSiguelineas. Damit es kein Durcheinander gibt müssen wir jede Schaltfläche anders benennen. Anschließend bestimmen wir mit ui.addButton, dass die Variable btnSiguelineas eine Schaltfläche sein soll. In Klammern fügen wir der Reihe nach den Text ein, der in der Schaltfläche erscheinen soll: die X- und Y-Position sowie die Höhe und die Breite der Schaltfläche. Anschließend geben wir die Funktion an, die mit Drücken der Schaltfläche ausgeführt werden soll, in diesem Fall per Bluetooth das Wort siguelineas (Linienfolger) zu senden.
  2. Eine Schaltfläche mit Bild erstellen

    Wir erstellen die Schaltfläche mit var btn180, aber diese ist anders als die Vorige. In diesem Fall verwenden wir ein Bild anstelle eines Textes. Anschließend bestimmen wir mit ui.addImageButton, dass die Variable btn180 eine Bildfläche sein soll. In Klammern fügen wir der Reihe nach die X- und Y-Position, die Höhe und die Breite der Fläche sowie den Namen des Bildes, das auf der Fläche erscheinen soll, hinzu. Anschließend geben wir an, welche Funktion mit dem Drücken der Schaltfläche ausgeführt werden soll. In diesem Fall lautet sie, per Bluetooth 180 zu senden. Bilder oder andere Dateien können leicht hinzugefügt werden, in dem wir sie vom Datei-Explorer des Computers in die rechte untere Ecke ziehen. Achte darauf, dass sich der Name, je einfacher er ist, auch umso leichter fehlerfrei in den Code einsetzen lässt.
    archivos
  3. Schaltflächen für das Dashboard erstellen: Diese fügen wir genauso wie die Schaltflächen des Gerätes hinzu. Allerdings verwenden wir dieses Mal statt des Präfixes ui, das Präfix dashboard. Standardmäßig erscheint das Dashboard nicht. Wenn du dies ändern willst, ersetze die Linie dashboard.show(false) durch dashboard.show(true).
  4. Funktionen für das Verbinden und Trennen von Bluetooth: Es geht um jene, die in den Variablen btnConectar und btnDesconectar enthalten sind. Außerdem erstellen wir eine Variable mit dem Namen btClient, die wir für die „Interaktion“ mit Bluetooth verwenden.
    1. Verbinden: Bevor wir eine Verbindung erstellen können, müssen wir zunächst die Schaltfläche mit dem Text „Bluetooth verbinden“ bilden. In die Funktion, die mit dem Drücken der Taste aktiviert wird, fügen wir die Bluetooth-Verbindung ein.

      Außerdem bestimmen wir, abgesehen davon, dass wir uns mit Bluetooth verbinden, dass der Variable bluetoothOn, die wir als „Signal“ für das Verbinden/Trennen von Bluetooth verwenden, der Wert 1 zugewiesen wird. Die Transparenz der Fläche ändern wir auf 0, das heißt, auf komplett transparent. Darüber hinaus fügen wir ein paar Animationen wie jump hinzu und lassen das Gerät beim Verbinden vibrieren.
    2. Trennen: Zum Trennen müssen wir zunächst eine Schaltfläche mit dem Text „Trennen“ erstellen. In die Funktion, die mit dem Drücken der Taste aktiviert wird, fügen wir das Trennen von Bluetooth hinzu.

      Außerdem bestimmen wir, abgesehen davon, dass wir die Bluetooth-Verbindung trennen, dass der Variable bluetoothOn, die wir als „Signal“ für das Verbinden/Trennen von Bluetooth verwenden, der Wert 0 zugewiesen wird. Die Transparenz der Fläche ändern wir auf 255, das heißt, auf opak.
  5. Funktion für das Senden und Empfangen von Daten über Bluetooth: Die Funktion für die Datenübertragung per Bluetooth lautet:

    Diese Funktion besitzt keine Schaltfläche, denn sie wird, mit Ausnahme des Verbindens/Trennens von Bluetooth, beim Anklicken einer Schaltfläche mit aufgerufen. Um Daten über Bluetooth zu senden verwenden wir den Befehl btClient.send(„=“+str+“+“). Für die Vorwärtsbewegung eines Autos sendet diese Funktion beispielsweise:=avanzar+. In diesem Fall haben wir den Code so festgelegt, aber du kannst auch eine andere Kodifizierung verwenden. Es werden die Zeichen =y+ als Begrenzungen für den Anfang und das Ende der Übertragung verwendet.

    1. Daten über Bluetooth senden: Um Daten über Bluetooth zu senden verwenden wir die Funktion send() mit einem Text, der in Anführungszeichen gesetzt ist. Wenn wir beispielsweise das Wort retroceder (zurücksetzen) senden wollen verwenden wir: senden („retroceder“).

Arduino Code

Um den Code von Arduino einsehen oder modifizieren zu können, musst du am Ende dieses Beitrags das Paket herunterladen und auf die Datei printbot_evolution_arduino.ino klicken. Wenn du keine Arduino-IDE oder eine andere IDE (mit der du die Datei lesen kannst) installiert hast, kannst du sie im Programmierkurs für Maker zu Arduino und Protocoder herunterladen. Dort kannst du auch verschiedene IDEs ansehen und deinen Favoriten herunterladen. So lernst du auch gleich mehr über Arduino und Protocoder.

  1. Deklaration von Variablen und Einfügen von Bibliotheken: Wir legen die einzelnen Variablen fest, die wir während des Programms verwenden:

    Einige von ihnen verwenden wir, um Arduino zu sagen, an welche Pins die nicht gedruckten Teile („vitamins“) angeschlossen werden müssen und andere, wie die delays, um die Ausführung des Programmes zu modifizieren. Wenn die Kreise nicht korrekt ausgeführt werden oder du ihren Drehwinkel ändern möchtest, kannst du die Variablen giro_180, giro_90, giro_45 y giro_30 verändern.
  2. Setup: In der Funktion Setup, zusammen mit Loop eine der obligatorischen Funktionen bei Arduino, initialisieren wir das Programm und die Komponenten, die es bilden. Der Code der Setup-Funktion lautet folgendermaßen:

    Innerhalb dieser Funktion initialisieren wir die serielle Schnittstelle mit einer Geschwindigkeit von 19200 Bauds/s. Dies ist die Geschwindigkeit, mit der das Bluetooth Modul der Platine ZUM BT-328 funktioniert. Dann müssen wir angeben, wo jeder einzelne Servo angeschlossen wurde, die sich bewegenden Servos anhalten und den Servo mit dem Bat Ultraschallsensor zentrieren. Als Letztes legen wir mit der Anweisung pinMode(pin,mode) die verschiedenen Eingangspins (INPUT) oder Ausgangspins (OUTPUT) je nach Bedarf fest.
  3. Loop: In der Funktion Loop, der zweiten obligatorischen Funktion bei Arduino, geht es um den Datenerhalt:

    Wir sehen in ihr die Anweisung if (Serial.available() >0). Dies bedeutet in “menschliche” Sprache übersetzt so viel wie: Sind an der seriellen Schnittstelle Daten vorhanden, führe die folgenden Anweisungen aus. In diesem Fall lautet die Anweisung, die Funktion readFromAndroid() aufzurufen. Diese Funktion liest die Daten, die von der Protocoder-Anwendung gesendet wurden. Die andere in Loop erscheinende Anweisung lautet writeData();. Diese Funktion sorgt für den Übergang in die verschiedenen Steuermodi (sowohl manuell und extern), sobald die Daten aus der vorigen Funktion gelesen wurden.
  4. readFromAndroid();:

    Statt dieser Funktion hätten wir auch die Funktion readString(); verwenden können, aber sie wird langsamer ausgelesen. Dies würde dazu führen, dass die Anweisungen, die wir vom Protocoder Programm auf unserem Gerät aus senden, verspätet zu unserem PrintBot Evolution gelangen.
  5. writeData();: Diese Funktion kontrolliert den Programmfluss, liest die aus der Funktion readFromAndroid() erhaltenen Daten und führt entsprechend dieser Daten die eine oder die andere Anweisung aus.
  6. Bewegungs-Funktionen: Diese Funktionen dienen dazu, den PrintBot Evolution zu bewegen. Es sind konkret: avanzar (vorwärts bewegen), retroceder (rückwärts bewegen), parar (anhalten), izquierda (links), derecha (rechts), giro_180_grados (180_Grad_Drehung), izquierdaLineas (linksLinien) und derechaLineas (rechtsLinien). Durch Aufrufen können wir diese Funktionen jederzeit verwenden. Für eine 180-Grad-Drehung verwenden wir beispielsweise die folgende Anweisung:
  7. Modi-Funktionen: Diese Funktionen werden dazu verwendet, den PrintBot in den automatischen Modus zu versetzen.
    1. Linienfolger: Dieser Automodus verwendet die Infrarotsensoren, um festzustellen, ob sich der Sensor auf einer Linie befindet. In diesem Modus werden die besonderen Bewegungs-Funktionen verwendet, linksLinien und rechtsLinien, die nur ein Rad statt zwei Rädern in entgegengesetzter Richtung bewegen, um eine Bewegung durchzuführen.
    2. Objekten ausweichen: In diesem Automodus wird der Ultraschallsensor zum Erfassen von Objekten verwendet, um ein Zusammenstoßen mit diesen zu umgehen. Der Code dieser Funktion lautet:

      In dieser Funktion finden wir zunächst die Variablen izq,drcg und cent, welche die Position des Mini-Servos festlegen, der den Ultraschallsensor bewegt. Zu diesen Positionen zählen entsprechend links, rechts und zentriert, aber die Positionen können an andere angepasst oder auch neu erstellt werden. Anschließend müssen wir mit Hilfe der Funktion buscaObstaculos() prüfen, dass sich keine Objekte in der Richtung befinden, in die der Servo steuert. Diese Funktion verwenden wir für alle Positionen und sie übermittelt den Winkel, den der Servo anstreben soll. Der Code dieser Funktion lautet:

      In dieser Funktion könnt ihr die maximale Entfernung verändern, die wir verwenden, um Objekte zu erkennen. Mit anderen Worten, du kannst die Distanz verändern, ab der wir ein Objekt auf unserem Weg als Hindernis ansehen oder nicht. Um die Entfernung zu kalkulieren werden die Hilfsfunktionen Distance und TP_init verwendet. Sie sorgen für die Aktivierung des Bat Sensors, senden ein Ultraschallsignal, kalkulieren die Zeit, die für das Auslesen des Signals benötigt wird sobald es zurückgesendet wird und berechnen entsprechend die bestehende Entfernung. Sobald wir wissen, ob wir in einer der drei Positionen ein Hindernis vor uns haben, bewegen wir den PrintBot in den freien Bereich.
    3. Lichtfolger: Dieser Automodus wird dafür verwendet, den Printbot in den Bereich zu bewegen, in dem die Lichtintensität am größten ist. Dafür lesen wir den Wert jedes einzelnen Pins aus, an dem die LDR Module (LDR=lichtabhängiger Widerstand) verbunden sind. Wir vergleichen die Werte, drehen in Richtung der größten Lichtintensität und bewegen den PrintBot 1 Sekunde lang geradeaus.

In diesem Video kannst du dir die Umsetzung dieses Beitrags ansehen:

Denk daran, dass du jeden einzelnen der verwendeten Parameter abändern kannst, um die Funktionsweise des PrintBot Evolution an deine Vorstellungen anzupassen. Außerdem schlagen wir dir als Übung Folgendes vor:

  • Verändere die Symbole der Protocoder Anwendung, um anstelle des Textes Bilder in die Schaltflächen zu integrieren.
  • Verwende die Infrarotsensoren, um Abgründe zu erkennen. Ein Beispiel kannst du dir hier ansehen.
  • Du kannst eine Schaltfläche erstellen, damit dein PrintBot den Kopf bewegt und einen Ton abgibt.

Wenn du mehr über Arduino, Protocoder und Robotik lernen möchtest, kannst du dem Programmierkursus für Maker in Arduino und Protocoder folgen.