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.
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
- Biblioteca Stepper.h
- Descrição dos motores de passo
- Leia antes: Programar com Arduino
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie