Halloween Puppe

simpel animierte Halloween Puppe

Ich notiere hier meine Erfahrungen im Zusammenbau einer kleinen mobilen Puppe als Eyecatcher für Halloween. Die Puppe dreht den Kopf nach frei definierbaren Vorgaben.

  • 1x bliebige Puppe
  • 1x Step Motor 28BYJ-48 inkl. motorboard
  • 1x arduino nano
  • 1,5mm alublech
  • 9V Clip
  • Litze
  • Schrauben, Muttern
  • Schrumpfschlauch (ggf.)

Werkzeug

  • Lötkolben & Lötzinn
  • Dremel / Fräse / etc.
  • Haushaltsschere (ggf.)

Das Projekt startete (wie so oft) kurzfristig und war dementsprechend beschränkt auf Komponenten die nicht erst noch bestellt werden mussten. Darüber hinaus sollten alle Teile in ein sehr schmales Budget passen, da es sich mehr um einen Gag mit beschränkten Einsatzmöglichkeiten handelt.

Eine passende alte Puppe war schnell in einem Trödelladen um die Ecke gefunden. Materialkosten bis hier her 1,50 €. Erst zuhause bemerkte ich mein Glück, die Puppe bestand nur aus einzelnen Teilen (Kopf, 2x Arm, 2x Bein) der Körper in der Mitte war nur mit Watte gefüllt. Das Beste: schon von Werk aus, wurden die, jeweils mit einer passenden Aussparung versehenen, Körperteile mittels eines dünnen Kabelbinders durch Führungen in der Kleidung zusammengehalten.

Dementsprechend war das Auseinander- und Zusammenbauen ein Kinderspiel. Alles was an Elektronik untergebracht werden musste, konnte entsprechend durch die Entnahme von Watte aufgefangen werden. Durch die Befestigung des Kopfes konnte dieser sich schon frei drehen.

Nun zum wesentlichen, der Animation. (Beleuchtete Augen fielen bei meinem Puppenmodel aus, da das Plastik am Kopf zu lichtundurchlässig war und ich die Glausaugen schöner fand als ein paar Led`s, aber das ist Geschmackssache.) Das der Kopf sich drehen sollte war die erste Iddee. Nach einigen Versuchen die Arme ebenfalls zu animieren wurde schnell klar, dass dies innerhalb der verbleibenden 2 Tage bis zum Einsatzdatum nicht zu realiseren war. Wer hier weiter macht mag diesen Teil gern zum Artikel beitragen. Es blieb also der animierte Kopf. Nach etwas Fledderei an anderen Projekten war ein Arduino Nano und ein kleiner Steppermotor samt motorboard bereit sich dieser Aufgabe zu stellen.

Als das grösste Problem stellte sich heraus, den hohlen Kopf und die Motorwelle sicher zu verbinden. Nach einigen Versuchen mit verkeilten Zahnrädern im Hals war klar, dass dies nicht zuverlässig arbeitete. Entweder löste sich das Zahnrad vom Hals bzw. Kopf, oder der Motor sackte nach unten ab und die Welle drehte frei unter dem Kopf.

Bisher die verlässlichste Variante, selbst im mobilen Einsatz in der Westentasche, ist ein Adapter aus Aluminium. Dazu einfach den Kopf auf die Aluplatte stellen, rund um den Hals anzeichnen und ausschneiden. Ich habe hierzu eine Ikea Küchenschere genommen, da ich die am schnellsten zur Hand hatte. Dies stellt natürlich nicht die beste oder werkzeugschonendste Variante dar, aber es zeigt, das kein besonderes Werkzeug notwendig ist um die dünne Aluplatte zu schneiden.

puppe1.jpg

Der Scheibe 3 oder 4 kleine Bohrungen verpassen, so dass die Platte von unten gegen den Hals geschraubt werden kann. Mit dem Dremel/Fräse/etc. eine passende Aufnahme für die Motorwelle in der Scheibe bohren. Der verjüngte Teil der Motorwelle sollte nun genau durch die Mitte der Platte passen. Jetzt muss noch das Zurückrutschen unterbunden werden. Hier kam eine übriggebliebene Zahnriemenscheibe mit Madenschraube zum Einsatz. In Ermangelung einer passenden Befestigung kann sicherlich auch einfach die Motorwelle mit einem dünnen Bohrer durchbohrt werden und bspw. eine Büroklammer durchgeführt und verbogen werden um ein ähnliches Ziel zu erreichen. Ist die Aluscheibe und der Motor nun fest verbunden kann die Scheibe an den Kopf geschraubt werden.

puppe2.jpg

Die Verbindung des Kopfes war nun sichergestellt, aber im Testbetrieb stellte sich schnell heraus, dass der Motor sich leicht im Puppenkörper bewegte. Dies stellte ein Problem dar, da somit keine präzisen Kopfbewegungen voreinstellbar waren. Zudem wickelte sich nach einiger Zeit immer wieder Watte um die Motorwelle. Beide Probleme auf einen schlag löste ein weiterer Adapter aus Alublech. Hierzu wird aus der Aluplatte wiederum ein kleines Stück herausgeschnitten. Das Stück sollte so groß sein, das es grade in die Puppe passt, sich darin aber nicht mehr drehen lassen. Nun werden Löcher für die Motorwelle und die beiden Befestigungsösen gebohrt. Anschließend kann der neue Adapter an den Motor geschraubt werden.

puppe3.jpg puppe3a.jpg

Nachdem alles zusammengeschraubt war, fiel auf, dass nun die Schrauben zur Befestigung des ersten Adapters am Kopf nicht mehr erreichbar waren. Um dieses Problem zu umgehen, wurde in der zweiten Platte ein Streifen herausgeschnitten. Nun lässt sich der Kopf auf dem Motor jeweils soweit drehen, dass durch die Lücke eine Schraube angezogen werden kann.

puppe4.jpg puppe5.jpg puppe6.jpg puppe7.jpg

Um keinen Kabelsalat im inneren der Puppe zu produzieren wurde der Nano auf der einen Seite, das Motorboard auf der anderen Seite einer Pappelholzplatte befestigt. Dies verhindert insbesondere, dass Zug auf die Litzen kommt, die die beiden boards verbinden. Hier wurden die Boards mangels geieignetem Befestigungsmaterial mittels Litze angeknotet. Dazu die beiden Boards (jeweils einzeln!) auf das Stück Holz legen und passende Löcher bohren. Nun die Boards mit etwas Litze am Board festbinden. Mit etwas Geschick können beide Boards mit einer durchgehenden Litze befestigt werden.

Zunächst wird die Stromversorgung verdrahtet. Dazu den 9V Clip an das Motorboard und den Nano anlöten. Dazu den 9V-Clip am besten direkt an das Motorboard löten. Von dort dann die Kabel zum Stromeingang des Nano weiterführen. Sowohl der Nano also auch der Motor können mit den 9V gut arbeiten. Nun braucht der Nano noch eine Steuerverbindung zum Motorboard. Wie im Quellcode zu sehen ist, werden hier dazu die Pins 6, 7 ,8 ,9 am Nano verwendet. Diese werden in dieser Reihenfolge an die Eingänge des Motorboards gelötet, welche bei dem verwendeten Modell mit 1N1 bis 1N4 bezeichnet sind.

Der Arduni-Code stellt sich simpel dar. Nach einigen Testläufen war festgestellt mit welchen Werten sich der Kopf um wieviel Grad dreht. Als Konfiguration im Beispielcode ist vorgesehen, dass die Puppe zunächst nach links, wieder geradeaus, dann nach rechts guckt um nach einer 10sec Pause den Kopf schnell um 360 Grad zu drehen. Danach ruht die Puppe 50 Sekunden.

Ein eigenes Drehprogramm wird mittels der Befehle „delay()“, „clockwise()“ und „counterclockwise()“ im Abschnitt „void loop()“ erstellt. Die Befehle clockwise bzw. counterclockwise drehen den Kopf gegen bzw. im Uhrzeigersinn. Die beiden Werte dahinter stehen für die Dauer des Drehvorgangs und die Geschwindigkeit. Demnach dreht die Puppe bei dem Befehl

clockwise(140, 2);

den Kopf im Uhrzeigersinn für 140 Zeiteinheiten mit der Geschwindigkeit 2. Es ist zu beachten, das kleinere Werte höhere Geschwindigkeit bedeuten. Der Geschwindigkeitswert 1 ist somit das schnellst Mögliche. Der Befehl

delay(50000);

versetzt die Puppe in einen Ruhezustand, wobei die Zahl die Länge der Pause in Millisekunden angibt.

Arduni-Code:

const int motorPin1 = 6;	// Blue   - 28BYJ48 pin 1
const int motorPin2 = 7;        // Pink   - 28BYJ48 pin 2
const int motorPin3 = 8;        // Yellow - 28BYJ48 pin 3
const int motorPin4 = 9;        // Orange - 28BYJ48 pin 4
                                
int a;
int b;

void setup() {
	Serial.begin(9600);	// Initialize serial communications with the PC

        pinMode(motorPin1, OUTPUT);
        pinMode(motorPin2, OUTPUT);
        pinMode(motorPin3, OUTPUT);
        pinMode(motorPin4, OUTPUT);

}

void loop() {
	
           clockwise(140, 2);
           counterclockwise(280, 2);
           clockwise(140, 2);
           delay(1000); 
           counterclockwise(560, 1);
           delay(50000);
         }



void counterclockwise (int a, int b){
  for (int i=0; i<a; i++)
  {
    // 1
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    delay(b);
    // 2
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    delay (b);
    // 3
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    delay(b);
    // 4
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
    delay(b);
    // 5
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
    delay(b);
    // 6
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, HIGH);
    delay (b);
    // 7
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
    delay(b);
    // 8
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
    delay(b);
    
    //shutdown
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  }
}


void clockwise(int a, int b)
{
  for (int i=0; i<a; i++)
  {
    // 1
    digitalWrite(motorPin4, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin1, LOW);
    delay(b);
    // 2
    digitalWrite(motorPin4, HIGH);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin1, LOW);
    delay (b);
    // 3
    digitalWrite(motorPin4, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin1, LOW);
    delay(b);
    // 4
    digitalWrite(motorPin4, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin1, LOW);
    delay(b);
    // 5
    digitalWrite(motorPin4, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin1, LOW);
    delay(b);
    // 6
    digitalWrite(motorPin4, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin1, HIGH);
    delay (b);
    // 7
    digitalWrite(motorPin4, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin1, HIGH);
    delay(b);
    // 8
    digitalWrite(motorPin4, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin1, HIGH);
    delay(b);
    
    //shutdown
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    }
  }

Wenn alles gesichert ist, kann das Konstrukt mit Schrumpfschlauch gesichert und die Puppe nach Geschmack mit Kunstblut versehen werden.

puppe8.jpg puppe9.jpg

Schliesst man nun einen 9V Block an, sollte der Horror beginnen.

bMnxoP1ilNg?.swf

  • Zuletzt geändert: 11.07.2016 23:18
  • (Externe Bearbeitung)