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...


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: 69212

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

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

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

Como o circuito não sabe quando será o fim de curso, recomendo que use uma interrupção :

https://www.arduino.cc/en/Reference/AttachInterrupt

https://playground.arduino.cc/Code/Interrupts

Se você tiver mais dúvidas do seu projeto, favor criar um novo tópico,

Obrigado. 

Motor de Passo - Modo Meio Passo  ( Half Step):

O Modo  Meio Passo é uma mesclagem dos outros dois modos, Full Step e Wave Step. 

Esse modo é usado quando o movimento do motor precisa ser delicado e preciso e o torque não é importante. 

Se um motor tem por exemplo 200 passos por rotação, no modo Half Step, o número de passos dobra para 400 !

Por isso é chamado de Meio Passo. O efeito Meio passo é conseguido intercalando um passo com duas Fases do Motor ativadas simultaneamente com um passo ativando somente uma Fase, obedecendo uma sequência própria para isso. Devido à essa alternância, o torque e o consumo de corrente varia de acordo com o passo. Com mais fases ativas, terá maior torque e maior consumo de corrente. 

Como em todos os outros exemplos, 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  ;

Confira a sequência de Leds visualizando a Carta de Tempo anexada (vide abaixo). 

O interessante nesse modo é que as matrizes dos Bytes  AHO e HOR , tem oito valores e não somente quatro como nos outros modos.Analisando os Bytes dá para perceber que as matrizes dos outros modos foram agrupadas. 

// Controle de Motor de Passo - Modo Meio Passo (Half 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 - Meio Passo 

byte HOR[8] = {0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; 

 // Matriz dos bytes das Fases do Motor - sentido Anti-Horário - Meio Passo 
byte AHO[8] = {0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};


int atraso_fase = 1 ;      // Intervalo de tempo entre as fases em milisegundos - min 1 para Meio Passo
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 < 8; j++)          // incrementa o contador j de 0 a 7
{
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 < 8; j++)         // incrementa o contador j de 0 a 7
{
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 Meio Passo ( Half Step):

Em alguns passos tem duas fases ativadas e em outros tem somente uma fase ativada .

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço