



Para entender o mecanismo de redução do motor, veja esse excelente video :
Como podem ver, a caixa tem várias engrenagens ( 31 dentes, 32 dentes, 26 dentes, 22 dentes, 11 dentes, 10 dentes, e mais duas com 9 dentes).
O pessoal fez alguns cálculos para determinar com maior precisão qual era a redução.
(31*32*26*22)/(11*10*9*9) = 283712/4455 = 25792/405 = 63,68395...
Na especificação do fabricante, ele aproximou o valor para 64.
Para calcular o número de passos do motor interno para girar uma volta do eixo externo (com redução) :
(64 * 25792)/405 = 4075,7728395..
Isto é , são necessários aproximadamente 4075 passos no motor de passo interno, para uma volta no eixo externo. Esse valor pode ter uma pequena variação devido às folgas nas engrenagens. O unico chip no módulo é o ULN2003. Esse chip possui um conjunto de sete drivers de transistores Darlington que permitem o acionamento de cargas indutivas. Todas as saídas tem o coletor aberto e diodos de supressão (Clamp) . Os transistores suportam tensões de até 50V e correntes de até 500 mA. Todas as entradas IN1, IN2,IN3 e IN4 são compatíveis com sinais TTL e CMOS, com limite de 5V. O pino comum tem que ser conectado na tensão de alimentação do motor. Nesse caso é conectado no 5V.
Datasheet ULN2003APG
Essa é disposição dos circuitos drivers no chip ULN2003APG:
Esse é o diagrama da placa de circuito do Módulo ULN2003APG :
Os quatro leds vermelhos (A,B,C e D) são usados para indicar o acionamento de cada um dos drivers (fases do motor). Mesmo que o diagrama mostre sete entradas, somente quatro podem ser usadas e somente essas tem pinos no conector.
Muita atenção ao conectar a alimentação nos pinos.
O pino mais à esquerda (-) no módulo é o terra (veja foto abaixo). Esse terra tem que ser conectado ao terra da fonte e ao terra do Arduino. O pino (+) no caso do Motor 28BYJ-48, tem que ser conectado ao positivo de uma fonte de 5V (preferencialmente de 1 Ampére). Não recomendo que conecte no 5V do Arduino, pois poderá sobrecarregar o regulador de tensão do mesmo.
O jumper Power ON/OFF é usado para ligar ou desligar o motor.

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) .
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.
Referência : Stepper_Motors_2011.pdf Esse é o diagrama da montagem do circuito com Arduino. Materiais necessários para a montagem do projeto com Motor de Passo 28BYJ-48 + Driver ULN2003 e Arduino Uno
Obs: como já informei, recomendo que use uma fonte externa de 5V para alimentar o Driver + Motor de passo.
Esse é o diagrama eletrônico do mesmo circuito:
No Modo de Passo completo com alto torque, 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 é mais alto, devido à ativação das duas fases.
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.
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.
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.
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.
Full_step.ino
// Controle de Motor de Passo - Modo Passo Completo alto torque (Full step)
// Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-motor-de-passo-28byj-48-driver-uln2003
// Baseado em http://www.elecrow.com/wiki/index.php?title=ULN2003_Stepper_Motor_Driver
// Motor 28BYJ48/5V com Módulo ULN20023 - Arduino Nano / IDE 1.8.5
// Uma volta no eixo = 4075 pulsos / 512 x 8 = 4096
// Gustavo Murta 23/jul/2018
byte HOR[4] = {0x09,0x03,0x06,0x0C}; // Matriz dos bytes das Fases do Motor - sentido Horário Full Step
byte AHO[4] = {0x0C,0x06,0x03,0x09}; // Matriz dos bytes das Fases do Motor - sentido Anti-Horário Full Step
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
}
Referências:
http://www.elecrow.com/wiki/index.php?title=ULN2003_Stepper_Motor_D...
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.
wave_step.ino
// Controle de Motor de Passo - Modo Passo Completo baixo torque (Wave step)
// Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-motor-de-passo-28byj-48-driver-uln2003
// Baseado em http://www.elecrow.com/wiki/index.php?title=ULN2003_Stepper_Motor_Driver
// Motor 28BYJ48/5V com Módulo ULN20023 - Arduino Nano / IDE 1.8.5
// Uma volta no eixo = 4075 pulsos / 512 x 8 = 4096
// Gustavo Murta 23/julho/2018
byte HOR[4] = {0x01,0x02,0x04,0x08}; // Matriz dos bytes das Fases do Motor - sentido Horário Wave Step
byte AHO[4] = {0x08,0x04,0x02,0x01}; // Matriz dos bytes das Fases do Motor - sentido Anti-Horário WaveStep
int atraso_fase = 2 ; // Intervalo de tempo entre as fases em milisegundos - min 2 para Wave 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
}
// Controle de Motor de Passo - Modo Meio Passo (Half step)
// Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-motor-de-passo-28byj-48-driver-uln2003
// Baseado em http://www.elecrow.com/wiki/index.php?title=ULN2003_Stepper_Motor_Driver
// Motor 28BYJ48/5V com Módulo ULN20023 - Arduino Nano / IDE 1.8.5
// Uma volta no eixo = 4075 pulsos / 512 x 8 = 4096
// Gustavo Murta 23/jul/2018
byte HOR[8] = {0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; // Matriz dos bytes das Fases do Motor - sentido Horário
byte AHO[8] = {0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; // Matriz dos bytes das Fases do Motor - sentido Anti-Horário
int atraso_fase = 1 ; // Intervalo de tempo entre as fases em milisegundos
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 .
AccelStepperPOT.ino
// Controle de Motor de Passo com Potenciometro
// Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-motor-de-passo-28byj-48-driver-uln2003
// Baseado em http://www.airspayce.com/mikem/arduino/AccelStepper/ProportionalControl_8pde-example.html
// Motor 28BYJ48/5V com Modulo ULN20023 - Arduino UNO / IDE 1.8.5
// Uma volta no eixo = 4075 pulsos
// Gustavo Murta 02/jago/2018
#include <AccelStepper.h> // biblioteca AccelStepper
#define ANALOG_PIN A0 // pino A0 para leitura da tensão do Potenciometro
AccelStepper motorPasso (AccelStepper::FULL4WIRE, 8, 10, 9, 11); // Passo completo 4 fios
void setup()
{
motorPasso.setMaxSpeed(500); // maxima velocidade = 500 pulsos por segundo
}
void loop()
{
int analog_in = analogRead(ANALOG_PIN); // lendo a tensão do pino A0 do Arduino
motorPasso.moveTo(analog_in); // gira o eixo do motor X pulsos (0 a 1023 pulsos)
motorPasso.setSpeed(100); // velocidade = 100 pulsos por segundo
motorPasso.runSpeedToPosition(); // gira o eixo para a posição definida
} Esse motor de passo permite movimentos precisos e com baixa rotação. Essas são algumas aplicações interessantes voltadas para fotografia :
ARDUINO TIME-LAPSE PANORAMA CONTROLLER
Motion Control Rig for Time-Lapse Photography
Tenha a Metodologia Eletrogate na sua Escola! Conheça nosso Programa de Robótica Educacional.
|
Essa montagem, eu diria que é a mais simples para controle de um motor de passo (stepper motor). 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 do circuito.
Encontre tudo na Loja Eletrogate com frete grátis para compras acima de R$ 200
Respostas de 2
Parabens pela aula , tenho o kit , se arduino , motores citados e controladores , quero Usar em uma mini cnc , funcionaria bem ? Abracos
Boa noite Wagner,
Esse motor é muito pequeno e tem baixa potência.
Não é recomendado para uma CNC com fresa (motor). Mas pode ser usado para uma CNC à laser.
Atenciosamente,
Gustavo Murta