Fernbedinung Humanoid Robot

Hallo
Ich habe mir gedacht ich versuche mal ein neues Projekt (Robot)
Der Robot ist fertig aufgebaut Sketch ist auf dem Arduino Mega ohne Probleme
nur leider bewegt sich kein Servomotor die FB ist ok die LED am Arduino Blinkt einmal beim
Senden der FB da nicht mehr .

#include <IRremote.h>
#include <Servo.h>
IRrecv irrecv(6);
decode_results results;
unsigned long last;
int state = 0;
int state1 = 0;
Servo servo1, servo2, servo3, servo4, servo5, servo6, servo7;
Servo servo8, servo9, servo10, servo11, servo12, servo13;
void bosh() {
  for (int i = 40; i <= 150; i++) {
    servo4.write(i);
    delay(20);
  }
  for (int i = 150; i >= 40; i--) {
    servo4.write(i);
    delay(20);
  }
  servo4.write(90);
  delay(500); 
}
void tren() {
  for (int i = 0,  w = 180; i <= 180, w >= 0; i++, w--) {
    servo1.write(i);
    servo7.write(w);
    servo4.write(i);
    delay(5);
  }
  delay(1000);
  for (int i = 180, w = 0; i >= 0, w <= 180 ; i--, w++) {
    servo1.write(i);
    servo7.write(w);
    servo4.write(i);
    delay(5);
  }
  servo4.write(90);
  delay(1000);
  for (int i = 180, w = 0; i >= 0, w <= 180 ; i--, w++) {
    servo2.write(i);
    servo6.write(w);
    delay(5);
  }
  delay(1000);
  for (int i = 0,  w = 180; i <= 180, w >= 0; i++, w--) {
    servo2.write(i);
    servo6.write(w);
    delay(5);
  }
  delay(1000);
  for (int i = 90,  w = 90; i <= 180, w >= 0; i++, w--) {
    servo3.write(i);
    servo5.write(w);
    delay(5);
  }
  delay(1000);
  for (int i = 180, w = 0; i >= 90, w <= 90 ; i--, w++) {
    servo2.write(i);
    servo6.write(w);
    delay(5);
  }
  delay(1000);
  for (int i = 90,  w = 90; i <= 180, w >= 0; i++, w--) {
    servo2.write(i);
    servo6.write(w);
    delay(5);
  }
  delay(1000);
  for (int i = 180, w = 0; i >= 90, w <= 90 ; i--, w++) {
    servo3.write(i);
    servo5.write(w);
    delay(5);
  }
  delay(1000);
}

void yurish() {
  if (millis() - last > 500 && state == 0) {
    servo3.write(60);
    servo5.write(60);
    servo8.write(85);
    servo9.write(70);
    servo10.write(20);
    servo11.write(60);
    servo12.write(70);
    servo13.write(55);
    last = millis();
    state = 1;
  }
  if (millis() - last > 500 && state == 1) {
    servo3.write(90);
    servo5.write(90);
    servo8.write(95);
    servo9.write(70);
    servo10.write(60);
    servo11.write(60);
    servo12.write(90);
    servo13.write(65);
    last = millis();
    state = 2;
  }
  if (millis() - last > 500 && state == 2) {
    servo3.write(120);
    servo5.write(120);
    servo8.write(95);
    servo9.write(95);
    servo10.write(60);
    servo11.write(110);
    servo12.write(90);
    servo13.write(65);
    last = millis();
    state = 3;
  }
  if (millis() - last > 500 && state == 3) {
    servo3.write(90);
    servo5.write(90);
    servo8.write(85);
    servo9.write(70);
    servo10.write(60);
    servo11.write(60);
    servo12.write(90);
    servo13.write(55);
    last = millis();
    state = 0;
  }
}
void roslan() {
  servo1.write(20);
  servo2.write(180);
  servo3.write(90);
  servo4.write(90);
  servo5.write(90);
  servo6.write(0);
  servo7.write(160);
  servo8.write(90);
  servo9.write(70);
  servo10.write(60);
  servo11.write(60);
  servo12.write(90);
  servo13.write(50);
}
void prisidani() {
  if (millis() - last > 500 && state1 == 0) {
    servo3.write(90);
    servo5.write(90);
    servo8.write(90);
    servo9.write(70);
    servo10.write(60);
    servo11.write(60);
    servo12.write(90);
    servo13.write(60);
    last = millis();
    state1 = 1;
  }
  if (millis() - last > 500 && state1 == 1) {
    servo3.write(90);
    servo5.write(90);
    servo8.write(90);
    servo9.write(120);
    servo10.write(20);
    servo11.write(100);
    servo12.write(40);
    servo13.write(60);
    last = millis();
    state1 = 0;
  }
}
void setup() {
  irrecv.enableIRIn();
  Serial.begin(9600);
  pinMode(6, INPUT);

  servo1.attach(A0);
  servo2.attach(A1);
  servo3.attach(A2);
  servo4.attach(A3);
  servo5.attach(A4);
  servo6.attach(A5);
  servo7.attach(A6);
  servo8.attach(A7);
  servo9.attach(A8);
  servo10.attach(A9);
  servo11.attach(2);
  servo12.attach(4);
  servo13.attach(5);

  servo1.write(20);
  servo2.write(180);
  servo3.write(90);
  servo4.write(90);
  servo5.write(90);
  servo6.write(0);
  servo7.write(160);
  servo8.write(90);
  servo9.write(70);
  servo10.write(60);
  servo11.write(60);
  servo12.write(90);
  servo13.write(50);
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value);
    if (results.value == 16718055) {
      yurish();
    } else if (results.value == 16730805) {
      prisidani();
    } else if (results.value == 12535991) {
      bosh();
    } else if (results.value == 12574751) {
      tren();
    } else {
      roslan();
    }







    irrecv.resume();
  }
}

welche LED?
Zeige mal ein Bild der Verkabelung damit man sieht wie die Servos angeschlossen sind.
Du könntest deinen Sketch mit Serial.print Debug Ausgaben ausstatten.
Eine Zeile am Ende von Setup um zu sehen, dass der Arduino startet
Eine Zeile die den gelesen IR-Code ausgibt
eine zum Beginn jeder Funktion damit du siehst welche Funktion angesprungen wird.

Dann schau nach im Serial Monitor was der Sketch genau macht.

Da sieht man keinerlei Serial Ausgaben von deinen ergänzten Debug Informationen.
Zeile 3 ist aber ziemlich konkret, finde ich.

Ich würde mal sagen Du brauchst für die Servos so etwas zwischen 30 und 100W.

Funktioniert die Sache wenn Du nur einen Servo anschließt?
Grüße Uwe

Also wenn ich die Servos anschließe drehen die bis zum anschlag und weiter kommt nichts
normalerweise "robot starten nichts passiert " und erst von der Fernbedienung ein Signal empfangen wird bewegt er sich. Leider geht die FB nicht per oszi geht die FB oder arduino
verarbeitet das Signal nicht .
Jedenfalls habe ich heute im netz nach schaltungen mit Fernbedienung led per arduino schalten gesucht habe drei schaltungen zusammengesteckt und nicht eine schaltung (LED)
hat sich ein oder ausschalten lassen per FB sehr eigenartig .
Ich hab gelesen änderung IRremote.h jetzt IRremote .hpp ist da der fehler?

In dem von dir geposteten Warnungstext steht doch eigentlich was Sache ist. Du hast die IRremote 4.x Bibliothek installiert, hast aber einen Quellcode der nur mit einer IRremote Bibliothek < 3.x funktioniert.

Du hast jetzt zwei Möglichkeiten:
Du passt den IR-Code auf die Version 4.x an. Wie das geht steht hier:

Oder Du installierst die IRRemote BiblIothek Version 2.6.X.

Danke

Habe die Version 2.6.x installiert bekomme keine fehlermeldung mehr soweit alles ok
leider geht das Projekt nicht .
Nach dem Starten des Arduino drehen die servo Motore einfach los und per FB geht nichts.
Da ich noch nicht so viel Ahnung davon habe weis ich nicht wo der Fehler im Sketch zu suchen ist .

Ist der IR-Receiver wirklich an Pin D6 angeschlossen?

Stimmen die Werte, die auf der seriellen Konsole ausgegeben werden, mit den in der loop() Funktion (results.value) verwendeten überein?

Habe jetzt alles nochmal geprüft , nach dem einschalten Drehen sich die Servo Motore
am anschluss A0 ,A1,A5,A6,D2,D5,A9,A8 . Es lassen sich nur die Servos A2,A4 per FB steuern .
Im Seriellen Monitor stimmt nur eine Zahl überein mit dem results .value 16730805 ,
mit keiner Taste wird 12535991 und 12574751 wie im results.value ausgegeben .

Werden den andere Werte ausgegeben? Dann kannst du die ja eintragen

Die Werte, die auf der seriellen Konsole ausgegeben werden, entsprechen dem Code einer bestimmten Taste auf der Fernbedienung. Wenn diese nicht mit denen in den If-Bedingungen der loop() übereinstimmen, passiert natürlich nichts.

Deshalb musst du die Ausgabewerte, wie @wwerner schon schrieb, im Programmcode eintragen.

Diese if Kaskade kann du durch

switch(results.value){    
  case 16718055: yurish();    break;
  case 16730805: prisidani(); break;
  case 12535991: bosh();      break;
  case 12574751: tren();      break;
  default: 
    Serial.println(results.value);
    roslan();
}

Ändert nix an der Funktion, ist aber übersichtlicher.
1 Like

Danke für eure Hilfe .habe jetzt die code der FB in dem Sketch geändert den kopf und die sogenanten schultergelenke lassen sich per FB steuern aber die anderen servos drehen immer noch lassen sich nicht regeln

Dann schreibe doch mal einen kleinen Testsketch der einen dieser Servos ansteuert um erst mal die Hardware zu testen.

Die Servo Motore habbe ich alle mit Arduino Uno überprüft sind alle io .
Jetzt weis ich auch nicht mehr weiter.

Auch an den gleichen Pins?

Habe es mit allen pins die die sevos antreiben getestet alles io .
also ist das Arduino mega board ok und die Servos auch .
Muss doch der fehler in der ino sein .
Ist sehr Komisch habe ein Robot Auto was mir folgt gebaut top ein DCF Analyzer Uhr mit Gong und Stundenschlag alles super nur dieses Projekt mag mich nicht bekomme ich nicht zum Laufen .
Im Netz habe ich jetzt ein Programm gefunden" Simulide "der Simuliert das,das Programm ist auf dem Mac die Schaltung ist eingezeichnet die ino datei ist auch schon drin nur leider bekomme ich den Ordner Arduino und Library nicht rein muss noch mal lesen wie das genau geht .Muss diese Schaltung mal simulieren .
HumanoidIRremote.ino (4.4 KB)

Warum verwendest du nicht Zaehler - Wokwi ESP32, STM32, Arduino Simulator

Hallo
Habe diese Software gleich gefunden . So habe jetzt die ino datei plus schaltung Simuliert
keine Fehler .
Alle servo Motore gehen nach dem Start deer Simulation in Grundstellung .
Servo 8 -A7 2 Grad,Servo 9-A8 45 Grad,Servo 10-A9 40 Grad ,servo 11-D2 40 Grad Servo 12-D4 2 Grad u.s.w .
Keine Servo dreht rund wie ein Gleichstrommotor .
Jetzt frage ich mich ob es mein fehler war unwissenheit ? Die Servos die ich gekauft habe
sind 360 Grad müssen da 180Grad servo rein ?
Ist das egal ? Die Servo bekommen doch vom Arduino das Signal ob links oder rechts schnell oder Langsam es gibt doch keine Rückmeldung vom Servo zum Arduino.