Dies ist eine alte Version des Dokuments!
Projektname
simpel animierte Halloween Puppe
Informationen
Ich notiere hier meine Erfahrungen im Zusammenbau einer kleinen mobilen Puppe als Eyecatcher für Halloween.
Materialien:
- 1x bliebige Puppe
- 1x Step Motor 28BYJ-48 inkl. motorboard
- 1x arduino nano
- 9V Clip
- Litze
Werkzeug
- Lötkolben & Lötzinn
- Dremel / Fräse / etc.
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.
Arduino: 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 ist vorgesehen, dass die Puppe zunächst nach links, dann nach rechts guckt um nach einer 10sec Pause den Kopf schnell um 360 Grad zu drehen. Danach ruht die Puppe 45 Sekunden.
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ässliche 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 gute 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.
Nun der Scheibe 3 oder 4 kleine Löcher verpassen, so dass die Platte von unten gegen den Hals geschraubt werden kann. Nun noch mit dem Dremel eine passende Aufnahme für den Motor in der Scheibe bohren. Die Motorwelle sollte nun genau durch die Mitte der Platte passen. Nun muss noch das Zurückrutschen unterbunden werden. Hier kam eine übriggebliebene Zahnriemenscheibe mit Madenschraube zum Einsatz. In Ermangelung einer passenden Konstruktion 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.
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. Wenn alles fertig ist, kann das Konstrukt mit Schrumpfschlauch gesichert werden.
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
// Red - 28BYJ48 pin 5 (VCC)
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);
}
}