Servo se atasca

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

No se quien tendrá experiencia con un servo trabajando como el tuyo tantas horas, lo que yo he usado es de tanto en tanto.
Te recomiendo que busques servos de calidad, pero no se donde ni cual recomendarte.

La otra alternativa obvia es tener reemplazo de cada uno y bueno, si se rompe, lo cambias.

Solo se me ocurre esto: estas seguro que el código trabaja bien, no los hace trabajar de mas?

Un “rato”’como de 1m20s?

Se atora en ratos de muy distinta duración?

Recuerda que una variable tipo int no acepta decimales
Lo mismo aplica aquí:

angulo es un entero que se incrementará de uno en uno a partir de 94. Además, servo.write() solo admite números enteros

1 Like

Hi,
Seria bueno que incluyeras que voltaje estas alimentando el servo y si has considerado si el servo puede con la carga Otra cosa no haz considerado usar un motor de pasos.

No se como se me pasó el código.

Muy buenas las observaciones y sugerencias. de @mancera1979 y de @tauro0221
Creo que la idea de @tauro0221 es el camino que debes seguir.
Te dará robustez y confiabilidad a largo plazo, sin hablar que hay motores de los torques que te imagines.

lo alimento a 5V 2A, yb la carga que soporta es mínima, un láser que no debe llegar ni a 30g
Grciuas :slight_smile:

gracias a todos por vuestras respuestas, ayudan mucho @tauro0221 , @mancera1979 y demás (sólo me deja citar dos)

La verdad es que usé Servos porque es lo que sé usar y lo que tengo a mano, pero igual es cierto que debo meterme a motores paso a paso.

En cuanto a lo de los números enteros, no tenía ni idea, mi conocimiento de código es limitado.

Si quisiese utilizar fracciones de grado (me vendría bien) cual sería la manera ideal?

Hoy he montado un servo Power HD 6001HB que me han dicho que es muy resistente.

A ver si funciona.

Grcacias de nuevo.!!!

por cierto, @mancera1979, el bucle es de minuto y veinte, como dices, pero está corriendo durante cuatro horas en una exposición.
El servo se para atascado repentinamente en cualquier momento, no he acabado de encontrarle una lógica.
Por otra parte es complicado estar delante justo en el momento que se para, y saber qué parte del código estaba ejecutando, porque pude estar tres horas funcionando bien y pararse, o conectarlo y que se atasque en diez minutos.
Sospecho del servo, pero os mantendré informados.

Gracias de nuevo

Este es tu código simulado

Qué sentido tiene esto que haces 400 veces entre 94 y 106, realmente esta bien?

En el código modifiqué esos temas de usar 94.5 que no tiene sentido, de todo modos la variable tomará 94.

Un sistema con motores puede experimentar problemas eléctricos que a su vez causen comportamiento errático del Arduino

Comparte un diagrama de conexiones de tu sistema que incluya las fuentes de alimentación

hola @Surbyte esos 400 valores aleatorios tienen sentido, porque el láser dibuja formas sobre un panel giratorio donde quedan grabadas.

va el esquema de conexiones que tengo montado

Saca esa línea que no tiene sentido.

Estos dos fragmentos de código exigen mucho a cualquier servo

  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
    accionoMuestro(angulo, intervalo);
  }

  // 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 = pasos; i >= 0; 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
    Serial.print  ("   i: " + String(i));
    accionoMuestro(angulo, intervalo);
  }

El intervalo es de 30 mseg. Intenta subirlo para proteger al servo.

int duracion  = 3000; // Duración total en milisegundos
  int pasos     = 100;     // Número de pasos para la rampa
  int intervalo = duracion / pasos;  // esto da 3000/100= 30 mseg
1 Like

O sea, que no tendríamos impresoras entonces, solo por citarte un ejemplo que usa motores paso a paso sin descanso.
Los motores no causan nada errático si se usan bien, con un puente H o el driver correspondiente.

La palabra importante aquí es “puede”. No intento afirmar que siempre habrá problemas. Solo que puede haberlos si no se hacen las cosas “bien”, como comentas.

En el caso que nos ocupa puede existir falta de capacidad de la fuente de poder, y la intención de post fue solicitar un diagrama de conexiones.

1 Like

Hi,
Una cosa que noto es que esta alimentando con 5 voltios y a la misma vez el servo por la entrada de DC. Esta debe de ser de por lo menos de 7 a 9 voltios DC. Si usa 5 voltiios para alimentar al alduino al pasar por el regulador va bajar el voltaje de menos de 5 voltios. puede ser que no sea un problema pero si usa la entrada de DC entonces se recommienda usar un voltaje de 7 al 9 voltios.

1 Like

He revisado la hoja de datos del servo y se alimenta entre 4,8 y 6v, así que entiendo que podría subir algo pero no mucho más.
O me estoy esquivocando?

Hoy se ha muerto el tercer servo… :sob:
El que se suponía que soportaba bien según la tienda…
Voy a eliminar las partes que hace rampa, voy a bajar los valores aleatorios a 150 y voy a subir el intervalo mínimo entre los valores aleatorios a 150ms a ver si así no lo funde.

Creo que a estas alturas deberías plantearte usar un stepper en lugar de un servo (con los cambios que conllevaría), o ,en su defecto, buscar un servo de calidad industrial (aunque un defecto de los microservos en general es que no son muy resistentes a este tipo de esfuerzos).

1 Like

Hi,
Adjunto un link de un servo para tu consideracion con bastante fuerza y tiene bastante torque, Este se usa en los aviones de control remoto.
link:
[Amazon.com: Smraza 45KG Coreless Servo Motor High Torque Steering: 2pcs 8.4V Waterproof Servo Digital Full Metal Gear Servo for RC 1/10 1/8 1/12 Scale Car Truck Crawler/Robot/Boat with 25T Servo Horn(180°×2) : Toys & Games]

1 Like