La EasyDriver nos da la capacidad de manejar motores paso a paso bipolares con consumos entre 150 mA a 700 mA por fase. Permite el control motores bipolares con mucha facilidad de programación en modo estándar de paso directo, y en modos de micropaso de 1/2, 1/4 y 1/8 de paso.
Con respecto a cuestiones de hardware, se pueden soldar cables directamente al EasyDriver, o utilizar conectores en la alimentación, motores y señales de control para poder realizar cableados de prueba. La mejor opción para usted dependerá de su aplicación.
Lecturas sugeridas
Si usted no está familiarizado con los siguientes conceptos, se recomienda revisarlos antes de empezar a trabajar con la EasyDriver.
• Instalar el entorno de desarrollo integrado de Arduino (IDE)
• Motores paso a paso
• Video motor paso a paso
Descripción general del hardware
La placa EasyDriver fue diseñada por Brian Schmalz, y su núcleo principal es el circuito integrado A3967. Este integrado permite manejar motores paso a paso bipolares con configuraciones de 4, 6 u 8 cables. La placa puede trabajar controlado desde sistemas de 3,3 V o 5V, por lo que es extremadamente versátil. Dos agujeros de montaje en la placa le dan al usuario la opción de sostener la EasyDriver con tornillos o postes de sujeción.
Descripción de las entradas y salidas de la placa
Vamos a echar un vistazo a todos los pines perforados que conectan hacia el exterior el circuito integrado A3967 en la EasyDriver.
Conexiones de la parte superior de la placa
Si se observa a lo largo de la parte superior de la placa, podrá ver varias perforaciones de conexión.
Funcionan de la siguiente manera:
Coil A+ : Salida del puente-H, polo + de la conexión para la bobina A del motor bipolar.
Coil A- : Salida del puente-H, polo – de la conexión para la bobina A del motor bipolar.
Coil B+ : Salida del puente-H, polo + de la conexión para la bobina B del motor bipolar.
Coil B- : Salida del puente-H, polo – de la conexión para la bobina B del motor bipolar.
PFD : Voltaje de entrada que selecciona el modo de descenso de la corriente de la salida. Si PFD > 0,6 Vcc, activa el modo de descenso de corriente lento. Si PFD < 0,21 Vcc, activa el modo de descenso rápido. Si el valor está en 0,21 Vcc < PFD < 0,6 Vcc se produce un descenso intermedio de la corriente.
RST : Entrada lógica. Cuando está en BAJO, todos los comandos son ignorados y todos los transistores de salida se desactivan. Debe ser puesto en ALTO para habilitar el control de los pasos.
ENABLE : Entrada lógica. Permite que funcionen los transistores de salida dentro del puente H que maneja el motor. Si se pone en ALTO, desactiva los transistores, y el chip no manejará el motor. Si se pone en BAJO, los transistores de salida son habilitados, lo que permite el control del motor.
MS2 : Entrada Lógica. Ver tabla de verdad de abajo para los ALTOS y BAJOS que definen la funcionalidad.
GND : Tierra.
M+ : Fuente de alimentación. 6-30V, corriente 2A.
Conexiones de la parte inferior de la placa
También hay conexiones en la parte inferior de la placa. Sus funciones son:
GND : Tierra.
5V : Salida. Este pin puede ser utilizado para alimentar un circuito externo. Se pueden utilizar como máximo 70 mA para asegurar la funcionalidad del controlador.
SLP : Entrada lógica. Cuando pone a BAJO, las salidas están desactivadas y el consumo de energía se reduce al mínimo.
MS1 : Entrada lógica. Ver tabla de verdad de abajo para los ALTOS y BAJOS que definen la funcionalidad.
GND : Tierra.
STEP : Entrada lógica. Cualquier transición en este pin de BAJO a ALTO activa el motor para que avance un paso. La dirección y la extensión de los pasos se controla por la configuración de los pines DIR y MSx. Esta podrá ser de 0 a 5 V, o de 0 a 3 V en base al nivel lógico que se ha seleccionado.
DIR : Entrada lógica. Esta línea determina la dirección de rotación del motor. Los cambios en el estado de ALTO a BAJO, o BAJO a ALTO solo tienen efecto en el siguiente flanco de subida de la línea de comando STEP. Esta podrá ser de 0 a 5 V, o de 0 a 3 V en base al nivel lógico que se ha seleccionado.
Puentes de soldadura
Hay dos conjuntos de puntos de soldadura para soldar puentes de configuración en la placa. Estos proporcionan las siguientes elecciones para el usuario:
3/5 V – Este puente permite que el usuario defina la configuración de VCC entre 3,3 V o 5 V. Con el puente abierto, VCC será de 5 V. Si el puente está cerrado, VCC es de 3,3 V. El valor de VCC define los niveles lógicos que aceptará la placa en sus entradas.
APWR – Este puente habilita que la fuente VCC entregue + y GND en los pines de alimentación de hardware externo.
Potenciómetro de ajuste de corriente
El potenciómetro que se incluye en la placa permite que los usuarios puedan ajustar la corriente máxima que se suministra al motor. El rango de ajuste va de 150 mA a 750 mA. Esto requerirá saber qué valores de corriente puede manejar su motor. Revise la hoja de datos del motor para una calibración correcta.
Si usted no puede encontrar esta información, no se preocupe: todavía puede encontrar el ajuste adecuado de este potenciómetro. En primer lugar, establezca el potenciómetro en su valor mínimo. Tenga en cuenta que el potenciómetro es delicado, así que no fuerce el potenciómetro más allá de los topes mecánicos que lo detienen en ambos extremos de su giro. Aumente lentamente la corriente observando el movimiento del motor. Una vez que el motor se mueva a una velocidad lenta pero constante, gire poco a poco el potenciómetro y preste atención al comportamiento del motor. Usted debe encontrar un punto justo en el que el motor no salte o se observen tirones entre los pasos.
Conectar los cables de las bobinas del motor
Usted tendrá que determinar cuáles son los pares de cables de cada bobina del motor que va a utilizar. El método más fiable para hacerlo es observar la hoja de datos del motor, donde indicará los colores de los cables o la posición de los puntos de conexión.
Sin embargo, si usted va a utilizar cualquier otro motor paso a paso de 4 o 6 cables, es posible determinar los pares correctos de cables de cada bobina a conectar sin tener la hoja de datos.
Determinación de los cables de un motor paso a paso
En un motor de 4 cables, tome uno de los cables y compruebe con un multímetro su resistencia contra cada uno de los tres cables restantes. Aquel cable que muestre el menor valor de resistencia contra el primer cable es el que está apareado con él. Los otros dos cables deben mostrar resistencia similar entre ellos.
Para un motor de 6 cables, usted tendrá que determinar cuáles son los tres cables que están unidos a una bobina. Escoja un cable y pruebe su valor de resistencia contra todos los otros cables. Dos de los cables deben mostrar algún valor de resistencia entre ellos y el primer cable escogido, mientras que los otros tres no mostrarán conexión en absoluto. Una vez que se han determinado cuáles son los tres cables de una bobina, busque a dos entre estos tres que muestren la mayor resistencia entre sí. Estos serán los cables a usar de esta bobina. Repita el procedimiento para el segundo grupo de tres cables.
Una vez que haya determinado los pares de cables de la bobina, debe unirlos a la placa EasyDriver. El par de cables de la primera bobina debe ser conectado a la conexión Coil A+ y el otro a Coil A-. El par de cables de la segunda bobina se conecta a Coil B+ y a Coil B-. Las bobinas no tienen polaridad, así que usted no debe preocuparse de conectar una bobina al revés en la placa. En nuestro ejemplo, estamos usando un motor de 4 cables. Las conexiones entre la EasyDriver y el motor son como sigue.
Conexión EasyDriver al motor (Nema 14, 16 o similar)
Conecte una fuente de alimentación
Una vez que el motor está cableado, puede conectar una fuente de alimentación para la EasyDriver. Se puede utilizar cualquier tipo de fuente de alimentación (de escritorio, adaptador de pared, una batería, etc.), pero compruebe que cualquiera sea la opción que se utilice debe ser capaz de entregar hasta 2 A y estar en el rango de 6 V a 30 V.
Conecte la fuente de alimentación a M+ y GND. Recuerde desconectar la alimentación antes de conectar o desconectar el motor.
Conectar a un microcontrolador
Necesitaremos:
Cables
Arduino UNO R3
Conectores
Motor paso a paso bipolar con corriente de bobina hasta un máximo de 700 mA
Para este ejemplo, vamos a utilizar un Arduino UNO. Sin embargo, cualquier microcontrolador que funcione con una lógica de 3,3 V o 5 V, y que posea entradas / salidas digitales con capacidad de trabajar en modo PWM sirve para utilizar con este ejemplo de circuito.
Aquí están las conexiones para nuestro ejemplo:
Circuito final
Una vez que está todo conectado, el circuito debe tener el siguiente aspecto:
Ejemplo de código básico para el Arduino
Ahora que usted tiene el hardware conectado y listo para funcionar, es el momento de obtener el código y cargarlo. En primer lugar, descargue el programa de ejemplo.
■ DESCARGAR EL PROGRAMA DE DEMOSTRACIÓN DE LA PLACA EASYDRIVER
■ DESCARGAR PROGRAMA COMPLETO CON COMENTARIOS Y NOMBRES EN ESPAÑOL
Para obtener el código más actualizado que esté disponible, se puede consultar el repositorio de GitHub. Si usted necesita un recordatorio en cuanto a cómo se instala una biblioteca en el IDE de Arduino, por favor vea este tutorial aquí.
La primera sección del programa define todas las conexiones entre el Arduino y la EasyDriver. También establece estos pines como salidas, y los pone a los niveles lógicos adecuados para comenzar a manejar el motor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//declarar pines digitales de Arduino #define STEP 2 #define DIR 3 #define MS1 4 #define MS2 5 #define ENABLE 6 //Declarar variables para las funciones char orden_usuario; int x; int y; int estado; void setup() { pinMode(STEP, OUTPUT); pinMode(DIR, OUTPUT); pinMode(MS1, OUTPUT); pinMode(MS2, OUTPUT); pinMode(ENABLE, OUTPUT); resetEDPins(); //PASO, DIR, MS1 y MS2, y ENABLE al estado por defecto Serial.begin(9600); //Abrir una conexion serie para pruebas Serial.println("Inicio de control del motor"); Serial.println(); //Mostrar la lista de funciones de comando Serial.println("Ingrese el número de la opción de control:"); Serial.println("1. Poner en el modo estandar de microstep."); Serial.println("2. Dirección reversa en modo estándar de microstep."); Serial.println("3. Poner en modo de microstep lento a 1/8."); Serial.println("4. Girar hacia adelante y luego hacia atrás."); Serial.println(); } |
Una cosa que debemos señalar es que el código también inicializa la conexión serie a 9600 bps. Esto permite que el usuario dé las indicaciones para controlar la funcionalidad del motor y depurar las conexiones, si es necesario.
El bucle principal del código es bastante simple. Arduino comprueba el puerto serie para ver si hay una orden ingresada por el usuario. Cuando lo recibe, compara con las cuatro posibles funciones para el motor, que inicia su funcionamiento cuando llega la entrada del usuario. Si se escribe una entrada que no sea una de las opciones posibles, Arduino imprime una indicación de error en el puerto serie.
Después de que la solicitud de una función se ha completado, la EasyDriver se restablece a los valores predeterminados.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//Bucle principal void loop() { while(Serial.available()){ orden_usuario = Serial.read(); //Leer la orden del usuario digitalWrite(ENABLE, LOW); //Poner el pin ENABLE en BAJO para habilitar control del motor if (orden_usuario =='1') { PasosAdelanteEstandar(); } else if(orden_usuario =='2') { PasosAtrasEstandar(); } else if(orden_usuario =='3') { ModoPasosPequenos(); } else if(orden_usuario =='4') { PasosAdelanteYAtras(); } else { Serial.println("Opción inválida."); } resetEDPins(); } } |
La primera de las cuatro funciones que se habilita en este programa de demostración es un ejemplo básico que muestra el motor girando en un sentido. El pin de dirección (DIR) se coloca en BAJO (LOW), que para nuestro programa se define como la dirección «Adelante». A continuación, pone el pin STEP a ALTO (HIGH), hace una pausa y, a continuación, lo coloca en BAJO.
Recuerde: el motor da pasos cuando hay transiciones en el pin STEP de BAJO a ALTO, por lo que hay que cambiar el estado del pin una y otra vez. Esto se repite 1000 veces y, a continuación, Arduino solicita una entrada de usuario para determinar la siguiente actividad del motor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//Funcion del modo estandar de microstep void PasosAdelanteEstandar() { Serial.println("Hacia adelante en el modo estándar."); digitalWrite(DIR, LOW); //Poner el pin DIR BAJO para girar hacia "Adelante" for(x= 1; x<1000; x++) //Repetir los pasos hacia adelante suficientes veces para ver el movimiento { digitalWrite(STEP,HIGH); //Dar un paso en direccion Adelante delay(1); digitalWrite(STEP,LOW); //Retornar el pin STEP a BAJO para preparar el proximo paso delay(1); } Serial.println("Ingrese nueva opción"); Serial.println(); } |
La función de giro inverso funciona exactamente de la misma forma que la anterior, la única diferencia es que en lugar de poner el pin de dirección a BAJO, lo establecemos en ALTO, por lo tanto cambiará la dirección de giro del motor.
Una cosa que usted puede probar en cualquiera de estas dos funciones es modificar la velocidad del motor al cambiar el valor pasado a delay(). Está establecido en 1 microsegundo, haciendo que el pulso para cada paso sea de 2 microsegundos. El aumento de la demora reduce la velocidad del motor, mientras que al disminuir el retardo aumenta la velocidad del motor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//Funcion reversa del modo estandar de microstep void PasosAtrasEstandar() { Serial.println("En reversa en el modo estándar."); digitalWrite(DIR, HIGH); //Poner el pin DIR ALTO para girar en "Reversa" for(x= 1; x<1000; x++) //Repetir los pasos hacia adelante suficientes veces para ver el movimiento { digitalWrite(STEP,HIGH); //Dar un paso en direccion AdelanteDar un paso en direccion Reversa delay(1); digitalWrite(STEP,LOW); //Retornar el pin STEP a BAJO para preparar el proximo paso delay(1); } Serial.println("Ingrese nueva opción"); Serial.println(); } |
La tercera función demuestra las diferentes opciones de micropasos (microstepping) que proporciona la EasyDriver. Para habilitar el motor paso a paso a 1/8 de paso, debemos establecer MS1 y MS2 en ALTO. Esto establece la lógica de la placa al modo de 1/8 de paso.
Si usted quiere probar el motor paso a paso con diferentes modos de paso, cambie la configuración de uno de los pines MS#. Compruebe la tabla en la sección de Descripción de Hardware, si usted necesita recordar qué modo se habilita al configurar los diversos estados de las entradas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Funcion modo microstep 1/8 hacia adelante void ModoPasosPequenos() { Serial.println("Dando pasos en modo microstep 1/8."); digitalWrite(DIR, LOW); //Poner el pin DIR BAJO para girar hacia "Adelante" digitalWrite(MS1, HIGH); //Poner MS1 y MS2 ALTO para elegir resolucion de 1/8 microstep digitalWrite(MS2, HIGH); for(x= 1; x<1000; x++) //Repetir los pasos hacia adelante suficientes veces para ver el movimiento { digitalWrite(STEP,HIGH); //Dar un paso en direccion Adelante delay(1); digitalWrite(STEP,LOW); //Retornar el pin STEP a BAJO para preparar el proximo paso delay(1); } Serial.println("Ingrese nueva opción"); Serial.println(); } |
La última función de movimiento disponible muestra cómo el motor puede cambiar de dirección en un instante. La función trabaja como en el avance y retroceso de las funciones anteriores, pero cambia entre los estados con rapidez. Este ejemplo de prueba del motor paso a paso le hace dar 1000 pasos hacia adelante y, a continuación, invertir 1000 pasos. Esto permite, precisamente, mover algo con el motor en una dirección, y volver exactamente a la posición inicial.
El control preciso de posición es una gran ventaja de los motores paso a paso.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//Funcion de pasos Adelante/Reversa void PasosAdelanteYAtras() { Serial.println("Alternar entre dar pasos Adelante y en Reversa."); for(x= 1; x<5; x++) //Repetir los pasos hacia adelante suficientes veces para ver el movimiento { //Leer el estado del pin de direccion y cambiarlo estado=digitalRead(DIR); if(estado == HIGH) { digitalWrite(DIR, LOW); } else if(estado ==LOW) { digitalWrite(DIR,HIGH); } for(y=1; y<1000; y++) { digitalWrite(STEP,HIGH); //Dar un paso delay(1); digitalWrite(STEP,LOW); //Retornar el pin STEP a BAJO para preparar el proximo paso delay(1); } } Serial.println("Ingrese nueva opción:"); Serial.println(); } |
Una vez que la acción concluye, los pines de entrada se deben volver a establecer en el estado predeterminado para evitar comportamientos inesperados del motor, o no deseados. Hacemos uso de la función resetEDPins() para lograr esto.
1 2 3 4 5 6 7 8 9 |
//Reiniciar EasyDriver a un estado por defecto void resetEDPins() { digitalWrite(STEP, LOW); digitalWrite(DIR, LOW); digitalWrite(MS1, LOW); digitalWrite(MS2, LOW); digitalWrite(ENABLE, HIGH); } |
Programa completo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
//declarar pines digitales de Arduino #define STEP 2 #define DIR 3 #define MS1 4 #define MS2 5 #define ENABLE 6 //Declarar variables para las funciones char orden_usuario; int x; int y; int estado; void setup() { pinMode(STEP, OUTPUT); pinMode(DIR, OUTPUT); pinMode(MS1, OUTPUT); pinMode(MS2, OUTPUT); pinMode(ENABLE, OUTPUT); resetEDPins(); //PASO, DIR, MS1 y MS2, y ENABLE al estado por defecto Serial.begin(9600); //Abrir una conexion serie para pruebas Serial.println("Inicio de control del motor"); Serial.println(); //Mostrar la lista de funciones de comando Serial.println("Ingrese el numero de la opcion de control:"); Serial.println("1. Poner en el modo estandar de microstep."); Serial.println("2. Direccion reversa en modo estandar de microstep."); Serial.println("3. Poner en modo de microstep 1/8."); Serial.println("4. Girar hacia adelante y luego hacia atras."); Serial.println(); } //Bucle principal void loop() { while(Serial.available()){ orden_usuario = Serial.read(); //Leer la orden del usuario digitalWrite(ENABLE, LOW); //Poner el pin ENABLE en BAJO para habilitar control del motor if (orden_usuario =='1') { PasosAdelanteEstandar(); } else if(orden_usuario =='2') { PasosAtrasEstandar(); } else if(orden_usuario =='3') { ModoPasosPequenos(); } else if(orden_usuario =='4') { PasosAdelanteYAtras(); } else { Serial.println("Opción inválida."); } resetEDPins(); } } //Reiniciar EasyDriver a un estado por defecto void resetEDPins() { digitalWrite(STEP, LOW); digitalWrite(DIR, LOW); digitalWrite(MS1, LOW); digitalWrite(MS2, LOW); digitalWrite(ENABLE, HIGH); } //Funcion del modo estandar de microstep void PasosAdelanteEstandar() { Serial.println("Hacia adelante en el modo estándar."); digitalWrite(DIR, LOW); //Poner el pin DIR BAJO para girar hacia "Adelante" for(x= 1; x<1000; x++) //Repetir los pasos hacia adelante suficientes veces para ver el movimiento { digitalWrite(STEP,HIGH); //Dar un paso en direccion Adelante delay(1); digitalWrite(STEP,LOW); //Retornar el pin STEP a BAJO para preparar el proximo paso delay(1); } Serial.println("Ingrese nueva opción"); Serial.println(); } //Funcion reversa del modo estandar de microstep void PasosAtrasEstandar() { Serial.println("En reversa en el modo estándar."); digitalWrite(DIR, HIGH); //Poner el pin DIR ALTO para girar en "Reversa" for(x= 1; x<1000; x++) //Repetir los pasos hacia adelante suficientes veces para ver el movimiento { digitalWrite(STEP,HIGH); //Dar un paso en direccion AdelanteDar un paso en direccion Reversa delay(1); digitalWrite(STEP,LOW); //Retornar el pin STEP a BAJO para preparar el proximo paso delay(1); } Serial.println("Ingrese nueva opción"); Serial.println(); } // Funcion modo microstep 1/8 hacia adelante void ModoPasosPequenos() { Serial.println("Dando pasos en modo microstep 1/8."); digitalWrite(DIR, LOW); //Poner el pin DIR BAJO para girar hacia "Adelante" digitalWrite(MS1, HIGH); //Poner MS1 y MS2 ALTO para elegir resolucion de 1/8 microstep digitalWrite(MS2, HIGH); for(x= 1; x<1000; x++) //Repetir los pasos hacia adelante suficientes veces para ver el movimiento { digitalWrite(STEP,HIGH); //Dar un paso en direccion Adelante delay(1); digitalWrite(STEP,LOW); //Retornar el pin STEP a BAJO para preparar el proximo paso delay(1); } Serial.println("Ingrese nueva opción"); Serial.println(); } //Funcion de pasos Adelante/Reversa void PasosAdelanteYAtras() { Serial.println("Alternar entre dar pasos Adelante y en Reversa."); for(x= 1; x<5; x++) //Repetir los pasos hacia adelante suficientes veces para ver el movimiento { //Leer el estado del pin de direccion y cambiarlo estado=digitalRead(DIR); if(estado == HIGH) { digitalWrite(DIR, LOW); } else if(estado ==LOW) { digitalWrite(DIR,HIGH); } for(y=1; y<1000; y++) { digitalWrite(STEP,HIGH); //Dar un paso delay(1); digitalWrite(STEP,LOW); //Retornar el pin STEP a BAJO para preparar el proximo paso delay(1); } } Serial.println("Ingrese nueva opción:"); Serial.println(); } |
Ejemplos adicionales
Además el ejemplo presentado aquí, también se puede instalar la biblioteca AccelStepper. Hay algunos ejemplos adicionales en esta biblioteca que pueden ser beneficiosos para utilizar con su EasyDriver. Descargue e instale la biblioteca en su carpeta de bibliotecas Arduino.
Usted también puede encontrar algunos ejemplos adicionales sobre la EasyDriver en la página aquí.
Recursos Adicionales
Eche un vistazo a estos recursos adicionales para obtener más información y otras ideas para sus proyectos.
• Página de Schmalz Haus sobre el Easy Driver
• Repositorio de GitHub
• Hoja de datos del integrado A3967