miércoles, 28 de enero de 2015

Cómo saber si un servo está bloqueado con arduino

servo hs311


Hoy vamos a explicar en este post cómo saber si un servo se ha bloqueado mientras intenta girar, tanto para servos normales como para servos de rotación continua, por medio de un arduino (aunque válido para otros sistemas).

Hay diversas maneras de averiguar si el servo está fallando os diré algunas:



1.- Que el servo tuviera un encoder, el cual nos diría si está en movimiento o no, deberíamos enviarle una señal pwm con arduino para moverlo y a su vez deberíamos estar obteniendo los datos del encoder para que nos diga si está moviéndose el servo o por el contrario está bloqueado.

2.- Otra opción es acceder al potenciometro de dentro del servo y llevar la señal a una entrada analógica de esta manera al enviarle los pulsos y conocer donde debería estar podemos leer el potenciometro y conocer la posición, esta solución está muy bien pero no sirve para servos de rotación continua.

3.- Por último la opción por la que nos hemos decantado es, conocer el consumo que está teniendo el motor, a continuación leerlo con una entrada analógica de arduino, esta opción es válida para todo tipo de servos.

Para conocer la intensidad que circula por un circuito tenemos que tener en cuenta la ley de ohm
I=V/R

Y sabemos que hay un tipo de configuración llamado shunt que es: (cito de la wikipedia)

"En electrónica, un shunt es una carga resistiva a través de la cual se deriva una corriente eléctrica. Generalmente la resistencia de un shunt es conocida con precisión y es utilizada para determinar la intensidad de corriente eléctrica que fluye a través de esta carga, mediante la medición de la diferencia de tensión o voltaje a través de ella, valiéndose de ello de la ley de Ohm (I = V/R)."

es decir vamos a poner una resistencia al circuito del servo para medir el voltaje y saber con precisión la intensidad que circula por el circuito. Si aumenta la Intensidad quiere decir que nuestro servo está bloqueado sin llegar a la posición deseada.

Veamos el esquema realizado.




Hemos puesto cuatro resistencias de 1ohm en paralelo para reducir la resistencia total y que intervenga lo mínimo en el servo.

Ahora sólo nos queda realizar un programa que lea del pin entrada analógica A0 y mostrar ese valor mientras gira el servo (El programa está pensado para un servo de rotación continua pero sirve para uno normal aunque tendremos que estar más atentos).

El funcionamiento es sencillo,
1.- Llevamos el servo a 90º, si el servo es de rotación continua se para, sino va a la posición.
2.- Le damos la orden de 180º para que gire en un sentido.
3.- Leemos la entrada analógica mientras el motor gira para determinar el consumo, y en función de esto podemos detectar si se ha parado sin llegar a la posición(haciendo un if con el valor límite)
4.- Ponemos un \n para que nos muestre el texto en la siguiente línea.
4.- Hacemos un delay de 400 para que imprima por pantalla más despacio.

Os dejo un programa ejemplo para que podáis utilizarlo (Código fuente):


#include <Servo.h> 

Servo myservo;  
int pinA = A0;  

void setup() 
{ 
  myservo.attach(9);  
  Serial.begin(9600); 
  myservo.write(90); 
} 

void loop() 
{ 

  myservo.write(180);
  Serial.println(analogRead(pinA)); 
  Serial.println("\n");
  delay(400);

} 


No hay comentarios:

Publicar un comentario