Velocidad de los servos

Estoy trabajando en un proyecto con un servo y un receptor infrarrojo. Hasta ahí todo bien.

El caso es que el servo gira demasiado rápido y me preguntaba si alguien del foro sabe como bajar la velocidad de este. seguramente sea más fácil de lo que creo pero no caigo en ninguna solución.

Este es el código:

#include <Servo.h>
#include <IRremote.h>

Servo servomotor;

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);

decode_results results;

int posicion;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();
servomotor.attach(3);
posicion=90;
}

void loop()
{
if (irrecv.decode(&results))
{
switch(results.value)

{
case 0xFF629D:

posicion=90;
Serial.print(“Posicion angular = “);
Serial.print(posicion);
Serial.println(””);
break;

case 0xFFA25D:
posicion=0;
Serial.print(“Posicion angular = “);
Serial.print(posicion);
Serial.println(””);
break;

case 0xFFE21D:
posicion=180;
Serial.print(“Posicion angular = “);
Serial.print(posicion);
Serial.println(””);
break;

case 0xFF02FD:
posicion=posicion+5;
if(posicion>180){posicion=180;}

Serial.print(“Posicion angular = “);
Serial.print(posicion);
Serial.println(””);
break;

case 0xFF22DD:
posicion=posicion-5;
if(posicion<0){posicion=0;}

Serial.print(“Posicion angular = “);
Serial.print(posicion);
Serial.println(””);
break;

}
servomotor.write(posicion);

irrecv.resume();

}

}

Tienes que cambiar la posicion del servo lentamente, paso por paso. Si la posicion del servo es 0 y quieres que sea 180:

servomotor.write(18);
delay(20);
servomotor.write(36);
delay(20);
servomotor.write(54);
delay(20);
...

De esta manera tardara 0.2 segundos. Solo tienes que cambiar la durada de la funcion "delay" para que se mueva mas lento, y si quieres que el movimiento sea mas suave, tienes que llamar la funcion de servomotor.write mas veces. Por ejemplo:

servomotor.write(9);
delay(10);
servomotor.write(18);
delay(10);

Es casi como controlar la velocidad de un motor paso a paso.

Espero que te haya sido util.