El movimiento síncrono entre múltiples actuadores lineales puede ser vital para el éxito de algunas aplicaciones de clientes, siendo uno común dos actuadores lineales que abren una trampilla. Para lograr esto, recomendamos utilizar el Firgelli dedicado caja de control síncrono FA-SYNC-2 y FA-SYNC-4. Sin embargo, algunos aficionados al bricolaje y hackers prefieren la libertad que ofrece un microcontrolador como el Arduino y prefieren escribir su propio programa de control sincrónico. Este tutorial tiene como objetivo proporcionar una descripción general sobre cómo lograr esto utilizando el Actuador lineal de la serie óptica.
Prefacio
Este tutorial no es un tratamiento riguroso de los pasos necesarios para lograr el control sincrónico con Arduino, sino una descripción general amplia para ayudarlo a escribir su propio programa personalizado. Este tutorial es avanzado y asume que ya está familiarizado con el hardware y software de Arduino e idealmente tiene experiencia con señales de modulación de ancho de pulso (PWM), rutina de servicio de interrupción (ISR), supresión de rebotes de sensores y codificadores de motor. El ejemplo proporcionado en este tutorial es un controlador proporcional primitivo. Se pueden implementar muchas mejoras en el siguiente ejemplo que incluyen, pero no se limitan a: implementar un bucle de control PID y escalar a más de dos actuadores lineales. Tenga en cuenta que no tenemos los recursos para proporcionar soporte técnico para las aplicaciones Arduino y no depuraremos, editaremos, proporcionaremos códigos o diagramas de cableado fuera de estos tutoriales disponibles públicamente.
Descripción general del control síncrono
El control sincrónico se logra comparando la longitud de dos actuadores lineales y ajustando proporcionalmente la velocidad; si un actuador comienza a moverse más rápido que otro, lo ralentizaremos. Podemos leer la posición del actuador lineal a través del codificador óptico incorporado. El codificador óptico es un pequeño disco de plástico con 10 orificios que está conectado al motor de CC de manera que cuando el motor gira, el disco de plástico también lo hace. Un LED infrarrojo se dirige hacia el disco de plástico para que, a medida que gira, la luz se transmita a través de los orificios del disco óptico o se bloquee por el plástico del disco. Un sensor de infrarrojos en el otro lado del disco detecta cuando la luz se transmite a través del orificio y emite una señal de onda cuadrada. Contando el número de pulsos que detecta el receptor, podemos calcular las RPM del motor y la distancia que ha recorrido el actuador lineal. El actuador lineal óptico de 35 lb tiene 50 (+/- 5) pulsos ópticos por pulgada de recorrido, mientras que los actuadores de 200 lb y 400 lb tienen ambos 100 (+/- 5) pulsos por pulgada. Al comparar cuánto se ha extendido cada actuador lineal, podemos ajustar proporcionalmente la velocidad de los dos actuadores para que siempre permanezcan en la misma longitud mientras se extienden.
Componentes requeridos
- Dos actuadores lineales ópticos
- Dos controladores de motor IBT-2
- Arduino Uno
- Fuente de poder 12V
- 3 botones momentáneos (no vendidos por Firgelli)
- Cableado adicional
Diagrama de cableado
Realice las conexiones de cableado anteriores. Siempre verifique los colores de los cables que salen del actuador lineal ya que la convención de colores puede cambiar de lo que se muestra en el diagrama anterior.
Tutorial rápido
Si solo desea que sus dos actuadores lineales se muevan en sincronía, simplemente siga estos pasos:
- Realice las conexiones como se muestra en el diagrama de cableado.
- Cargue y ejecute el primer programa, a continuación.
- Copie los dos valores generados por este programa en la línea 23 del segundo programa, a continuación.
- Cargue y ejecute el segundo programa.
- Ajuste su sistema variando la variable K_p (línea 37, segundo programa). Esto se hace más fácilmente conectando un potenciómetro al pin analógico A0 y modificando el código para leer el potenciómetro y usando la función map (): K_p = map (analogRead (A0), 0, 1023, 0, 20000);
El resto de este tutorial repasará con más detalle algunas de las características clave de los programas. Nuevamente reiteramos que este no es un tutorial exhaustivo, sino más bien una descripción general de las cosas a considerar al crear su propio programa.
Descripción general del programa de calibración
Antes de que se pueda lograr el control síncrono, primero debemos calibrar el sistema. Esto implica contar el número de pulsos por ciclo de actuación porque, como se indica en las especificaciones del producto, hay una tolerancia de (+/- 5) pulsos por pulgada de recorrido. Cargue y ejecute el programa, a continuación. Este programa retraerá completamente los actuadores (línea 53) y establecerá la variable del contador de pulso óptico en cero, luego se extenderá y retraerá completamente (línea 63 y 74, respectivamente). Durante este ciclo de actuación, el número de pulsos será contado por la rutina de servicio de interrupción (ISR), línea 153 y 166. Una vez que se complete el ciclo de actuación, saldrá el número promedio de pulsos, línea 88, tome nota de estos valores para más adelante.
https://gist.github.com/Will-Firgelli/89978da2585a747ef5ff988b2fa53904
Descripción general del programa síncrono
Antes de cargar el programa de control síncrono, primero debe copiar los valores generados por el programa de calibración en la línea 23 y reemplazar la matriz actual: {908, 906} con sus propios valores. Además, si está utilizando el actuador lineal de 35 libras, deberá cambiar el valor de la variable en la línea 29 de 20 milisegundos a 8 milisegundos.
Después de retraerse completamente una vez (para identificar el origen), puede mover ambos actuadores lineales en sincronía pulsando los tres botones correspondientes a los comandos de extensión, retracción y parada. Los actuadores permanecerán sincronizados incluso bajo cargas desiguales al comparar sus contadores de pulsos relativos y ajustar la velocidad entre ellos para permanecer siempre sincronizados. Tenga en cuenta que el programa actual implementa un controlador proporcional simple, la línea 93, como tal, está sujeta a sobreimpulso y oscilación alrededor del equilibrio. Puede ajustar esto variando la variable K_p, definida en la línea 37. Esto se hace más fácilmente conectando un potenciómetro al pin analógico A0 y modificando el código para leer el potenciómetro y usando la función map (): K_p = map (analogRead (A0), 0, 1023, 0, 20000);
Para obtener los mejores resultados, recomendamos encarecidamente quitar el controlador proporcional e implementar un lazo de control PID; sin embargo, esto está más allá del alcance de este tutorial introductorio y se ha omitido deliberadamente.
https://gist.github.com/Will-Firgelli/44a14a4f3cac3209164efe8abe3285b6
Uso de actuadores Bullet 36 y Bullet 50 en sincronía
Además de nuestro actuador lineal Optical Series, también ofrecemos dos actuadores lineales con codificadores incorporados: el Bullet 36 Cal. y el Bullet 50 Cal, ambos con un codificador de efecto Hall en cuadratura interno. El codificador de efecto Hall funciona con el mismo principio que el codificador óptico, sin embargo, en lugar de usar luz, utiliza magnetismo. Además, al ser un codificador de cuadratura, tiene dos salidas de señal, cada una desfasada en 90 grados. Como tal, debe usar una placa Arduino con 4 o más pines de interrupción (el Arduino Uno solo tiene dos) y modificar el código para procesar la entrada de dos señales por actuador. Además, la variable de tiempo antirrebote, falsepulseDelay deberá ajustarse junto con K_p.
Consejos para escribir su propio programa
Más de dos actuadores lineales
Cuando se utilizan dos o más actuadores lineales, Arduino Uno ya no funcionará ya que solo tiene dos pines de interrupción disponibles. Deberá utilizar una placa Arduino con el número apropiado de pines de interrupción disponibles, más información: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
En segundo lugar, en aras de la eficiencia, es aconsejable vectorizar su programación utilizando matrices y bucles for () para iterar sobre cada actuador.
Rebotando
Como ocurre con muchos sensores, es importante tener en cuenta las señales que rebotan. Al igual que con los interruptores mecánicos, los codificadores también pueden sufrir rebotes. En el ejemplo anterior, el proceso de eliminación de rebotes se ha manejado mediante un retardo simple (definido por la variable falsepulseDelay), es importante manejar esto en cualquier cambio de software que realice o con circuitos físicos para filtrar el ruido de rebote.
Manejo de vuelco
Si modifica el código, tenga en cuenta el rollover cuando trabaje con la función millis (). Tanto millis () como la matriz lastDebounceTime se declaran como variables largas sin firmar, lo que significa que pueden almacenar valores de hasta 4,294,967,295 (32 ^ 2-1). Esto se traduce en aproximadamente un período de renovación de 49,7 días. El programa actual está diseñado para manejar el rollover en las funciones ISR (rutina de servicio de interrupción): count_0 & count_1, sin embargo, si modifica este programa, asegúrese de manejar correctamente el rollover variable, de lo contrario su programa fallará después de ~ 49.7 días de uso continuo. Para obtener más información, consulte: https://www.norwegiancreations.com/2018/10/arduino-tutorial-avoiding-the-overflow-issue-when-using-millis-and-micros/