Wir sind die Roboter
Die Dämpfe von Lötzinn brennen einer konzentriert über den Lötkolben gebeugten Schülerin in den Augen, der Geruch von Röstzwiebeln liegt in der Luft, überall liegen elektronische und mechanische Bauteile herum. Seltsame Gefährte, die an diejenigen aus der Mad-Max-Triologie anzuknüpfen scheinen, fahren über den Flur und drehen wie von Geisterhand vor Wänden und Hindernissen um. Rechts wird geflucht über die unvermeidlichen Treiberprobleme unter Windows8, links lacht sich darüber der Nutzer eines Ubuntu-Desktops ins Fäustchen, während die Gruppe im hinteren Bereich das Scheitern des letzten Algorithmus bei einem kräftigen Biss in das selbstgebaute Hotdog und einer Partie Minecraft verarbeitet.
Die Situation entstammt nicht dem Entwicklungslabor einer nerdigen Elektronikfirma, sondern beschreibt die Atmosphäre in unserer neuen Arduino-AG auf dem letzten Regionalgruppentreffen recht genau. Da kann nach nicht einmal acht Wochen dann schon sowas herauskommen:
Die Hardware habe ich nach einem Schülerentwurf nachgebaut. Die hier zu sehenden Komponenten
- ein Arduino UNO-Nachbau
- ein Adafruit-Motorshield-Nachbau
- ein HC-SR04 Ultraschallsensor
- ein 4WD-Chassis
- sechs Mignon-Akkus
- ein Batteriefach
- Kabel und anderer Kleinkram
kosten etwa 50,- Euro, wenn man etwas warten kann. Die notwendige Software gibt es kostenlos zum Download. Programmiert wird in einem C‑ähnlichen Dialekt. Der Roboter aus dem Video wird von diesem Programm gesteuert:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | #include <AFMotor.h> AF_DCMotor motor_01(1, MOTOR12_64KHZ); AF_DCMotor motor_02(2, MOTOR12_64KHZ); AF_DCMotor motor_03(3, MOTOR12_64KHZ); AF_DCMotor motor_04(4, MOTOR12_64KHZ); // HC-SR04 // VCC auf 5V // Trig auf Trigger Pin (löst Ultraschallimpuls aus) // Echo auf Echo Pin (Zeit in ms bis zum Empfang des Echos) // GND auf GND #define echoPin 15 // Echo Pin #define trigPin 14 // Trigger Pin int turn = 1; // Drehrichtungsänderung wenn "festgefahren" int count = 0; // Anzahl der Drehausweichversuche pro Richtung long duration, distance; // Dauer um Abstand zu berechnen void setup() { motor_01.setSpeed(190); // Wir fahren nicht volle Pulle motor_02.setSpeed(190); motor_03.setSpeed(190); motor_04.setSpeed(190); Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { /* The following trigPin/echoPin cycle is used to determine the distance of the nearest object by bouncing soundwaves off of it. */ digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); //Calculate the distance (in cm) based on the speed of sound. distance = duration/58.2; //Delay 50ms before next reading. delay(50); if (distance < 25 && turn > 0 ) { motor_01.run(FORWARD); // Motor 1 vorwärts laufen lassen motor_02.run(FORWARD); motor_03.run(FORWARD); motor_04.run(FORWARD); delay(200); motor_01.run(BACKWARD); motor_02.run(BACKWARD); // Motor 2 rückwärts laufen lassen motor_03.run(FORWARD); motor_04.run(FORWARD); delay(200); count++; if (count >= 3 ) { turn = -turn; } } else if (distance < 25 && turn < 0 ) { motor_01.run(FORWARD); // Vorwärts fahren motor_02.run(FORWARD); motor_03.run(FORWARD); motor_04.run(FORWARD); delay(200); motor_01.run(FORWARD); motor_02.run(FORWARD); // Motor 2 rückwärts laufen lassen motor_03.run(BACKWARD); motor_04.run(BACKWARD); delay(200); count++; if (count >= 3 ) { turn = -turn; } } else { motor_01.run(BACKWARD); // Motor 1 vorwärts laufen lassen motor_02.run(BACKWARD); motor_03.run(BACKWARD); motor_04.run(BACKWARD); count = 0; } } |
Beim Experimentieren mit der Arduinoplattform gibt es ganz viele verschiedene Herausforderungen:
- Es muss zumindest in Grundzügen programmiert werden
- Diese Programme bedürfen einer ständigen Optimierung
- „Verdrahtet“ man mit Lötkolben und Schrauberndreher oder gleich im Programm selbst? – Im oberen Programm sind z.B. „falsch“ angeschlossene Motoren durch entsprechende Codeänderungen kompensiert worden.
- Wie strukturiert man sein Programm so, dass man es die Woche darauf noch versteht? – Morgen werden wir uns mit Unterprogrammen und der Parameterübergabe beschäftigen.
- Wie arbeiten die Sensoren eigentlich? (Der HC-SR04 muss z.B. so ausgerichtet werden, dass er nicht schon Unebenheiten auf dem Boden als Hindernis erfasst, mit mehreren Sensoren erhöhe ich die Messgenauigkeit usw.)
- Wie löse ich die vielen mechanischen Probleme?
- Die meisten Programmierbeispiele im Netz sind auf Englisch …
Ich finde es prima, dass Informatik hier erfahrbar wird und dass nicht nur virtuell vermittelte Erfahrungen und Lernanlässe vorhanden sind. Grundstrukturen zum Programmieren geben wir in der AG vor, da reines Ausprobieren schnell zu Frusterlebnissen führt, insbesondere wenn mehrere Aktoren und Sensoren dazukommen.
Die Schülerinnen und Schüler dokumentieren das im in einem DokuWiki, was sie über Aktoren und Sensoren herausfinden oder stellen auch ganz Codeschnipsel ein. Nebenbei lernen sie etwas über Syntax.