Hallo,
ich habe an einem Arduino Mega 4 Servos vom Typ AZDelivery MG996R hängen, wobei die 5 V am + Pol von einem separatem Netzteil kommen und nur der Steuer-IO vom Arduino kommt. GND ist vom Arduino und 5V Netzteil zusammengeschaltet.
Mein Problem ist aktuell, dass die Servos relatif oft im Leerlauf "mahlende" Geräusche machen und das obwohl sie laut Code ja eigentlich gar nichts machen sollten, außer auf den nächsten Steuerbefehl zu warten. Die Steuerung funktioniert soweit auch, aber mich stören diese Geräusche, da ich vermute, dass die auf Dauer auch nicht gut für die Servos sind.
Ich habe mal 3 Videos hier hochgeladen:
Das dritte Video mit dem Zucken ab 0:14 kommt, wenn ich am Steuerpin des Arduino für den Servo das Kabel bewege.
Hat jemand einen Tipp woran das liegen könnte ich wie ich das abstellen kann?
Hier auch noch mein Code:
#include <Servo.h>
#include <RCSwitch.h>
RCSwitch receiver = RCSwitch();
RCSwitch sender = RCSwitch();
// ===== Servo =====
// create servo object to control a servo
Servo servoA;
Servo servoB;
Servo servoC;
Servo servoD;
Servo servoF;
// variable to store the servo position
int start_position = 0;
int end_position = 180;
int posA = start_position;
int posB = start_position;
int posC = start_position;
int posD = start_position;
int posF = start_position;
// =====================================================
// Servo öffnen
// =====================================================
void openServo(Servo &servoOpen, int &posOpen)
{
while (posOpen < end_position)
{
posOpen++;
servoOpen.write(posOpen);
Serial.print("Servo öffnet:");
Serial.println(posOpen);
//delay(100);
}
}
// =====================================================
// Servo schließen
// =====================================================
void closeServo(Servo &servo, int &posClose)
{
while (posClose > start_position)
{
posClose--;
servo.write(posClose);
Serial.print("Servo schließt:");
Serial.println(posClose);
//delay(100);
}
}
// =====================================================
// Setup
// =====================================================
void setup()
{
Serial.begin(9600);
servoA.attach(4);
servoB.attach(6);
servoC.attach(11);
servoD.attach(12);
servoF.attach(13);
servoA.write(start_position);
servoB.write(start_position);
servoC.write(start_position);
servoD.write(start_position);
servoF.write(start_position);
//Funk Empfänger initialisieren
receiver.enableReceive(0); // Receiver on interrupt 0 => that is pin #2
receiver.setProtocol(2);
receiver.setPulseLength(690);
//Funk Transmitter initialisieren
sender.enableTransmit(10); // An Pin 10
sender.setProtocol(1);
sender.setPulseLength(416);
sender.setRepeatTransmit(15);
//integrierte LED auf Arduino initialisieren
pinMode(LED_BUILTIN, OUTPUT);
}
// =====================================================
// Loop
// =====================================================
void loop()
{
unsigned long value = receiver.getReceivedValue();
if (receiver.available()) {
if (value == 2288270336){ //Button A ON
Serial.println("A_AN");
//kleine Pause, damit längeres Drücken nicht als mehrere Betätigungen interpretiert werden
delay(200);
//Funkdose aktivieren und integrierte LED anschalten
digitalWrite(LED_BUILTIN, HIGH);
sender.send("100100001001010010011001");
Serial.println("Signal EIN gesendet");
//Servo öffnen
openServo(servoA, posA);
//Alle anderen Servos schließen (falls überhaupt offen)
closeServo(servoB, posB);
closeServo(servoC, posC);
closeServo(servoD, posD);
}
if (value == 2221161472){ //Button A OFF
Serial.println("A_AUS");
//kleine Pause, damit längeres Drücken nicht als mehrere Betätigungen interpretiert werden
delay(200);
digitalWrite(LED_BUILTIN, LOW);
//Funkdose aktivieren und integrierte LED ausschalten
sender.send("100100001001010010010001");
Serial.println("Signal AUS gesendet");
}
if (value == 2281776640){ //Button B ON
Serial.println("B_AN");
//kleine Pause, damit längeres Drücken nicht als mehrere Betätigungen interpretiert werden
delay(200);
//Funkdose aktivieren und integrierte LED anschalten
digitalWrite(LED_BUILTIN, HIGH);
sender.send("100100001001010010011001");
Serial.println("Signal EIN gesendet");
//Servo öffnen
openServo(servoB, posB);
//Alle anderen Servos schließen (falls überhaupt offen)
closeServo(servoA, posA);
closeServo(servoC, posC);
closeServo(servoD, posD);
}
if (value == 2214667776){ //Button B OFF
Serial.println("B_AUS");
//kleine Pause, damit längeres Drücken nicht als mehrere Betätigungen interpretiert werden
delay(200);
digitalWrite(LED_BUILTIN, LOW);
//Funkdose aktivieren und integrierte LED ausschalten
sender.send("100100001001010010010001");
Serial.println("Signal AUS gesendet");
}
if (value == 2287266816){ //Button C ON
Serial.println("C_AN");
//kleine Pause, damit längeres Drücken nicht als mehrere Betätigungen interpretiert werden
delay(200);
//Funkdose aktivieren und integrierte LED anschalten
digitalWrite(LED_BUILTIN, HIGH);
sender.send("100100001001010010011001");
Serial.println("Signal EIN gesendet");
//Servo öffnen
openServo(servoC, posC);
//Alle anderen Servos schließen (falls überhaupt offen)
closeServo(servoA, posA);
closeServo(servoB, posB);
closeServo(servoD, posD);
}
if (value == 2220157952){ //Button C OFF
Serial.println("C_AUS");
//kleine Pause, damit längeres Drücken nicht als mehrere Betätigungen interpretiert werden
delay(200);
digitalWrite(LED_BUILTIN, LOW);
//Funkdose aktivieren und integrierte LED ausschalten
sender.send("100100001001010010010001");
Serial.println("Signal AUS gesendet");
}
if (value == 2284645376){ //Button D ON
Serial.println("D_AN");
//kleine Pause, damit längeres Drücken nicht als mehrere Betätigungen interpretiert werden
delay(200);
//Funkdose aktivieren und integrierte LED anschalten
digitalWrite(LED_BUILTIN, HIGH);
sender.send("100100001001010010011001");
Serial.println("Signal EIN gesendet");
//Servo öffnen
openServo(servoD, posD);
//Alle anderen Servos schließen (falls überhaupt offen)
closeServo(servoA, posA);
closeServo(servoB, posB);
closeServo(servoC, posC);
}
if (value == 2217536512){ //Button D OFF
Serial.println("D_AUS");
//kleine Pause, damit längeres Drücken nicht als mehrere Betätigungen interpretiert werden
delay(200);
digitalWrite(LED_BUILTIN, LOW);
//Funkdose aktivieren und integrierte LED ausschalten
sender.send("100100001001010010010001");
Serial.println("Signal AUS gesendet");
}
receiver.resetAvailable();
}
}