Panama Hitek Logo
Panama Hitek Logo

Servomotor seguidor con acelerómetro MMA7361

La intención de este trabajo es implementar un seguidor de movimientos sobre el Eje Y con el acelerómetro y un servomotor. De esta manera aplicamos lo aprendido en Post anteriores  “Acelerómetros de 3 ejes, lo que necesitas saber”. La idea es utilizar un Servomotor 9G Tower-Pro como seguidor , acoplando a través de Arduino, de manera que nuestro seguidor , copie los movimientos del Eje Y del módulo sensor MMA7361.

Cabe mencionar que será importante haber leído previamente el Post de Acelerómetros ,ya que se darán por conocidas ciertas cuestiones al realizar la explicación. Por otra parte debemos hacer una pequeña introducción al funcionamiento del servomotor.

Servomotores:

Un servomotor no es más que un motor de Corriente continúa con una fuerte reducción mecánica y un multiplicador de fuerza para que el mismo, no pierda capacidad de torque para poder acoplarle otros dispositivos mecánicos como ejes, correas, y engranajes, de acuerdo para lo que se haya pensado. El servomotor es un actuador, no un sensor, es decir un dispositivo final sobre el cual, y en general, va a actuar un control electrónico como en este caso.

La mayoría de los servomotores trabajan en un radio de 180 grados, para los cuales tienen topes mecánicos y si se intenta sobrepasar estos límites puede dañarse. El servomotor se puede desarmar y quitarle los topes y el dispositivo de control de realimentación (potenciómetro) para que pueda trabajar libremente, es decir, con giro continuo.

El modelo básico y conceptual de un servomotor puede verse en la siguiente figura:

Funcionamiento Conceptual Servomotor
Funcionamiento Conceptual Servomotor

Básicamente, el Servomotor trabaja con un control de realimentación negativa, sin entrar en detalles de la teoría de control, diremos que se denomina negativa puesto que el sistema completo llegará a un punto de equilibrio o error en estado estacionario constante. Nuestro Servomotor trabaja con un esquema cuasi PWM, digo cuasi, porque en realidad no es un PWM, dado que estrictamente hablando los grados de rotación, no son proporcionales a un ciclo de trabajo determinado, sino a un ancho de pulso determinado o TON (Tiempo en estado HIGH).

Señal de Control y conversor

La señal de control es un tren de pulsos determinado que posee un TON y un TOFF (tiempo en estado LOW) y que será convertido a un valor de voltaje continuo por el conversor de ancho de pulso, la llamaremos VPUL

Amplificador de error

Este amplificador compara este voltaje de contínua y que es proporcional al TON contra una referencia de la posición actual del conversor, la llamaremos VPOT

Señal de error

El error, la llamaremos VERR
, será una nueva tensión eléctrica como resultado de la diferencia, esto es:

VERR=VPUL-VPOT

Este voltaje de error, excitará al Servomotor, que como es de corriente contínua, girará en un determinado sentido, y al hacerlo, como el Potenciómetro (POT) está acoplado al eje, mediante reducciones mecánicas, este POT modificará el voltaje de referencia VPOT, vale decir, VPOT se mueve dinámicamente con el giro del motor. Esto generará una nueva comparación entre VPUL y VPOT para generar una nueva señal de error y así sucesivamente hasta que el error sea cero, y en este caso el servomotor se detendrá. El error va disminuyendo dinámicamente con el giro del motor.

Si el error dinámico es positivo, vale decir VPUL>VPOT el servomotor girará hacia en un sentido y si VPUL<VPOT girará en sentido contrario, es decir, el signo del error nos dará el sentido de giro del motor. El tracking de la posición, en realidad lo lleva VERR.

Podemos comprender entonces que lo que definimos como realimentación negativa, puede comprenderse aún mejor, dado que el motor girará de tal manera de siempre conseguir error cero para equilibrarse en una posición determinada. Supongamos que por un mal funcionamiento interno, el motor girase en sentido contrario al normal, el error sería cada vez mayor lo que ocasionaría que la contínua aplicada, a su vez al servomotor fuese aún mayor, esto implica más velocidad de rotación contraria, y más error y más contínua y así siguiendo en un loop llamado de realimentación positiva, característica de los sistemas oscilantes.

Codificación de pulsos

Entendido esto, veamos ahora la manera en que se codifican los pulsos de manera normalizada, lo cual puede variar de acuerdo al tipo de fabricante.

Tabla de datos fabricantes Servomotor
Tabla de datos fabricantes Servomotor

La tabla nos muestra la codificación de los grados de giro para diferentes marcas de servomotores y su ancho de pulso TON en milisegundos ms, junto con la nomenclatura en colores de los tres cables que lleva la su interface.

Codificación de pulsos Servomotor
Codificación de pulsos Servomotor

Como se observa, el concepto no es enteramente PWM, dado que el TON tiene su rango entre 0,5 y 2,5 ms, para el caso de la figura, por eso, en mi caso, y podrán estar de acuerdo, o no, lo llamo cuasi PWM,pero si al decir que es como un PWM se entiende, no hay inconveniente.

 

 

Para el caso del servomotor de la figura, podríamos fácilmente llegar a la conclusión que la relación entre los grados y el TON es la siguiente:

Grados=(TON-0.5)x90

 Servomotor Tower-Pro

Para medir este servomotor, es decir, poder efectivamente saber el rango de TON, me he valido de un analizador lógico que lo adquirí en China :

Analizador de datos para proyecto Servomotor
Analizador de datos para proyecto Servomotor

Es una herramienta muy útil y que sirve para analizar los tiempos de las señales TON y TOFF de cualquier pin digital de cualquier dispositivo. Para adquirirlo vía China : vean Aliexpress

Y para descargar el software : Descargar.

Las mediciones encontradas para el servomotor Tower-Pro fueron las siguientes:

MMA7361
Medición de TON Servomotor

0 grados: 0.6 ms

90 grados: 1.45 ms

189 grados: 2.4 ms

De acuerdo a la tabla anterior de fabricantes , este Servomotor tiene características similares al Futaba.

Proyecto:

Para el proyecto vamos a conectar el ARDUINO y el módulo MMA7361 de igual manera que en el Post de acelerómetros

La repetimos los las dudas:

Módulo Sensor MMA7361:
  •  Fx al canal A0 del Arduino
  •  Fy al canal A1
  •  Fz al canal A2
  • GND: 0V desde GND ARDUINO
  • 5V: 5V desde ARDUINO
  • 3V3: nada O, si se desea se puede conectar a AREF del Arduino
  • 0G: nada
  • ST: LOW=GND
  • GS: LOW=GND
 Arduino:
  • A0: FX no es necesario para este caso
  • A1:FY Solo vamos a usar este eje
  • A2:FZ no es necesario para este caso
  • AREF: 3V3 desde Arduino, esto es dado que el modulo entrega tensiones entre 0 y 3V3 con lo cual podemos aprovechar todo el rango de la conversión.
  • PIN3 : Será la señal PWM que va al Servomotor
  • AREF: 3V3 desde la placa Arduino ( un puente)
Alimentación del Servomotor

Es recomendable que la alimentación del servomotor sea externa, es decir 5 Volts de una fuente externa para no dañar la placa Arduino ya que el consumo del servomotor en general y en especial los servomotores más grandes pueden consumir más de 1A, este no es el caso, pero lo recomiendo. La masa de la fuente externa si, hay que conectarla con la masa de la placa Arduino para que las referencias sea iguales.

Código

Lo principal

#include <Servo.h> es la librería de Arduino para servomotores

analogReference(EXTERNAL);  le decimos que la AREF será externa y de 3v3 y no los clásicos 5v

La lectura de N=770 que corresponde a +1G serán 180 grados del servomotor y N=240 serán los 0 grados del servomotor, pero como inicialmente está en 90 grados  (Servo1.write(90);) inicialmente quiere decir que este se moverá +/-90 grados respecto de esta posición inicial. Esto es una manera de hacerlo, pueden experimentar como se quiera.

map(promY, 770, 240, 179, 0);    En este caso se ve la razón de colocar inicialmente el servomotor en 90 grados, si 770 representan los 179 grados(no puse 180 para no forzar el tope) y 240 los 90 grados quedarán en el punto medio.

Antes de realizar su propia función map, podrían experimentar el servomotor sin el módulo sensor realizando lo siguiente:

Conectan en Servomotor y colocan instrucciones para moverlo en forma fija, por ejemplo:

Servo1.write(grados deseados); de esta manera pueden ir ejecutando valores entre 0 y 180 grados para fijar visualmente cual es la posición de cero grado y la de 180 grados. Luego le acoplan el módulo MMA7361 y comenzar a girarlo sobre el Eje Y observando en el monitor serial los valores de conversión y, de esta manera armar la función map() de acuerdo a sus necesidades u orientaciones.

Les dejo un video y espero que les haya gustado.

Gustavo Circelli
Gustavo Circelli
Ingeniero Electrónico egresado de la U.N.Mar del Plata, Analista Programador (ISSD Córdoba) , Profesor PDI (UTN). Especialista en Comunicaciones y sistemas automatizados.

Posts relacionados

Post relacionados