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...
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!
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.
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.
Ignacio Vázquez-Abrams
s3c
Juan U.
frarugi87