Motor de passo unipolar

Esta página mostra dois exemplos de como ativar um motor de passo unipolar. Esse tipo de motor pode ser encontrado em unidades antigas de disquetes e são fáceis de controlar. O exemplar que utilizamos tem cinco conectores, sendo um a alimentação (VCC) e os demais, usados para acionar o motor mediante o envio de sinais sincronizados.

O primeiro código é um exemplo de como fazer o motor girar em um sentido. É destinado aos praticantes que não têm nenhum conhecimento de como controlar motores de passo. O segundo exemplo é mais complexo, mas permite que o motor gire a velocidades diferentes, nos dois sentidos, e controlável com um potenciômetro.

Precisamos de um potenciômetro de 10 kohms, que conectamos a uma entrada analógica, e um chip ULN2003A. Este último tem muitos transístores embutidos dentro de um único componente e servem para fornecer correntes elétricas muito maiores do que as que o chip Atmega do Arduino pode oferecer.

Fotografia de um protoboard com o potenciômetro e o ULN2003A

Exemplo 1: exemplo simples

/* Motor de passo Copal
 * --------------------
 *
 * Programa para acionar um motor de passo proveniente de
 * um drive de disquete de 5'25
 * De acordo com a documentação encontrada, este motor:
 * "[...] motor 
 * made by Copal Electronics, with 1.8 degrees per step and 96 ohms 
 * per winding, with center taps brought out to separate leads [...]"
 * [http://www.cs.uiowa.edu/~jones/step/example.html]
 *
 * Trata-se de um motor de passo unipolar com 5 fios:
 * 
 * - vermelho: alimentação, 5V pareceu-me bem
 * - laranja e preto: bobina 1
 * - marrom e amarelo: bobina 2
 *
 * (cleft) 2005 DojoDave para o K3
 * http://www.0j0.org | http://arduino.berlios.de
 *
 * @author: David Cuartielles
 * @date: 20 Out 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);
}

Exemplo 2: exemplo avançado

/* Motor de passo unipolar avançado
 * --------------------------------
 *
 * Programa para acionar um motor de passo proveniente de
 * um drive de disquete de 5'25 
 * De acordo com a documentação encontrada, este motor: 
 * "[...] motor 
 * made by Copal Electronics, with 1.8 degrees per step and 96 ohms 
 * per winding, with center taps brought out to separate leads [...]"
 * [http://www.cs.uiowa.edu/~jones/step/example.html]
 *
 * Trata-se de um motor de passo unipolar com 5 fios:
 * 
 * - vermelho: alimentação, 5V pareceu-me bem
 * - laranja e preto: bobina 1
 * - marrom e amarelo: bobina 2
 *
 * (cleft) 2005 DojoDave for K3
 * http://www.0j0.org | http://arduino.berlios.de
 *
 * @author: David Cuartielles
 * @date: 20 Out 2005
 */

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

void setup() {
  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) {
    // quanto maior o valor no potenciômetro, mais rápido
    delayTime = 2048 - 1024 * val / 512 + 1; 
    moveForward();
  } else if (val < 480) {
    // quanto menor o valor no potenciômetro, mais devagar
    delayTime = 1024 * val / 512 + 1; 
    moveBackward();
  } else {
    delayTime = 1024;
  }
}

Share