Conexión BASICA con servo en Arduino UNO no funciona como debiera

Mi problema es básico porque me impide utilizar los servos. Al conectar un servo a alimentación y al pin D9 PWM y subiendo un código que le introduzco el ángulo al que debe posicionarse, el resultado es que el motor gira de modo continuo de la forma siguiente:

  • 90 grados: no se mueve

  • 0 grados: gira a toda la velocidad posible en sentido horario

  • 180 grados: gira a toda la velocidad posible en sentido antihorario

  • En valores intermedios varia la velocidad en el sentido horario si 0 < ángulo <90, y cuanto mas bajo es el ángulo mas rápido gira, no puedo saber la velocidad relativa a la máxima, pero parece que sea proporcional, es decir que ángulo= 45 parece que sea la mitad de la velocidad que cuando doy valor ángulo=0. Pasaría lo mismo en valores 90..180 pero en sentido antihorario.

Es decir, que es como si controlase la velocidad y sentido de giro del servo (gira de forma continua), cuando le paso el valor de ángulo.

  • Hace lo mismo con alimentación externa y con alimentación de arduino.

  • He probado con los pines PWM D8 D9 y D10, falla exactamente igual

  • He probado con varios servos (2xSG90,1xMG90S) y todos tienen el mismo comportamiento. He probado con ejemplos de la biblioteca y con código generado y mismo resultado

  • He desinstalado y vuelto a instalar la librería Servo.h de Michael Margolis v1.2.2, y también he probado a instalar una versión anterior (v1.1.0), y falla igualmente en ambos casos

Adjunto el último código usado para hacer pruebas:

#include <Servo.h>

Servo miServo;  // Crea un objeto servo para controlar el servo
int angulo = 0; // Variable para almacenar el valor del ángulo recibido
String entradaSerial; // Variable para almacenar la cadena de caracteres de la entrada serial

void setup() {
  Serial.begin(9600); // Inicializa la comunicación serial a 9600 baudios
  miServo.attach(9);  // Asocia el objeto servo al pin digital 9
  Serial.println("Introduce un angulo (0-180) por el monitor serial:");
}

void loop() {
  // Comprueba si hay datos disponibles en el puerto serial
  if (Serial.available() > 0) {
    // Lee la entrada serial hasta encontrar un salto de línea ('\n')
    entradaSerial = Serial.readStringUntil('\n');
    
    // Convierte la cadena de caracteres leída a un número entero
    angulo = entradaSerial.toInt();

    // Valida que el ángulo esté dentro del rango permitido (0 a 180 grados)
    if (angulo >= 0 && angulo <= 180) {
      miServo.write(angulo); // Mueve el servo a la posición deseada
      Serial.print("Servo movido a: ");
      Serial.println(angulo);
    } else {
      Serial.println("Angulo fuera de rango. Introduce un valor entre 0 y 180.");
    }
    
    // Limpia la cadena de entrada para la próxima lectura
    entradaSerial = "";
  }
}

No serán de rotación continua? Por que el comportamiento que describes es ese.

Muchisimas gracias victorjam, no había caído en ello, son de 360, y por lo que leo:

“A diferencia de los servos convencionales, para controlar la velocidad y dirección se usa la función write() con valores que no representan grados: valores más bajos que 90 hacen girar en sentido horario, valores más altos hacen girar en sentido antihorario y 90 lo detiene” lo cual concuerda exactamente con lo que me pasa.