Site icon AranaCorp

Controlar um motor de passo com Arduino

Um dos principais objectivos da robótica é fazer os objectos se moverem por si sós. Para isso, é muito comum utilizar motores elétricos, como os motores de passo, especialmente quando se quer obter uma boa precisão de movimento em malha aberta.

Neste tutorial, veremos o uso de circuitos integrados para controlar um motor de passo. Para facilitar a vida, existem Shields que integram esses ICs e que permitem comandar diversos motores (Motor Shield V1 e Motor Shield V2). Há também controladores de motor de passo que permitem obter funcionalidades e performances mais avançadas, como o A4988 ou os TMC muito utilizados nos CNC.

Leia antes: Programar com Arduino

Equipamento

Motor de passo

Os motores de passo possuem diferentes fases que permitem orientar a posição do rotor. Com isso, pode-se transformar uma sequência de impulsos nas diferentes fases em deslocamento angular. Como a sequência a ser enviada para obter um determinado deslocamento é conhecida, podemos saber a posição sem necessidade de sensor suplementar e assim controlar o motor com precisão em circuito de malha aberta.

Há dois tipos principais de motor de passo, os unipolares (5 ou 6 fios) e  os bipolares (4 fios), com características que podem variar, como o número de passos por revolução. Essas diferenças implicam modificações nas configurações de controle, especialmente quanto ao número de saídas necessárias para controlar o motor. É indispensável possuir essas informações.

Transistor

Os motores de passo, como o nome indica, podem ser controlados passo a passo aplicando uma potência elétrica por sequência de impulsos às diferentes fases do motor. Para os motores unipolares, será utilizada uma matriz de transistores como a ULN2003A, que possui uma rede de 7 transistores.

Para os motores bipolares, utilizamos uma ponte H, a SN754410NE, que permite controlar duas bobinas independentes do motor.

O caso do motor de passo 28BYJ-48

Esquema de ligação

Em função de suas características, os motores de passo podem requerer uma tensão de alimentação de 3V, de 5V ou mais. Se a tensão for superior a 5V, deve-se utilizar uma fonte de energia diferente da placa eletrónica para alimentar esses actuadores. No nosso caso, o motor pode ser alimentado pela placa em 5V e a placa Arduino pode ser alimentada pelo computador via USB.

Código básico

Para controlar o motor, é preciso ativar os transistores seguindo uma sequência precisa. O motor de passo 28BYJ-48 efetua 2048 passos para cada rotação.

#define IN1  11
#define IN2  10
#define IN3  9
#define IN4  8

int Steps = 0;
int Direction = 0;
int number_steps=512;//= 2048/4


void setup()
{
Serial.begin(9600);
pinMode(IN1, OUTPUT); 
pinMode(IN2, OUTPUT); 
pinMode(IN3, OUTPUT); 
pinMode(IN4, OUTPUT); 
// delay(1000);

}
void loop()
{
  //1 rotation counter clockwise
  stepper(number_steps);
  delay(1000);

  //1 rotation clockwise
  stepper(-number_steps);
  delay(1000);

  //Keep track of step number
  for(int thisStep=0;thisStep<number_steps;thisStep++){
    stepper(1);
  }
  delay(1000);

  for(int thisStep=number_steps;thisStep>0;thisStep--){
    stepper(-1);
  }
  delay(1000);
}

void stepper(double nbStep){
  if(nbStep>=0){
      Direction=1;
  }else{
      Direction=0;
      nbStep=-nbStep;
  }
  for (int x=0;x<nbStep*8;x++){
    switch(Steps){
       case 0:
         digitalWrite(IN1, LOW); 
         digitalWrite(IN2, LOW);
         digitalWrite(IN3, LOW);
         digitalWrite(IN4, HIGH);
       break; 
       case 1:
         digitalWrite(IN1, LOW); 
         digitalWrite(IN2, LOW);
         digitalWrite(IN3, HIGH);
         digitalWrite(IN4, HIGH);
       break; 
       case 2:
         digitalWrite(IN1, LOW); 
         digitalWrite(IN2, LOW);
         digitalWrite(IN3, HIGH);
         digitalWrite(IN4, LOW);
       break; 
       case 3:
         digitalWrite(IN1, LOW); 
         digitalWrite(IN2, HIGH);
         digitalWrite(IN3, HIGH);
         digitalWrite(IN4, LOW);
       break; 
       case 4:
         digitalWrite(IN1, LOW); 
         digitalWrite(IN2, HIGH);
         digitalWrite(IN3, LOW);
         digitalWrite(IN4, LOW);
       break; 
       case 5:
         digitalWrite(IN1, HIGH); 
         digitalWrite(IN2, HIGH);
         digitalWrite(IN3, LOW);
         digitalWrite(IN4, LOW);
       break; 
         case 6:
         digitalWrite(IN1, HIGH); 
         digitalWrite(IN2, LOW);
         digitalWrite(IN3, LOW);
         digitalWrite(IN4, LOW);
       break; 
       case 7:
         digitalWrite(IN1, HIGH); 
         digitalWrite(IN2, LOW);
         digitalWrite(IN3, LOW);
         digitalWrite(IN4, HIGH);
       break; 
       default:
         digitalWrite(IN1, LOW); 
         digitalWrite(IN2, LOW);
         digitalWrite(IN3, LOW);
         digitalWrite(IN4, LOW);
       break; 
    }
  delayMicroseconds(1000);
  if(Direction==1){ Steps++;}
  if(Direction==0){ Steps--; }
  if(Steps>7){Steps=0;}
  if(Steps<0){Steps=7; }
} 
} 


Biblioteca

Há uma biblioteca muito prática para administrar os movimentos do seu actuador: a Stepper.h.

#include <Stepper.h> 

double stepsPerRevolution = 2048;

Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);  // Pin inversion to make the library work

void setup() { 
  myStepper.setSpeed(10);  
  Serial.begin(9600); 
  } 
  
  void loop() {  
    // 1 rotation counterclockwise:  
    Serial.println("counterclockwise");    
    myStepper.step(stepsPerRevolution);  
    delay(1000); 
     
   // 1 rotation clockwise: 
   Serial.println("clockwise");  
   myStepper.step(-stepsPerRevolution); 
   delay(1000); 
}

Este código vem de um exemplo retirado da biblioteca, que precisou ser modificado para o caso do stepper  28BYJ-48 130061869. Os motores de passo podem ser bem diferentes entre si, então é preciso verificar o seu equipamento antes de conseguir controlá-lo.

O caso do motor de passo 42HS34

Esquema de ligação

Neste caso, o motor pode ser alimentado pelo terminal 3,3V da placa, e a placa Arduino pode ser alimentada pelo computador via USB.

Código básico

Para controlar o motor bipolar, utilizaremos uma sequência de 4 etapas. O motor de passo 42HS34 realiza 200 passos por rotação.

#define IN1  11
#define IN2  10
#define IN3  9
#define IN4  8

int Steps = 0;
int Direction = 0;
int number_steps=50; //= 200/4

void setup() {
  Serial.begin(9600);
  pinMode(IN1, OUTPUT); 
  pinMode(IN2, OUTPUT); 
  pinMode(IN3, OUTPUT); 
  pinMode(IN4, OUTPUT); 
}

void loop()
{
  //1 rotation counter clockwise
  stepper4(number_steps);
  delay(1000);

  //1 rotation clockwise
  stepper4(-number_steps);
  delay(1000);

  //Keep track of step number
  for(int thisStep=0;thisStep<number_steps;thisStep++){
    stepper4(1);
  }
  delay(1000);

  for(int thisStep=number_steps;thisStep>0;thisStep--){
    stepper4(-1);
  }
  delay(1000);
}

void stepper4(double nbStep){
  if(nbStep>=0){
      Direction=1;
  }else{
      Direction=0;
      nbStep=-nbStep;
  }
  for (int x=0;x<nbStep*4;x++){
    switch (Steps) {
      case 0:  // 1010
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
      break;
      case 1:  // 0110
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
      break;
      case 2:  //0101
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
      break;
      case 3:  //1001
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
      break;
    }
  delayMicroseconds(2000);
  if(Direction==1){ Steps++;}
  if(Direction==0){ Steps--; }
  if(Steps>3){Steps=0;}
  if(Steps<0){Steps=3; }
} 
} 

Biblioteca

Com a biblioteca Stepper.h.

#include <Stepper.h>

const int stepsPerRevolution = 200;  

Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
  myStepper.setSpeed(100);
  Serial.begin(9600);
}

void loop() {
  // 1 rotation clockwise: 
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(2000);

  // 1 rotation counterclockwise:
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(2000);
}

Se tiver dificuldade para aplicar este tutorial com o seu motor de passo, pode deixar-nos um comentários abaixo ou entrar em contacto conosco. Ficaremos felizes em ajudar.

Próximos passos

Fontes

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Exit mobile version