Wall-E Servo und Sound Steuerung

Hallo Zusammen, ich habe mir ein ziemlich umfangreiches Winterprojekt angetan. Einen lebensechten Wall-E Roboter. Die Hardware ist nun ziemlich fertig. Nun benötige ich noch eine Steuerung für 6 Servos da ich nur eine 10 Kanal Fernbedienung habe. Dafür habe ich mir noch eine 10 Kanal Funkrelaiskarte zusätzlich gekauft bei der die ersten 6 Relais tastend und die anderen 4 selbsthemmend sind (1x drücken an, 2. drücken aus). Die Arme, Kopf, Antrieb und Augen steuere ich mit der RC Fernbedienung. Die Finger, Augenbrauen, Hände und die Klappe würde ich gerne mit dieser Funkrelaiskarte steuern. Dafür würde ich den Arduino Nano mit einem DF-Player verwenden. Gedacht wäre es so:
Die Fernbedienung hat 10 Tasten. Auf jede Taste würde ich gerne einen Ablauf legen:

Taste 1: Sound 1, Servo linke Hand zu, Servo linke Finger zu
Taste 2: Sound 2, Servo linke und rechte Hand auf, Servo linke und rechte Finger auf, Servo Klappe auf
Taste 3: Sound 3, Servo linke und rechte Hand auf, Servo linke und rechte Finger zu
Taste 4: Sound 4, Servo linke und rechte Hand zu, Servo linke und rechte Finger auf
Taste 5: Sound 5, Servo Augenbrauen auf für 5 Sekunden
Taste 6: Wenn gedrückt Servo Augenbrauen auf, Wenn losgelassen Servo Augenbrauen zu
Schalter 7: Sound 6, Relais zieht an solange Schalter 7 an ist
Schalter 8: Sound 7, Servo linke Hand auf, Servo linke Finger auf/zu
Schalter 9: Lied 1, Servo linke und rechte Hand auf/zu
Schalter 10: Lied 2

Als Eingänge hätte ich die A0 bis A7 und den Eingang 9 und 12.
Als Servo- und Relaisausgang 2 bis 8
Und als Audio RX TX den 10 und 11

Was meint Ihr, ist das realisierbar bzw. wäre jemand da, der auch gerne gegen Bezahlung, mir unter die Arme greifen kann da ich bis jetzt nur eine Minischaltung für eine Geisterfalle realisiert habe.

Ich habe den Code jetzt soweit zum laufen bekommen. Leider bekomme ich ein paar Funktionen selbst nicht hin. Könnt Ihr mir bitte helfen?

  • Beim Schalter 7, 8 und 9 soll das Lied solange laufen bis der Schalter wieder aus ist

  • Bei Schalter 10 soll der Sound nur einmal abspielen obwohl der Schalter auf on ist, da über das Relais noch ein Licht geschalten ist. Die anderen Programme sollen dann trotzdem laufen nachdem der Sound beim einschalten des Schalters 10 abgespielt worden ist.

  • Eine Möglichkeit die Geschwindigkeit der Servos zu verlangsamen wäre auch super.

Ich würde mich freuen, wenn Ihr mir helfen könntet.


```cpp
#include <SoftwareSerial.h>
#include <DFPlayerMini_Fast.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

SoftwareSerial mySerial(10, 11); // RX, TX
DFPlayerMini_Fast myDFPlayer;

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

const int numServos = 8;
const int servoPins[numServos] = {0, 1, 2, 3, 4, 5, 6, 7}; // Servo PWM Pins

const int Taster1 = 2; // Pin für Wall-E ws/gb
const int Taster2 = 3; // Pin für Tatttaaaaa   ws/sw
const int Taster3 = 4; // Pin für EVA   gr/sw
const int Taster4 = 5; // Pin für Yuuhuuu  ws/bl
const int Taster5 = 6; // Pin für woah   bl/rosa
const int Taster6 = 7; // Pin für ohhhh   braun/sw
const int Schalter7 = A0; // Pin für Lied 3   gelb/br
const int Schalter8 = A1; // Pin für Lied 1   braun
const int Schalter9 = A2; // Pin für Lied 2    ws/gr
const int Schalter10 = A3; // Pin Solar Charger   br/bl
const int Taster11 = 8 ; // Pin für den Gehäusetaster   ws/gr


void setup() {

   Wire.begin();

  pwm.begin();

  pwm.setPWMFreq(60); // Set the PWM frequency to 60 Hz

  pinMode(Taster1, INPUT_PULLUP);
  pinMode(Taster2, INPUT_PULLUP);
  pinMode(Taster3, INPUT_PULLUP);
  pinMode(Taster4, INPUT_PULLUP);
  pinMode(Taster5, INPUT_PULLUP);
  pinMode(Taster6, INPUT_PULLUP);
  pinMode(Schalter7, INPUT_PULLUP);
  pinMode(Schalter8, INPUT_PULLUP);
  pinMode(Schalter9, INPUT_PULLUP);
  pinMode(Schalter10, INPUT_PULLUP);
  pinMode(Taster11, INPUT_PULLUP);

  mySerial.begin(9600);
  myDFPlayer.begin(mySerial);
  myDFPlayer.volume(25); // Lautstärke einstellen (0-30)

}

void loop() {
  if (digitalRead(Taster1) == LOW) {
    myDFPlayer.play(1); // Wall-E abspielen
      setServoAngle(0,-90);     //Hand links zur mitte
      setServoAngle(1,140);     //Finger links zu
      setServoAngle(2,120);     //Finger rechts zu
      setServoAngle(3,130);     //Hand rechts zur mitte
      setServoAngle(4,-25);     //Augenbrauen zu
      setServoAngle(5, 10);     //Arm rechts mitte
      setServoAngle(6, 10);     //Arm links mitte
      setServoAngle(7,-90);       //Klappe zu
    delay(2000); // Verzögerung, um mehrfaches Auslösen zu vermeiden
  }

  if (digitalRead(Taster2) == LOW) {
    myDFPlayer.play(2); // Tataaaaa abspielen
      setServoAngle(0,-180);    //Hand links nach unten
      setServoAngle(1,-100);    //Finger links auf
      setServoAngle(2,-120);    //Finger rechts auf
      setServoAngle(3,230);     //Hand rechts nach unten
      setServoAngle(4,110);     //Augenbrauen auf
      setServoAngle(5,-60);     //Arm rechts unten
      setServoAngle(6,60);     //Arm links unten
      setServoAngle(7,0);       //Klappe auf
    delay(2000);
  }

  if (digitalRead(Taster3) == LOW) {
    myDFPlayer.play(3); // EVA abspielen
      setServoAngle(0,120);     //Hand links nach oben 
      setServoAngle(1,140);     //Finger links zu
      setServoAngle(2,120);     //Finger rechts zu
      setServoAngle(3,-70);     //Hand rechts nach oben
      setServoAngle(4,-25);     //Augenbrauen zu
      setServoAngle(5,10);     //Arm rechts mitte
      setServoAngle(6, 10);     //Arm links mitte
      setServoAngle(7,-90);       //Klappe zu
      delay(2000);

  }
    if (digitalRead(Taster4) == LOW) {
    myDFPlayer.play(4);       // Yuhuuu winken abspielen
    setServoAngle(0,120);     //Hand links nach oben 
    setServoAngle(3,-70);     //Hand rechts nach oben
    setServoAngle(5,-30);     //Arm rechts oben
    setServoAngle(6,10);     //Arm links mitte
    setServoAngle(7,-90);     //Klappe zu
    setServoAngle(1,90);    //Finger links winken
    delay(500);
    setServoAngle(1,-90);
    delay(500);
    setServoAngle(1,90);
    delay(500);
    setServoAngle(1,-90);
    delay(500);
    setServoAngle(1,90);
    delay(500);
    setServoAngle(1,-90);
    delay(500);
    setServoAngle(1,90);
    delay(2000); // Verzögerung, um mehrfaches Auslösen zu vermeiden
  }

  if (digitalRead(Taster5) == LOW) {
    myDFPlayer.play(9); // Ahhhhhh abspielen
    setServoAngle(4,110);     //Augenbrauen auf
    delay(1500);
    setServoAngle(4,-25);     //Augenbrauen zu
    delay(2000);
  }

  if (digitalRead(Taster6) == LOW) {
    myDFPlayer.play(8); // traurig abspielen
    delay(2000);
  }

    if (digitalRead(Schalter7) == LOW) {
    myDFPlayer.play(10); // Lied 1 abspielen
    delay(2000);
  }

      if (digitalRead(Schalter8) == LOW) {
    myDFPlayer.play(11); // Lied 2 abspielen
    delay(2000);
  }

      if (digitalRead(Schalter9) == LOW) {
    myDFPlayer.play(9); // Lied3 abspielen
    delay(2000);
  }

      if (digitalRead(Schalter10) == LOW) {
    myDFPlayer.play(6); // Solar Charger abspielen
    delay(6000);
  }


      if (digitalRead(Taster11) == LOW) {   //Taster am Gehäuse
    myDFPlayer.play(5); // wow abspielen
    delay(2000);
  }
}


void setServoAngle(int servoNumber,int angle){
   int pulse = map(angle , -180 ,180 ,150 ,600); // Map the angle to the PCA9685 pulse length range
   pwm.setPWM(servoPins[servoNumber],0 ,pulse); 
}


Keiner?

Wenn Taste 3 gedrückt wird, dann spielt die Musik und der Arduino wird für 2 Sekunden blockiert. Du kontrollierst aber nicht ob die Taste losgelassen wird. Auch kannst Du in diesen 2 Sekunden keine Taste kontrollieren.

Gleiches gilt für alle anderen Taster.

Du mußt Zeiträume mit millis() machen und die funktionalitäten mit einer Schrittkette (State Machine)

Grüße Uwe

Jo Danke. Da muss ich mich erst leider einlesen. Das habe ich noch nie gemacht. Der jetzige Sketch war für mich schon eine Herausvorderung. :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.