¿Cómo detecto la parada del servo con un Arduino?

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

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

Para ello, tengo esta idea en 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 de corriente, detiene el servo.
  5. El Arduino almacena la posición del servo en una nueva variable.

Estoy haciendo esto para un proyecto que enfatiza el bajo costo. Por lo tanto, quiero abstenerme de usar codificadores de motor, amplificadores operacionales o cualquier componente patentado.

Muéstrame cómo puedo detectar la parada del servo con un Arduino leyendo la corriente. Si tiene una idea mejor/rentable, ¡también sería apreciada!

¡Gracias de antemano!

Vas a encontrar esto muy, muy difícil de hacer sin algún tipo de amplificador. Te recomiendo que revises ese requisito.
Coloque una pequeña resistencia entre la tierra del servo y la tierra verdadera, mida el voltaje analógico sobre esta resistencia. Si el valor sube demasiado, tiene un puesto.
Alternativamente, conduzca el servo a baja potencia durante un período de tiempo que sepa que será lo suficientemente largo para llegar a la posición de parada desde cualquier posición inicial. Debe limitar la potencia del servo para que sea suficiente para moverse libremente, pero se detendrá suavemente y no se quemará.
En mi humilde opinión, vas en la dirección equivocada. La corriente será demasiado baja para que pueda sentirla de manera confiable. Simplemente use un codificador o un potenciómetro en el eje para detectar la posición. Un potenciómetro cuesta mucho menos que cualquier amplificador y puede encontrarlo fácilmente. Si no desea agregarlo, simplemente abra el servomotor y suelde un cable en el potenciómetro interno que usa para detectar la posición, luego lea su voltaje (preferiblemente agregando un búfer). muévelo hasta que el valor cambie, luego encontraste el máximo.

Respuestas (1)

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

Permítanme hacer algunas suposiciones/recomendaciones primero:

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

La premisa general es usar una resistencia de derivación de corriente del lado bajo, de un valor bajo que no limite demasiado el sistema que está midiendo, pero lo suficiente como para que pueda sentir la tensión actual de la condición de bloqueo de manera suficientemente confiable con el 5V 10 - bit ADC en el Arduino.

esquemático

simular este circuito : esquema creado con CircuitLab

He mostrado en el esquema anterior una batería de iones de litio de 2 celdas completamente cargada (8,4 V, 4,2 V por celda, con 2 en serie), yendo a una 7805 (o si puede encontrar una mejor, hágalo. Estilo LDO daría mejores resultados a largo plazo ya que las baterías se agotan en la región de caída de los modelos más antiguos como el 7805) con los condensadores de entrada y salida apropiados, y luego se van al servo. El servo tiene condensadores "cercanos" de 100uF y 1000uF (1mF) para que se puedan proporcionar grandes cantidades de corriente sin recargar demasiado el 7805 o la batería durante cortos períodos de tiempo. Obviamente, un cortocircuito/bloqueo continuo seguirá afectando al sistema "aguas arriba".

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

El diodo de sujeción D4 es para proteger el pin ADC de Arduino de los voltajes negativos. La resistencia en serie R1 es un limitador de corriente de entrada combinado 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, aumentará el voltaje a través de nuestra resistencia de detección R2. Configuré la resistencia a 100 mOhm, lo que nos permitirá usar la ley de Ohm para ver qué voltaje habrá a través de ella durante una corriente arbitraria.

De hecho, 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 activar el código de detección de corriente de bloqueo.

Digamos que para un valor de 25 lecturas en el ADC, 25 unidades * 4,88 mv/unidad son 122 mV en la entrada del ADC en el mundo real. La corriente requerida a través de la resistencia de detección para obtener 122 mV sigue la ley de Ohm. V = IR, por lo que 0,122 V = I * 0,1, que son 1,22 amperios.

Creo que 1,22 amperios es lo suficientemente razonable para una corriente de bloqueo en un servo de aficionado, y puede ser más que esto, pero ciertamente el movimiento normal no estará cerca de esto.

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

El código de lectura de ADC debe tener algún tipo de temporizador/período de tiempo de espera en el que, si los valores de ADC están constantemente por encima de 20->25 o lo que elija como límite (puede ajustarlo más tarde), tal vez para 5 muestras seguidas, tomado 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 arranca o cambia de dirección, consumirá esta cantidad de corriente durante períodos breves. Trate de evitar disparar la condición de "bloqueo" demasiado rápido.

¿Los servos tienen flyback o EMF de qué preocuparse? He buscado arriba y abajo y solo puedo encontrar información relacionada con motores regulares. Nadie parece molestarse en proteger sus circuitos de los servos... ¿dejándome creer que las partes internas de un servo se encargan de eso...? Además, ¿no se destruiría R2 en su circuito anterior debido a un gran valor de potencia?
@Bort En primer lugar, R2 es una resistencia de derivación actual y 100 mOhms no es tan malo, pero, sinceramente, 10 mOhm sería ideal. Es posible que necesite un amplificador operacional simple configurado para una ganancia x5 entre el nodo R1 y el ADC del microcontrolador, para que vuelva a tener un voltaje útil para la detección de corriente.
Los servos @Bort (especialmente los de hobby baratos) son solo motores de CC con un circuito de control incorporado especial que les permite actuar como un actuador giratorio controlado por posición con una interfaz simple. La naturaleza inductiva y ruidosa del motor todavía está presente y aún puede causar estragos en los circuitos cercanos. Si comienza a colocar circuitos sensibles en las mismas conexiones que el servo, le sugiero que haga los diodos de sujeción flyback como se muestra como D3 y D4 en mi diagrama. D3 es el diodo flyback principal y va de las conexiones Servo + a -. D4 es menos importante pero puede ayudar a proteger el microcontrolador y el ADC.
Esta es una respuesta genial. ¿Sería esto utilizable en stm32f103 que tiene 12bit adc a 3.3v para un motor paso a paso a 12v donde la corriente va de 100ma a 200 bajo parada? Estoy cerca de calcular esto yo mismo, pero tengo curiosidad por saber si el suministro del motor de 12v ayuda a aumentar el diferencial de voltaje. ¿Y si uso una resistencia más grande, obtendré un voltaje más alto en el ADC pero quemaré más energía?
Creo que lo siguiente es cierto para esto: 12 bits adc = 4096 unidades 3300 mv/4096 unidades = 0.8056640625 mv / unidad adc unidades a 100ma (operación normal) = .01v / 0.0008056640625v = 12.4121212121 unidades y a 200ma, sería justo el doble de ese sonido, ¿verdad?
La última pregunta es ¿para qué sirve la resistencia de 1-10k en el ADC?
@MattWilliamson hola mate. Me alegro que esta respuesta te haya ayudado. ADC de 12 bits y 3.3V está bien. Básicamente, es imposible que obtenga 3.3 V a través de la resistencia de detección de 100 mOhm a menos que de alguna manera haga 33 amperios a través de ella. Sin embargo, si su rango de detección de corriente es solo alrededor de 100 y 200 mA, es posible que desee aumentar el voltaje de detección o usar una resistencia de 1 ohmio. Sí, se genera más calor con una resistencia más grande, pero si de hecho es solo 200 mA, no hay problema. sus cálculos parecen correctos para los valores que obtendría del ADC. Sin embargo, usar solo 12-24 de 4096 es una tontería. use un amplificador operacional con ganancia o mayor R.
@MattWilliamson, la resistencia de 1-10k para el ADC es tanto para protegerlo de sobrevoltaje falso y estático, como para ayudar a igualar la impedancia en las entradas del ADC. Los ADC a menudo se ajustan para ciertas impedancias de fuente. Por lo general, una resistencia más baja es mejor, las cosas empeoran (valores inexactos) cuando la resistencia de la fuente es demasiado alta, porque los capacitores de muestreo dentro del ADC no se cargan por completo antes de que se tome la muestra (terminas con valores inferiores a los reales)
@kyranf, sí, es una tontería usar un valor tan bajo para el adc, pero solo estoy buscando una condición booleana económica. Gracias por elaborar para mí!