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 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 ¤tPosition, 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;
}
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.
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.
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.