Hola a todos/as
Tengo un.problema con un proyecto en el que un Arduino UNO controla un servo que mueve un láser
He montado dos servos, uno murió tras varios días de funcionamiento y el otro se atasca aleatoriamente tras funcionar un rato, y solo vuelve a funcionar si fuerzas el movimiento a mano, entonces recupera el movimiento correcto hasta que vuelve se vuelve a queadr atascado .
He alimentado el servo de modo independiente por si pudiera ser ese el problema, pero se sigue atascando tras un rato de funcionamiento.
En concreto el Arduino manda una serie de valores aleatorios y fijos al servo.
He variado el tiempo entre valores aleatorios, por si fuese este el problema, pero tampoco.
El sistema está funcionando durante 8 horas al día, y he usado estos dos modelos de Servos.
Este es el que se atasca
Este el que se ha muerto directamente
Este es el código que uso:
#include <Servo.h>
Servo miServo; // Crea un objeto servo
const int pinServo = 9; // El pin al que está conectado el servo
const int pinRele = 7; // El pin al que está conectado el relé
void setup() {
miServo.attach(pinServo); // Asigna el pin al objeto servo
pinMode(pinRele, OUTPUT); // Configura el pin del relé como salida
randomSeed(analogRead(0)); // Inicializa el generador de números aleatorios
}
void loop() {
// Encender el relé antes de la función de valores aleatorios
digitalWrite(pinRele, HIGH);
// Enviar 400 valores aleatorios al servo
for (int i = 0; i < 400; i++) {
int angulo = random(94.5, 106); // Genera un ángulo aleatorio entre 0 y 180 grados
int delayAleatorio = random(100, 150); // Genera un delay aleatorio entre 50 y 70 ms
miServo.write(angulo); // Mueve el servo al ángulo aleatorio
delay(delayAleatorio); // Espera un tiempo aleatorio
}
// Apagar el relé y esperar 2 segundos
digitalWrite(pinRele, LOW);
delay(6000);
// Encender el relé antes de la función de valores fijos
digitalWrite(pinRele, HIGH);
// Mantenerse en los valores 20, 50 y 100 grados por 3 segundos cada uno
miServo.write(94.5); // Mueve el servo a 20 grados
delay(3000); // Espera 3 segundos
miServo.write(96); // Mueve el servo a 50 grados
delay(3000); // Espera 3 segundos
miServo.write(98); // Mueve el servo a 100 grados
delay(3000); // Espera 3 segundos
miServo.write(100); // Mueve el servo a 100 grados
delay(3000); // Espera 3 segundos
miServo.write(102); // Mueve el servo a 100 grados
delay(3000); // Espera 3 segundos
miServo.write(104); // Mueve el servo a 100 grados
delay(3000); // Espera 3 segundos
// Apagar el relé y esperar 2 segundos
digitalWrite(pinRele, LOW);
delay(6000);
// Encender el relé antes de las rampas
digitalWrite(pinRele, HIGH);
// Hacer una rampa de 0 a 100 grados en 3 segundos
int inicio = 94.5;
int fin = 104;
int duracion = 3000; // Duración total en milisegundos
int pasos = 100; // Número de pasos para la rampa
int intervalo = duracion / pasos; // Intervalo de tiempo entre cada paso
for (int i = 0; i <= pasos; i++) {
int angulo = map(i, 0, pasos, inicio, fin); // Mapea el paso actual al ángulo
miServo.write(angulo); // Mueve el servo al ángulo mapeado
delay(intervalo); // Espera el intervalo calculado
}
// Pausa de 3 segundos después de la primera rampa
delay(3000);
// Hacer una rampa inversa de 100 a 0 grados en 3 segundos
for (int i = 0; i <= pasos; i++) {
int angulo = map(i, 0, pasos, fin, inicio); // Mapea el paso inverso al ángulo
miServo.write(angulo); // Mueve el servo al ángulo mapeado
delay(intervalo); // Espera el intervalo calculado
}
// Apagar el relé y esperar 2 segundos al final
digitalWrite(pinRele, LOW);
delay(6000);
// Puedes detener el programa o hacer que repita
while (false); // Detiene el programa después de la rampa
}
¿Se os ocurre qué puede estar fallando?
¿Quizás sean demasiadas horas al día funcionando?
¿modelo de servo mal elegido?
Cualquier aportación será bienvenida, este proyecto forma parte de una pieza de una exposición y necesito que funcione hasta el 31 de diciembre.
Gracias de antemano por la ayuda.
Juan