Motor paso a paso unipolar

En éste ejemplo veremos dos ejemplo de como trabajar con un motor paso a paso unipolar. Este tipo de motores los podemos encontrar en disqueteras antiguas, y son muy fáciles de controlar. El que utilizamos en este ejercicio tiene seis conectores en los que dos (o uno dependiendo del diseño del motor) es el voltaje de referencia (VCC) y otros cuantro se utilizan para manejar el motor enviando señales sincronizadas.

En este enlace se muestra más información sobre el funcionamiento de motores paso a paso

El primer ejemplo muestra el código básico para hacer girar el motor en una dirección. Pretende orientar a aquellos que nunca han manejado un motor paso a paso. El segundo ejemplo muestra un código más complejo, que permite hacer girar el motor a distintas velocidades y en ambas direcciones, controlando ambas cosas con un potenciómetro.

En la placa protoboard se ha empleado un potenciómetro de 10K Ohmios que está conectado a una entrada analágica y a un driver ULN2003A. Este driver cuenta con un puñado de transistores en su interior. Estos permiten conectar componentes y dispositivos que necesitan mucha más corriente que la que puede ofrecer el Atmaga8 de la placa Arduino.

Detalle del conexionado del motor paso a paso

Detalle del conexionado del driver ULN2003A

Esquema válido para ambos ejemplos. Para el ejemplo 1 hay que eliminar el potenciómetro

Imagen de una placa protoboard con un potenciómetro y un driver ULN2003A conectados a una placa Arduino

Código fuente

Ejemplo 1: Código básico para manejar un motor paso a paso

 /* Motor paso a paso de Copal
 * ---------------------------
 *
 * Programa para manejar un motor paso a paso unipolar extraido de una 
 * unidad de disquette de 5'25. De acuerdo a la documentación que
 * he encontrado, este: "[...] motor paso a paso fabricado por
 * Copal Electronics, con 1,8 grados por paso y 96 ohmios por cada 
 * vuelta (de la bobina), con una etapa central conectada a diferentes
 * cables [...]"
 * [http://www.cs.uiowa.edu/~jones/step/example.html]
 *
 * Es un motor paso a paso unipolar con cinco cables:
 *
 * - rojo: conector de alimentación, lo tengo a 5V y funciona bien
 * - naranja y negro: bobina 1
 * - marrón y amarillo: bobina 2
 *
 * (cleft) 2005 DojoDave for K3
 * http://www.0j0.org | http://arduino.berlios.de
 *
 * @author: David Cuartielles
 * @date: 20 Oct. 2005
 */

 int motorPin1 = 8;                              // PIN-es del Motor
 int motorPin2 = 9;
 int motorPin3 = 10;
 int motorPin4 = 11;
 int delayTime = 500;                            // Delay que determina la velocidad de giro

void setup() {

  pinMode(motorPin1, OUTPUT);                    // Configuración de los PIN-es como salida digital
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);

}

void loop() {

  digitalWrite(motorPin1, HIGH);                 // Los pines se activan en secuencia
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(delayTime);

}

Ejemplo 2: Código avanzado para manejar un motor paso a paso

 /* Motor paso a paso unipolar avanzado
 * ------------------------------------
 *
 * Programa para manejar un motor paso a paso unipolar extraido de una 
 * unidad de disquette de 5'25. De acuerdo a la documentación que
 * he encontrado, este: "[...] motor paso a paso fabricado por
 * Copal Electronics, con 1,8 grados por paso y 96 ohmios por cada 
 * vuelta (de la bobina), con una etapa central conectada a diferentes
 * cables [...]"
 * [http://www.cs.uiowa.edu/~jones/step/example.html]
 *
 * Es un motor paso a paso unipolar con cinco cables:
 *
 * - rojo: conector de alimentación, lo tengo a 5V y funciona bien
 * - naranja y negro: bobina 1
 * - marrón y amarillo: bobina 2
 *
 * (cleft) 2005 DojoDave for K3
 * http://www.0j0.org | http://arduino.berlios.de
 *
 * @author: David Cuartielles
 * @date: 20 Oct. 2005
 */

 int motorPins[] = {8, 9, 10, 11};                   // PIN-es del motor
 int count = 0;                                      // Contador 1 
 int count2 = 0;                                     // Contador 2
 int delayTime = 500;                                // Delay que determina la velocidad de giro
 int val = 0;

void setup() {

  for (count = 0; count < 4; count++) {              // Configuración de los PIN-es como salida digital 
    pinMode(motorPins[count], OUTPUT);
  }

}

void moveForward() {

  if ((count2 == 0) || (count2 == 1)) {             // Mueve el motor hacia delante. Para hacerlo desplaza los  
    count2 = 16;
  }                                                 // bits de la vable count2 entre los PIN-es del motor.
  count2>>=1;                                       
  for (count = 3; count >= 0; count--) {            // 16 = 00010000 --> 00001000 --> 00000100 --> 00000010 ...
    digitalWrite(motorPins[count], count2>>count&0x01);
  }
  delay(delayTime);

}

void moveBackward() {

  if ((count2 == 0) || (count2 == 1)) {              // Mueve el motor hacia delante. Para hacerlo desplaza los  
    count2 = 16;                                     // bits de la vable count2 entre los PIN-es del motor.
  }
  count2>>=1;
  for (count = 3; count >= 0; count--) {             // 16 = 00010000 --> 00001000 --> 00000100 --> 00000010 ...
    digitalWrite(motorPins[3 - count], count2>>count&0x01);
  }
  delay(delayTime);

}

void loop() {

  val = analogRead(0);
  if (val > 540) {                                   // Cuanto mayor es el valor del potenciómetro 
    delayTime = 2048 - 1024 * val / 512 + 1;         // más rápido se mueve hacia delante
    moveForward();
  } else if (val < 480) {                            // Cuanto menor es el valor del potenciómetro 
    delayTime = 1024 * val / 512 + 1;                // más rápido se mueve hacia atrás
    moveBackward();                                    
  } else {
    delayTime = 1024;                                // Cuando el valor del potenciometro se encuentra 
  }                                                  // en la zona media, el motor se para.

}

Referencias

Con el objetivo de entender mejor este ejemplo, hemos revisado numerosa documentación. Los enlaces que vienen a continuación pueden resultar interesantes con el objetivo de aprender algo más sobre la teoría de motores paso a paso:

  • Castellano:

 - Tutorial sobre motores paso a paso
 - Motores paso a paso
 - Motores paso a paso Bipolares

  • Inglés:

 - Información sobre el motor que estamos utilizando
 - Buena explicación sobre motores paso a paso
 - Buen PDF con información básica