Die Seifenblasenmaschine verfügt über zwei unterschiedliche Motoren – einen Getriebemotor und einen bipolaren Schrittmotor. Ersterer ist für den Betrieb des Propellers verantwortlich und wird durch 2AA-Batterien in einem Batteriekasten versorgt, der ein- und ausgeschalten werden kann (siehe Kippschalter an der Rückseite der Ente), letzterer bedarf der Steuerung durch einen Arduino, angeschlossen an die Eingänge einer Motorsteuerungsplatine; betrieben wird dieser mit einer Powerbank.
Bei der Programmierung der Bewegung, die das Seifenblasenrohr steuert, ist zu beachten, dass das Rohr vor dem Propeller mit Beendigung einer vollen Umdrehung innehält. Anderfalls könnte die Seifenblase gar nicht erst entstehen. Anschließend wird dieselbe Bewegung in entgegengesetzter Richtung fortgesetzt. Im Gegensatz zu Servo- oder Getriebemotoren dreht ein Schrittmotor sich nicht einfach, wenn Spannung anliegt, er bewegt sich mittels kleiner Schritte voran. Für eine volle Umdrehung müssen 2048 Schritte zurückgelegt werden (siehe Anleitung & Code weiter unten).
WC-Ente Total Akiv Gel macht dank ihres außergewöhnlich geformten Halses nicht nur Toilettenränder sauber, ihre Verpackung eignet sich auch hervorragend zur Befestigung eines Getriebemotors. Mit einem Plastikschneider lässt sich das Material gut bearbeiten, im Bauch der Ente kann man zudem Elektronik-Komponenten unterbringen und sie damit der Sichtbarkeit entziehen.
A | B | ¬ A | ¬ B |
1 | 1 | 0 | 0 |
0 | 1 | 1 | 0 |
0 | 0 | 1 | 1 |
1 | 0 | 0 | 1 |
ULN2003 – | Arduino |
– an GND
+ an 5V
IN1 (braun) an D2
IN2 (lila) an D3
IN3 (blau) an D4
IN4 (gelb) an D5
// +++ barbara's code zur schrittmotorsteuerung +++ // DEKLARATION DER VARIABLEN // Integer-Array mit den PINS D2, D3, D4, D5 am Arduino int pins[] { 2, 3, 4, 5 }; // Zustände des Schrittmotors für den Vollschritt // siehe: Wahrheitstabelle int fullStepCount = 4; int fullSteps[][4] = { {HIGH,HIGH,LOW,LOW}, // 1,1,0,0 {LOW,HIGH,HIGH,LOW}, // 0,1,1,0 {LOW,LOW,HIGH,HIGH}, // 0,0,1,1 {HIGH,LOW,LOW,HIGH} // 1,0,0,1 }; // Zähler, der mit 0 beginnt (currentStep) // Boole'sche Variable für Richtungsdefinition (clockwise) // Endpunkt nach 2048 Schritten (targetSteps) int currentStep = 0; bool clockwise = true; int targetSteps = 2048; // INITIALISIERUNG DER VARIABLEN // Funktionsdeklaration void setup() { Serial.begin(9600); for(int pin = 0; pin < 4; pin++) { pinMode(pins[pin], OUTPUT); digitalWrite(pins[pin], LOW); } } // Funktionsaufruf Zähler void step(int steps[][4], int stepCount) { int currentStepInSequence = currentStep % stepCount; // Abfrage der Richtung (clockwise | !clockwise) int directionStep = clockwise ? currentStepInSequence : (stepCount-1) - currentStepInSequence; // Aktivierung der Pins for(int pin=0; pin < 4; pin++){ digitalWrite(pins[pin],steps[directionStep][pin]); } } // AUSFÜHRUNG void loop() { //Zähler mit Inkrement int stepCount = fullStepCount; step(fullSteps,fullStepCount); ++currentStep; // 1. Bedingung // Wenn die Anzahl der Schritte nicht 0 ist && // sie 2048 (=fullSteps) beträgt, // dann ändere die Richtung! if(targetSteps != 0 && currentStep == targetSteps) { currentStep = 0; clockwise = !clockwise; // 2. Bedingung // Wenn die Anzahl der Schritte 0 ist && // eine volle Umdrehung ausgeführt wurde, // setze den Schrittezähler auf Null! } else if(targetSteps == 0 && currentStep == stepCount) { currentStep = 0; } // Wenn die Bedingung im jeweiligen Statement // erfüllt ist, führe die dazugehörige Anweisung aus! // Warte 2 Sekunden! (max. Wert für Verzögerung) delay(2); }