Eine Bühnenshow im Maßstab 1:25

Projekt einer Bühnenshow im Maßstab 1:25 für das Modell der Seebühne Kriebstein.

Enthalte soll diese die klassischen Bühnenscheinwerfer an Traversen mit 5 mm RGB LEDs und 2 beweglichen Großscheinwerfern die in 2 Achsen beweglich sind und jeweils 2 Servos, 1 RGB LED und 1-2 Laserdioden beinhalten.

Hardware:

  • Arduino MEGA Wifi
  • 2x 2 Servos
  • HX133AO14
  • MP3 Soundmodul
  • 8mm Neopixel Arduino LED-Chips RGB Vollfarb-LED-Chip APA106 wie WS2812
  • 5mm Laserdioden JGT 5mW
  • Starttaster

Bisher im Code

#include <Servo.h>
Servo myServo;  // Erstellen Sie ein Servo-Objekt
void setup() {
myServo.attach(9);  // Verbinden Sie den Servo 1 mit Pin 9
myServo.write(0);   // Setzen Sie den Servo auf 0 Grad
delay(2000);        // 2 Sekunden warten
myServo.write(90);  // Setzen Sie den Servo auf 90 Grad
delay(2000);        // 2 Sekunden warten
myServo.write(180); // Setzen Sie den Servo auf 180 Grad
delay(2000);        // 2 Sekunden warten
myServo.attach(9);  // Verbinden Sie den Servo 2 mit Pin 10
myServo.write(0);   // Setzen Sie den Servo auf 0 Grad
delay(2000);        // 2 Sekunden warten
myServo.write(90);  // Setzen Sie den Servo auf 90 Grad
delay(2000);        // 2 Sekunden warten
myServo.write(180); // Setzen Sie den Servo auf 180 Grad
delay(2000);        // 2 Sekunden warten
myServo.attach(9);  // Verbinden Sie den Servo 3 mit Pin 11
myServo.write(0);   // Setzen Sie den Servo auf 0 Grad
delay(2000);        // 2 Sekunden warten
myServo.write(90);  // Setzen Sie den Servo auf 90 Grad
delay(2000);        // 2 Sekunden warten
myServo.write(180); // Setzen Sie den Servo auf 180 Grad
delay(2000);        // 2 Sekunden warten
myServo.attach(9);  // Verbinden Sie den Servo 4 mit Pin 12
myServo.write(0);   // Setzen Sie den Servo auf 0 Grad
delay(2000);        // 2 Sekunden warten
myServo.write(90);  // Setzen Sie den Servo auf 90 Grad
delay(2000);        // 2 Sekunden warten
myServo.write(180); // Setzen Sie den Servo auf 180 Grad
delay(2000);        // 2 Sekunden warten
}
void loop() {
// Hier können Sie weitere Steuerungen hinzufügen
}

Kompilieren funzt, hochladen bringt Fehlermeldung:

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Users\Iev\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf"

         Using Port                    : COM6
         Using Programmer              : wiring
         Overriding Baud Rate          : 115200
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout

Testaubau zum Verständnis:

Warum?

Was für ein Board hast Du zum Kompilieren und Hochladen in der IDE eingestellt?
Meines Wissens gibt es - jedenfalls von Arduino selbst - keinen Mega WiFi.

Hier und dort haben sich mal Leute mit sowas beschäftigt...

Hast Du noch einen zweiten MEGA?

Dann brauchst Du auch 4 Servoobjekte.

// Forensketch "Seebühne"
// https://forum.arduino.cc/

#include <Streaming.h>     // https://github.com/janelia-arduino/Streaming
#include <Servo.h>
Servo s1;
Servo s2;
Servo s3;
Servo s4;

constexpr uint8_t sNums {4};
Servo myServo[sNums] = {s1, s2, s3, s4};
constexpr uint8_t servoPins[sNums] {9, 10, 11, 12};

void setup()
{
  Serial.begin(115200);
  Serial << F("Start...");

  for (byte b = 0; b < sNums; b++)     // zählt durch alle Servos
  {
    myServo[b].attach(servoPins[b]);   // Pinzuweisung
    Serial << F("Servo: ") << b + 1 << F(" :0,");
    myServo[b].write(0);               // Setzen Sie den Servo auf 0 Grad
    delay(2000);                       // 2 Sekunden warten
    Serial << F(" 90,");
    myServo[b].write(90);              // Setzen Sie den Servo auf 90 Grad
    delay(2000);                       // 2 Sekunden warten
    Serial << F(" 180");
    myServo[b].write(180);             // Setzen Sie den Servo auf 180 Grad
    delay(2000);                       // 2 Sekunden warten
    Serial << endl;
  }
}

void loop()
{
  // Hier können Sie weitere Steuerungen hinzufügen
}

beim 2. MEGA das selbe

eingestellt ist Mega oder Mega 2560

Erstmal muss sichergestellt werden, dass die DIP-Schalter richig stehen.
Die DIP 1, 2, 5, 6 und 7 müssen OFF sein, 3 und 4 ON.

MEGA in der IDE ist richtig.

In der Geräteumgebung muss der dann richtig erkannt werden und in der IDE der Port sollte stimmen.

lag an den minidipschaltern, jetzt gehts hoch zuladen.

Jetzt mal den Startbutton mit einbauen in den Code.

Nach dem Ablauf sollen die Servos erstmal wieder auf 0, also Startposition gehen.

Am Ende ist Servo 1 und 2 der Master und 3 und 4 sollen die Bewegungen gleichzeitig mitmachen, aber spiegelverkehrt

Button an welchen PIN?

Dann ist die Start-Position der beiden aber auch spiegelvekehrt, oder?

Button gern wieder A0

schau dir das Bild mit dem Testaufbau an, stell dir vor die Beiden Scheinwerfer strahlen sich jetzt gegenseitig an (Startposition). Dann soll eine Art Ablauf ablaufen wo die beiden Scheinwerfer langsam nach oben fahren, danach gleichzeitig wieder runter und nach innen (Richtung Steckbrett) fahren. Anschließend wieder in Startposition fahren.

// Forensketch "Seebühne"
// https://forum.arduino.cc/

#include <Streaming.h>     // https://github.com/janelia-arduino/Streaming
#include <Servo.h>
Servo s1;
Servo s2;
Servo s3;
Servo s4;

constexpr uint8_t btnPin {A0};

constexpr uint8_t sNums {4};
Servo myServo[sNums] = {s1, s2, s3, s4};
constexpr uint8_t servoPins[sNums] {9, 10, 11, 12};

enum STATE {wait, startPos, middlePos, endPos};
STATE state = wait;

void setup()
{
  Serial.begin(115200);
  Serial << F("Start...");
  pinMode(btnPin, INPUT_PULLUP);

  for (byte b = 0; b < sNums; b++)     // zählt durch alle Servos
  {
    myServo[b].attach(servoPins[b]);   // Pinzuweisung

    if (b > 1)
    { myServo[b].write(180); }             // Setzen Sie den Servo auf 180 Grad
  }
}

void loop()
{
  stateMachine();
}

void stateMachine()
{
  switch (state)
  {
    case wait:
      if (!digitalRead(btnPin))
      {
        state = middlePos;
        Serial << F("btn gedrückt") << endl;
      }

      break;

    case middlePos:
      Serial << F("Fahre in Mittelstellungen") << endl;

      for (byte b = 0; b < sNums; b++)
      { servoPos(b, 90); }

      delay(2000);
      state = endPos;
      break;

    case endPos:
      Serial << F("Gegenläufig Endposition") << endl;

      for (byte b = 0; b < sNums / 2; b++)
      {
        servoPos(b, 180);
        servoPos(b + 2, 0);
      }

      delay(2000);
      state = startPos;
      break;

    case startPos:
      Serial << F("Gegenläufig Startposition") << endl;

      for (byte b = 0; b < sNums / 2; b++)
      {
        servoPos(b, 0);
        servoPos(b + 2, 180);
      }

      delay(2000);
      state = wait;
      break;
  }
}

void servoPos(const uint8_t servoNum, const uint8_t pos)
{
  myServo[servoNum].write(pos);
  Serial << F("Servo: ") << pos + 1 << F(" Position: ") << pos << endl;
}

Erstmal, das irgendwas geht.
Für die Positionen gibts dann später Variablen.