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.

Facebook Like

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.