Etiquetas: , , ,

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

  • Computador
  • Placa Arduino UNO
  • Cabo USB para conectar o Arduino ao PC
  • ULN2003APG x1
  • Breadboard x1
  • Motor de passo x1
  • Cabos de conexão

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.

stepper-motor-640x640 Controlar um motor de passo com Arduino

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.

uln2003a-transistors-net Controlar um motor de passo com Arduino
uln2003a-schematics Controlar um motor de passo com Arduino

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

h-bridge-sn754410 Controlar um motor de passo com Arduino
sn754410-connections-500x500 Controlar um motor de passo com Arduino

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.

stepper-28byj48-arduino-wiring Controlar um motor de passo com Arduino

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.

stepper-42HS34-arduino-wiring Controlar um motor de passo com Arduino

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