GrabDuck

Controlando motores de passo 28BYJ-48 com o Arduino Motor Shield L293D

:

Conforme prometido no artigo Controlando motores DC com o Arduino Motor Shield L293D, hoje vou apresentar o esquema de funcionamento desse shield com o nosso também já conhecido Motor de Passo 28BYJ-48 Arduino (foto abaixo).

O motor de passo 28BYJ-48 funciona com alimentação de 5V e possui uma redução de 1/64. Essa redução faz com que o número de passos necessários para que o motor dê uma volta completa seja de 4096, ou no modo de ativação de 4 passos, esse número cai pela metade, para 2048.

"Peraí, modo de ativação de 4 passos ? O que é isso ?"

O motor de passo pode funcionar em 2 modos de ativação : 8 passos (half-mode) ou 4 passos (full step). No modo de ativação de 8 passos, a sequência de acionamento das bobinas segue a tabela abaixo. Primeiro é acionada uma bobina, depois duas, depois uma, depois duas novamente, e assim por diante, até se completarem os 8 passos :

Já no modo de 4 passos, são acionadas 2 bobinas de cada vez, o que reduz o número de acionamentos necessários para movimentar o motor :


O modo de acionamento de 4 passos é utilizado pela biblioteca padrão do Arduino, e teoricamente imprime mais força ao motor, já que sempre teremos duas bobinas sendo acionadas ao mesmo tempo.

Relembrando um pouco sobre o funcionamento do Motor Shield L293D, vimos que ele pode controlar 2 servos, e até 4 motores DC ou 2 motores de passo. Para controlar motores de passo, utilizamos os conectores laterais, os mesmos usados para controlar motores DC :

Vamos ligar não só um, mas dois motores de passo 28BYJ-48 nessa placa (muito útil para um robô, não ?). Atenção para a ordem de ligação dos fios desse motor, que deve ser a mesma do circuito abaixo. A alimentação será feita por meio dos 5V do próprio Arduino Uno, que usaremos nos testes, por isso vamos manter o jumper PWR na placa.

 
A biblioteca utilizada para controlar os motores de passo é a AFMotor, que você pode baixar nesse link. Descompacte o arquivo, renomeie a pasta para AFMotor e coloque-a dentro da pasta LIBRARIES da IDE do seu Arduino.

Para controle de motor de passo, os principais comandos do programa são :

  • AF_Stepper nome(passos, porta) - Define o nome dado ao motor de passo, o número total de passos desse motor (para dar uma volta completa) e a porta à qual esse motor está ligado. A porta pode ter o valor 1 para motores ligados no conector do lado esquerdo (M1 / GND / M2), ou o valor 2 para motores ligados no conector do lado direito (M3 / GND / M4)
  • nome.step(numero_passos, direção, tipo_passo) - São os comandos de movimentação do motor identificado por nome. Numero_passos é a quantidade de passos que o motor vai girar ao executar o comando. Os comandos de direção podem ser o FORWARD (gira o motor no sentido horário) ou BACKWARD (gira o motor no sentido anti-horário). Tipo_passo determina de que maneira as bobinas serão acionadas, sendo que pode ser definido como SINGLE (uma bobina por vez), DOUBLE (duas bobinas por vez), INTERLEAVE (alternando entre 1 e 2 bobinas, aumentando a precisão) e MICROSTEPPING, que rotaciona o motor de uma forma mais suave e precisa. Não são todos os motores de passo que aceitam os modos  INTERLEAVE e o MICROSTEPPING.

O programa gira os dois motores de passo, alternadamente, um em cada direção. A cada ciclo, o motor se move na quantidade de graus definida na variável angulo, no início do programa.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Programa : Controlando 2 motores de passo 28BYJ-48 com 
// Arduino Motor Shield L293D
// Autor : Arduino e Cia
 
// Carrega a biblioteca AFMotor 
#include <AFMotor.h>

//Numero de passos para 1 rotacao total
double passos_total = 2048; 
 
// Define as portas para os motores
// Valor 1 para motor em M1/M2 e 2 para motor em M3/M4
int porta_motor_1 = 1; 
int porta_motor_2 = 2;

// Angulo de rotacao do eixo
int angulo = 45; 
 
// Armazena o numero de passos que o motor vai girar
double numero_de_passos = 0; 
 
// Define os parametros do motor 1
AF_Stepper motor_de_passo_1(passos_total, porta_motor_1); 
// Define os parametros do motor 2
AF_Stepper motor_de_passo_2(passos_total, porta_motor_2);
 
void setup()
{
  // Define a velocidade de rotacao do motor 1
  motor_de_passo_1.setSpeed(10);
  // Define a velocidade de rotacao do motor 2
  motor_de_passo_2.setSpeed(10);
  // Inicializa a serial
  Serial.begin(9600);
}
 
void loop()
{
  //Calcula a quantidade de passos, baseado no angulo determinado
  numero_de_passos = angulo / (360 / passos_total);
 
  //Mostra no serial monitor o numero de passos calculados
  Serial.print("Numero de passos : ");
  Serial.println(numero_de_passos);
 
  //Move o motor 1. Use FORWARD para sentido horario,
  //BACKWARD para anti-horario
  motor_de_passo_1.step(numero_de_passos, FORWARD, SINGLE);
  motor_de_passo_1.release();

  delay(10);

  //Move o motor 1. Use FORWARD para sentido horario,
  //BACKWARD para anti-horario
  motor_de_passo_2.step(numero_de_passos, BACKWARD, SINGLE);
  motor_de_passo_2.release();
 
  delay(500);
}

O funcionamento dessa ligação e do programa apresentados você confere no vídeo abaixo :

Falta agora o controle de Servo Motor com esse shield. Assunto para um próximo post. Até lá !