Motor paso a paso con módulo ULN2003
El driver o controlador ULN2003 es ampliamente utilizado debido a su precisión, ya que puedes controlar el giro del eje del motor con bastante exactitud. Además, tiene un precio muy bajo.
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 (DATASHEET 28BYJ-48) y su módulo controlador compatible ULN2003
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)
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)); }
Ejemplo de una aplicación
Valoraciones
No hay valoraciones aún.