Problema con servos SG90

Hola a todos, escribo para ver si alguien puede echarme una mano con un proyecto que tengo entre manos. Buscando por internet he ido juntando cosillas para preparar un código que me permita girar dos servos SG90 180 grados (uno lo hace en una dirección y otro en la otra) y que al hacerlo enciendan unos leds. Mi problema empieza cuando se ponen en funcionamiento los servos, la posición inicial de uno es inversa al otro y cuando ese servo se coloca en esa posición empieza a vibrar como si estuviese en marcha pero sin moverse. Al pulsar el botón cambia de posición y deja de vibrar, pero el otro comienza a hacerlo mientras que mantiene la posición. He probado varios códigos pero con todos me pasa lo mismo. He leído a gente que le ha pasado cosas parecidas pero no se si era lo mismo exactamente y ya no se hacia donde tirar para solucionarlo.

El código que uso es este

#include <Servo.h> 

Servo myservo; // create servo object to control a servo 
Servo myservo1;

const int buttonPin = 2; // the pin that the pushbutton is attached to
const int ledPin = 5; // the pin that the LED is attached to

int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button
int ledState = 0; // remember current led state
int pos = 0; // variable to store the servo positions
int pos1 = 180;

void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
myservo1.attach(10); // attaches the servo 1 on pin 10 to the servo object
pinMode(buttonPin, INPUT); // initialize the button pin as a input
pinMode(ledPin, OUTPUT); // initialize the button pin as a output
}

void loop() 
{
buttonState = digitalRead(buttonPin); // read the pushbutton input pin
if (buttonState != lastButtonState) // compare buttonState to previous state
{
if (buttonState == 1)
{
if(ledState == 1)
{
delay(30); ledState = 0;
for(pos = 0; pos <= 180; pos += 20) // goes from 0 degrees to 180 degrees 
{ // in steps of 10 degrees 
myservo.write(pos); // tell servo to go to position 'pos'
}
for(pos1 = 180; pos1 >= 0; pos1 -= 30) // goes from 180 degrees to 0 degrees 
{ // in steps of 10 degrees 
myservo1.write(pos1); // tell servo to go to position 'pos1'
}
delay(15); // waits 15ms for the servo to reach the position 
} 
else 
{ 
delay(30); ledState = 1;
for(pos = 180; pos >= 0; pos -= 20) // goes from 180 degrees to 0 degrees 
{ 
myservo.write(pos); // tell servo to go to position 'pos' 
}
for(pos1 = 0; pos1 <= 180; pos1 += 30) // goes from 0 degrees to 180 degrees 
{ 
myservo1.write(pos1); // tell servo to go to position 'pos1' 
}
delay(1000);
}
}

lastButtonState = buttonState; // remember the current state of the button
}
// turns LED on if the ledState =1 or off if ledState = 0
digitalWrite(ledPin, ledState);
myservo.write(pos); // goes from 0 degrees to 180 degrees 
myservo1.write(pos1); // goes from 180 degrees to 0 degrees 

delay(20);
}

A veces en las posiciones extremas el servo toca con el tope mecanico provocando temblores,prueba a ir acortando las posiciones extremas ,por ejemplo 179 en vez de 180 o 1 en vez de 0 ,segun donde vibre,y ves probando.Si sigue vibrando,reduce otra unidad,hasta que des con un punto en que no vibre.

Gracias por tu contestación. He probado a poner menos grados y sigue haciendo lo mismo, incluso he probado a quitar los delays y a poner los valores fijos en el movimiento pero nada. Estoy pensando en que no se si es problema de que el servo entra en bucle constante para comprobar el estado en el que se encuentra pero he probado también a modificar los for y no he conseguido un resultado optimo. ¿A alguien se le ocurre alguna otra posibilidad?

Tambien puede ser que en algun momento le pases un valor excesivo o negativo a la posicion del servo de la manera que tienes el bucle for ,y aqui no se como se comportaria:

for(pos = 0; pos <= 180; pos += 20) // goes from 0 degrees to 180 degrees

Cuando pos vale 180 se cumple que pos <= 180 y le sumas 20 ,por lo que la posicion es 200…idem con :

for(pos1 = 180; pos1 >= 0; pos1 -= 30) // goes from 180 degrees to 0 degrees

Llegas a 0 y se cumple pos >= 0 ,se restan 30,la posicion es -30.

Gracias a todos por los comentarios, finalmente y tras muchas probatinas y mezclas de códigos he conseguido que funcione correctamente. Probé a hacer los pasos de grado en grado y a modificar los ángulos en todas las variantes que se me ocurrieron. También probé con varios códigos que encontré de otros usuarios pero seguía haciéndome lo mismo. Finalmente lo he conseguido estableciendo el valor según el estado de pulsación y asignando los rangos de grados fijos de 10 y 180 para que no haga tope el de 10, que era el que me daba problemas. También he eliminado un servo porque creo que con uno me servirá para hacer la función. Os dejo el código por si a alguien le sirve

#include <Servo.h> 

Servo myservo; // create servo object to control a servo 

const int buttonPin = 2; 
const int ledPin = 4; 

int buttonState = 0; 
int lastButtonState = 0; 
int ledState = 0; 
int pos = 10; 

void setup()
{
myservo.attach(9); 

pinMode(buttonPin, INPUT); 
pinMode(ledPin, OUTPUT); 
}

void loop() 
{
buttonState = digitalRead(buttonPin); 
if (buttonState != lastButtonState) 
{
if (buttonState == 1)

{
if(ledState == 1)
{
delay(30); ledState = 0;
pos = 180;  

{ 
myservo.write(pos);
}

delay(15);
} 
else 

{ 
delay(30); ledState = 1;
pos = 10; 

{ 
myservo.write(pos);
}
delay(1000);
}
}

lastButtonState = buttonState; 
}

digitalWrite(ledPin, ledState);
myservo.write(pos);  

delay(20);
}