Calibración de mis servos
Componentes y suministros
| × | 1 | ||||
| × | 1 | ||||
| × | 8 | ||||
| × | 8 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Herramientas y máquinas necesarias
|
Aplicaciones y servicios en línea
| ||||
|
Acerca de este proyecto
En una publicación anterior en Hackster, escribí sobre cómo he creado una plataforma para comparar cómo giran diferentes servos del mismo lote, y mostré que enviar las mismas señales PWM a diferentes servos da como resultado algunas diferencias significativas:la imagen a continuación muestra servos que comenzaron en su posición más alejada en el sentido contrario a las agujas del reloj y recibieron la misma señal PWM; todos tienen un comportamiento ligeramente diferente.
¿Por qué no utilizar las bibliotecas de servo existentes para Arduino?
Utilizo el Adafruit PWM Servo Driver para manejar un montón de servos, y esto me permite enviar una señal PWM diferente a cada servo. Podría usar la biblioteca Servo que está integrada en mi instalación de Arduino, pero tengo algunas razones para no hacer esto:
- Con Adafruit PWM Servo Driver, puedo controlar mis servos usando solo dos pines sobre I2C, en lugar de tener que dedicar un pin en mi Arduino a cada servo.
- A veces he encontrado con la biblioteca Arduino Servo que cuando lo conecto a un servo y envío una señal para que gire a la posición de cero grados, gira hasta el límite de recorrido y muele los engranajes dentro del servo.
- / li>
Por supuesto, los servos de 9g que estoy usando son baratos y no están diseñados para ser precisos, pero creo que puedo sacarles algo más de valor. Quiero usarlos como un robot andante y necesito que su comportamiento sea un poco más preciso y predecible.
¿Cómo puedo controlar mis servos de hobby con mayor precisión?
Confirmar que todos mis servos se comportan de manera ligeramente diferente me hizo querer construir un dispositivo que me permitiera calibrar un servo. ¿Qué valores de PWM necesito para enviar un servo para moverlo a una posición de 0 grados? ¿O el punto central de 90 grados? ¿Cómo evito enviar un valor PWM que ajusta el servo a una posición extrema con muchos crujidos y rechinamiento de engranajes?
Decidí combinar un par de conceptos simples.
- Alinear mi servo con el centro de un transportador simple, de modo que cuando el limpiador del servo gire, pueda medir su posición.
- Conecte un potenciómetro a una entrada analógica del Arduino, para poder controlar la posición del limpiador del servo ajustando el valor PWM mientras ajusto la posición del eje del potenciómetro.
Para esta versión, estaba feliz de usar el Serial Monitor de mi Arduino IDE para decirme el valor de la señal PWM, que puedo grabar manualmente.
Usé Autodesk 123D para diseñar una plataforma simple que sostendría el potenciómetro, el transportador, un solo servo, mi Arduino y el servocontrolador Adafruit PWM junto con una fuente de alimentación.
Quiero seguir usando el servocontrolador Adafruit PWM para mi calibración, ya que es lo que probablemente usaré en mi proyecto final. Si fuera a controlar el servo directamente desde un pin en el Arduino, lo replicaría en el dispositivo y calibraría el servo contra PWM del Arduino.
Construyendo el dispositivo
Imprimí cada una de las partes y las uní usando los pernos y arandelas M3.
Los orificios de montaje en el diseño de mi dispositivo se ajustan para adaptarse a mis componentes; diferentes componentes pueden tener variaciones en los diámetros y posiciones de los orificios.
Para la electrónica, conecté el pin central del potenciómetro al pin A0 del Arduino, y los otros pines a 0v y 5v en el Arduino. Conecté el controlador del servomotor PWM al Arduino, y luego conecté el convertidor reductor DC-DC (había sintonizado para convertir la entrada de la fuente de alimentación de 9v en una salida de 5v). Conecté el servo 9g a la primera ranura en el protector del controlador del servomotor y luego cargué mi boceto al Arduino.
El resultado final se muestra en las fotografías a continuación. Al girar la perilla en la parte superior izquierda del dispositivo, puedo controlar la posición del servo, y al usar el Monitor serial en el IDE de Arduino, puedo leer la señal PWM que se envía al servomotor para cualquier ángulo.
Entonces, ¿qué me dice el dispositivo?
Para mi servo, lo giré hasta su límite máximo en el sentido de las agujas del reloj y coloqué el limpiaparabrisas en el servo para que se posicionara justo más allá de la marca de 180 grados en el transportador de mi dispositivo de calibración.
Conecté la alimentación al dispositivo y luego giré la perilla del potenciómetro hasta que la aguja del servo se alineó con la marca de 0 grados en el transportador y anoté el valor PWM escrito en la salida serial de mi Arduino IDE. Luego giré el potenciómetro hasta que la aguja del servo apuntó a 10 grados y volví a anotar el valor PWM. Continué con este proceso cada 10 grados hasta que llegué a 180 grados y he compartido los resultados en la siguiente tabla.
Creé un gráfico de los resultados (que se muestra a continuación) y, como era de esperar, es obvio que hay una relación fuertemente lineal entre PWM y el ángulo del servo.
Ahora tengo algunos valores de ángulo y PWM que son característicos de este servo en particular; otros servos pueden tener características similares, pero no serán idénticos.
Ahora tengo un par de opciones para un rendimiento del servo más preciso:
- Registre estos pares de valores y manténgalos en una matriz en mi boceto de Arduino, y cuando quiera mover el limpiaparabrisas del servo a 90 grados (por ejemplo), simplemente consulte qué valor PWM se relaciona con este ángulo y envíe ese valor PWM al servo. Esto tiene el inconveniente de que solo puedo rotar a ángulos que sean múltiplos de 10.
- O si quiero un control completo del ángulo al que envío, puedo usar la regresión lineal en el conjunto de datos para averiguar qué fórmula relaciona el ángulo y el valor PWM (para este servo, PWM =2.35 * Ángulo + 159.4). De esta manera puedo pasar el ángulo al que quiero girar como parámetro y calcular programáticamente el PWM necesario para rotar este servo en particular a esa posición.
De cualquier manera, puedo controlar este servo con más precisión y confianza que antes. Es un poco más de esfuerzo calibrar cada servo con precisión, pero para mi proyecto, vale la pena por la precisión adicional.
Por supuesto, cuando quito el servo del dispositivo, mantengo el limpiaparabrisas del servo conectado, ya que las medidas se relacionan con cómo se conecta el limpiador mientras se calibra.
Mejoras para la próxima versión
Después de calibrar algunos servos, pensé en algunas mejoras que incorporaré a la próxima versión.
- El servo debe tener un mecanismo de liberación rápida, tal vez asegurando el servo en su lugar usando un clip con imanes de neodimio, en lugar de asegurarlo con pernos M3.
- Quiero hacer esto más pequeño, tal vez podría reorientar el Arduino y la fuente de alimentación para lograrlo.
- Necesito un interruptor de encendido entre la batería de 9v y el convertidor reductor, por lo que no necesito desconectar completamente la batería cada vez que quiero apagar la máquina.
- Me gustaría poder imprimir el equipo en menos piezas.
- En lugar de leer manualmente los valores del transportador, sería mejor si un sensor pudiera detectar cuándo el servo está en posiciones angulares específicas y retroalimentarlo al Arduino; esto podría eliminar algún error de paralaje.
- Por último, una pantalla LCD para mostrar los resultados sería de gran ayuda, ya que no necesitaría tener mi computadora conectada al dispositivo.
Terminando
Así que eso es todo, mis servos de hobby son baratos y no están diseñados para ser precisos, y para muchas aplicaciones, están perfectamente bien. Sin embargo, me gustaría obtener un poco más de precisión y un rendimiento repetible del mío, y el equipo de esta publicación me ayuda a lograrlo.
Código
- Boceto para dispositivo servocalibrador
Boceto para dispositivo servocalibrador C / C ++
#include#define analogIn A0Adafruit_PWMServoDriver pwm =Adafruit_PWMServoDriver (); int inputValue =0; int tmpPwmValue =0; void setup () {Serial ).begin (9600) pwm.begin (); pwm.setPWMFreq (60);} bucle vacío () {inputValue =analogRead (analogIn); // inputValue estará entre 0 y 1024 // Por observación, los valores de PWM mínimo y máximo del servo suelen estar entre 100 y 612 // La siguiente fórmula nos permite convertir simplemente la entrada analógica a PWM int pwmValue =(int) (100 + ( inputValue / 2)); pwm.setPWM (0, 0, pwmValue); // Verifique que no estemos mostrando datos duplicados innecesariamente if (pwmValue! =TmpPwmValue) {Serial.print ("Potentiometer Input ="); Serial.print (inputValue); Serial.print (", PWM ="); Serial.println (pwmValue); } tmpPwmValue =pwmValue; retraso (15);}
Piezas y carcasas personalizadas
Repo para piezas de servocalibrador
https://github.com/jeremylindsayni/ServoCalibratorProceso de manufactura
- Impresión 3D PLA:todo lo que necesita saber
- Rastreo de rostro con movimiento horizontal / vertical con raspberry pi
- PLA frente a ABS frente a nylon
- Walbi, el bípedo ambulante
- Brazo robótico Arduino IoT
- Impresión 3D con PLA vs. ABS:¿Cuál es la diferencia?
- Accionamientos de CC como reemplazo de los servos de CA
- ¿El PLA es reciclable o incluso biodegradable?
- ¿Se disolverá el PLA en agua y se descompondrá?
- ¿Es conductor el filamento PLA (hay algún filamento conductor)?
- ¿Es el PLA conductor? Propiedades eléctricas del filamento 3D.