bclose

Mas sobre motores paso a paso

Controlando un motor unipolar como si fuera bipolar

Objetivos

 

 

    • Seguimos jugando con los motores paso a paso.
    • Diferencias entre motores unipolares y bipolares.
    • Convirtiendo un motor unipolar en bipolar.
    • Gobernando un motor bipolar con L293D H-Bridge
 
 

Material requerido.

 

  Tienda España Tienda Mexico
Kit Arduino Uno  Kit inicio UNO Kit inicio UNO
Kit Arduino MEGA Kit Inicio Mega Kit Inicio Mega

 

Motores unipolares y bipolares

 

En las dos últimas sesiones empezamos a hablar de motores pasos a paso y de la jerga que los rodea. Vimos que había motores unipolares y motores bipolares y además dijimos que según el fabricante nos puede entregar 4, 5, 6, u 8 hilos de control.

Revisando un poco lo dicho hasta ahora, si alguien que no había visto nunca un motor paso a paso, ha entendido algo será un milagro. Y francamente, viendo lo mucho que se escribe por Internet del tema, y el barullo semi interesado que pueden montarte, acabaras convenciéndote de que esto no es lo tuyo, pero no señor.

Los motores paso a paso, son una cosa sencilla, pero son muy versátiles y conviene ir pasito a pasito, porque si haces caso a todo lo que lees la cosa se puede complicar mucho, así que vamos a dedicar esta sesión recapitular un poco y demostrarte que no es para tanto.

Recuerda que un motor paso a paso se diseña para que solo se mueva un paso cada vez que excitamos una de sus bobinas (O varias según el caso) y por eso, el circuito de control, o sea nuestro Arduino, tiene que ir excitando en secuencia las bobinas del motor, y por eso tenemos que volver a las configuraciones de las bobinas porque son las que definen como puedo excitar el motor.

Pero tienes que saber algo importante, casi son todos parecidos, (solo casi). Fíjate en estas imágenes de configuraciones:

Al final vamos a tener al menos 4 bobinas, enfrentadas dos a dos (Porque si no va a costar que el motor gire), pero la cuestión es cómo saca el fabricante los hilos de las bobinas al exterior, para que podamos controlar el motor.

En el caso del de 5 hilos, primero excitamos un lado de la bobina del primer grupo y luego la media bobina del otro grupo, después vuelta  a la primera bobina, pero del otro lado y al final la que falta. Pero fíjate que el caso del motor de 5 hilos es igual que el de 6, solo que en el primero el fabricante une los dos hilos centrales.

Y el caso de 8 hilos, es casi lo mismo pero, el fabricante te entrega 8 hilos para que los gobiernes como quieras. ¿Pero… para motores y bobinas similares hay alguna diferencia en esto? Pues poco menos que no (Algo hay pero ahora pasamos de ello).

 
  • No te preocupes por ahora de esto, ya tendrás tiempo más delante de entender las pequeñas diferencias, que tienen que ver con el consumo, el par o la velocidad de giro, por ahora olvídate de todo esto.  

En la práctica eres tu quien configura la excitación de las bobinas porque parece que cuantos más opciones te ofrece el fabricante, más sofisticado es el motor (Y el precio claro, no te olvides de la pasta), pero es bien fácil convertir un motor unipolar de 8 hilos en uno 6 o de 5 y uno de 6 en uno de 5.

Vale, más o menos los motores paso a paso unipolares son poco más o menos equivalentes, pero en cambio los bipolares son muy distintos ¿No?

Vale, pues tampoco. Fíjate en el esquema que parece muy diferente:

DIferencias de configuracion

Tienes marcado en rojo el hilo que une los comunes de las dos bobinas en el motor unipolar. ¿Qué pasa si simplemente los dejas al aire sin conectar? Pues querido amigo, que acabas de conseguir un precioso motor bipolar.

Así que al final, en todo este asunto hay mucho teatro, por parte de unos que esperan cobrarte más por el Show, y porque algunos que no han entendido nada, esperan convencerte de que te dejes aconsejar por ellos que son los que más saben de esto.

Hay un tema básico en que si se diferencian los motores unipolares y bipolares, y es que con un unipolar puedes usar un par de transistores Darlington para excitar una u otra mitad de cada bobina, como hacíamos en la sesión anterior y la costumbre es usar un integrado del tipo del ULN2003A.

En cambio un motor bipolar no puede ser gobernado de ese modo, porque hay que revertir el sentido de circulación de la corriente según en qué fase estés y para eso necesitamos un viejo conocido nuestro: Un H-bridge.

 
  • Recordad que un H-Bridge es capaz de invertir la dirección de circulación de la corriente en su salida.  

Y como no queremos que nadie se quede con dudas, en esta sesión vamos a mover el motorcito que hemos visto, el 28BYJ-48, unipolar, mediante un sencillo H-bridge, el  LS293D  manejándolo como si fuera bipolar (Hoy tengo ganas de guerra, que queréis que os diga) y montaremos  un pequeño circuito para gobernarlo.

En la sesión anterior controlamos el giro y  la secuencia de fases del motor directamente, pero en esta ocasión aprovecharemos para ver que Arduino dispone de una librería para gobernar motores paso a paso, a un mayor nivel de abstracción desentendiéndonos de tan agotador trabajo.

 

Esquema del circuito

 

Coma ya vimos el H-Bridge L293D en una sesión previa, no vamos a insistir con el y os remito a la sesión correspondiente.  Recordemos que este chip tenía dos puentes H-Bridge y que en aquella sesión solo usamos uno de ellos porque era mas que suficiente para gobernar un motor de corriente continua.

La diferencia es que ahora tenemos que manejar los dos H-bridges, porque vamos a tener dos juegos de bobinas, y por ello poned un poco de cuidado con el cableado, porque vamos a conectar unos cuantos cables a la protoboard, y como ya es costumbre con uno mal puesto probablemente dejará de funcionar.

Recordad, también, que para manejar nuestro motor 28BYJ-48 unipolar, como bipolar basta con que nos olvidemos casualmente, de usar el hilo común de las bobinas que en el conector viene de color rojo y listo.

 
  • En Internet he visto varios artículos que recomendaban desmontar el motor y cortar la pista interna que da al cable rojo, o bien cortar el cable rojo.
  • Jesús, que agresivos. Yo prefiero dejar sin conectar el cable correspondiente y no estropear un motorcito que nos puede dar mucho juego manejándolo de un modo u otro según nos convenga.   

Vamos con el esquema:

Esquema electrico

Y para la protoboard, tenemos:

Esquema de Protoboard
 
  • A riesgo de ponerme pesado, fijaros en que el cable rojo está sin conectar, para forzar a que usemos este motor como bipolar.  

 

El programa de control

 

 

Lo primero que vamos a hacer es desentendernos de los detalles de bajo nivel y vamos a usar una librería llamada stepper.h que viene de serie con el IDE moderno de Arduino, por lo que no hace falta que la instales, basta con invocarla: Prog_99_1

#include <Stepper.h>

Para crear una instancia del motor paso a paso, tenemos que definir que pines usamos para gobernar las entradas del motor. Si habéis usado las conexiones que os hemos marcado en el esquema:

const int in1Pin = 12;
const int in2Pin = 11;
const int in3Pin = 10;
const int in4Pin = 9;

Ahora tenemos que definir el número de pasos que nuestro motor tiene por vuelta y crear una instancia de la clase Stepper, pasándole los pines de control definidos:

#define STEPS 512  // Define el numero de pasos del motor. 512 para 28BYJ-48
Stepper motor(STEPS, in1Pin, in2Pin, in3Pin, in4Pin);

El resto es gimnasia:

void setup()
   { pinMode(in1Pin, OUTPUT);
     pinMode(in2Pin, OUTPUT);
     pinMode(in3Pin, OUTPUT);
     pinMode(in4Pin, OUTPUT);

     Serial.begin(115200);
     motor.setSpeed(25);     // Fijar la velocidad en rpms
   }

Lo único digno de mención es la última línea, donde fijamos la velocidad del motor en revoluciones por minuto.

 
  • Yo sé que vais a intentar acelerar un poco el motor, porque es lento que da asco, pero tenéis que entender que la excitación de las bobinas supone la creación de los campos magnéticos que inducen la fuerza electromotriz y eso lleva un cierto tiempo.
  • Dicho de otro modo: Si fijáis una velocidad superior a la que vuestro motor puede excitarse, sencillamente quedará inmóvil (Lo sé la vida es dura)
  • Estos motorcitos tienen un buen par motor, porque tienen una reductora 64: 1, lo que significa que es 64 veces más lento que el motor a pelo.  

Para no aburrirnos, vamos a seguir la costumbre de Internet, para este ejemplo, de recibir por la puerta serie un número entero y usarlo como un número de pasos que el motor debe avanzar si es positivo o retroceder si es negativo:

Contenido solo disponible para suscriptores. ¡Accede al contenido!

  

Pues eso es todo. Para probarlo basta con que después de volcar el programa al Arduino, abráis el terminal serie y marquéis algún numero como 1024 o -2048 y el motor girará lentamente el número de pasos que le especifiquéis.

Aquí os dejo el mini video correspondiente para que veáis el resultado

 

 

Resumen de la sesión

 

 

    • Vimos que no hay tantas diferencias entre un motor paso a paso unipolar y bipolar.
    • Nos dimos cuenta de lo sencillo que es, usar un bipolar como si fuera unipolar.
    • Montamos un pequeño circuito con un H-Bridge para manejar el motor.

 

 

 

 

 

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login

(43) Comments

  • Avatar for Charly
    • MOISES GORGU SANCHEZ

    Buena info, solo que no te desatiendes de los detalles a bajo nivel, es básicamente la info que yo esperaba.

  • Avatar for Charly

    Buenas tardes. ya he logrado mover los motores monopolares como bipolares gracias. pero me aparece la siguiente duda. si al conectar los motores monopolares como si fueran bipolares, y aplicamos el mismo voltaje para el cual fueron construidos , creo que estamos desperdiciando la mitad de la potencia del motor. esto porque al conectarlo como bipolar, estaremos aplicnado el voltaje a dos bobinas en serie en vez de una sola e internamente tendriamos un divisor de voltaje (dos resistencias en serie) asi que cada bobina solo va a recibir la mitad del voltaje que estamos aplicando. mi propuesta es aplicar el doble del voltaje para el cual especificado por el motor. ya lo estoy probando y hasta ahora todo funciona bien.

  • Avatar for Charly
    • Juan carlos macho mangas

    Hola Robert, no estoy seguro del motivo de los 2048 pasos por vuelta porque hace tiempo que no lo miro, pero al final es el fabricante el que te dice cuantos pasos son por vuelta para el mutor sin reductora y luego lo multiplicas por el valor de la reductora. esos es todo

  • Avatar for Charly
    • Robert

    oye me puedes explicar porque el giro. completo es 2048? no era 512?
    le pongo 512 y gira 90°, ya lo hice y no tuve ningún problema en que funcionara pero si quisiera comprender mas sobre el giro.

  • Avatar for Charly
    • Ivan Uriarte

    Hola Nicolas, no tienes más que hacer un contador con la función milis(). Así puedes contar y por ejemplo cambiar una variable de 0 a 1 cada segundo. Si la variable está a 0 lo mueves y a 1 lo paras.

  • Avatar for Charly
    • Nicolas

    Hola que tal. Estoy realizando un proyecto para la universidad donde tengo que establecer una serie de datos que hagan accionar el motor paso a paso. Los datos son 0 o 1 por segundo, es decir si en el segundo 1 hay un 1 el motor se moverá, si en el segundo 2 hay un 0 el motor no se moverá, y así durante un total de 10 minutos. Tienen idea como puedo hacerlo? Gracias!

  • Avatar for Charly
    • Javier Padilla

    Hola, el esquema tiene errores:
    La alimentacion, los «enables», el «vmotor», de todas formas un excelente tutorial. Saludos

  • Avatar for Charly
    • Admin

    Muchas gracias por todo Roman, revisaremos el tema

  • Avatar for Charly
    • Roman

    Kaixo! Muchas gracias por los tutoriales, son muy instructivos!
    Pero quería comentarte que el esquema tiene varios errores de conexión en el L293D. La protoboard por el contrario está bien cableada y funciona bien, aunque a mi con velocidad 25 no se mueve. He leído por ahí que la librería estándar Stepper.h no va muy bien con este motorcillo. Recomiendan el uso de AccelStepper, con la que he conseguido muy buenos resultados.

    Un saludo!

  • Avatar for Charly
    • Ivan

    Hola Cristobal, prueba a poner otro if, en el que le digas que si no ay nada pulsado se pare, a ver si te funciona. Un saludo.

  • Avatar for Charly
    • Cristobal

    buenas, tengo un programa que creo que deberia funcionar pero no es asi, el motor esta todo el tiempo en movimiento y yo solo quiero que funcione con los botones. El programa en cuestión:

    int boton2 = 3;
    int motorPin1 = 8;
    int motorPin2 = 9;
    int motorPin3 = 10;
    int motorPin4 = 11;

    int motor_speed = 4;
    int val1 = 0;
    int val2 = 0;

    void setup()
    {
    pinMode(boton1,INPUT);
    pinMode(boton2,INPUT);
    pinMode(motorPin1,OUTPUT);
    pinMode(motorPin2,OUTPUT);
    pinMode(motorPin3,OUTPUT);
    pinMode(motorPin4,OUTPUT);
    }

    void loop()
    {
    val1 = digitalRead(boton1);
    if(val1 == HIGH)
    {
    digitalWrite(motorPin1,HIGH);
    digitalWrite(motorPin2,LOW);
    digitalWrite(motorPin3,LOW);
    digitalWrite(motorPin4,LOW);
    delay (motor_speed);
    digitalWrite(motorPin1,LOW);
    digitalWrite(motorPin2,HIGH);
    digitalWrite(motorPin3,LOW);
    digitalWrite(motorPin4,LOW);
    delay (motor_speed);
    digitalWrite(motorPin1,LOW);
    digitalWrite(motorPin2,LOW);
    digitalWrite(motorPin3,HIGH);
    digitalWrite(motorPin4,LOW);
    delay (motor_speed);
    digitalWrite(motorPin1,LOW);
    digitalWrite(motorPin2,LOW);
    digitalWrite(motorPin3,LOW);
    digitalWrite(motorPin4,HIGH);
    delay (motor_speed);
    }
    val2 = digitalRead (boton2);
    if(val2 == HIGH)
    {
    digitalWrite(motorPin4,HIGH);
    digitalWrite(motorPin3,LOW);
    digitalWrite(motorPin2,LOW);
    digitalWrite(motorPin1,LOW);
    delay (motor_speed);
    digitalWrite(motorPin4,LOW);
    digitalWrite(motorPin3,HIGH);
    digitalWrite(motorPin2,LOW);
    digitalWrite(motorPin1,LOW);
    delay (motor_speed);
    digitalWrite(motorPin4,LOW);
    digitalWrite(motorPin3,LOW);
    digitalWrite(motorPin2,HIGH);
    digitalWrite(motorPin1,LOW);
    delay (motor_speed);
    digitalWrite(motorPin4,LOW);
    digitalWrite(motorPin3,LOW);
    digitalWrite(motorPin2,LOW);
    digitalWrite(motorPin1 ,HIGH);
    delay (motor_speed);
    }

    }
    gracias de antemano por esta magnífica página que me ha ayudado mucho.

  • Avatar for Charly
    • Mauro

    hola, estoy desarrollando también un tope automático, la idea es hacerlo con un motor nema 23 y un tornillo de bolas, aunque por ahora estoy preparando un prototipo con una varilla roscada hasta probarlo si funciona. Ahora estoy tratando de armar el programa para la arduino usando como variables los steps (para pasarlos a mm con el map) y controlarlo con un teclado y presentarlo en un lcd de 16×2, como hiciste para conectarlos a todos? gracias

  • Avatar for Charly
    • Admin

    Hola Juan Luis,

    Pues no se que decirte porque ya ves que el ejemplo es de lo mas sencillo, hay un hilo que controla la direccion del motor. Yo lo revisaria por si acaso

  • Avatar for Charly

    Hola amigos del foro y admin, tengo creo un problema y es el siguiente: copio el programa correctamente y realizo las conexiones de igual forma Y me funciona bien con un valor positivo PERO al ingresar un valor negativo el motor no gira en sentido contrario, se queda medio trabado o me gira positivamente …. queria saber que problema tengo en este momento , sera el motor paso a paso que esta malo?
    PD: es la misma referencia que aca se mensiona y el codigo es copiado (esta exactamente igual), me funciona con valores positivos pero cuando ingreso negativos no genera un giro contrario.
    A que se puede deber este problema?
    Gracias

  • Avatar for Charly
    • Beto

    Hola Amigos del foro.
    Quería contarles que hice un gran avance (me parece) en cuanto a mi proyecto, “Tope Automatico”.
    Lo que logré es que al teclear los mm., estos, se vean en el LCD, luego apretando otra tecla (‘B’), el motor se mueve una determinada cantidad de pasos, desplazando por supuesto al tope hasta la medida indicada.

    Hasta aqui todo barbaro.
    Ahora pido ayuda…..

    El problema es que no se como hacer, para que una vez que el motor llegó a su destino se quede como en Pausa. Ya que si sigo apretando la tecla (‘B’) el ciclo se vuelve a repetir infinitas veces .

    Ademas apretando otra tecla (‘C’) logro borrar la pantalla, pero, al volver a cargar otra medida, me vuelve a aparecer el numero anterior más este.

    No se que hacer para que mi programa “se olvide” del dato anterior y pueda comenzar de nuevo…

    Ojalá alguien me pueda echar una mano, porque estoy estancado con esto…
    Gracias
    Saludos, Beto.

  • Avatar for Charly
    • Admin

    No sabria que decirte Demian, porque aparentemente y por lo que he visto en internet es similar al Nema 17 que hemos utilizado en algun otro tuto, pero yo probaria a bajarle la velocidad a ver que pasa ¿Vale?

  • Avatar for Charly

    Hola buenas tardes tengo un motor NEMA 23 y al momento de probarlo con este programa lo único que hace es vibrar y no gira para ninguno de los lados, la alimentación del motor es de 12v con una fuente ATX, su consumo es de 2A, anteriormente lo probé con otro motor NMB PM55L-048-HPG9 que es de 48 pasos y todo resultó perfecto, también lo alimenté con 12V pero su consumo es más bajo de 800mA y el NEMA 23 es de 200 pasos, probé variando los pasos del motor en el programa y la velocidad aun así no para de vibrar, me podrías decir que estoy haciendo mal por favor

    Mil gracias!!
    Saludos

  • Avatar for Charly
    • Beto

    Hola Ivan
    Gracias por tu aporte, todo me ayuda…
    Saludos, Beto.

  • Avatar for Charly
    • Ivan

    Hola Beto, no estoy seguro de entender bien, pero si lo que quieres es que cuando el metas un valor por el puerto serie el motor avance un cierto número de pasaos hacia uno u otro lado, sólo tendrías que poner un par de condicionales if y si se cumple la condición usar la instrucción motor.step(steps); donde steps sea el número de pasos que quieras que se mueva.

    Un saludote!

  • Avatar for Charly
    • Beto

    Hola admin…. gracias por responder.
    Veras, a la parte mecanica, no le tengo miedo, lo que no estoy logrando es la electronica. Por el momento logro ingresar el valor en el lcd mediante el teclado, pero no logro que a determinado valor, el motor gire x vueltas.
    Otra cosa que estoy analizando es lo de las operaciones aritméticas (suma y resta), para que cuando se encuentre en una posicion y se le ingrese una nueva medida, pueda restar o sumar y se mueva desde ahí (ojalá me entiendas), en vez de tener que resetear y arrancar desde cero todas las veces.
    Si tenés algun dato o consejo… desde ya muchas gracias…
    Beto.

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login