Learning   Examples | Foundations | Hacking | Links

Motor paso a paso Bipolar

En esta página se muestran dos ejemplos de como controlar un motor paso a paso bipolar. Estos motores se pueden encontrar en unidades de diskette y son fáciles de controlar. El que nosotros usaremos es uno con 5 cables de los cuales uno es alimentación y los otros cuatros son usados para controlar el motor enviando señales síncronas.

El primer ejemplo corresponde a el código básico para hacer que el motor gire en una dirección. Está orientado para aquellos que no poseen conocimientos sobre el control de motores paso a paso. El segundo ejemplo posee un código un poco más complejo que permite hacer girar el motor con diferentes velocidades, en ambas direcciones y siendo controlado mediante un potenciómetro.

En la placa de prototipado se ha añadido un potenciómetro de 10K que conectamos a una entrada analógica, y un integrado ULN2003A. Este integrado posee varios transistores en un mismo encapsulado. Permite la conexión de dispositivos y componentes que necesitan mucha más corriente de lo que nuestra placa Arduino puede ofrecer.

Foto de una protoboard con el chip ULN2003A y un potenciómetro

Ejemplo 1: Ejemplo simple

 
/* Paso a paso Copal
 * -------------
 *
 * Programa para controlar un motor paso a paso que proviene de una disquetera de 5,25.
 * de acuerdo con la documentación que he encontrado, este motor paso a paso: "[...]  
 * hecho por Copal Electronics, con 1.8 grados por paso y 96 ohmios 
 * por devanado, con el punto central de los devanados conectados a uno de los terminales exteriores [...]"
 * [http://www.cs.uiowa.edu/~jones/step/example.html]
 *
 * Es un motor bipolar con 5 terminales:
 * 
 * - rojo: conector de alimentación, lo he conectado a 5V y funciona bien.
 * - naranja y negro: bobina 1
 * - marrón y amarillo: bobina 2
 *
 * (cleft) 2005 DojoDave para K3
 * http://www.0j0.org | http://arduino.berlios.de
 *
 * @autor: David Cuartielles
 * @fecha: 20 Oct. 2005
 */

int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;
int delayTime = 500;

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

void loop() {
  digitalWrite(motorPin1, HIGH);
  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: Paso a paso Bipolar ejemplo Avanzado

 
/* Paso a paso Bipolar Avanzado
 * ------------------------
 *
 * Programa para controlar un motor paso a paso que pertenecía a una disquetera de 5,25
 * de acuerdo con la documentación encontrada este motor paso a paso"[...] 
 * hecho por Copal Electronics, con 1.8 grados por paso y 96 ohmios  
 * por devanado,con el punto central de los devanados conectados a uno de los terminales exteriores [...]"
 * [http://www.cs.uiowa.edu/~jones/step/example.html]
 *
 * Este es un motor bipolar con 5 terminales:
 * 
 * - rojo: alimentación, lo he conectado a 5V y funciona bien
 * - naranja y negro: bobina 1
 * - marrón y amarillo: bobina 2
 *
 * (cleft) 2005 DojoDave para K3
 * http://www.0j0.org | http://arduino.berlios.de
 *
 * @author: David Cuartielles
 * @date: 20 Oct. 2005
 */

int motorPins[] = {8, 9, 10, 11};
int count = 0;
int count2 = 0;
int delayTime = 500;
int val = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  for (count = 0; count < 4; count++) {
    pinMode(motorPins[count], OUTPUT);
  }
}

void moveForward() {
  if ((count2 == 0) || (count2 == 1)) {
    count2 = 16;
  }
  count2>>=1;
  for (count = 3; count >= 0; count--) {
    digitalWrite(motorPins[count], count2>>count&0x01);
  }
  delay(delayTime);
}

void moveBackward() {
  if ((count2 == 0) || (count2 == 1)) {
    count2 = 16;
  }
  count2>>=1;
  for (count = 3; count >= 0; count--) {
    digitalWrite(motorPins[3 - count], count2>>count&0x01);
  }
  delay(delayTime);
}

void loop() {
  val = analogRead(0);
  if (val > 540) {
    // move faster the higher the value from the potentiometer
    delayTime = 2048 - 1024 * val / 512 + 1; 
    moveForward();
  } else if (val < 480) {
    // move faster the lower the value from the potentiometer
    delayTime = 1024 * val / 512 + 1; 
    moveBackward();
  } else {
    delayTime = 1024;
  }
}

Referencias

Para poder realizar estos ejemplos, hemos leído mucha documentación. Los siguientes enlaces podría ser útil visitarlos para entender la teoría en la que se basan los motores paso a paso.

- información acerca del motor que hemos usado - aquí

- explicación básica sobre motores paso a paso - aquí

- buen PDF con información básica - aquí

Share