Como acionar motor de passo com Driver ULN2003 e Arduino
O motor de passo é um motor elétrico de corrente contínua cuja principal característica é que seu eixo gira em incrementos ou passos precisos, movendo-se por uma quantidade fixa de graus.
Os motores de passo são muito úteis em projetos em que fatores como ângulo de rotação, velocidade, posição e sincronismo precisam ser controlados com precisão. Eles são usados em impressoras convencionais; impressoras 3D, scanners, câmeras de vídeo, máquinas CNCs e até mesmo na injeção eletrônica dos automóveis.
Uma das maneiras de aprender mais sobre o motor de passo é usando os motores de passo 28BJY-48 (Figura 1).
Geralmente o 28BYJ-48 é usando em conjunto com o Driver ULN2003 (Figura 2), que permite que você controle facilmente o motor de passo com um microcontrolador, como o Arduino. O CI ULN2003 é um dos controladores de motor mais comuns, consistindo em uma série de 7 pares de transistores Darlington, em que cada par é capaz de conduzir cargas de até 500mA.
O Driver ULN2003 possui um conector de encaixe para dos fios do motor de passo 28BYJ-48, o que facilita muito a ligação. Além disso, o driver possui quatro entradas de controle (IN1, IN2, IN3 e IN4), entrada de alimentação e 4 LEDs.
IMPORTANTE: Uma vez que o motor exige uma corrente mais alta do que a que pode ser fornecida pela placa UNO, o Driver ULN2003 se faz necessário
A proposta deste projeto é acionar o motor de passo usando o driver ULN2003 e Arduino. O motor deverá se mover no sentido horário quando o usuário digitar A e no sentido anti-horário quando o usuário receber B no monitor serial.
MATERIAIS NECESSÁRIOS
- 1 x Placa UNO SMD R3 Atmega328 compatível com Arduino UNO;
- 1 x Cabo USB;
- 1 x Motor de passo 28BYJ-48;
- 1 x Driver ULN2003 para motor de passo;
- 1 x Fonte de alimentação de 5V – 1A;
- Fios de jumper macho-macho.
ESQUEMÁTICO DE LIGAÇÃO DOS COMPONENTES
Inicialmente, certifique-se que a sua placa Arduino esteja desligada. Em seguida, monte o circuito da Figura 3 utilizando o motor de passo e o driver ULN2003.
Ao montar seu circuito na protoboard preste atenção nos seguintes pontos:
- Encaixe o conector do motor de passo 28BYJ-48 ao driver ULN2003;
- Conecte os pinos IN do driver ULN2003 aos pinos da placa UNO da seguinte maneira: IN1 = Pino digital 8; IN2 = Pino digital 9; IN3 = Pino digital 10; IN4 = Pino digital 11.
- Conecte uma fonte de alimentação de 5V – 1A nos pinos de alimentação do driver ULN2003;
- Conecte o aterramento GND da fonte de alimentação ao GND da placa UNO. Isso é importante para que possamos estabelecer a mesma referência de tensão.
OBSERVAÇÃO:
Apesar de haver inúmeros exemplos na internet em que o motor de passo é alimentado diretamente pela placa Arduino, esta prática não é recomendada. Além do alto consumo, o motor de passo pode induzir ruído elétrico em suas linhas de alimentação, o que pode danificar a sua placa.
ELABORANDO O CÓDIGO
Com o esquemático elétrico montado, vamos a programação do Sketch. A proposta deste projeto é acionar o motor de passo usando o driver ULN2003. Vamos entender a lógica de programação deste projeto a partir dos seguintes passos.
1. Incluir a biblioteca:
Neste projeto, usaremos a biblioteca stepper, que permite controlar motores de passo unipolares ou bipolares. Esta biblioteca já se encontra instalada no Arduino IDE e você pode encontrá-la por meio do seguinte caminho na Toolbar: Sketch > Incluir biblioteca > Stepper, conforme a Figura 4.
2. Declarar as variáveis:
Em seguida, declaramos a variável passos para armazenar o número de passos para que o motor complete uma revolução, ou seja, uma volta completa. Em nosso caso, é 2048.
Declaramos também a variável sentido, do tipo char, para armazenar os caracteres digitados pelo usuário no monitor serial.
3. Instanciar a biblioteca e configurar os pinos:
Logo após, vamos instanciar o objeto myStepper, do tipo Stepper, passando como parâmetro a quantidade de passos para que o motor mova uma volta completa e os pinos de conexão do motor.
4. Inicializar a comunicação serial:
Dentro da função setup(), inicializamos a comunicação serial através da instrução: Serial.begin(9600);
5. Verificar, receber e armazenar um caractere pelo monitor serial:
Inicializaremos a função loop() testando se algum caractere foi enviado ao monitor serial por meio da instrução if (Serial.available()). Uma vez satisfeita essa condição, o caractere será lido e armazenado na variável sentido através da instrução sentido = Serial.read();.
6. Verificação do caractere da variável sentido:
Utilizaremos a estrutura de controle de fluxo de seleção switch…case para comparar o caractere armazenado na variável sentido aos caracteres especificados nos comandos cases. Quando o caractere armazenado for igual ao caractere ‘A’, a função horario() será executada. Mas se o caractere armazenado for igual a ‘B’, a função antihorario() será chamada.
7. Criar a função horario():
Na função horario(), usaremos a função setSpeed() para definir a velocidade que desejamos que o motor de passo se mova. Em nosso exemplo, definimos a velocidade de 10 rotações por minuto.
A função step()será utilizada para definir a quantidade de passos que o motor deverá girar. Deste modo, passamos como parâmetro a variável passos para que o motor gire uma volta completa no sentido horário.
8. Criar a função antihorario():
Na função antihorario() também adicionamos a função setSpeed(), definindo a velocidade de 10 rotações por minuto.
A função step()será usada para definir a quantidade de passos que o motor deverá girar. Ao contrário da função horário(), passamos como parâmetro a variável -passos para que o motor gire uma volta completa no sentido anti-horário.
Ao final, o código deste projeto terá a seguinte estrutura:
/* --- ACIONAR MOTOR DE PASSO COM DRIVE ULN2003 --- ================================================== == BLOG DA ROBOTICA - www.blogdarobotica.com == ================================================== Autora: Carol Correia Viana E-mail: contato@blogdarobotica.com Facebook: facebook.com/blogdarobotica Instagram:@blogdarobotica YouTube: youtube.com/user/blogdarobotica ================================================== */ #include <Stepper.h> //Biblioteca do motor const int passos = 2048; //Número de passos para uma volta char sentido; //Variável para armazenar o caractere digitado pelo usuário Stepper myStepper(passos, 8, 10, 9, 11); //Inicia o motor utilizando os pinos 8, 10, 9, 11 void setup() { Serial.begin(9600); // Inicializa a comunicação serial } void loop() { if (Serial.available()) { // Se a serial receber algum caractere sentido = Serial.read(); // Lê o caractere e guarda na variável sentido Serial.println(sentido);// Imprime na serial o conteúdo de sentido } switch (sentido) { case 'A': horario(); // Chama a função para acionamento do motor no sentido horário break; case 'B': antihorario(); // Chama a função para acionamento do motor no sentido anti-horário break; } } // Função para acionamento do motor no sentido horário void horario() { Serial.println("Girando no sentido Horário!"); myStepper.setSpeed(10); // Velocidade de 10 rpm myStepper.step(passos); // Move 2048 passos, correspondentes a uma volta } // Função para acionamento do motor no sentido anti-horário void antihorario() { Serial.println("Girando no sentido Anti-horário!"); myStepper.setSpeed(10); // Velocidade de 10 rpm myStepper.step(-passos); // Move 2048 passos, correspondentes a uma volta }
Espero ter ajudado,
Obrigada a todos e, em caso de dúvidas, deixe seu comentário abaixo!
Bacharel em Engenharia Elétrica com ênfase em Eletrônica, mestra em Engenharia Industrial e especialista em Docência com ênfase em Educação Inclusiva. Atua no setor de Desenvolvimento de Produtos na Casa da Robótica. Editora chefe e articulista no Blog da Robótica. Fanática por livros, Star Wars e projetos Maker.