Recently, I have been working on a project involving 8 Tower Pro SG90 servos and an Arduino Uno. The issue I am running into is that the servos will randomly move when connected, without even receiving a signal from the Arduino.
Specifically, sometimes the servos will work perfectly and the input moves the servos fine, but then all of a sudden the servos will start twitching and moving erratically back and forth. Then I disconnect the power and plug it back in and I will sometimes work again or sometimes not.
I don't think power is the problem because I am powering the servos externally with a 5.5 V power supply which can provide 2.5 A. I also made sure to have a common ground between the Arduino and the power supply. Additionally, I don't think this is an issue of a broken servo because I have this problem with all eight. In my code, I have input pins to control the servos which are just buttons. These buttons also have pull-down resistors, so I don't think the input is the problem either. I am using the Arduino servo library.
The only other thing I can think of is external frequency interference because some of the circuitry and wiring are close together, but none of the wires are very long and I even tried putting a ferrite bead on the servo cables but to no avail.
If anyone has any ideas about a solution to my problem which I have not tried yet that would be amazing!
#include <Servo.h>
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;
Servo servo7;
Servo servo8;
void setup(){
pinMode(5, INPUT);
pinMode(4, INPUT);
pinMode(3, INPUT);
pinMode(2, INPUT);
pinMode(1, INPUT);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
servo1.attach(13);
servo2.attach(12);
servo3.attach(11);
servo4.attach(10);
servo5.attach(9);
servo6.attach(8);
servo7.attach(7);
servo8.attach(6);
}
void loop(){
if (digitalRead(5) == LOW) {
servo1.write(120);
delay(20);
} else {
servo1.write(50);
delay(20);
}
if (digitalRead(4) == LOW) {
servo2.write(110);
delay(20);
} else {
servo2.write(200);
delay(20);
}
if (digitalRead(3) == LOW) {
servo3.write(120);
delay(20);
} else {
servo3.write(50);
delay(20);
}
if (digitalRead(2) == LOW) {
servo4.write(110);
delay(20);
} else {
servo4.write(200);
delay(20);
}
if (digitalRead(1) == LOW) {
servo5.write(120);
delay(20);
} else {
servo5.write(50);
delay(20);
}
if (digitalRead(A3) == LOW) {
servo6.write(110);
delay(20);
} else {
servo6.write(200);
delay(20);
}
if (digitalRead(A2) == LOW) {
servo7.write(120);
delay(20);
} else {
servo7.write(50);
delay(20);
}
if (digitalRead(A1) == LOW) {
servo8.write(110);
delay(20);
} else {
servo8.write(200);
delay(20);
}
}
delay, but I don't think that should matter. Cross-talk isn't hugely likely. I think wrapping up each button/servo combo would be a good way to get started.