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 = "";
}
}