Bitte um Hilfe: Servos reagieren willkürlich statt auf Funksignal?

Hallo liebe Forenmitglieder,

in meiner Verzweiflung wende ich mich nun nach langem Probieren, Lesen und Basteln an euch.

ich bastele schon länger an einem Kostümprojekt herum, bei dem eine Fernbedienung in einem Handschuh auf Knopfdruck Signale übertragen soll, um einige Servos (aktuell ist es nur einer) im Kostüm zu bewegen.
Die Fernbedienung ist fertig und funktioniert.
Sie besteht aus einem Arduino Nano (Nachbau von elegoo), einem FS1000A 433 MHz Funksender wird mit einer 9v Batterie betrieben. Vier Taster senden jeweils eine andere 4-stellige Zahlenfolge.

Der Servo in der Maske soll die Fühler / Hörner der Kreatur bewegen, sobald die Zahlenfolge "1234" empfangen wird.
Dies funktioniert leider nur hin und wieder - und ich verstehe nicht, warum das so willkürlich geschieht.
Ich verwende die Servo.h und RCSwitch.h , da diese für mich am einfachsten verständlich ist und für diese Art von Sender / Empfänger empfohlen ist.

Der Aufbau in der Maske besteht aus:
Arduino Nano (elegoo Nachbau, der Gleiche wie oben)
RF-5V 433 MHz Empfänger, im Set gekauft mit dem Sender -> an Pin 2
Servo von Sunfounder für 4,8 - 6 V -> an Pin 9

Zuerst dachte ich, das Ding hat zu wenig Strom (ich habe es mit einer USB Powerbank betrieben)
Jetzt habe ich eine 9V Batterie an den VIN Pin gehängt, leider ist das Ergebnis das Gleiche:

Es wird nur hin und wieder auf den Tastendruck der Fernbedienung reagiert.
Leider scheint der Arduino (zumindest wenn ich den Seriellen Monitor richtig betreibe) jetzt gar nichts mehr zu empfangen.

Meine Vermutung - und das gebe ich ganz ehrlich zu - ist mein nicht wirklich gut geschriebener Code...
Eventuell ist die if-Funktion, die ich mir hier zusammen geschustert habe, nicht das richtige für meinen Zweck.
Leider bin ich im Programmieren (besonders von Schleifen) eine Niete. Ich habe schon einige einfache Arduino Projekte erfolgreich abgeschlossen, aber dies ist mein erster Einsatz von Servos und Funksendern.

Ich wäre sehr dankbar, wenn jemand einen Blick auf meinen Code werfen und mir sagen könnte, was ich da bloß falsch mache:

#include <Servo.h> 
#include <RCSwitch.h>

 const int servoPin1 = 9;  // Servo pin

RCSwitch mySwitch = RCSwitch();


 int directionState = 0; 

 Servo servo1;
  
 
 int pos = 0;


 
void setup() {
  Serial.begin(9600);
   servo1.attach(9);
    mySwitch.enableReceive(0); // laut Arduino Nano Referenz ist Pin 2 der Interrupt Pin 0 und der Empfänger muss an den Interrupt Pin, oder hat sich was geändert??

servo1.write(0);
   
 }
 
 void loop(){

Serial.println("Start...");

  if (mySwitch.available()) // Wenn ein Code Empfangen wird...
  {
  int value = mySwitch.getReceivedValue();
Serial.println(value);
  
   if (directionState == 0){
     if (value == 1234) {
       directionState = 1;
       Serial.println(value);
       for(pos = 0; pos <= 90; pos += 1)
       {
                
         servo1.write(pos);  
        
         delay(20);  // waits 15ms to reach the position 
      
            
       }
     }
 
   } else if (directionState == 1) {
     if (value == 1234) {
       directionState = 0;   
       Serial.println(value);
       
      for (pos = 90; pos>=1; pos -=1)
       {
                 
         servo1.write(pos);
         
         delay(20);
         
         
       }
     }
   }  
     mySwitch.resetAvailable(); // Hier wird der Empfänger "resettet"
 }
 }

Ich bin für jede Hilfe dankbar!

Deine For Schleifen blockieren je, 1,8 Sekunden. In der Zeit ist keine weitere Aktion vom Arduino möglich. Sieh dir di Moba Tools an. Die lösen zumindestmal dieses Problem.

Dann fehlt auch noch der Sende Sketch.

Hi

Bitte bitte entferne unnötige Leerzeilen und drücke STRG+T in der IDE - SO sieht der Sketch nicht sonderlich toll aus und es macht echt keinen Spaß, sich so Kram anzuschauen.

MfG

Beschreibe doch mal, warum du die for-Schleife in der Servosteuerung benötigst.
Wenn du die weglässt, arbeiten die Servos schneller und bereiten nicht diese Probleme.
Damit sollte dein Problem eigentlich weg sein.

Wenn nicht, hast du vermutlich ein Problem mit der Funkübertragung. Das müsste dann untersucht werden.

Verwendest du Antennen? Wenn nicht ist vielleicht der Empfang einfach manchmal weg.

Ansonsten vertragen sich nicht alle libraries, aber dann dürfte es denke ich gar nicht gehen.

Der Spannungsstabilisator des NANO Nachbaus liefert nicht genügend Strom für einen Servo.
Du mußt den / die Servo/s getrennt mit Spannung versorgen (rechne mit bis zu 1A pro Servo) und die Massen verbinden.

Grüße Uwe

ElEspanol:
Deine For Schleifen blockieren je, 1,8 Sekunden. In der Zeit ist keine weitere Aktion vom Arduino möglich. Sieh dir di Moba Tools an. Die lösen zumindestmal dieses Problem.

Dann fehlt auch noch der Sende Sketch.

Dankeschön für den Tipp! Diese Tools kannte ich bisher noch nicht! :slight_smile: Wenn ich das richtig lese, kann man hier sogar die Servo Geschwindigkeit beeinflussen? Ich werde mich mal einlesen!

Der Sende Sketch ist dieser hier (Teilweise habe ich Beispielsketche genommen und modifiziert):

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

int taster_wings = 5; //Zeigefinger
int taster_ledmode = 6; //Mittelfinger
int taster_horn = 7; // Ringfinger
// int taster_rauch=8; //Kleiner Finger

int tasterstatus_horn = 0; //Das Wort „tasterstatus“ steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable gespeichert, ob der Taster gedrückt ist oder nicht.
int tasterstatus_ledmode = 0;
int tasterstatus_wings = 0;
// int tasterstatus_rauch=0;

void setup() //Hier beginnt das Setup.
{
  mySwitch.enableTransmit(10);  // Der Sender wird an Pin 10 angeschlossen
  pinMode(taster_horn, INPUT); //Der Pin mit dem Taster (Pin 7) ist jetzt ein Eingang.
  pinMode(taster_ledmode, INPUT);
  pinMode(taster_wings, INPUT);
  // pinMode(taster_rauch, INPUT);

}
void loop()
{ //Mit dieser Klammer wird der Loop-Teil geöffnet.
  tasterstatus_horn = digitalRead(taster_horn); //Hier wird der Pin7 ausgelesen (Befehl:digitalRead). Das Ergebnis wird unter der Variable „tasterstatus“ mit dem Wert „HIGH“ für 5Volt oder „LOW“ für 0Volt gespeichert.
  tasterstatus_ledmode = digitalRead(taster_ledmode);
  tasterstatus_wings = digitalRead(taster_wings);
  // tasterstatus_rauch=digitalRead(taster_rauch);


  if (tasterstatus_horn == HIGH)//Verarbeitung: Wenn der taster gedrückt ist (Das Spannungssignal ist hoch)
  { //Programmabschnitt des IF-Befehls öffnen.

    mySwitch.send(1234, 24);
    delay (50); // 50 Millisekunden Pause
  } //Programmabschnitt des IF-Befehls schließen.

  else if (tasterstatus_ledmode == HIGH)
  {

    mySwitch.send(5678, 24);
    delay (50); // 50 Millisekunden Pause
  }

  else if (tasterstatus_wings == HIGH)
  {

    mySwitch.send(9999, 24);
    delay (50); // 50 Millisekunden Pause
  }



  //else //...ansonsten...
  //{ //Programmabschnitt des else-Befehls öffnen.
  //mySwitch.send(1234, 24); // Der 433mhz Sender versendet die Dezimalzahl „1234“
  //} //Programmabschnitt des else-Befehls schließen.


} //Mit dieser letzten Klammer wird der Loop-Teil geschlossen.

Mein Problem ist der "Taster_Horn", der 1234 versenden soll und auf den der Arduino reagieren soll.
Die "LED_mode" und "Rauch" sind aktuell eher Platzhalter.
Die Fernbedienung funktioniert, ich habe es soeben mit meinem anderen Arduino (ein Testaufbau für die Flügel) getestet und der reagiert wunderbar auf den Taster mit "9999".
Unterschied hier: Der Empfänger für die Flügel ist ein mit 9V betriebener (Elegoo Nachbau) Arduino UNO R3 statt einem Nano... und hat zwei Servos dran. Das Ding ist noch nicht fertig, aber immerhin funktioniert der Funk.
Dass es doch am Nano liegt?

postmaster-ino:
Hi

Bitte bitte entferne unnötige Leerzeilen und drücke STRG+T in der IDE - SO sieht der Sketch nicht sonderlich toll aus und es macht echt keinen Spaß, sich so Kram anzuschauen.

MfG

Tut mir Leid, ich selber tue mich in der IDE immer leichter wenn Leerzeilen drin sind :frowning:
Werde ich nächstes Mal beherzigen!
Danke für den Tipp mit Strg+T, das kannte ich noch gar nicht!

Du kannst es glauben oder auch nicht , Servos vom 5V Ausgang eines Arduinos, egal welchen, geht unter Last keinesfalls gut.
Das ist eine Tatsache, bei der alles drumrum diskutieren nix bringt. Wenn der Sevo arbeiten muss, braucht er mehr Strom. Der Spannungsregler auf den Arduinos kann den aber nicht liefern, also geht die Spannung in die Knie. Ist die Spannung zu tief, schaltet der Arduino ab oder startet neu.
Kann sein, dass auf dem Uno der spannungsregler ein bisschen mehr strom liefern kan, als jener auf dem Nano, aber Beide sind zu schwach, um Servos wirklich zu versorgen. Ein test, bei dem die Servos unbelastet sind mag mal kurz funtionieren, aber für die Praxis ist das nicht zu gebrauchen. Uach sind 9V Batterien für Servos nicht grad die idealen Stromliferanten.

LG Stefan

HotSystems:
Beschreibe doch mal, warum du die for-Schleife in der Servosteuerung benötigst.
Wenn du die weglässt, arbeiten die Servos schneller und bereiten nicht diese Probleme.
Damit sollte dein Problem eigentlich weg sein.

Wenn nicht, hast du vermutlich ein Problem mit der Funkübertragung. Das müsste dann untersucht werden.

Ich muss gestehen, dass ich mich einfach mal in das Thema eingelesen habe und die For-Schleife war in vielen Beispielen gewählt. Ich möchte den Servo bei Tastendruck (über Funk) zu einer bestimmten Position bewegen, einmal vorwärts und bei erneutem Tastendruck rückwärts auf Ausgangsposition.
Ich glaube es lag an dem + und - (also vorwärts und rückwärts) und an der durchgehend fließenden Bewegung, weshalb ich die Schleife gewählt habe.
Außerdem kann ich kein Vollgas brauchen, mit der Delay (ich weiß, ist schlecht, blockiert den Loop...) kann ich steuern, wie schnell der Servo sein Ziel erreicht.

Hättest du einen Tipp, wie ich es ohne Schleife lösen könnte? Mit welchem Kommando?

Ist es eigentlich normal, dass Servos in "Wartestellung" immer etwas zucken und surren oder habe ich auch hier Verbesserungspotential?

Ich denke die Schleifen sind wirklich ein Problem. Aller Anfang ist schwer...

Vor allem solltest Du die Funkstrecke erst mal weg lassen und sehen, wie Du mit Tastern oder Eingabe im seriellen Monitor am Arduino das Verhalten lösen kannst. Da fällt erst mal eine mögliche Fehlerquelle raus.

Gruß Tommy

Deltaflyer:
Du kannst es glauben oder auch nicht , Servos vom 5V Ausgang eines Arduinos, egal welchen, geht unter Last keinesfalls gut.
Das ist eine Tatsache, bei der alles drumrum diskutieren nix bringt. Wenn der Sevo arbeiten muss, braucht er mehr Strom. Der Spannungsregler auf den Arduinos kann den aber nicht liefern, also geht die Spannung in die Knie. Ist die Spannung zu tief, schaltet der Arduino ab oder startet neu.
Kann sein, dass auf dem Uno der spannungsregler ein bisschen mehr strom liefern kan, als jener auf dem Nano, aber Beide sind zu schwach, um Servos wirklich zu versorgen. Ein test, bei dem die Servos unbelastet sind mag mal kurz funtionieren, aber für die Praxis ist das nicht zu gebrauchen. Uach sind 9V Batterien für Servos nicht grad die idealen Stromliferanten.

LG Stefan

uwefed:
Der Spannungsstabilisator des NANO Nachbaus liefert nicht genügend Strom für einen Servo.
Du mußt den / die Servo/s getrennt mit Spannung versorgen (rechne mit bis zu 1A pro Servo) und die Massen verbinden.

Grüße Uwe

@Uwe und Stefan:
Dankeschön für Eure Antworten! Ja, den Strom einzuschätzen ist etwas schwierig und mir sind wirklich Unterschiede aufgefallen zum UNO. Dieser läuft aber aktuell auch noch ohne Last :-/
Wirklich interessant, wie viel Saft die Servos brauchen, das hab ich wohl unterschätzt... Ist ja mein erstes Servo-Projekt.

Stefan, du sagst 9V Blöcke sind nicht geeignet? Was würdest du empfehlen? Ich finde die Teile am praktischsten, das ganze wird ja ein Kostüm und da sollte man Stromquellen gut tragbar unterbringen und schön verstecken können, daher meine Wahl.
Eine Autobatterie möchte ich nicht grade rumschleppen...
Wenn ich für separate Spannungsversorgung der Servos sorge (habe ich schon mal bei EL Kabeln gemacht, dieses Projekt funktioniert super), kann ich dann den Nano zum Steuern verwenden?

Ein UNO passt bei den Hörnern unmöglich in die Maske, Batterien krieg ich unter.

Denke mal über Powerbanken nach, die sind flach und können je nach Typ einige A liefern.

Gruß Tommy

Tommy56:
Vor allem solltest Du die Funkstrecke erst mal weg lassen und sehen, wie Du mit Tastern oder Eingabe im seriellen Monitor am Arduino das Verhalten lösen kannst. Da fällt erst mal eine mögliche Fehlerquelle raus.

Gruß Tommy

Das habe ich am Anfang probiert. Ich weiß leider nicht mehr ob mit Last oder ohne. Leider sind einige Teile bereits fest vebaut und erlauben keinen Rückbau auf Taster. Eventuell baue ich nochmal einen Testschaltkreis auf, erstmal mit Taster später mit Funk (ich hab mehrere von diesen Sendern / Empfängern und auch schon durchprobiert)
Was ich aber mittlerweile durch die hilfreichen Antworten hier im Forum schon sagen kann:
Ich glaube es ist eine Kombi aus der Schleife (die muss irgendwie raus, ich weiß nur noch nicht wie am besten) und zu wenig Saft.

Tommy56:
Denke mal über Powerbanken nach, die sind flach und können je nach Typ einige A liefern.

Gruß Tommy

Das war auch mein erster Plan, ich hab hier eine 10000 mAh, die hätte einen schön eingeplanten Platz in der Maske, aber ich glaube, die 5 V sind zu wenig. Bzw. die schaltet Ports ab, wenn zu viel Strom gezogen wird, oder zumindest sieht es so aus. Es hat auch nur manchmal funktioniert.

Hi

Ein 9V-Block hat relativ wenig Kapazität (Ampere-Stunden) und recht hohen Innenwiderstand (IM 9V-Block bleibt bereits viel Energie hängen).
Von diesen 9V schmeißt Du dann noch 4V weg (zumindest per Linear-Regler) - also fast die Hälfte!
Da überlege ich mir doch, ob ich nicht lieber eine andere Batterie mitschleppe, Die ich aber 'ganz' benutzen kann.

Mein Vorschlag wäre ebenfalls Power-Bank (wenn Diese teilweise abschaltet, weil der Arduino zu wenig Strom nimmt, lasse eine LED blitzen).
Mit den 5V kann der Arduino direkt, wenn andere Spannungen benötigt werden, gibt's Schaltwandler, Die Diese recht effizient erzeugen können.

Auch gab Es einen Spannungswandler (Boost), Der direkt von einer Lithium-Zelle betrieben werden konnte und bei 2V (glaub) abschaltet, Was der Zelle ganz gut tut.
Also 2...3,7V ->5V.
... müsste nur Recherchieren, wie das Steinchen hieß ...

MfG

Die schaltet ab, wenn zu wenig gezogen wird wenn sie bei zu viel abschaltet, ist sie zu schwach für die Anwendung. Ich habe hier eine, die gibt 2,5A an dem einen Ausgang und 1,5a am anderen raus.

Dann ersetze die Funkstrecke durch Eingaben im seriellen Monitor (z.B. 'a' als Taster-Ersatz) und werte Funk im Sketch erstmal nicht aus.

Zu den Servos wurden Dir ja chon die MoBa-Tools genannt. Die haben Beispiele und eine gute Doc.

Gruß Tommy

postmaster-ino:
Hi

Ein 9V-Block hat relativ wenig Kapazität (Ampere-Stunden) und recht hohen Innenwiderstand (IM 9V-Block bleibt bereits viel Energie hängen).
Von diesen 9V schmeißt Du dann noch 4V weg (zumindest per Linear-Regler) - also fast die Hälfte!
Da überlege ich mir doch, ob ich nicht lieber eine andere Batterie mitschleppe, Die ich aber 'ganz' benutzen kann.

Mein Vorschlag wäre ebenfalls Power-Bank (wenn Diese teilweise abschaltet, weil der Arduino zu wenig Strom nimmt, lasse eine LED blitzen).
Mit den 5V kann der Arduino direkt, wenn andere Spannungen benötigt werden, gibt's Schaltwandler, Die Diese recht effizient erzeugen können.

Auch gab Es einen Spannungswandler (Boost), Der direkt von einer Lithium-Zelle betrieben werden konnte und bei 2V (glaub) abschaltet, Was der Zelle ganz gut tut.
Also 2...3,7V ->5V.
... müsste nur Recherchieren, wie das Steinchen hieß ...

MfG

Tommy56:
Die schaltet ab, wenn zu wenig gezogen wird wenn sie bei zu viel abschaltet, ist sie zu schwach für die Anwendung. Ich habe hier eine, die gibt 2,5A an dem einen Ausgang und 1,5a am anderen raus.

Dann ersetze die Funkstrecke durch Eingaben im seriellen Monitor (z.B. 'a' als Taster-Ersatz) und werte Funk im Sketch erstmal nicht aus.

Zu den Servos wurden Dir ja chon die MoBa-Tools genannt. Die haben Beispiele und eine gute Doc.

Gruß Tommy

Ahso, die schaltet ab, wenn zu wenig Strom gezogen wird?? Das wusste ich nicht. Das würde jetzt zu meiner Beobachtung passen, dass wenn ich ein LED Lauflicht am Port 1 (kein Quick-Charge Port oder wie man die nennt) einstecke und den Nano mit dem Servo am Port 2 (Quick-Charge), die Status-LEDs der Powerbank dauerhaft leuchten. Wenn ich nur den Nano einstecke, gehen die aus und man hört auch kein "Warte-Gesurre" von den Servos mehr.
Trotzdem bleibt ja mein Problem mit dem "reagiert nur manchmal".
Aber ich denke, ich habe jetzt schon einen Ansatz:
Ich bleibe bei der Powerbank (ist mir eh viel lieber, weil schon so geplant) versuche, die Schleife zu eliminieren (ich lese mich mal in die MoBa Tools ein) und irgendwie müsste ich noch dem Servo eine extra Stromquelle zukommen lassen.
Eine Frage hierzu noch: Sollte ich die Powerbank den Servo direkt als externe Stromquelle versorgen lassen? Bzw. Port 1 per USB an den Nano und Port 2 (per modifiziertem USB Kabel) an den Servo? Oder irgendwie ein Batteriepack (nicht unbedingt ein 9V Block) dazunehmen?

@postmaster-ino: Vor losen Lithium-Zellen habe ich etwas zu viel Respekt ^^ Die Elektronik in der Powerbank erscheint mir da sicherer als meine eigenen Künste...

Du solltest dein Projekt ganz klar trennen und die Bereiche einzeln angehen.
Das musst du mit einem eigenen System machen.

  1. Servosteuerung mittels Taster am Netzteil.
  2. Funksteuerung beider Controller am Netzteil.
  3. Zusammenführen der einzeln funktionierenden Syteme am Netzteil.
  4. Funktionstest mit unterschiedlichen Spannungsquellen.

Nur so kannst du als Anfänger vernünftig zum Ziel kommen und noch dabei lernen.
Alles andere ist gewurschtel und bringt dich nicht wirklich weiter.

Hallo nochmal,

ich freue mich so, ich habe einen Erfolg erzielt! :slight_smile:
Ich habe nun einen neuen Testschaltkreis aufgebaut, erstmal nur mit Taster wie empfohlen, um die Funktion des Servos zu testen. Nebeneffekt: Jetzt habe ich auch endlich die Funktion von Pullup / Pulldown Widerständen richtig verstanden ^^
Der Servo hat nun eine externe Stromversorgung mittels Powerbank und die MoBa-Tools Library ist super! Genau, was ich gebraucht habe.

Anschließend der gleiche Schaltkreis, nur statt Taster mein Funkempfänger. Und ich habe Fehler Nr. 2 gefunden: Es ist doch die Fernbedienung........
Scheinbar haben sich zwei der vier Taster ins Nirvana verabschiedet, ich habe kurz mal einen anderen Taster verwendet, der 9999 sendet - jetzt geht's.
Trotzdem habe ich die Gelegenheit genutzt, und meinen Code verbessert, die Variable directionstate für die Richtung des Servos wird nun nach dessen Bewegung gesetzt.

Wen es interessiert und wer es vielleicht selber brauchen kann, hier der neue Sketch:

#include <MobaTools.h>
#include <RCSwitch.h>

const int servoPin1 = 9;  // Servo pin
RCSwitch mySwitch = RCSwitch();
int directionState = 0;
MoToServo servo1;

void setup() {
  Serial.begin(9600);
  servo1.attach(9);
  servo1.setSpeed(15); //MoBa Geschwindigkeit Servo
  mySwitch.enableReceive(0); // laut Arduino Nano Referenz ist Pin 2 der Interrupt Pin 0 und der Empfänger muss an den Interrupt Pin

  servo1.write(0);
}

void loop() {
  //Serial.println("Start...");

  if (mySwitch.available()) // Wenn ein Code Empfangen wird...
  {
    int value = mySwitch.getReceivedValue();
    Serial.println(value);

    if (value == 9999) {
      if (directionState == 0) {
        Serial.println(value);
        servo1.write(90);
        delay(1000);
        directionState = 1;
      } else if (directionState == 1) {
        Serial.println(value);
        servo1.write(0);
        delay(1000);
        directionState = 0;
      }
    }
    mySwitch.resetAvailable(); // Hier wird der Empfänger "resettet"
  }
}

Mein nächstes Projekt wird wohl die Reparatur bzw. Verbesserung der Fernbedienung sein. Ich denke, da geht noch was, sowohl bauformtechnisch als auch funktionstechnisch! :slight_smile:
Auf jeden Fall habe ich hierbei viel gelernt!

Vielen herzlichen Dank für die kompetente Hilfe hier im Forum!!! :slight_smile:

Drachenkreation:
Der Servo hat nun eine externe Stromversorgung mittels Powerbank

Hast du einfach das USB Kabel aufgetrennt oder gibts da bessere Möglichkeiten? Ich finde bei Powerbanks die Kabel so winzig. Ich nutze derzeit lieber Li-ion 9V Blöcke da gibts schöne Verbinder für.