¿Cómo detecto el servo stall con un Arduino?

4

Estoy controlando un servo estándar de 5 voltios con un Arduino con PWM.

Mi objetivo es rotar el servo hasta que se detenga físicamente (siente resistencia) y luego detenerse. Luego quiero que el Arduino almacene el grado en el que el servo se detuvo.

Para hacer esto, tengo esta idea en mi mente ...

  1. Se declara una variable ( servoPos ).
  2. Arduino incrementa servoPos un grado a la vez y lo escribe en el servo.
  3. Arduino lee simultáneamente la corriente extraída del servo.
  4. Si el Arduino ve un pico actual, entonces detiene el servo.
  5. El Arduino almacena la posición del servo en una nueva variable.

Estoy haciendo esto para un proyecto que hace hincapié en el bajo costo. Por lo tanto, quiero abstenerme de usar codificadores de motor, amplificadores operacionales o cualquier componente propietario.

Por favor, muéstreme cómo puedo detectar el bloqueo de servo con un Arduino leyendo la corriente. Si tienes una idea mejor / costo-efectiva, ¡eso también sería apreciado!

Gracias de antemano!

    
pregunta solutionhacker

1 respuesta

6

Lo más barato que puedes hacer es usar una resistencia de detección de corriente de lado bajo (0.1ohm) y usar la entrada ADC de Arduino con una resistencia de la serie 1-10K, una pinza de sobretensión y asegurarte de que el servo es sujetado también.

Primero déjeme hacer algunas suposiciones / recomendaciones:

Alimente su Arduino y el resto de su sistema con una batería recargable de Lipo / NiMH a 7V voltios (lo que significa una Lipo de 2 celdas o ~ 4 celdas de NiMH). La batería puede alimentar el Arduino Uno, ya que tiene un regulador incorporado para sus propias necesidades de 5V, pero le sugiero que ponga el servo en su propio regulador 7805 o mejor / más nuevo de tecnología lineal para separarlo un poco del suministro de Arduino. y también en general para obtener resultados más confiables y seguros del servo. La mayoría de los servos de hobby son 5-6V de entrada recomendada de todos modos.

La premisa general es utilizar una resistencia de derivación de corriente de lado bajo, de un valor bajo para no ser demasiado limitante para el sistema que está midiendo, pero lo suficiente como para poder detectar la tensión actual de la condición de bloqueo lo suficientemente confiable con El ADC de 5V de 10 bits en el Arduino.

simular este circuito : esquema creado usando CircuitLab

En el esquema de arriba, he mostrado una batería de iones de litio de 2 celdas completamente cargada (8.4V, 4.2V por celda, con 2 en serie), yendo a una 7805 (o si puede encontrar una mejor, por favor El estilo LDO daría mejores resultados a largo plazo, ya que las baterías se descargan en la región de deserción de los modelos más antiguos, como el 7805, con los capacitores de entrada y salida apropiados, y luego se apagan al servo. El servo tiene "cerca de" un condensador de 100uF y 1000uF (1mF), de modo que se pueden proporcionar grandes cantidades de corriente sin cargar el 7805 o la batería demasiado por cortos períodos de tiempo. Obviamente, un corto / bloqueo continuo todavía afectará el sistema "upstream".

Hay un diodo Schottky de retención / retorno D3, paralelo a través de las conexiones de servo + y -. No se muestra la entrada de señal / control del servo, pero debe saber cómo funciona. Por cierto, te sugiero que uses la biblioteca Servo de Arduino, no PWM "estándar" ya que las frecuencias son demasiado altas.

El diodo de sujeción D4 protege el pin ADC de Arduino de voltajes negativos. La resistencia en serie R1 es una limitación de la corriente de entrada combinada con la tapa del filtro C5 para formar un poco de filtrado pasivo de paso bajo, lo que ayuda a evitar falsos positivos para picos de corriente durante el funcionamiento normal del servo.

A medida que aumenta la corriente a través del servo, la tensión a través de nuestra resistencia sensorial R2 aumentará. Establecí la resistencia en 100mOhm, lo que nos permitirá usar la ley de Ohm para ver qué voltaje habrá en ella durante una corriente arbitraria.

En realidad lo miré desde el punto de vista de Arduino y el código, pensando que el ADC es de 10 bits, lo que significa 1024 pasos. La referencia suele ser 5V, por lo que 5000mV / 1024 es 4.88mV por "unidad" del ADC en el código. Digamos que para evitar detectar algo pequeño, apuntemos a una lectura de ADC de 20+ para disparar el código de detección de corriente de bloqueo.

Digamos que para un valor de 25 leídos en el ADC, 25 Unidades * 4.88mv / La unidad es 122mV en la entrada del ADC en el mundo real. La corriente requerida a través de la resistencia sensorial para obtener 122 mV a través de ella sigue la ley de Ohm. V = IR, entonces 0.122V = I * 0.1, que es de 1.22 amperios.

Creo que 1.22 amperios son lo suficientemente razonables para una corriente de parada en un servo aficionado, y puede ser más que esto, pero ciertamente el movimiento normal no será muy parecido.

Lo último que se debe tener en cuenta es que, si encuentra que los valores de ADC con 0.1Ohm no son lo suficientemente buenos / altos, fácilmente puede duplicar la resistencia a 0.2Ohms. Sin embargo, recuerde que no desea limitar el servo del funcionamiento normal, pero 5V / 0.2Ohm todavía permite un cortocircuito del servo de 25 amperios por lo que aún no estamos cerca de afectar su funcionamiento.

El código de lectura del ADC debe tener algún tipo de temporizador / tiempo de espera en el que, si los valores del ADC son consistentemente superiores a 20 y gt; 25 o lo que sea que elijas como límite (puedes hacerlo más tarde), quizás para 5 muestras en una fila, tomada a intervalos de 5 ms le da un tiempo de respuesta de poco más de 25 milisegundos a una condición de bloqueo legítima. ¡Eso debería ser suficiente! Recuerde que cada vez que un servo se inicia, o cambia de dirección, extrae esta cantidad de corriente por períodos cortos. Trate de evitar tropezar con la condición de "bloqueo" demasiado rápido.

    
respondido por el KyranF

Lea otras preguntas en las etiquetas