Arduino Playground is read-only starting December 31st, 2018. For more info please look at this Forum Post

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 [...]"
 * [https://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
 * https://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 [...]"
 * [https://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
 * https://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;
  }
}