Dies ist eine Portierung des fantastischen Arduino-Projekts Heiße Drachen, schräge Vögel & andere verrückt-lebendige Wesen | tuduu.org für den Calliope mini. Mit einem Daumen-Joystick werden dabei zwei Servos angesteuert, die rechtwinklig zueinander auf ein Holzbrett geklebt sind. Wenn man an einen der Servos eine Art "Arm" anklebt, lässt sich das Gesamtkunstwerk als Roboterhand interpretieren oder als Gerüst für eine Handpuppe verwenden!
Die oben verlinkte Original-Anleitung für den mechanischen Aufbau ist hervorragend, so dass hier nur die für den Calliope angepasste Verkabelung und das Steuerungs-Programm beschrieben werden. Vorher aber noch eine kleine Demo ;-)
Der Joystick kommt an den rechten (!) Grove-Port, das ist der einfachste Teil. Ein Grove-Kabel wird meist mitgeliefert, muss also nicht separat gekauft werden.
Servos haben einen Anschluss mit drei Kabeln: Versorgungsspannung (rot), Masse (schwarz oder braun) und die Steuerleitung (gelb oder orange), über die der Servo erfährt, in welche Position er sich bewegen soll. Die Steuerleitungen der beiden Servos werden über Krokodilklemmen mit den beiden analogen Touch-Pins P1 bzw. P2 verbunden.
Zur Stromversorgung: Servos benötigen mindestens 4, 5 V, der Calliope arbeitet jedoch mit 3, 3 V. Beide Servos werden daher an eine Batteriehalterung mit 3 AAA-Baterien zu je 1, 5 V angeschlossen (parallel, nicht in Reihe!). Um den Stomkreis zu schließen, muss auch der Minus-Pin des Calliope an den Minus-Pol der Batterie angeschlossen werden. ACHTUNG: Nur der Minus-Pin, sonst könnte der Calliope irreparabel beschädigt werden!
Da es in Fritzing keine Vorlage für eine 3er-Batteriehalterung gab, ist in der Abbildung eine Batterie mehr zu sehen. Das würde genauso funktionieren, die Servos vertragen auch 6 V, drei Batterien reichen aber, zumindest beim oben angegebenen Modell. Da es auch keine Vorlage für den Grove-Joystick gab, ist stattdessen ein Grove-Buzzer abgebildet, welcher dem Joystick zwar nicht funktionell, aber optisch am nächsten kommt ;-)
Es ist möglich, das alles ohne Löten hinzubekommen. Dazu sollte man die Plastikstecker der Servos nicht abschneiden, sondern mit einer Büroklammer o. ä. die drei Kabel komplett (inkl. der Metall-Buchse) aus dem Stecker herausdrücken. Dann lassen Sie sich gut mit den Krokodilklemmen greifen.
Auch die beiden Kabel der Batteriehalterung bekommt man da noch unter. Wenn so viele Kabel relativ lose auf wenig Raum hängen, ist es aber immer mal möglich, dass sich welche lockern oder Kontakte sich berühren. Wenn sich also die Servos einmal nicht bewegen, wäre der erste Schritt: nachsehen, ob alle Kabel noch richtig angeschlossen sind und sicherstellen dass sie sich die Klemmen nicht zu nahe kommen. Und dass der Calliope sowie die Batteriehalterung eingeschaltet sind ;-) Wer kann, greift alternativ zum Lötkolben, aber den hat eben nicht jeder und wenn man mit einer solchen provisorischen Verkabelung leben kann, ist er auch nicht zwingend notwendig.
Auf dem Holzbrett ist es am besten, den Calliope mit dem Stecker nach hinten anzubringen, um beim (Neu-)Programmieren das USB-Kabel gut anstecken zu können und damit der Weg von den Pins P1, P2 zu den Servos nicht so lang ist. Bei der Befestigung sind Gummibänder oder Klebestreifen das Mittel der Wahl, abgesehen von den Servos, da muss die Heißklebepistole zum Einsatz kommen. Wichtig: Darauf achten, dass der Batterieschalter zugänglich bleibt!
ProgrammWer nun möglichst schnell die Handpuppe ausprobieren möchte, der kann einfach den fertigen Code in den Makecode-Editor einfügen (im JavaScript-Modus) und mit dem USB-Kabel auf den Calliope überspielen. Die Erklärung des Programms ist für alle, die genauer wissen wollen, was der Calliope da eigentlich macht. Das ist zugegebener Weise etwas Hintergrundwissen nötig. Es ist aber nicht schlimm, erstmal nur ein bisschen davon zu verstehen, der Rest kommt dann schon noch mit der Zeit. Hier zunächst das Programm im Ganzen. So viele Zeilen sind es gar nicht :-)
Und jetzt die einzelnen Schritte:
Herausfindender aktuellenJoystick-Position
Der Joystick wird an den rechten Grove-Port des Calliope angeschlossen (über der Taste "B"). Dort befinden sich die Pins C16 und C17, so dass man an diesen beiden Pins ablesen kann, ob und wie der Joystick bewegt wird.
Wenn der Joystick entlang der x-Achse bewegt wird (links/rechts), dann ändert sich der Wert an Pin C16. Eine Bewegung entlang der y-Achse (oben/unten) verändert den Wert an Pin C17. Bei einer Bewegung z. B. nach rechts oben oder links unten ändern sich beide Werte gleichzeitig.
Dabei entspricht der Wert "256" der Position ganz links (bzw. ganz unten), "767" der Position ganz rechts (bzw. ganz oben) und "511" jeweils der Ruheposition in der Mitte.
In dieser Stelle ist es eine gute Idee, erst einmal nur den Joystick anzustöpseln und sich damit vertraut zu machen, also z. B. in einem kleineren Programm nur die aktuellen Werte von Pin C16 bzw. Pin C17 auszugeben bevor es weitergeht!
Bewegen derServos
Die Servos lassen sich durch Vorgabe eines Winkels zwischen 0° und 180° ansteuern. In unserem Projekt sind die Servos an Pins P1 und P2 angeschlossen, d. h. die entsprechenden Blöcke lauten:
In der Abbildung unten ist das so genannte "Servo-Horn", der kleine Zeiger, so auf das Zahnrad des Servos aufgesetzt, dass es nach links zeigt, wenn der Servo mit 0° angesteuert wird, bei 90° in die Mitte weist und bei 180° nach rechts. Da das Servo-Horn abnehmbar ist, muss das nicht so sein und es ist auch wichtig, das zu beachten! Tipp: an dieser Stelle einmal nur das ausprobieren: einen der Servos an P1 anschließen, in irgendeine Position fahren lassen, schauen, was passiert.
Was leider nicht zu ändern ist: "links" bedeutet für den Joystick "256", für den Servo heißt "links" aber "0". Unter "rechts" versteht der Joystick "767", der Servo "180". Deshalb bleibt nichts anderes übrig, als etwas zu rechnen, wenn man den Servo mit dem Joystick ansteuern will:
Praktischerweise gibt es dafür in Makecode den Block "verteile", der einem die Details abnimmt:
Man kann sogar die Richtung umkehren, so wie hier geschehen, in dem man die obere und untere Grenze vertauscht. Entscheidend ist, wie die Motoren genau angebracht sind, d. h. wo "vorne" und "hinten" ist, wo "links" ist und wo "rechts", entsprechend ist das Programm zu ändern, da muss man im Zweifel etwas herumprobieren.
Unerschrockene können einen Blick auf die Rechnung "hinter den Kulissen" riskieren (hier ohne Richtungsumkehrung):
Das sieht dramatischer aus, als es ist. Hier passieren nur zwei Dinge: Man muss berücksichtigen, dass der Servo bei "0" anfängt "zu zählen" und nicht wie der Joystick bei "256" (erster Teil der Formel). Und man muss alles, was sich beim Joystick in einem Bereich von 511 möglichen Werten abspielt (256..767) auf den kleineren Bereich von 180 möglichen Werten (0..180) des Servos "stauchen" (zweiter Teil der Formel).
Joystick kalibrierenWarum steht im Programm dann aber an einer Stelle 771 statt 767 und an einer anderen 250 statt 256? Gute Frage! Die tatsächlichen Wertebereiche solcher Joysticks sind produktionsbedingt nie ganz gleich. Idealerweise lässt man sie sich mit einem kurzen Testprogramm ausgeben (während man den Joystick entsprechend ganz nach links, ganz nach rechts, ganz nach oben und ganz nach unten bewegt), um sie dann in das eigentliche Programm einzutragen. Das geht am einfachsten über die "serielle Schnittstelle", d. h. in dem Fall über das USB-Kabel, mit dem der Calliope an den PC angeschlossen ist. Dort muss man ein entsprechendes Programm verwenden, um die vom Calliope übertragenen Daten anzuzeigen, z. B. den "Serial Monitor" der kostenlosen Arduino-IDE. Oder man spart sich den Schritt, geht aber auf Nummer sicher und verwendet einfach "blind" einen großzügigen Puffer, also z. B. 245-780.
Servos nur bei Richtungsänderung ansteuern
Wenn der Joystick nicht bewegt wird, dürfen die Servos nicht dauernd mit dem selben Wert angesteuert werden, das würde dazu führen, dass sie nach einer Weile anfangen zu "zittern". Daher wollen wir die Servos nur ansteuern, wenn sich die Position des Joysticks tatsächlich ändert:
Damit wir erkennen können, ob sich der Joystick bewegt hat, müssen wir uns bei jedem Programmdurchlauf die aktuellen Servo-Postionen merken (in den Variablen x_alt, y_alt). Im nächsten Durchlauf vergleichen wir sie dann wie oben gesehen mit den neu berechneten Werten (Variablen x, y):
Periodendauer beachten
Die Servos arbeiten mit einer sog. "Periodendauer" von 20 ms, d. h. genau alle 20 ms wird ein neues Signal von der Steuerleitung verarbeitet. Die Laufzeit unseres Programms beträgt 3 ms (man kann das messen mit dem Block "Laufzeit (ms)" unter "Eingabe"). Wir warten also zusätzliche 17 ms, bevor wir den nächsten Wert "hineinschieben", zuvor hätte es keinen Nutzen.
Genug Theorie nun, viel Spaß beim Nachbauen :-)
Comments