Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* TITULO: Control del motor a pasos unipolar 28BYJ-48 mediante el driver ULN2003
- AUTOR:
- MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA
- - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia
- - TWITTER: https://twitter.com/MarianoCampoGa
- - CORREO: marianodc83@gmail.com
- DESCRIPCIÓN DEL PROGRAMA
- Con este programa seremos capaces de controlar tanto el sentido y velocidad de giro como la posición
- del eje del motor a pasos unipolar 28BYJ-48 a través del módulo driver ULN2003, siempre que previamente
- hayamos hechos las conexiones oportunas de las que el conjunto requiere y hayamos cargado el programa
- correctamente en nuestro Arduino. El programa consta de 5 estados de movimiento posibles que comandaremos
- a través de un interruptor táctil capacitivo TTP224 de 4 Vías de la siguiente manera:
- - Botón 1 -> El eje del motor a pasos se mueve una vuelta en sentido horario y con velocidad rápida
- - Botón 2 -> El eje del motor a pasos se mueve una vuelta en sentido antihorario y con velocidad rápida
- - Botón 3 -> El eje del motor a pasos se mueve media vuelta en sentido horario y con velocidad lenta
- - Botón 4 -> El eje del motor a pasos se mueve media vuelta en sentido horario y con velocidad lenta
- - Si no pulsamos ningun botón, el eje del motor a pasos permanece en reposo.
- Si abrimos el monitor serie podremos observar los correspondientes mensajes sobre el estado de movimiento
- o no del eje del motor a pasos en cada momento.
- ESQUEMA DE CONEXION
- +-----+
- +----[PWR]-------------------| USB |--+
- | +-----+ |
- | GND/RST2 [ ][ ] |
- | MOSI2/SCK2 [ ][ ] A5/SCL[ ] |
- | 5V/MISO2 [ ][ ] A4/SDA[ ] |
- | AREF[ ] |
- | GND[ ] |
- | [ ]N/C SCK/13[ ] |
- | [ ]IOREF MISO/12[ ] |
- | [ ]RST MOSI/11[ ]~| "INI4" del modulo driver ULN2003
- | [ ]3V3 +---+ 10[ ]~| "INI3" del modulo driver ULN2003
- | [ ]5v -| A |- 9[ ]~| "INI2" del modulo driver ULN2003
- | [ ]GND -| R |- 8[ ] | "INI1" del modulo driver ULN2003
- | [ ]GND -| D |- |
- | [ ]Vin -| U |- 7[ ] | "OUT 1" del interruptor táctil capacitivo TTP224 de 4 Vías
- | -| I |- 6[ ]~| "OUT 2" del interruptor táctil capacitivo TTP224 de 4 Vías
- | [ ]A0 -| N |- 5[ ]~| "OUT 3" del interruptor táctil capacitivo TTP224 de 4 Vías
- | [ ]A1 -| O |- 4[ ] | "OUT 4" del interruptor táctil capacitivo TTP224 de 4 Vías
- | [ ]A2 +---+ INT1/3[ ]~|
- | [ ]A3 INT0/2[ ] |
- | [ ]A4/SDA RST SCK MISO TX>1[ ] |
- | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] |
- | [ ] [ ] [ ] |
- | UNO_R3 GND MOSI 5V ____________/
- \_______________________/
- NOTAS:
- - La alimentación y la masa del interruptor táctil capacitivo TTP224 de 4 Vías van directamente
- conectadas a +3,3VDC y GND de nuestro Arduino respectivamente (también acepta la salida de +5VDC)
- - La alimentación y la masa del modulo driver ULN2003 van directamente conectadas a +5VDC y GND
- de nuestro Arduino respectivamente, aunque acepta una alimentación de hasta +12VDC.
- */
- // Declaración de las variables para los pines del módulo driver ULN2003
- int IN1 = 8; // Pin digital para el pin IN1 del módulo driver ULN2003 (Cable Azul)
- int IN2 = 9; // Pin digital para el pin IN2 del módulo driver ULN2003 (Cable Rosa)
- int IN3 = 10; // Pin digital para el pin IN3 del módulo driver ULN2003 (Cable Amarillo)
- int IN4 = 11; // Pin digital para el pin IN4 del módulo driver ULN2003 (Cable Naranja)
- int velocidad_motor; // Variable para fijar la velocidad motor (mínimo 900ms)
- int pasos; // Variable que almacena el número de pasos a ejecutar (512 por vuelta completa)
- // Matriz para las 8 señales de la secuencia en modo "Half-step"
- int secuencia[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
- // Declaración de las variables para el interruptor táctil TTP224
- int horario_rapido = 7; // Pin digital para la salida OUT1 del interruptor táctil TTP224
- int antihorario_rapido = 6; // Pin digital para la salida OUT2 del interruptor táctil TTP224
- int media_horario_lenta = 5; // Pin digital para la salida OUT3 del interruptor táctil TTP224
- int media_antihorario_lenta = 4; // Pin digital para la salida OUT4 del interruptor táctil TTP224
- // Declaración de las variables internas de control del programa
- int imprimo = 1;
- int boton = 0;
- int paro = 1;
- int i;
- void setup()
- {
- Serial.begin(9600); // Comienzo de la comunicación con el monitor serie
- pinMode(horario_rapido, INPUT); // Pin digital 7 como entrada
- pinMode(antihorario_rapido, INPUT); // Pin digital 6 como entrada
- pinMode(media_horario_lenta, INPUT); // Pin digital 5 como entrada
- pinMode(media_antihorario_lenta, INPUT); // Pin digital 4 como entrada
- pinMode(IN1, OUTPUT); // Pin digital 8 como salida
- pinMode(IN2, OUTPUT); // Pin digital 9 como salida
- pinMode(IN3, OUTPUT); // Pin digital 10 como salida
- pinMode(IN4, OUTPUT); // Pin digital 11 como salida
- }
- void loop()
- {
- // Si pulsamos el botón 1 del interruptor táctil capacitivo TTP224...
- if(digitalRead(horario_rapido) == HIGH)
- {
- completa_rapido();
- boton = 1;
- }
- // Si pulsamos el botón 2 del interruptor táctil capacitivo TTP224...
- if(digitalRead(antihorario_rapido) == HIGH)
- {
- completa_rapido();
- boton = 2;
- }
- // Si pulsamos el botón 3 del interruptor táctil capacitivo TTP224...
- if(digitalRead(media_horario_lenta) == HIGH)
- {
- media_lento();
- boton = 3;
- }
- // Si pulsamos el botón 4 del interruptor táctil capacitivo TTP224...
- if(digitalRead(media_antihorario_lenta) == HIGH)
- {
- media_lento();
- boton = 4;
- }
- // Se evalúa el botón que hemos pulsado para así ejecutar el movimiento correspondiente
- switch(boton)
- {
- // El eje del motor a pasos permanece en reposo
- case 0:
- if(paro == 1)
- {
- Serial.print("Motor a pasos detenido !!!\n");
- paro = 0;
- }
- break;
- // El eje del motor a pasos gira una vuelta completa en sentido horario con velocidad rápida
- case 1:
- if(imprimo == 1)
- {
- Serial.print("Una vuelta completa rapida en sentido horario !!!\n");
- imprimo = 0;
- }
- // Giro en sentido horario
- for(i=0; i <= pasos; i++)
- {
- horario();
- }
- control();
- break;
- // El eje del motor a pasos gira una vuelta completa en sentido antihorario con velocidad rápida
- case 2:
- if(imprimo == 1)
- {
- Serial.print("Una vuelta completa rapida en sentido antihorario !!!\n");
- imprimo = 0;
- }
- // Giro en sentido antihorario
- for(i=0; i <= pasos; i++)
- {
- antihorario();
- }
- control();
- break;
- // El eje del motor a pasos gira media vuelta en sentido horario con velocidad lenta
- case 3:
- if(imprimo == 1)
- {
- Serial.print("Media vuelta lenta en sentido horario !!!\n");
- imprimo = 0;
- }
- // Giro en sentido horario
- for(i=0; i <= pasos; i++)
- {
- horario();
- }
- control();
- break;
- // El eje del motor a pasos gira media vuelta en sentido antihorario con velocidad lenta
- case 4:
- if(imprimo == 1)
- {
- Serial.print("Media vuelta lenta en sentido antihorario !!!\n");
- imprimo = 0;
- }
- // Giro en sentido antihorario
- for(i=0; i <= pasos; i++)
- {
- antihorario();
- }
- control();
- break;
- }
- }
- // Función para el giro del eje del motor a pasos en sentido horario
- void horario()
- {
- for(int i = 7; i >= 0; i--)
- {
- activa_salidas(i);
- delayMicroseconds(velocidad_motor);
- }
- }
- // Función para el giro del eje del motor a pasos en sentido antihorario
- void antihorario()
- {
- for(int i = 0; i < 8; i++)
- {
- activa_salidas(i);
- delayMicroseconds(velocidad_motor);
- }
- }
- // Función que configura una vuelta del eje del motor a pasos con velocidad rápida
- void completa_rapido()
- {
- pasos = 512; // Vuelta completa del eje del motor a pasos
- velocidad_motor = 900; // Velocidad rápida
- }
- // Función que configura media vuelta del eje del motor a pasos con velocidad lenta
- void media_lento()
- {
- pasos = 256; // Media vuelta del eje del motor a pasos
- velocidad_motor = 4000; // Velocidad lenta
- }
- // Función que inicializa las variables internas de control del programa
- void control()
- {
- boton = 0;
- imprimo = 1;
- paro = 1;
- }
- // Función que realiza la secuencia de excitación de las bobinas del motor a pasos
- void activa_salidas(int salida)
- {
- digitalWrite(IN1, bitRead(secuencia[salida], 0));
- digitalWrite(IN2, bitRead(secuencia[salida], 1));
- digitalWrite(IN3, bitRead(secuencia[salida], 2));
- digitalWrite(IN4, bitRead(secuencia[salida], 3));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement