Un motor paso a paso es un dispositivo electromecánico que convierte pulsos eléctricos en movimientos mecánicos exactos. El eje de un motor paso a paso gira en pasos de ángulos fijos cuando se le aplican impulsos eléctricos en la secuencia correcta. La dirección de rotación del eje del motor se relaciona directamente con la secuencia de los pulsos. La velocidad de la rotación del eje está relacionada con la frecuencia de los pulsos de entrada y la duración de la rotación está relacionada con la cantidad de pulsos que se aplican a la entrada.
Una de las ventajas más importantes de un motor paso a paso es su capacidad de ser controlado con precisión en un sistema de lazo abierto, es decir, sin necesidad de ninguna realimentación que indique su posición. Este tipo de control elimina la necesidad de costosos dispositivos de detección y ajuste, como los codificadores ópticos.
Para ampliar su conocimiento en más detalle sobre motores paso a paso ver aquí.
28BYJ-48 y su módulo controlador asociado ULN2003
El motor 28BYJ-48 tiene un ángulo de paso de 5,625 grados (64 pasos por vuelta usando half-step). El reductor interno tiene una relación de 1/64. Combinados, la precisión total es 64 x 64 = 4096 pasos por vuelta, equivalente a un paso de 0,088°, que resulta en una precisión muy elevada. Debido a alguna razón mecánica que el fabricante no explica, no son exactamente 4096: es necesario aclarar que la cantidad verdadera de pasos para dar una vuelta completa de 360° —como verán en el programa— es de 4076.
Los parámetros de este motor paso a paso son:
- Modelo: 28BYJ-48 – 5V
- Tensión nominal: 5V (o 12 V, valor indicado en la parte trasera).
- Cantidad de fases: 4.
- Reductor de velocidad: 1/64
- Ángulo de paso: 5,625° / 64
- Frecuencia: 100Hz
- Resistencia en CC: 50Ω ±7 % (25° C)
- Frecuencia con tracción: > 600Hz
- Frecuencia sin tracción: > 1000Hz
- Torque con tracción: >34,3mN.m (120Hz)
- Torque en autoposicionamiento: >34,3mN.m
- Torque con fricción: 600-1200 gf.cm
- Arrastre en torque: 300 gf.cm
- Resistencia de aislación > 10MΩ (500V)
- Aislación eléctrica: 600VAC/1mA/1s
- Grado de aislación: A
- Aumento de temperatura: < 40K (120Hz)
- Ruido: < 35dB (120Hz, sin carga, 10cm)
El integrado ULN2003
Consiste en un conjunto de 7 pares de transistores en configuración Darlington, con diodo de protección de contracorriente. Cada salida es capaz de manejar 500 mA y hasta 50V en sus salidas.
Diagrama interno de cada circuito:
Los circuitos de transistores Darlington tienen un resistor en la entrada, de modo que se los puede conectar directamente a la salida de un microcontrolador. También tienen protección con un diodo para evitar daños en las entradas, si accidentalmente se les aplica un voltaje negativo.
¿Cómo se acciona?
El motor tiene cuatro bobinados que son excitados en una precisa secuencia para hacer girar el eje.
En el modo elegido, de medio paso, o “half step”, primero se excita una bobina, luego dos a la vez, luego la siguiente… Y así hasta completar la secuencia. Para cambiar el sentido de giro, simplemente se invierte el orden de la secuencia.
Diagrama de las dos secuencias usadas habitualmente
Por eso, en la secuencia de medio paso (half step, en inglés), la variación de señales necesaria para el funcionamiento en uno u otro sentido tiene 8 combinaciones, tal como lo muestra el cuadro.
Vista del conector al motor y las salidas A, B, C, D y E (entrada de alimentación):
Diagrama de la placa de control:
A (Azul), B (Rosa), C (Amarillo), D (Naranja), E (Rojo)
La conexión entre el módulo y el motor no requiere mucha atención ya que tiene un conector con ranuras para guiar la unión entre los dos dispositivos.
El módulo posee cuatro leds que indican qué bobina está activada (dibujo de arriba) en cada momento.
La salida de 5V de la placa Arduino es suficiente para un motor, pero si su proyecto tiene más elementos conectados, debe usar una fuente de alimentación externa de 5V, debido a que se puede exceder la corriente que es capaz de suministrar el microcontrolador.
Los pines IN1, IN2, IN3 e IN4 se conectan a cuatro salidas digitales del Arduino (pines digitales del 8 al 11 empezando, por el IN1 con el 8).
Programa
El programa tal como se ve está preparado para el modo de medio paso, o half-step, ya que es el que recomienda el fabricante. Sin embargo, cambiando los signos // de comentario en el programa de un bloque de código a otro, es posible probar los tres modos en el motor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
//definicion de pines const int pinMotor1 = 8; // 28BYJ48 - In1 const int pinMotor2 = 9; // 28BYJ48 - In2 const int pinMotor3 = 10; // 28BYJ48 - In3 const int pinMotor4 = 11; // 28BYJ48 - In4 //definicion variables int velocidadMotor = 1000; // variable para determinar la velocidad // 800 maxima - minima 1000 o mas int contadorPasos = 0; // contador para los pasos int pasosPorVuelta = 4076; // pasos para una vuelta completa // Tablas con la secuencia de encendido // quitar signo de comentar a la necesaria) //secuencia 1-fase usar velocidadMotor = 2000 //const int cantidadPasos = 4; //const int tablaPasos[4] = { B1000, B0100, B0010, B0001 }; //secuencia 2-fases usar velocidadMotor = 2000 //const int cantidadPasos = 4; //const int tablaPasos[4] = { B1001, B1100, B0110, B0011 }; //secuencia media fase usar velocidadMotor = 1000 const int cantidadPasos = 8; const int tablaPasos[8] = { B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 }; void setup() { //declarar pines como salida pinMode(pinMotor1, OUTPUT); pinMode(pinMotor2, OUTPUT); pinMode(pinMotor3, OUTPUT); pinMode(pinMotor4, OUTPUT); } void loop() { for (int i = 0; i < pasosPorVuelta * 2; i++) { sentidoHorario(); delayMicroseconds(velocidadMotor); } delay(200); for (int i = 0; i < pasosPorVuelta * 2; i++) { sentidoAntihorario(); delayMicroseconds(velocidadMotor); } delay(200); } void sentidoHorario() // en dirección de las agujas del reloj { contadorPasos++; if (contadorPasos >= cantidadPasos) contadorPasos = 0; escribirSalidas(contadorPasos); } void sentidoAntihorario()// en dirección contraria a las agujas del reloj { contadorPasos--; if (contadorPasos < 0) contadorPasos = cantidadPasos - 1; escribirSalidas(contadorPasos); } void escribirSalidas(int paso) { digitalWrite(pinMotor1, bitRead(tablaPasos[paso], 0)); digitalWrite(pinMotor2, bitRead(tablaPasos[paso], 1)); digitalWrite(pinMotor3, bitRead(tablaPasos[paso], 2)); digitalWrite(pinMotor4, bitRead(tablaPasos[paso], 3)); } |
Este programa hace girar al motor dos vueltas completas en un sentido, y luego dos vueltas en el otro sentido. Es posible cambiar algunos parámetros para ver su funcionamiento en tres modos diferentes.
Presento aquí un interesante diseño realizado con cuatro de estos motores como tracción y cuatro servos para darles dirección. Su creador lo ha llamado Stepperbot. He aquí una foto del proyecto (al que, sin duda, habría que quitarle una buena cantidad de peso acortando los cables al mínimo). Con menor peso podía moverse más rápido, utilizando ruedas de mayor diámetro.
Lo interesante es la gran flexibilidad de movimientos que ha logrado. Agrego un video para mostrar su desplazamiento.