Hallo Kollegen,
ich arbeite an meinem zweiten Arduino Projekt, einem Animatronik-Totenkopf, der zu Halloween den Ghostbusters Song "singen" soll.
Ich bin Anfänger bei der Programmierung und Fortgeschrittener bei der elektronischen Umsetzung.
Ich habe eine elektronische Lösung und auch eine Programmlösung.
Unten ist ein Video verlinkt, das einen Test mit wenigen Kommandos zeigt.
Das läuft.
Das Programm für die endgültige Ansteuerung ist jedoch viel umfangreicher.
Und bei dem werden Befehle ausgelassen oder die Bewegung eines Servos fiert ein, bis der nächste Befehl für den Servo kommt.
Ich habe einen Arduino NANO als Steuerung gewählt, weil die recht günstig zu haben sind.
Ich habe darüber gelesen, dass der Nano empfindlich ist, wenn Servos betrieben werden.
Es werden 6 Servos und 2 Neopixel LEDs angesteuert.
Testvideo hier:
Die Elektronik sieht so aus:
Ich habe verschiedene Varianten der Spannungsversorgung probiert.
12V Netzteil direkt an den Nano & Stepdown 5 V für die Servos
12V Netzteil an Nano und 5 V Netzteil an die Servos
Stepdown 9V an Nano und Stepdown 5 V an Servos.
Alle Varianten zeigen dieselben Aussetzer. Die Aussetzer sind bei jedem Durchlauf anders, weswegen ich denke, es handelt sich um rückgekoppelte Störungen im Nano.
Der Programmcode îst sehr lang, ca 700 Zeilen.
Die Bewegungen der Servos müssen zum Takt der Musik passen. Deshalb ist das Programm mit einem Zeitcode programmiert.
Der Arduino zählt die millis() und vergleicht diese mit dem Zeitcode.
Wenn eine Zeitmarke erreicht ist, wird eine Bewegung ausgeführt.
Das Programm wartet auf das Startsignal eines zentralen Nanos, der das Adafruit SFX Board, die 3 Totenköpfe und Lichteffekte steuert.
Nach dem Startsignal läuft das ZeitCode Programm ab.
Hier ein Auszug aus dem Programm:
// Servo Limits for Beta SKULL
// NOD MAX UP 60 MID 90 MAX DOWN 120
// SHAKE MAX STBD 30 MID 100 MAX PORT 170
// TILT MAX STBD 140 MID 95 MAX PORT 50
// JAW MAX OPEN 95 MID 70 MAX CLOSED 48
// Eye X MAX STBD 40 MID 90 MAX PORT 140
// Eye Y MAX UP 175 MID 140 MAX Down 80
#include <VarSpeedServo.h>
#include <Adafruit_NeoPixel.h>
// Servo
VarSpeedServo servo1; // NOD
VarSpeedServo servo2; // SHAKE
VarSpeedServo servo3; // TILT
VarSpeedServo servo4; // Jaw
VarSpeedServo servo5; // Eye X
VarSpeedServo servo6; // Eye Y
const int servoPin1 = 3;
const int servoPin2 = 5;
const int servoPin3 = 6;
const int servoPin4 = 9;
const int servoPin5 = 10;
const int servoPin6 = 11;
const int resetPin = 7;
const int startpin = 12;
unsigned long runtime;
unsigned long offsetMillis;
// NeoPixel
#define PIN 2
#define NUMPIXELS 2
Adafruit_NeoPixel eyes = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup()
{
// Pin Mode Selection
pinMode(startpin, INPUT_PULLUP);
pinMode (resetPin, INPUT_PULLUP);
// LED Initialising
eyes.begin();
// Preset eyes to off
eyes.setPixelColor(0, eyes.Color(0,0,0)); // Eyes off
eyes.setPixelColor(1, eyes.Color(0,0,0)); // Eyes off
eyes.show(); // This sends the updated pixel color to the hardware.
servo1.attach(servoPin1);
servo1.write(120,10,false); // NOD MAX UP 60 MID 90 MAX DOWN 120
servo2.attach(servoPin2);
servo2.write(100,40,false); // SHAKE MAX STBD 30 MID 100 MAX PORT 170
servo3.attach(servoPin3);
servo3.write(95,40,false); // TILT MAX STBD 140 MID 95 MAX PORT 50
servo4.attach(servoPin4);
servo4.write(40,40,false); // JAW MAX OPEN 95 MID 70 MAX CLOSED 40
servo5.attach(servoPin5);
servo5.write(90,40,false); // Eye X MAX STBD 40 MID 90 MAX PORT 140
servo6.attach(servoPin6);
servo6.write(80,40,false); // Eye Y MAX UP 175 MID 140 MAX Down 80
delay(2000);
// Wait for start signal
while (digitalRead(startpin) == HIGH) {};
// Define Offset millis
offsetMillis = millis();
}
void(* resetFunc) (void) = 0;//declare reset function at address 0
void loop()
{
if (digitalRead(resetPin) == HIGH) {} //
if (digitalRead(resetPin) == LOW) {resetFunc();} // Reset triggered
runtime = millis();
// Eyes ZOOM IN BLUE
if ((runtime-offsetMillis) == 3500) // Augen Zoom Blue // 50
{
for(int i = 0; (i < 256) && ((runtime-offsetMillis) >= 9); i++)
{
eyes.setPixelColor(0, eyes.Color(0,0,i)); // Fade in Magenta
eyes.setPixelColor(1, eyes.Color(0,0,i)); // Fade in Magenta
eyes.show(); // This sends the updated pixel color to the hardware.
delay(25); // Delay for a period of time (in milliseconds).
}
}
if ((runtime-offsetMillis) == 11000) {
servo1.write(85,5,false); // NOD MAX UP 60 MID 90 MAX DOWN 120
servo6.write(140,8,false); // (Winkel, Geschwindigkeit) // Eye Y MAX UP 175 MID 140 MAX Down 80
}
// ***********************************************************************************************************************************************
if ((runtime-offsetMillis) == 12521) {} // Beat 1
if ((runtime-offsetMillis) == 13041) {} // Beat 2
if ((runtime-offsetMillis) == 13562) {} // Beat 3
if ((runtime-offsetMillis) == 14082) {} // Beat 4
if ((runtime-offsetMillis) == 14603) {} // Beat 5
.........
if ((runtime-offsetMillis) == 134863) {} // Beat 236
if ((runtime-offsetMillis) == 135384) {} // Beat 237
if ((runtime-offsetMillis) == 135905) {} // Beat 238
if ((runtime-offsetMillis) == 136425) {servo3.write(80,50,false);servo6.write(140,40,false);}
if ((runtime-offsetMillis) == 136946) {servo4.write(90,120,false);}
if ((runtime-offsetMillis) == 137196) {servo4.write(47,120,false);servo3.write(110,50,false);}
if ((runtime-offsetMillis) == 137466) {servo4.write(90,120,false);}
if ((runtime-offsetMillis) == 137716) {servo4.write(47,120,false);servo3.write(80,50,false);}
if ((runtime-offsetMillis) == 137987) {servo4.write(90,120,false);}
if ((runtime-offsetMillis) == 138237) {servo4.write(47,120,false);servo3.write(110,50,false);}
if ((runtime-offsetMillis) == 138508) {servo4.write(90,120,false);}
if ((runtime-offsetMillis) == 138758) {servo4.write(47,120,false);servo3.write(95,60,false);}
if ((runtime-offsetMillis) == 139028) {} // Beat 244
if ((runtime-offsetMillis) == 139549) {} // Beat 245
if ((runtime-offsetMillis) == 140069) {} // Beat 246
if ((runtime-offsetMillis) == 140590) {} // Beat 247
}
Nun meine Bitte an die Community, habe ich ein elektronisches Problem, oder liegt es am Programmcode?
Bielen Dank für Eure Hilfe,
3D-Gurke