Roboterarm mit HC-05 und Servos funktioniert nicht

Guten Tag,
Ich habe noch wenig Erfahrung und baue aktuell einen kleinen Robotterarm der aus 6 Servos besteht nach Anleitung eines YouTube Tutorials. Das Problem ist, dass die Servos nur zucken und sich nicht bewegen. Ich kann sie nicht mit dem Handy über das HC-05 bluetoothmodul ansteuern, da sie nicht reagieren. Das handy lässt dich jedoch problemlos mit dem Bluetoothmodul verbinden. Ich weiß nicht ob es villeicht an der Stromversorgung oder an dem Bluetoothmodul liegt.

Code:

#include <SoftwareSerial.h>
#include <Servo.h>

Servo servo01;
Servo servo02;
Servo servo03;
Servo servo04;
Servo servo05;
Servo servo06;

SoftwareSerial Bluetooth(3, 4); 

int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos;
int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; 
int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; 
int speedDelay = 20;
int index = 0;
String dataIn = "";

void setup() {
  
  servo01.attach(5);
  servo02.attach(6);
  servo03.attach(7);
  servo04.attach(8);
  servo05.attach(9);
  servo06.attach(10);
  Bluetooth.begin(38400); 
  Bluetooth.setTimeout(1); 
  
  delay(20);
 
  servo1PPos = 90;
  servo01.write(servo1PPos);
  servo2PPos = 150;
  servo02.write(servo2PPos);
  servo3PPos = 35;
  servo03.write(servo3PPos);
  servo4PPos = 140;
  servo04.write(servo4PPos);
  servo5PPos = 85;
  servo05.write(servo5PPos);
  servo6PPos = 80;
  servo06.write(servo6PPos);

}

void loop() {
  if (Bluetooth.available() > 0) {
    dataIn = Bluetooth.readString(); 
    
    if (dataIn.startsWith("s1")) {
      String dataInS = dataIn.substring(2, dataIn.length()); 
      servo1Pos = dataInS.toInt(); 
      
      if (servo1PPos > servo1Pos) {
        for ( int j = servo1PPos; j >= servo1Pos; j--) {  
          servo01.write(j);
          delay(20);    
        }
      }
      
      if (servo1PPos < servo1Pos) {
        for ( int j = servo1PPos; j <= servo1Pos; j++) { 
          servo01.write(j);
          delay(20);
        }
      }
      servo1PPos = servo1Pos;   
    }
    
    // Move Servo 2
    if (dataIn.startsWith("s2")) {
      String dataInS = dataIn.substring(2, dataIn.length());
      servo2Pos = dataInS.toInt();
      if (servo2PPos > servo2Pos) {
        for ( int j = servo2PPos; j >= servo2Pos; j--) {
          servo02.write(j);
          delay(50);
        }
      }
      if (servo2PPos < servo2Pos) {
        for ( int j = servo2PPos; j <= servo2Pos; j++) {
          servo02.write(j);
          delay(50);
        }
      }
      servo2PPos = servo2Pos;
    }
    // Move Servo 3
    if (dataIn.startsWith("s3")) {
      String dataInS = dataIn.substring(2, dataIn.length());
      servo3Pos = dataInS.toInt();
      if (servo3PPos > servo3Pos) {
        for ( int j = servo3PPos; j >= servo3Pos; j--) {
          servo03.write(j);
          delay(30);
        }
      }
      if (servo3PPos < servo3Pos) {
        for ( int j = servo3PPos; j <= servo3Pos; j++) {
          servo03.write(j);
          delay(30);
        }
      }
      servo3PPos = servo3Pos;
    }
    // Move Servo 4
    if (dataIn.startsWith("s4")) {
      String dataInS = dataIn.substring(2, dataIn.length());
      servo4Pos = dataInS.toInt();
      if (servo4PPos > servo4Pos) {
        for ( int j = servo4PPos; j >= servo4Pos; j--) {
          servo04.write(j);
          delay(30);
        }
      }
      if (servo4PPos < servo4Pos) {
        for ( int j = servo4PPos; j <= servo4Pos; j++) {
          servo04.write(j);
          delay(30);
        }
      }
      servo4PPos = servo4Pos;
    }
    // Move Servo 5
    if (dataIn.startsWith("s5")) {
      String dataInS = dataIn.substring(2, dataIn.length());
      servo5Pos = dataInS.toInt();
      if (servo5PPos > servo5Pos) {
        for ( int j = servo5PPos; j >= servo5Pos; j--) {
          servo05.write(j);
          delay(30);
        }
      }
      if (servo5PPos < servo5Pos) {
        for ( int j = servo5PPos; j <= servo5Pos; j++) {
          servo05.write(j);
          delay(30);
        }
      }
      servo5PPos = servo5Pos;
    }
    // Move Servo 6
    if (dataIn.startsWith("s6")) {
      String dataInS = dataIn.substring(2, dataIn.length());
      servo6Pos = dataInS.toInt();
      if (servo6PPos > servo6Pos) {
        for ( int j = servo6PPos; j >= servo6Pos; j--) {
          servo06.write(j);
          delay(30);
        }
      }
      if (servo6PPos < servo6Pos) {
        for ( int j = servo6PPos; j <= servo6Pos; j++) {
          servo06.write(j);
          delay(30);
        }
      }
      servo6PPos = servo6Pos; 
    }
    
    if (dataIn.startsWith("SAVE")) {
      servo01SP[index] = servo1PPos;  
      servo02SP[index] = servo2PPos;
      servo03SP[index] = servo3PPos;
      servo04SP[index] = servo4PPos;
      servo05SP[index] = servo5PPos;
      servo06SP[index] = servo6PPos;
      index++;                        
    }
   
    if (dataIn.startsWith("RUN")) {
      runservo(); 
    }
   
    if ( dataIn == "RESET") {
      memset(servo01SP, 0, sizeof(servo01SP)); 
      memset(servo02SP, 0, sizeof(servo02SP));
      memset(servo03SP, 0, sizeof(servo03SP));
      memset(servo04SP, 0, sizeof(servo04SP));
      memset(servo05SP, 0, sizeof(servo05SP));
      memset(servo06SP, 0, sizeof(servo06SP));
      index = 0;  // Index to 0
    }
  }
}

void runservo() {
  while (dataIn != "RESET") {   
    for (int i = 0; i <= index - 2; i++) { 
      if (Bluetooth.available() > 0) {      
        dataIn = Bluetooth.readString();
        if ( dataIn == "PAUSE") {           
          while (dataIn != "RUN") {         
            if (Bluetooth.available() > 0) {
              dataIn = Bluetooth.readString();
              if ( dataIn == "RESET") {     
                break;
              }
            }
          }
        }
        
        if (dataIn.startsWith("ss")) {
          String dataInS = dataIn.substring(2, dataIn.length());
          speedDelay = dataInS.toInt(); 
        }
      }
      // Servo 1
      if (servo01SP[i] == servo01SP[i + 1]) {
      }
      if (servo01SP[i] > servo01SP[i + 1]) {
        for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) {
          servo01.write(j);
          delay(speedDelay);
        }
      }
      if (servo01SP[i] < servo01SP[i + 1]) {
        for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) {
          servo01.write(j);
          delay(speedDelay);
        }
      }
      // Servo 2
      if (servo02SP[i] == servo02SP[i + 1]) {
      }
      if (servo02SP[i] > servo02SP[i + 1]) {
        for ( int j = servo02SP[i]; j >= servo02SP[i + 1]; j--) {
          servo02.write(j);
          delay(speedDelay);
        }
      }
      if (servo02SP[i] < servo02SP[i + 1]) {
        for ( int j = servo02SP[i]; j <= servo02SP[i + 1]; j++) {
          servo02.write(j);
          delay(speedDelay);
        }
      }
      // Servo 3
      if (servo03SP[i] == servo03SP[i + 1]) {
      }
      if (servo03SP[i] > servo03SP[i + 1]) {
        for ( int j = servo03SP[i]; j >= servo03SP[i + 1]; j--) {
          servo03.write(j);
          delay(speedDelay);
        }
      }
      if (servo03SP[i] < servo03SP[i + 1]) {
        for ( int j = servo03SP[i]; j <= servo03SP[i + 1]; j++) {
          servo03.write(j);
          delay(speedDelay);
        }
      }
      // Servo 4
      if (servo04SP[i] == servo04SP[i + 1]) {
      }
      if (servo04SP[i] > servo04SP[i + 1]) {
        for ( int j = servo04SP[i]; j >= servo04SP[i + 1]; j--) {
          servo04.write(j);
          delay(speedDelay);
        }
      }
      if (servo04SP[i] < servo04SP[i + 1]) {
        for ( int j = servo04SP[i]; j <= servo04SP[i + 1]; j++) {
          servo04.write(j);
          delay(speedDelay);
        }
      }
      // Servo 5
      if (servo05SP[i] == servo05SP[i + 1]) {
      }
      if (servo05SP[i] > servo05SP[i + 1]) {
        for ( int j = servo05SP[i]; j >= servo05SP[i + 1]; j--) {
          servo05.write(j);
          delay(speedDelay);
        }
      }
      if (servo05SP[i] < servo05SP[i + 1]) {
        for ( int j = servo05SP[i]; j <= servo05SP[i + 1]; j++) {
          servo05.write(j);
          delay(speedDelay);
        }
      }
      // Servo 6
      if (servo06SP[i] == servo06SP[i + 1]) {
      }
      if (servo06SP[i] > servo06SP[i + 1]) {
        for ( int j = servo06SP[i]; j >= servo06SP[i + 1]; j--) {
          servo06.write(j);
          delay(speedDelay);
        }
      }
      if (servo06SP[i] < servo06SP[i + 1]) {
        for ( int j = servo06SP[i]; j <= servo06SP[i + 1]; j++) {
          servo06.write(j);
          delay(speedDelay);
        }
      }
    }
  }
}

Schaltplan:

Auf der Zeichnung fehlt ein schwarzes Kabel das von der externen Stromquelle zum Bluetoothmodul bzw. zum Arduino geht.

Für die Stromversorgung verwende ich ein 5v 2A 10W Wandnetzteil von Amazon.

1 Like

Auch wenn ich selbst das nicht sehen könnte - nen Link...

Also wenn ich mir die ganzen delays da ansehe, und das mit den Schachteln in Schleifen und Bedingungen...

Versuch doch mal erstmal, das runterzubrechen auf einen Servo und bring den sauber zum laufen.
Dann den nächsten und so weiter.

Verwende den Seriellen Monitor um zu sehen, was Du empfängst und verarbeitest....

Eine sehr schöne Präsentation :slight_smile:

Das kommt mir zu schwach vor. Zudem würde ich jedem Servo einen Elko spendieren.

Sind die Servos überhaupt stark genug für den Arm? Zum Testen die Servos einzeln auf den Tisch legen, dann einen nach dem andern zum Arm hinzufügen.

Ansonsten solltest Du Dich über Arrays und Unterprogramme schlau machen, damit kann Dein Programm auf 1/4 zusammenschrumpfen und Fehler müssen nicht für jeden einzelnen Servo extra korrigiert werden.

Hier der Link des Videos: https: //www.youtube.com/watch?v=_B3gWd3A_SI&t=460s

Ich habe versucht die Servos einzeln anzusteuern, ich habe sie dazu einfach an den Arduino angeschlossen. Die Servos lassen sich einzeln ansteuern über den Strom des Arduinos. Das Netzteil habe ich auch aus dem YouTube video da der YouTuber es auf seiner Webseite verlinkt hatte.

ich denke schon. Ich habe sie ausgebaut und auf den Tisch gelegt und es ist das Selbe passiert. Sie bewegen sich garnicht und wenn man auf der Handy app etwas drückt z.B. dass sich nur einer bewegen soll dann zucken alle kurz aber es dreht sich keiner richtig. Eine zweite Frage wäre ob die 2A nicht gefährlich sind da mein Multimeter bei der Stromstärke anfängt zu hupen und zu blinken :thinking:

Servos sollte man grundsätzlich und immer über eine externe Stromversorgung betreiben.
Der Spannungsregler auf dem Arduino kann ca 500 mA. Wenn ein einzelnes Servo gegen eine Last arbeiten muss dann zieht ein einzelnes Servo schon 500 mA bis 1,5 A.

Auf dem Bild das du gepostest hast fehlt die Verbindung der Minuspole zwischen der externen Stromversorgung und dem Arduino. Wenn diese Verbindung der Minuspole fehlt ist es kein Wunder dass es nicht funktioniert.

Ich habe auf der Seite des Youtubers nachgesehen da ist die Leitung eingezeichnet

Die schwarze Leitung die von "5V external Powersource nach unten zum Arduino geht.

2A sind bei 5V für Menschen nicht lebensgefährlich.
Über ein Breadboard sollte man so hohe Ströme nicht fließen lassen. Bei 2A wird es nicht spontan anfangen zu glühen und zu brennen aber breadboards sind nur was für Ströme bis ca. 100-200 mA.

Wenn die Leitungen die du verwendest nicht ultradünn sind dann sollte das gehen. 0,14mm² ist aber bei 2A auch schon sehr knapp bemessen. Auf so ganz dünnen Leitungen (die billigen Jumperwirer für Breadboards) hast du dann auf der Leitung schon 1-2V Spannungsabfall. Das sollten wenigsten 0,5 mm² sein.

2A sind auch höchstwahrscheinlich nicht für das Multimeter gefährlich im Sinne von kaputt gehen. Das piepsen des Multimeters zeigt an das der Strom größer ist als der Messbereich. Die meisten Multimeter haben eine interne Sicherung die durchbrennt wenn der Strom wirklich zu hoch ist. Dann muss man erst einmal diese Sicherung wechseln.
Poste mal ein Foto von deinem Multimeter. Hat das Multimeter auch einen 10A oder 20A Messbereich?

So ein bißchen Grundlagen in Sachen Elektronik wäre schon gut. Dann wäre dir das mit der Verbindung zwischen den Minusleitungen selbst aufgefallen. Es geht hier nicht mehr nur um mit Papier, Schere und klebstoff ein bißchen was auszuscheniden und zusammenkleben.

vgs

Die großen Servos werden mit 1,5 kgcm angegeben.

Das ist im Modellflug schon ein recht kleines Servo. Ich habe den MeArm Roboter der komplett aus flachen Teilen zusammengebaut wird
gebaut.

Der hat ähnlich "kleine" Servos. Solange man keine allzu großen Zusatzlasten hochheben will geht das.

vgs

Danke für den Tipp, das fiel mir schon vorher auf und ich habe es nun behoben.

Das wusste ich nicht, vielleicht ligt es ja daran. Wie könnte ich es alternaiv verbinden :thinking:.
Hier ist noch ein Foto vo meinem Aufbau:

Bauteile die größere Ströme ziehen kann man mit Wagoklemmen anschliessen

Das ist der Nachfolger der "Lüsterklemme" Hebel aufklappen Kabel oder Jumperwire reinstecken. Hebel runterklappen - hält. Im Grunde bekommt man das Kabel nur dann heraus wenn man den Hebel hochklappt. Das hält also viel besser als Jumperwire auf einem Breadboard.
Wenn man die Kabel nicht auf ein Brettchen (= echtes breadboard) montiert wird es ein ziemlicher Kabelverhau. Weil ja dann alles lose herumfliegt.

Die gibt es im Baumarkt. Die sehen zwar filigran aus sind aber für 230V und hohe Ströme zugelassen. Und man kann auch der Unerseite auch noch reinschauen ob das blanke Kabelende wirklich Kontakt hat.

Eine Technik mit der es auch ordentlich wird wären Lochrasterplatine mit Stiftleisten und Buchsenleisten.

Jetzt musste ich echt 15 Minuten google bildersuche machen um so ein Foto zu finden

Das Grundprinzip sieht man hier. Ich finde es jedoch praktischer die Buchsen- und Stiftleisten senkrecht in die Platine zu löten

vgs

Die Servos haben doch alle Normstecker. Ich würde mir eine Adapterplatine (proto shield?) mit den passenden Gegenstücken zusammenlöten. Von dort ggf. ein Flachbandkabel mit Stecker zum Arduino.

Vielen Vielen Dank für die ganze Hilfe :+1: :grinning:
Ich werde das ganze mal ausprobieren.

Hm jetzt kalauer ich ein bißchen:

Nicht das "ganze" ausprobieren sondern Teile davon.
Das ist schon Ok das Gesamtprojekt zusammenzubauen und zu testen ob es geht.
Wenn es dann nicht geht muss man Fehlereingrenzung machen.
Alle Verbindungen bis auf externes Netzteil und ein Servo wegnehmen.

Für ein einzelnes Servo ohne Last wird das Breadboard wohl funktionieren.

Dann einen Demo-Sketch für Servo hin- und herbewegen von dem man weiß, dass er funktioniert aufspielen umit und einem einzelnen Servo testen:

funktioniert die Signalerzeugung und die Signalübertragung an das Servo?

Hat dein Digitalultimeter Frequenzmessung? Wenn ja könntest du damit prüfen ob an den IO-pins an die die Servos angeschlossen werden auch wirklich ein Servosignal herauskommt. Das Messgerät zeigt dann 50 Hz an.

Dann Servo abklemmen einzeln ausprobieren funktioniert die Bluetooth-Verbindung.

EDIT: Jetzt habe ich in den Code reingeschaut und da gesehen

  Bluetooth.begin(38400); 

38400 baud ist für softwareserial eine ziemlich hohe Baudrate ob das zusammen mit dem Erzeugen von 6 Servosignalen funktioniert?

vgs

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