Tutorial Arduino - Motor de Passo 28BYJ-48 + driver ULN2003

Mais um Tutorial para os colegas do Lab de Garagem - Arduino controlando o motor de passo 

28BYJ-48 com o driver ULN2003.

Essa montagem, eu diria que é a mais simples para controle de um motor de passo (stepper motor). Nem por isso ela pode ser considerada ruim. Esse motorzinho tem uma redução interna que aumenta bem o torque, apesar do pequeno tamanho. O módulo de controle com o chip ULN2003 é bem pequeno também, o que pode facilitar a montagem em um seu projeto. 

As vantagens são a simplicidade na montagem , Sketch pode ser bem enxuto, o uso de tensão de 5V para alimentar o motor, etc. 

A desvantagens são que a rotação é baixa (devido a redução na caixa de engrenagens) ,  que  o motor unipolar é menos eficiente e o uso de quatro portas do Arduino. Alguns módulos de controle de motor de passo usam interfaces com duas portas apenas (por exemplo I2C). 

Favor interagir com o tutorial, somente assuntos relacionados com o mesmo. 

Se deseja esclarecer alguma outra dúvida, favor criar um novo tópico. 

Farei o Tutorial em partes. 

Para facilitar a pesquisa nos tópicos, criei esse índice :

A precisão de um motor de passo :
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Informações sobre o Motor de Passo 28BYJ-48 :
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Informações sobre o Módulo Driver ULN2003:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Diagrama de montagem do Modulo Driver + Motor com Arduino:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Primeiro exemplo - com dois botões para alterar o sentido da rotação:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...


Segundo exemplo - controla-se o motor através do angulo:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...


Terceiro exemplo - Controle do motor através de um potenciômetro:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...


Quarto exemplo - Três voltas no sentido horário e mais duas voltas no sentido ant-horário :
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...


Quinto exemplo - Acionamento com duplo sentido :
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Aplicações com o Motor + Driver - Impressora de Ovos e Ploter de PCB:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Aplicações com o Motor + Driver - Fotografia Time-lapse:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Motor de Passo - modos de operação :
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Motor de Passo - Modo Passo completo com baixo torque ( Wave Step):
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Motor de Passo - Modo Passo completo com alto torque ( Full Step):
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Motor de Passo - Modo Meio Passo ( Half Step):
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

E muito mais !!!

Espero que gostem.  

Exibições: 29886

Responder esta

Respostas a este tópico

Mais uma aplicação com esse Motorzinho !

http://www.instructables.com/id/Arduino-Time-Lapse-Panorama-Control...

Fotografia Time lapse com Gopro !

Fala Jose Gustavo eai tudo bem?

estou acompanhando tutorial, ta ficando interessante mt coisa ainda tinha duvida vlw

um forte abraço pra vc =)

Obrigado ! Seja bem vindo.

Abraços,

Motor de Passo - modos de operação  :

Nesse tutorial o Motor de passo é Unipolar, isto é, ele possui quatro enrolamentos que chamamos de Fases. 

Cada circuito driver do chip ULN2003A aciona uma das fases. E a ativação de cada driver é realizada pelas portas digitais do Arduino ( portas D08, D09, D10 e D11) .

  •  F1 (azul)       - D08
  •  F2 (rosa)       - D09
  •  F3 (amarelo)  - D10
  •  F4 (laranja)    - D11 

Para um motor de Passo Unipolar, temos alguns modos de operação. O modo Passo completo com alto torque ( Full step), Passo completo com baixo torque ( Wave Step), Meio Passo (half step) e micro-passo (Micro stepping). 

No caso do Micro passo, a corrente nos enrolamentos deve ser alterada. Como o nosso circuito não permite o controle da corrente, esse modo de operação não se aplica. 

Para entender como as Fases são acionadas em cada caso, vejam essas cartas de tempo:

Referência : https://dscl.lcsr.jhu.edu/main/images/b/b3/Stepper_Motors_2011.pdf

Obs: 0 (enrolamento desativado) e 1 (enrolamento ativo) 

Nas linhas estão a sequência dos passos e nas colunas estão as Fases.

                                             Passo completo com alto torque ( Full step)

                                             Duas Fases são acionadas ao mesmo tempo.

 

                                             Passo completo com baixo torque ( Wave Step)

                                                  Somente uma Fase acionada de cada vez. 

                                                               Meio Passo (half step)

                           Na sequência de oito passos, em alguns passos temos somente uma Fase acionada 

                           e em outros passos, temos duas Fases acionadas. 

Motor de Passo - Modo Passo completo com baixo torque ( Wave Step):

Um dos motivos para a escolha desse Módulo driver ULN2003 é que ele possui quatro leds que permitem a indicação da ativação das fases do motor. Para fins didáticos, isso é muito útil.

Como já foi dito, no modo Passo completo com baixo torque ( Wave step) somente uma Fase é acionadas de cada vez, portanto o torque do motor é menor do que nos outros modos. Esse modo é pouco usado exatamente por isso. O rendimento do motor é menor, mas tem-se como vantagem um menor consumo de corrente, já que somente uma Fase é ativada em cada passo. 

Comecei com esse modo, pois ele é o mais fácil de visualizar tanto através dos Leds como na Carta de tempo. 

Para melhor visualizar o avanço dos Leds piscando de acordo com a ativação das Fases, altere a variável atraso-fase para 500 milisegundos :

int atraso_fase = 500  ;

Desse modo poderá perceber que os Leds piscam um de cada vez e na sequência da Carta de Tempo (vide abaixo). 

Importante ressaltar que nas matrizes do programa : AHO e HOR , estão carregados os bytes de ativação das fases, de acordo com a tabela anexada no tópico anterior. Uma sequência de bytes é inversa da outra.

Referências:
http://www.elecrow.com/wiki/index.php?title=ULN2003_Stepper_Motor_D...
Sobre Matrizes no Sketch https://www.arduino.cc/en/Reference/Array

Esse é o Sketch Wave_step.ino (anexei o arquivo) :

// Controle de Motor de Passo - Modo Passo Completo baixo torque (Wave step)
// Baseado em http://www.elecrow.com/wiki/index.php?title=ULN2003_Stepper_Motor_D...
// Motor 28BYJ48/5V com Módulo ULN20023 - Arduino Nano / IDE 1.6.7
// Uma volta no eixo = 4075 pulsos / 512 x 8 = 4096
// Gustavo Murta 26/mar/2016

 // Matriz dos bytes das Fases do Motor - sentido Horário Wave Step

byte HOR[4] = {0x01,0x02,0x04,0x08};           

 // Matriz dos bytes das Fases do Motor - sentido Anti-Horário WaveStep
byte AHO[4] = {0x08,0x04,0x02,0x01};         

// Intervalo de tempo entre as fases em milisegundos - min 2 para Wave Step 
int atraso_fase = 2 ;                           


int intervalo = 1000 ;                       // Intervalo de tempo entre os movimentos do motor em ms

void Motor_AHO()                          // Movimento no sentido anti-horário
{
for(int i = 0; i < 512; i++)                // incrementa o contador i de 0 a 511 - uma volta

for(int j = 0; j < 4; j++)                   // incrementa o contador j de 0 a 3
{
PORTB = AHO[j];                         // Carrega bytes da Matriz AHO na Porta B
delay (atraso_fase);                      // Atraso de tempo entre as fases em milisegundos
}
}

void Motor_HOR()                        // Movimento no sentido horário
{
for(int i = 0; i < 512; i++)              // incrementa o contador i de 0 a 511 - uma volta

for(int j = 0; j < 4; j++)                 // incrementa o contador j de 0 a 3
{
PORTB = HOR[j];                       // Carrega bytes da Matriz HOR na Porta B
delay (atraso_fase);                    // Atraso de tempo entre as fases em milisegundos
}
}

void setup()
{
DDRB = 0x0F;                           // Configura Portas D08,D09,D10 e D11 como saída
PORTB = 0x00;                         // Reset dos bits da Porta B (D08 a D15)
}

void loop()
{
Motor_HOR();                         // Gira motor no sentido Horário
delay (intervalo);                     // Atraso em milisegundos
Motor_AHO();                         // Gira motor no sentido Anti-Horário
delay (intervalo);                     // Atraso em milisegundos
}

Essa é a Carta de Tempo do Modo Passo completo com baixo torque ( Wave Step):

Veja que para cada passo, somente uma Fase (Channel) esta ativa. 

Anexos

Motor de Passo - Modo Passo completo com alto torque ( Full Step):

O Modo de Passo completo com alto torque é um pouquinho mais complexo, pois para cada passo, duas Fases são ativadas simultaneamente. Esse modo é o mais usado, pois como o nome já diz, tem mais torque. O consumo de corrente é o mais alto devido à essa ativação de duas Fases. 

Como no exemplo anterior, para melhor visualizar o avanço dos Leds piscando de acordo com a ativação das Fases, altere a variável atraso-fase para 500 milisegundos :

int atraso_fase = 500  ;

Fica visível  que dois Leds piscam ao tempo, também seguindo a Carta de Tempo anexada (vide abaixo). 

Verificando os valores dos Bytes das matrizes do programa : AHO e HOR , percebe-se que dois bits são ativados ao mesmo tempo. E é claro, uma sequência de bytes é inversa da outra.

Referências:
http://www.elecrow.com/wiki/index.php?title=ULN2003_Stepper_Motor_D...
Sobre Matrizes no Sketch https://www.arduino.cc/en/Reference/Array

Esse é o Sketch Full_step.ino (anexei o arquivo) :

 

// Controle de Motor de Passo - Modo Passo Completo alto torque (Full step)
// Baseado em http://www.elecrow.com/wiki/index.php?title=ULN2003_Stepper_Motor_D...
// Motor 28BYJ48/5V com Módulo ULN20023 - Arduino Nano / IDE 1.6.7
// Uma volta no eixo = 4075 pulsos / 512 x 8 = 4096
// Gustavo Murta 26/mar/2016

 // Matriz dos bytes das Fases do Motor - sentido Horário Full Step

byte HOR[4] = {0x09,0x03,0x06,0x0C};       

// Matriz dos bytes das Fases do Motor - sentido Anti-Horário Full Step
byte AHO[4] = {0x0C,0x06,0x03,0x09};      


int atraso_fase = 2 ;                    // Intervalo de tempo entre as fases em milisegundos - min 2 para Full Step
int intervalo = 1000 ;                   // Intervalo de tempo entre os movimentos do motor em ms

void Motor_AHO()                       // Movimento no sentido anti-horário
{
for(int i = 0; i < 512; i++)             // incrementa o contador i de 0 a 511 - uma volta

for(int j = 0; j < 4; j++)                // incrementa o contador j de 0 a 3
{
PORTB = AHO[j];                      // Carrega bytes da Matriz AHO na Porta B
delay (atraso_fase);                   // Atraso de tempo entre as fases em milisegundos
}
}

void Motor_HOR()                      // Movimento no sentido horário
{
for(int i = 0; i < 512; i++)            // incrementa o contador i de 0 a 511 - uma volta

for(int j = 0; j < 4; j++)               // incrementa o contador j de 0 a 3
{
PORTB = HOR[j];                     // Carrega bytes da Matriz HOR na Porta B
delay (atraso_fase);                 // Atraso de tempo entre as fases em milisegundos
}
}

void setup()
{
DDRB = 0x0F;                        // Configura Portas D08,D09,D10 e D11 como saída
PORTB = 0x00;                     // Reset dos bits da Porta B (D08 a D15)
}

void loop()
{
Motor_HOR();                       // Gira motor no sentido Horário
delay (intervalo);                   // Atraso em milisegundos
Motor_AHO();                      // Gira motor no sentido Anti-Horário
delay (intervalo);                  // Atraso em milisegundos
}

Essa é a Carta de Tempo do Modo Passo completo com alto torque ( FullStep):

Veja que para cada passo, duas Fases  (Channel) são ativadas ao mesmo tempo. 

Anexos

Boa noite José augusto  tudo bem,  nesse código que criei abaixo como posso adicionar leds, alerta sonoro e dar um Stop(parada de emergência com botões) no mesmo Motor de passo? Se puder dar uma Força fico eternamente grato!

 Código

#include <Stepper.h>

//================================CONTROLE MOTOR DE PASSO===================================================
//================================PLATAFORMA ELEVATÓRIA=====================================================

int botao1= 2; // Pino botão 1
int botao2= 3; // Pino Botão 2
int botao3= 6; // Pino Botão 2

int apertoubotao1=0; // estado botão 3, 0 low e 1 high
int apertoubotao2=0; // estado botão 3, 0 low e 1 high
int apertoubotao3=0; // estado botão 3, 0 low e 1 high



const int stepsPerRevolution = 64; // Passos por volta

Stepper myStepper(stepsPerRevolution, 8,10,11,9); // Entradas do DRIVE ULN2003

void setup() {

myStepper.setSpeed(450); //RPM do Motor de Passo
pinMode(botao1,INPUT); //Definindo botão1 entrada
pinMode(botao2,INPUT); //Definindo botão2 entrada
pinMode(botao3,INPUT);
Serial.begin(9600);



}
void loop() {

apertoubotao1=digitalRead(botao1); // Apertar Botão 1 sentido horário pra X numero de voltas
if(apertoubotao1==HIGH){
Serial.println("Apertei1");
for(int i=0; i<1; i++)
myStepper.step(1000);


}
apertoubotao2=digitalRead(botao2); // Apertar Botão 2 sentido anti-horário pra X numero de voltas
if(apertoubotao2==HIGH){
Serial.println("Apertei2");
for(int i=0; i<1; i++)
myStepper.step(-1000);

}

botao3=digitalRead(botao3); // Apertar Botão 3 Stop ou Parada de Emergência
if(digitalRead(6)==HIGH);
myStepper.setSpeed(0);




}

Olá.
Do jeito que está esse fonte, você só poderá fazer o STOP quando um dos movimentos de 1000 passos terminar. Acredito que não seja essa a sua intenção.
O ideal, usando Arduino é vc. modificar esse fonte para que a cada passo seja verificado se o STOP foi acionado.
Para isso, a técnica ideal é aproveitar o loop do Arduino, criar uma variável que indique se vc. está girando em um sentido ou ao contrário. Outra para contar os passos e controlar essas duas variáveis dentro do loop. A verificação do Botão de Stop fica como está. A cada passada pelo loop é acionado um passo (crescente ou decrescente de acordo com o sentido clicado por último). Quando a variável contadora chegar ao fim, tudo deixa de acontecer, uma verificação dentro dos IFs verifica quantos passos já foram dados e se atingir o limite não faz nada.
Boa sorte.

Boa noite Ramon, 

Se você não tem conhecimento de programação de Arduino, sugiro que faça o seu programa em etapas. 

Um programa para apertar o botão :

https://www.arduino.cc/en/Tutorial/Debounce

Para acionar Leds :

  • Blink: Turn an LED on and off.

https://www.arduino.cc/en/Tutorial/BuiltInExamples

Tou querendo utilizar fonte externa, para o motor de passo de o drive. Minha fonte possue 12Vcc e 9A, 12Vcc e 14 A, 5Vcc e 1.5 A. Posso alimentar o 28BYJ-48 e o ULN2003 nessas 3 configurações ?

Com essas fontes esta querendo dar um tiro de canhão em um mosquito. 

A tensão máxima das saídas Coletor aberto do  ULN2003 é de 50V.

Mas as portas de controle operam somente com 5V.

A corrente máxima em cada saída é de apenas 500 mA.

http://www.ti.com/lit/ds/symlink/ulq2004a.pdf

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2017   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço