Störsignale Arduino

Hallo,

da ich zwei Servos mit einem Arduino steuern will, dies aber mit einer Fernbedienung machen will habe ich mir eine Fernbedienung und Empfänger gekauft. Wenn ich die Tasten der Fernbedienung testen will, kommt immer der entschlüsselte Code raus den ich brauche. Aber wenn ich die Servos mit der Fernbedienung steuern will kommt nur noch selten der richtige entschlüsselte Code raus. Habe den Empfänger schon bei 3,3V und bei 5V angesteckt, Ergebnis aber das gleiche. Woran kann das liegen, dass ich da falsche Entschlüsselte Codes habe, sobald die Servos angesteckt sind?

Sorry, aber mit dem Raten ist es bei mir sehr schlecht.
Du solltest schon mehr Infos liefern.
Welcher Controller, welche Fernbedienung, welcher Empfänger. Bitte für alles Links zum Händler posten. Und auch wichtig, welchen Sketch verwendest du ?
Inkl. Angaben der verwendeten Libraries.
Und mit welcher Spannung und wo angeschlossen betreibst du die Servos ?

Die verwendete Fernbedienung+Empfänger https://amzn.eu/d/7dSJgKE.
Der Controller ist halt ein Noname Controller aus China, aber ähnlich mit dem Nano Every https://amzn.eu/d/6T0HnpB.

Die Servos sind an Pin 9,10 angeschlossen und werden mit dem 5V Pin versorgt.
Den gesamten Controller betreibe ich mit einer 7,4 Volt Batterie, die ich an die Pins VIN und GND angeschlossen habe.
Den Empfänger habe ich an Pin 5 angeschlossen.

Das ist der Sketch.

tippe oder füge den Code hier ein
 #include <IRremote.h>
#include <Servo.h>

const int RECV_PIN = 5; // Pin für den IR-Empfänger
Servo servo1; // Servo 1-Objekt erstellen
Servo servo2; // Servo 2-Objekt erstellen
int servoPin1 = 9; // Pin für Servo 1
int servoPin2 = 10; // Pin für Servo 2

IRrecv irrecv(RECV_PIN);
decode_results results;

unsigned long lastMovedTime = 0;
bool isServoMoved = false;
int startPosition1 = 180; // Startposition für Servo 1
int startPosition2 = 0; // Startposition für Servo 2
int currentPos1 = startPosition1;
int currentPos2 = startPosition2;
int targetPosition1 = startPosition1; // Zielposition für Servo 1
int targetPosition2 = startPosition2; // Zielposition für Servo 2

// Geschwindigkeitseinstellungen (je größer der Wert, desto langsamer die Bewegung)
int speedServo1 = 1; // Geschwindigkeit für Servo 1 (Millisekunden pro Schritt)
int speedServo2 = 1; // Geschwindigkeit für Servo 2 (Millisekunden pro Schritt)

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Startet den IR-Empfänger
  servo1.attach(servoPin1); // Bindet Servo 1 an den Steuerungspin
  servo2.attach(servoPin2); // Bindet Servo 2 an den Steuerungspin
  servo1.write(startPosition1); // Setzt Servo 1 in die Startposition
  servo2.write(startPosition2); // Setzt Servo 2 in die Startposition
}

void loop() {
  if (irrecv.decode(&results)) {
    unsigned long value = results.value;
    Serial.println(value, HEX); // Gibt den empfangenen IR-Wert im Serial-Monitor aus

    if (value == 0xE81722DD || value == 0xFFA25D ){ // Ersetze 0xFFA25D und 0xFF629D mit den Codes deiner Fernbedienungstasten
      targetPosition1 = 0; // Setzt die Zielposition für Servo 1
      targetPosition2 = 178;   // Setzt die Zielposition für Servo 2
      lastMovedTime = millis();
      isServoMoved = true;
    }

    irrecv.resume(); // Bereitet den IR-Empfänger auf das nächste Signal vor
  }

  if (isServoMoved) {
    bool reachedTarget1 = moveServoToPosition(servo1, currentPos1, targetPosition1, speedServo1);
    bool reachedTarget2 = moveServoToPosition(servo2, currentPos2, targetPosition2, speedServo2);

    // Überprüfen, ob die Zielpositionen erreicht wurden
    if (reachedTarget1 && reachedTarget2) {
      if (millis() - lastMovedTime >= 2000) { // Überprüfen, ob 3 Sekunden vergangen sind
        targetPosition1 = startPosition1; // Setzt die Zielposition auf die Startposition zurück
        targetPosition2 = startPosition2; // Setzt die Zielposition auf die Startposition zurück
        lastMovedTime = millis(); // Setze die Zeit, um das Rückkehren zu verfolgen
      }
    }
  } else {
    moveServoToPosition(servo1, currentPos1, startPosition1, speedServo1);
    moveServoToPosition(servo2, currentPos2, startPosition2, speedServo2);
  }
}

// Funktion, um den Servo in Schritten zur Zielposition zu bewegen
bool moveServoToPosition(Servo &servo, int &currentPosition, int targetPosition, int speed) {
  bool reachedTarget = false;
  if (currentPosition < targetPosition) {
    currentPosition++;
    servo.write(currentPosition);
    delayMicroseconds(speed * 1130); // Konvertiere Millisekunden zu Mikrosekunden
  } else if (currentPosition > targetPosition) {
    currentPosition--;
    servo.write(currentPosition);
    delayMicroseconds(speed * 1130); // Konvertiere Millisekunden zu Mikrosekunden
  }
  if (currentPosition == targetPosition) {
    reachedTarget = true;
  }
  return reachedTarget;
}

Deine 5 Volt brechen zusammen.
Der Strom reicht für die Servos nicht.
Die solltest du extern versorgen.

im Link am Bild sieht man einen Atmega328PB
Der Nano Every ist GANZ WAS ANDERES
Herkömmliche Nanos "aus China" haben im Idealfall einen ATmega328P

Jetzt ist halt die Frage was du wirklich hast und nicht nur so ähnlich ausschaut wie im Link.

Die Servos funktionieren ja im Moment einwandfrei, auch mit den 5Volt. Aber der Empfänger hat halt manchmal Probleme, auch wenn der am 3,3Volt Pik angeschlossen ist.

Dann miss mal die Spannung für die Servos. Am besten mit einem Oszilloskop.
Der Strom reicht da sicher nicht aus.

Aber die Spannung reicht ja aus, ansonsten würden die Servos ja nicht funktionieren oder nicht?

Hast du die Spannung gemessen ?
Die Servos drehen sich auch noch mit 3 Volt, aber dein Controller nicht.

Hab ein Kabel, welches einen kaputten Stecker hatte und andauernd rausgegangen war ausgetauscht und jetzt funktioniert alles perfekt.

Das glaubst du doch selbst nicht.
Und das passiert nur, wenn die Servos dran sind.
Dann meinen Glückwunsch....ehrlich.
Ach und du kannst deine Lösung als gelöst abhaken.

Jetzt funktioniert es mehr kann ich nicht sagen. Sind aber auch sehr kleine Servos von einem RC Hubschrauber.

Dann brauchst du auch die Spannung nicht messen. Echt.....

Sorry, dass ichs durch Zufall auf eigenem Weg gelöst habe.

Alles gut.
Für ein vermeintlich defektes Kabel musst du dich nicht entschuldigen.
Das kann immer mal vorkommen.
Selbst ich habe das schon genossen. :wink:

Hat sich nur so vorwurfsvoll angehört.:man_shrugging:

Der Spannungsstabilisator auf dem Arduino NANO kann 150mA geben.
Ein Servo zieht bis zu 1A.
Da passiert es häufig, daß die 5V Versorgungsspannung zusammenbricht und der NANO resetiert.

Grüße Uwe