Motor Paso a Paso Arduino



En esta entrada tomaremos como ejemplo el motor paso a paso 28BYJ-48 y lo controlaremos a través de un UNL2003, sin embargo, veremos que podremos controlar un motor paso a paso con arduino usando transistores en puente H o otro tipo de driver como el L298.

Un motor paso a paso o también conocidos como “stepper motor” es un dispositivo electrónico que permite efectuar un movimiento muy preciso en ángulos pequeños y por pasos en ambas direcciones, por lo tanto este dispositivo es usado en infinidad de procesos de precisión como CNC, impresoras 3D, robots, fotocopiadoras, cortadoras láser entre otros.
Los motores paso a paso son motores de CC que se mueven en pasos discretos. Tienen múltiples bobinas que se organizan en grupos llamados “fases”. Al energizar cada fase en secuencia, el motor rotará, un paso a la vez.
Los pasos del motor son controlados por una computadora o un microcontrolador, pudiendo lograr un posicionamiento muy preciso y / o controlar de velocidad del motor paso a paso. Por esta razón, los motores paso a paso son el motor elegido para muchas aplicaciones de control de movimiento de precisión.
Los motores paso a paso vienen en diferentes tamaños y estilos y características eléctricas. Esta guía detalla lo que necesita saber para elegir el motor adecuado para su trabajo.
Nosotros ya habíamos tenido la oportunidad de hablar de los motores paso a paso en nuestro curso de PIC donde explicamos en detalle su funcionamiento. Ver motor paso a paso con PIC.
Motores Paso a Paso
como puede ser observado en la figura anterior y como ya fue mencionado, el motor paso a paso posee diferentes cables “fases” y es porque internamente dicho motor posee varias bobinas, las cuales deben ser energizadas en una secuencia ordenada para poder conseguir el movimiento del motor.

Tipos de Motores Paso a Paso

Pero antes es importante entender que en el mercado existen dos tipos de motores paso a paso los cuales podremos controlar con Arduino.

Bobinas del motor paso a paso

A continuación podemos ver un esquema que muestra la configuración de las diferentes bobinas dentro de un motor paso a paso unipolar y bipolar.
Motores paso a paso
Estos motores de paso pueden ser encontrados en diferentes dispositivos comunes tales como las impresoras y muchas veces puede resultar especialmente utíl poder reconocer cada uno de los terminales del motor, por lo tanto preparé el siguiente video explicándote como reconocer fácilmente las bobinas y los cables de un motor paso a paso para controlarlo posteriormente con un Arduino.

Motor Paso a Paso Unipolar con Arduino

Este es el motor de paso más común, el cual posee dos bobinas en cada uno de los estatores donde cada una de esas bobinas posee un punto común, por lo tanto este motor típicamente posee 5 o 6 cables. Y viendo esta entrada estarás en la capacidad de controlar un motor paso a paso de 6 cables con Arduino y mucho más.
Los motores unipolares, siempre energizan sus fases de la misma forma. La derivación “común”, siempre será negativa o positiva según nuestro criterio. La otra punta de la derivación contendrá la polarización contraria. Los motores unipolares se pueden implementar con un simple circuito de transistor. La desventaja es que hay menos torque disponible porque solo la mitad de las bobinas se pueden energizar a la vez.

Motor Paso a Paso Bipolar con Arduino

También posee dos bobinas, con la diferencia que no tienen un punto intermedio común, por lo tanto, es fácil intuir que posee 4 cables. Sin embargo, para conseguir el control de este motor bipolar será necesario efectuar una configuración de 2 puente H usando 8 transistores, o bien usando algún driver o integrado especial para poder mandar la secuencia de pasos.
Los motores bipolares necesitan los circuitos de puente H porque es necesario invertir el flujo de corriente a través de las fases. Al energizar las fases alternando la polaridad, todas las bobinas pueden ponerse a trabajar girando el motor.

Movimiento del Motor paso a Paso con Arduino o cualquier Microcontrolador

Para conseguir el movimiento de un motor paso a paso con Arduino o cualquier otro microcontrolador, necesariamente vamos a tener que recurrir a la ayuda de un circuito externo, debido a que un sistema microcontrolado no cuenta con la corriente suficiente para mover este dispositivo con carga.
En el mercado existen vários drivers diseñados para este fin tales como el ULN2003, L298, L296 entre otros, o también podriamos pensar en controlar un motor paso a paso con Arduino sin Driver a través de 4 transistores (unipolar) para activar cada bobina o 8 transistores (bipolar) para hacer una configuración de 2 Puente H que direccione la corriente dentro del motor.
A través de estos dispositivo mandaremos la secuencia en orden para poder mover el motor paso a paso.
Entonces, para poder controlar un motor paso a paso con Arduino podemos emplear alguna de las siguientes 3 secuencias de pasos descritas a continuación:

Secuencia a 1 Fase

Encendemos únicamente una bobina por vez siguiendo la siguiente tabla de verdad.
PasoIn1In2In3In4
1ONOFFOFFOFF
2OFFONOFFOFF
3OFFOFFONOFF
4OFFOFFOFF
ON

Secuencia a 1 paso

Secuencia a 2 pasos

En esta secuencia encendemos de a 2 bobinas para aumentar el Par del motor
PasoIn1In2In3In4
1ONONOFFOFF
2OFFONONOFF
3OFFOFFONON
4ONOFFOFFON

Secuencia a 2 pasos

Secuencia a Medio Paso

Es una combinación de las dos secuencias anteriores donde se enciende 1 bobina intercalada con la activación de 2 bobinas, por lo tanto puede ser aplicado en aplicaciones que requieran de una mayor precisión.

PasoIn1In2In3In4
1ONOFFOFFOFF
2ONONOFFOFF
3OFFONOFFOFF
4OFFONONOFF
5OFFOFFONOFF
6OFFOFFONON
7OFFOFFOFFON
8ONOFFOFFON

Secuencia a medio paso

Invertir giro motor paso a paso

La inversión de giro de un motor paso a paso es sumamente sencilla, para ello solo basta con enviar los pasos mostrados en las tablas anteriores en la dirección contraria, o sea, debemos mirar la tabla de abajo hacia arriba. Si se respeta ese orden en la programación del motor paso a paso con Arduino, conseguiremos invertir el cambio de sentido del motor pap sin ninguna complicación.
Por ejemplo para la secuencia a 1 fase, debemos enviar primero el paso 4, luego el paso 3, luego el paso 2 y finalmente el paso 1.

Usando un Motor Paso a Paso 28BYJ-48 con ULN2003 y Arduino

Para esta práctica del Motor paso a paso con Arduino vamos a usar el popular motor 28BYJ-48 (datasheet) con el driver ULN2003 controlado con Arduino. Por lo tanto esta practica consistirá en un motor paso a paso unipolar con Arduino.

El motor 28BYJ-48 es un motor paso a paso Unipolar, por lo tanto no necesita de un complejo sistema de driver para ser controlado por eso haremos uso del ULN2003 el cual es una agrupación de 7 darlingtons que sirven para proporcionarle la corriente necesaria al motor para moverse.
El motor 28BYJ-48 posee 4 bobinas y usa una reductora de 1 /64 , por lo que si configuramos el arduino con la secuencia de 1 paso o de 2 pasos, el motor necesitará de 4 pasos x 64 = 256 pasos por vuelta, pero si configuramos el motor a pasos con la secuencia de medio paso, el motor necesitará de 8 medios pasos x 64 = 512 pasos por vuelta.

Ejemplo Motor PaP con Arduino UNL2003

Hagamos un ejemplo de un motor paso a paso unipolar arduino.
Crear un programa en arduino usando el driver UNL2003 y el Motor paso a paso 28BYJ-48 que sea capaz de detectar el cambio en 4 pulsadores. Un pulsador servirá para hacer el giro sentido horario, otro pulsador hará el giro anti horario, otro pulsador cambiará la secuencia de pasos para 1, 2 o medio paso y el ultimo pulsador modificará la velocidad del motor.
El esquema es representado a continuación, donde se muestra como conectar un motor paso a paso en Arduino:

Lista de Materiales


1 Arduino
1 Driver UNL2003
1 Motor paso a paso 28BYJ-48
4 Resistencias de 10k
4 Pulsadores


Motor paso a paso arduino L293D y L298 Unipolar

Note que el ejemplo anterior del Motor Paso a Paso con Arduino Unipolar también puede ser implementado con drivers comerciales como el L293D y el Driver L298, que internamente poseen configuraciones en Puente H. Por lo que puedes usar exactamente el mismo código, cambiando el driver que tengas en tu poder.
También puede implementarse el control del motor paso a paso con arduino sin driver utilizando para ello un arreglo de 4 transistores que activen cada una de las bobinas del motor UNIPOLAR.

Motor Paso a Paso Bipolar con Arduino

El ejemplo anterior también puede ser utilizado con Motores Paso a Paso Bipolares, sin embargo el control de este tipo de motor puede resultar un poco más complejo, en el caso que se quiera implementar con un arreglo de 8 transistores para hacer 2 puente H.
A diferencia del motor paso a paso unipolar, el motor paso a paso bipolar tiene dos conductores por fase, ninguno de los cuales es común.
Sin embargo usando los Drivers que poseen puente H internos como el caso del L293D o el L298, es sumamente fácil poner a trabajar nuestros motores BIPOLARES, es más, puede emplearse EXACTAMENTE EL MISMO programa hecho para el motor UNIPOLAR, haciendo las conexiones correctas.

Diferencia en la conexión del Motor PaP Unipolar y Bipolar



CONEXION BIPOLAR UNIPOLAR

Motor Paso a Paso UNIPOLAR y BIPOLAR con Arduino

A continuación se muestra el esquema electrónico del ejemplo, que muestra la conexión para motores paso a paso unipolares y bipolares usando cualquiera de los drivers anteriormente mencionados o inclusive vamos a conectar un motor paso a paso a Arduino sin usar DRIVER y lo más importante es que todos los esquemas usan el MISMO CÓDIGO DE PROGRAMACIÓN DEL ARDUINO.
Inicialmente veamos el esquema del motor paso a paso en proteus:

Motor Paso a Paso UNIPOLAR y BIPOLAR con Arduino

Código Motor Paso a Paso Arduino

Sabes que para bajar el código solo basta con compartir el contenido de este post con cualquiera de los siguientes 3 botones, así ayudas a difundir la información de esta web y que más personas aprendan y conozcan el maravilloso mundo de Arduino.
Si lo deseas Puedes Descargar el Archivo con el Código y con los diagramas de simulación en Proteus 8

//*************************************************************//
//*************************************************************//
//****                                                    *****//
//**** MOTOR PASO A PASO CON ARDUINO                      *****//
//****                                                    *****//
//**** By: SERGIO ANDRES CASTAÑO GIRALDO                  *****//
//**** https://controlautomaticoeducacion.com/            *****//
//**** RIO DE JANEIRO - BRASIL - 2018                     *****//
//****                                                    *****//
//*************************************************************//
//*************************************************************//
//Declaración de los PULSADORES
byte PHorario = 2;     //Pulsador sentido horario
byte PAntiHorario = 3; //Pulsador sentido anti horario
byte PPasos = 4;       //Pulsador numero de pasos
byte PVel = 5;         //Pulsador velocidad
//Declaración de los PINES del Driver
byte IN1=8;  // 28BYJ48 In1
byte IN2=9;  // 28BYJ48 In2
byte IN3=10; // 28BYJ48 In3
byte IN4=11; // 28BYJ48 In4
int horario=1;
//*** Crear Matriz con los Pasos del Motor ***//
int paso=4; //Variable que indica el numero de pasos de las matrices
int Cpaso=0; //Contador de pasos
int vel[5]={5,10,30,100,500}; //Vector de velocidad
int Cvel=0; //Contador de Velocidad
int conf=1; //Variable que configura la secuencia de pasos
//secuencia 1 paso
const int UnPaso[4] = {      B1000, 
B0100, 
B0010, 
B0001 };
//secuencia 2 pasos
const int DosPasos[4] = {    B1100, 
B0110, 
B0011, 
B1001 };
// Secuencia a medio paso
byte const  MedioPaso[8] = { B1000,
B1100,
B0100, 
B0110, 
B0010, 
B0011, 
B0001, 
B1001 };
//Función que coloca en el puerto de salida los bits comenzando
// desde el pin ini hasta el pin fin
void puerto(int bits,int ini,int fin){
for(int i=ini;i<=fin;i++)
{
digitalWrite(i,bitRead(bits,i-ini));
}
}
void setup() {
//Configura los 4 Pines de Pulsadores como ENTRADAS
for(int i=2;i<=5;i++){
pinMode(i,INPUT);
}
//Configura los 4 Pines digitales como SALIDAS
for(int i=IN1;i<=IN4;i++){
pinMode(i,OUTPUT);
}
}
void loop() {
//******************************************************************************//
//***********    Pregunta por los Pulsadores   *********************************//
//******************************************************************************//
// Giro en Sentido Horario
if(digitalRead(PHorario))  // Pregunta si pulsador horario fue presionado
{
delay(100); //Anti-Rebote
horario=1;
Cpaso=-1;
}
// Giro en Sentido Anti-Horario
if(digitalRead(PAntiHorario))  // Pregunta si pulsador horario fue presionado
{
delay(100); //Anti-Rebote
horario=0;
Cpaso=paso;
}
// Cambio de la secuencia de pasos
if(digitalRead(PPasos))  // Pregunta si pulsador horario fue presionado
{
delay(100); //Anti-Rebote
while(digitalRead(PPasos)); //Espera hasta soltar el boton
delay(100); //Anti-Rebote
conf++;
//Si ya paso por las 3 configuraciones reinicie
if(conf>3)
conf=1;
if(horario==1)
Cpaso=-1;
else
Cpaso=paso;
puerto(B0000,IN1,IN4);
}
// Velocidad del Motor
if(digitalRead(PVel))  // Pregunta si pulsador horario fue presionado
{
delay(100); //Anti-Rebote
while(digitalRead(PVel)); //Espera hasta soltar el boton
delay(100); //Anti-Rebote
Cvel++;
//Si ya paso por las 5 velocidades reinicie
if(Cvel>4)
Cvel=0;
}
//******************************************************************************//
//***********    Logica de los contadores      *********************************//
//******************************************************************************//
if(horario==1)
{
Cpaso++;                        //Incremente la variable cont
if(Cpaso>=paso)
Cpaso=0;                          //Se pone Contador de pasos en cero 
else{
Cpaso--;                        //Decremente la variable cont
if(Cpaso<0)
Cpaso=paso-1;                  //Se pone Contador igual al paso
}
//******************************************************************************//
//***********    Secuencia de Movimiento del Motor   ***************************//
//******************************************************************************//
switch(conf){
case 1:
puerto(UnPaso[Cpaso],IN1,IN4); //Envíe al puerto la información de la tabla
paso=4;
break;
case 2:
puerto(DosPasos[Cpaso],IN1,IN4); //Envíe al puerto la información de la tabla
paso=4;
break;
case 3:
puerto(MedioPaso[Cpaso],IN1,IN4); //Envíe al puerto la información de la tabla
paso=8;
break;
}
delay(vel[Cvel]);                      //Retardo de 100 milisegundos
}









































No hay comentarios:

Publicar un comentario