Deine Träume sind zerplatzt?
Mach' Dir neue – mit der automatisierten Seifenblasenmaschine!



Seifenblasenmaschine #1 – Propeller Ø 3,1 cm



Seifenblasenmaschine #2, PinkPower – Propeller Ø 7,2 cm


IDEE

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.

ZUTATEN

WERKZEUGE

ANMERKUNGEN

Schrittmotor

Bipolare Schrittmotoren besitzen 2 Spulen, sie können im Halbschritt- oder im Vollschritt-Modus gesteuert werden – ich habe mich für letztere Variante entschieden. Im Vollschritt-Modus werden beide Spulen mit Strom versorgt, Taktstufen (1) und Gegentaktstufen (0) wechseln einander ab. Diesbezüglich ist eine Wahrheitstabelle sinnvoll, für das geplante Vorhaben sieht diese so aus:



A   B   ¬ A ¬ B
1 1 0 0
0 1 1 0
0 0 1 1
1 0 0 1


1 = HIGH
0 = LOW

Arduino – Motorsteuerungsplatine

Voraussetzung für die Steuerung des Schrittmotors ist die Verbindung mit einer Motorsteuerungsplatine – in diesem Fall ist es die ULN2003. Die fünf in einem einzigen Stecker eingefassten Kabel des Schrittmotors werden in die Buchse der Platine gesteckt, die Eingänge IN1 – IN4 sowie die Eingänge für 5V und GND auf der diametral entgegengesetzten Seite der Platine wie folgt mit den Pins am Arduino verbunden:



ULN2003 – Arduino

–           an GND

+           an 5V

IN1 (braun)    an D2

IN2 (lila)    an D3

IN3 (blau)     an D4

IN4 (gelb)     an D5

CODE

Näheres zur Code-Erstellung und -Injection eines Arduino findest Du hier, Anleitungen zur Installation der Arduino-IDE und der Funktionsweise der an C++ angelehnten Programmiersprache .ino sind dort ebenso zu finden!

	
  // +++ 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);

}
   	

Happy Coding!
Die Seifenblasenmenschen ;-)