El objetivo de este tutorial es tener la primera toma de contacto con los famosos motores paso a paso, tan útiles que se pueden encontrar en muchas aplicaciones como robots o impresoras 3D.
¿Por qué? Esto es debido a su precisión, ya que puedes controlar el giro del eje del motor con bastante precisión. Su funcionamiento, de forma muy simplificada, es parecida a la de los servos, con la diferencia de que no existe la limitación de giro de 180 grados, sino que pueden dar vueltas completas como si un motor de corriente continua se tratase. Y es justo esta su ventaja frente a los motores de corriente continua, una mayor precisión en el movimiento de los mismos. Por contra, son más complejos de usar, lo cual no son
recomendables en proyectos donde no se necesite la ya comentada alta precisión.
Motor de paso a paso 28BYJ-48 y su módulo controlador compatible ULN2003
Este motor venía con el starter kit que nos compramos para empezar en el mundo de Arduino. ¿No lo tienes? No te preocupes, son baratos y fáciles de encontrar por la red.
Es pequeño, ligero y funciona a 5V, lo que hace perfecto a la hora de usarlo con la placa Arduino (aunque el voltaje de entrada puede ampliarse hasta 12V).
En la hoja de catálogo de este componente, nos encontramos que ofrece un par decente a unas 15 RPM (revoluciones por minuto). De los dos modos "de paso" que tiene (half-step mode y full-step mode), vamos a usar el "hal-step mode"(el recomendado por el fabricante), que nos ofrece el uso de 8 señales de frecuencia de paso con unos resultados de 5.625 grados por paso, un total de 64 pasos por vuelta.
¿Cómo funciona?
El motor tiene 4 bobinas que son excitadas en una secuencia para hacer girar el eje.
En el modo elegido, primero excitamos la bobina 1, luego la 1 y la 2 a la vez, luego la 2... Y así hasta completar la secuencia. De ahí las 8 señales necesarias para el funcionamiento, tal y como muestra la figura:
A (Azul), B (Rosa), C (Amarillo), D (Naranja), E (Rojo)
La conexión entre el módulo y el motor es bastante intuitiva ya que tiene un conector con ranuras para guiar el acople entre los dos dispositivos.
Veremos en el módulo que existen 4 leds que indican qué bobina está actuando (mirar esquema de arriba).
Se recomienda el uso de baterías externas para la alimentación de 5V y no usar la salida de la placa Arduino, debido a que se necesita más corriente de la que el microcontrolador puede suministrar (92mA frente a los 40mA máximos que ofrece la placa)..
Los pines IN1, IN2, IN3 e IN4 son los que irán conectados a las salidas digitales del Arduino (pines digitales del 8 al 11 empezando por el IN1 con el 8).
Programa
Se va a usar un programa diferente al que viene pre-instalado en el IDE de Arduino , ya que dicho programa usa el full-step mode y nosotros queremos utilizar, por recomendación del fabricante, el half-step mode.
// Este ejemplo demuestra que el motor 28BYJ-48 opera de forma // bidireccional, usando un módulo ULN2003. //La frecuencia de operación es 100Hz. Y la corriente de 92mA. //////////////////////////////////////////////// //declaración de las variables para los pines del motor int motorPin1 = 8; // Azul - 28BYJ48 pin 1 motor int motorPin2 = 9; // Rosa - 28BYJ48 pin 2 motor int motorPin3 = 10; // Amarillo - 28BYJ48 pin 3 motor int motorPin4 = 11; // Naranja - 28BYJ48 pin 4 motor // Rojo - 28BYJ48 pin 5 (VCC) motor int motorSpeed = 1200; //variable para fijar la velocidad del motor (el retraso entre cada secuencia) int count = 0; // cuenta de los pasos dados int countsperrev = 512; // número de pasos por vuelta completa int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001}; void setup() { //declare the motor pins as outputs pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); Serial.begin(9600); } void loop(){ if(count < countsperrev ) clockwise(); //sentido agujas del reloj else if (count == countsperrev * 2) count = 0; else anticlockwise(); //sentido antihorario count++; } //creación funciones giro horario y antihorario void anticlockwise() { for(int i = 0; i < 8; i++) { setOutput(i); delayMicroseconds(motorSpeed); } } void clockwise() { for(int i = 7; i >= 0; i--) { setOutput(i); delayMicroseconds(motorSpeed); } } void setOutput(int out) //función secuencia giro { digitalWrite(motorPin1, bitRead(lookup[out], 0)); digitalWrite(motorPin2, bitRead(lookup[out], 1)); digitalWrite(motorPin3, bitRead(lookup[out], 2)); digitalWrite(motorPin4, bitRead(lookup[out], 3)); }