Skip to Content

Controla um Motor de Passo com um Controlo Remoto por Infravermelhos

Controla um Motor de Passo com um Controlo Remoto por Infravermelhos

Neste tutorial, vais aprender a controlar um motor de passo usando um comando IR. Os motores de passo são amplamente utilizados em várias aplicações, como robótica, máquinas CNC e impressoras 3D, devido ao seu controlo preciso e à capacidade de se moverem em pequenos incrementos. Ao combinar o motor de passo com um comando IR, podemos criar um sistema de controlo sem fios para os nossos projetos.

Vamos utilizar o ULN2003 módulo driver para ligar o motor de passo ao Arduino. O ULN2003 é um chip driver popular que simplifica o controlo de motores de passo, fornecendo a amplificação de corrente e a proteção necessárias. Permite-nos controlar o motor de passo usando apenas alguns pinos digitais do Arduino.

Para o motor de passo, usamos um 28byj-48 motor de passo. É muito acessível, compacto e funciona entre 5 e 12 Volts, o que facilita a integração com Arduinos e projetos alimentados por bateria.

No final deste tutorial, vais perceber claramente como ligar os componentes, escrever o código Arduino e controlar o motor de passo usando um comando IR. Especificamente, vamos conseguir controlar a velocidade e a direção do motor, e também teremos uma funcionalidade de pausa.

Vamos começar!

Componentes Necessários

Abaixo encontras os componentes necessários para este projeto. Se já tens um comando IR, não precisas do Kit de Recetor IR, apenas do Módulo Recetor IR. No entanto, nem todos os comandos IR serão adequados. Por outro lado, se comprares ou já tens o Kit, não precisas do Módulo Recetor IR, pois já faz parte do Kit.

Arduino Uno

Dupont wire set

Conjunto de Cabos Dupont

Half_breadboard56a

Breadboard

USB Data Sync cable Arduino

Cabo USB para Arduino UNO

Infrared (IR) receiver module

Módulo Recetor IR

Kit de Recetor Remoto IR

ULN2003 28BYJ-48 4-Phase Stepper Motor

Motor de Passo

Ligar os Componentes

Nesta secção vamos ligar os componentes ao Arduino. Vais precisar de ligar os pinos de saída do Arduino ao módulo driver, que por sua vez está ligado ao motor de passo. Como o motor de passo consome mais energia do que o Arduino pode fornecer, adicionamos uma breadboard com uma fonte de alimentação adicional. A breadboard também irá alimentar o sensor IR, que precisa de estar ligado à alimentação e a um pino de entrada do Arduino. A imagem abaixo mostra toda a cablagem completa.

Wiring of the IR sensor, stepper motor, driver and Arduino

Ligar o Motor de Passo e o Driver

Vamos começar por ligar o motor de passo à placa driver.

O motor de passo 28byj-48 normalmente vem com um conector que encaixa diretamente na tomada da placa driver. Basta ligar. Só encaixa numa orientação.

Wiring stepper motor and driver

De seguida, ligamos os sinais de entrada do driver do motor aos pinos de saída da placa Arduino:

Wiring driver and Arduino

A tabela seguinte mostra os pinos correspondentes:

Arduino Módulo driver
Pino 12 IN1
Pino 11 IN2
Pino 10 IN3
Pino 9 IN4

Terminamos a cablagem do driver ligando a alimentação da placa driver à breadboard. Certifica-te de que o fio vermelho liga a entrada positiva da placa driver ao rail positivo da breadboard (marcado por uma linha vermelha). O fio preto liga o lado negativo ao GND.

Power supply driver

Ligar Fonte de Alimentação Adicional

Para alimentar um motor de passo normalmente precisas de mais energia do que a placa Arduino pode fornecer. Por isso, ligamos uma fonte de alimentação adicional (por exemplo, uma pilha de 9V) à breadboard. Vê o conector abaixo:

Additional power supply

NÃO alimentes o motor de passo diretamente a partir da saída de 5V do Arduino! Podes danificar o regulador de tensão da tua placa.

Ligar o Sensor IR

Agora, vamos colocar o sensor infravermelhos (IR) na breadboard e ligá-lo. O pino negativo está marcado com um sinal (-). Usamos um fio preto para ligar este pino ao rail de terra da breadboard. Isto significa que o sensor e a placa driver usam a mesma massa.

Wiring IR sensor

O pino do meio do sensor é normalmente o positivo. Precisamos de o ligar à saída de 5V do Arduino. Abaixo vês o fio vermelho a sair do pino central do sensor IR para a saída de 5V da placa Arduino.

Power supply IR sensor

NÃO ligues o pino do meio do sensor ao rail positivo da breadboard, pois pode estar a uma tensão superior! Também não ligues os 5V do Arduino ao rail positivo da breadboard. .

No entanto, temos de garantir que o sensor e a placa driver partilham a mesma massa. Por isso, ligamos um fio preto do pino GND do Arduino ao rail negativo da breadboard (marcado por uma linha azul. Vê acima.

Por fim, ligamos o sinal de saída do sensor IR, que é o pino marcado com (S), ao pino 8 do Arduino usando um fio branco.

As duas coisas mais importantes a lembrar são (1), não ligar a alimentação do motor de passo diretamente ao Arduino. Mas (2), deves ligar a alimentação do sensor IR ao Arduino. E claro, confirma sempre a polaridade correta.

Escrever o Código Arduino

Nesta secção vamos escrever o código para controlar o motor de passo com um comando IR. Especificamente, queremos conseguir controlar a velocidade e a direção do motor de passo. Além disso, seria útil podermos parar e arrancar o motor com o pressionar de um botão.

O código abaixo faz tudo isso. Vamos dividi-lo em partes e explicar cada uma nas secções seguintes.

#include <IRremote.hpp>
#include <AccelStepper.h>

#define IR_RECEIVE_PIN 8

#define IN1_PIN 12
#define IN2_PIN 11
#define IN3_PIN 10
#define IN4_PIN 9

#define TYPE AccelStepper::HALF4WIRE

#define MAXSPEED 1000
#define MINSPEED 100

int currspeed = 500;
int prevspeed = 500;
int inc = 100;
int dir = +1;

// Note the pin order 1,3,2,4!
auto stepper = AccelStepper(TYPE, IN1_PIN, IN3_PIN, IN2_PIN, IN4_PIN);

void setup() {
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
  stepper.setMaxSpeed(MAXSPEED);
}

void loop() {
  if (IrReceiver.decode()) {
    uint16_t command = IrReceiver.decodedIRData.command;
    if (command == 31) {         // VOL+
      prevspeed = currspeed;
      currspeed = min(currspeed + inc, MAXSPEED);
    } else if (command == 23) {  // VOL-
      prevspeed = currspeed;
      currspeed = max(currspeed - inc, MINSPEED);
    } else if (command == 21) { // MODE
      dir = -dir;
      delay(200);
    } else if (command == 7) {  // PLAY or PAUSE
      currspeed = currspeed > 0 ? 0 : prevspeed;
      delay(200);
    }
    IrReceiver.resume();
  }
  stepper.setSpeed(dir * currspeed);
  stepper.runSpeed();
}

Instalar as Bibliotecas

Primeiro, precisamos de duas bibliotecas. IRremote, que é usada para ler e interpretar os sinais enviados pelo comando IR. E AccelStepper, que nos vai facilitar muito o controlo do motor de passo. Se ainda não tens estas duas bibliotecas instaladas, vais precisar de as instalar.

#include <IRremote.hpp>
#include <AccelStepper.h>

Definir as Constantes

De seguida, definimos as constantes que vamos usar no resto do código. Primeiro, definimos os pinos para o sensor IR (PIN 8) e os quatro pinos de saída na placa Arduino que estão ligados aos pinos de entrada do driver do motor de passo (IN1_PIN, …, IN4_PIN)

#define IR_RECEIVE_PIN 8

#define IN1_PIN 12
#define IN2_PIN 11
#define IN3_PIN 10
#define IN4_PIN 9

Além disso, precisamos de informar a biblioteca do motor de passo sobre o tipo de motor que temos ligado (HALF4WIRE). Também queremos especificar uma velocidade máxima e mínima (1000…100). Para mais detalhes vê o nosso tutorial 28BYJ-48 Stepper Motor with ULN2003 Driver and Arduino.

#define TYPE AccelStepper::HALF4WIRE

#define MAXSPEED 1000
#define MINSPEED 100

Definir as Variáveis

Como queremos conseguir controlar a velocidade do motor de passo, precisamos de algumas variáveis além das constantes acima. Especificamente, precisamos da velocidade atual (currspeed), da velocidade anterior do motor (lastspeed), e do incremento (inc) para acelerar ou abrandar o motor. Também temos uma variável dir, que pode ser +1 ou -1 e determina a direção da rotação.

int currspeed = 500;
int prevspeed = 500;
int inc       = 100;
int dir       = +1;

Dica: se quiseres alterar a velocidade do motor mais rápido ou devagar, é a variável inc que deves ajustar.

Por fim, criamos o objeto do motor de passo (stepper), que precisamos para enviar comandos ao motor de passo.

auto stepper = AccelStepper(TYPE, IN1_PIN, IN3_PIN, IN2_PIN, IN4_PIN);

Nota que as entradas estão NÃO em ordem sequencial, mas sim na ordem 1, 3, 2, 4. Isto é propositado!

A Função Setup

A função setup, onde inicializamos a placa, é muito simples. Apenas informamos a biblioteca do sensor sobre os pinos usados para o sensor IR e definimos a velocidade inicial do motor de passo para MAXSPEED.

void setup() {
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
  stepper.setMaxSpeed(MAXSPEED);
}

A Função Loop

Toda a ação acontece no loop principal. Aqui, primeiro esperamos pelo recetor IR. Se receber um sinal para decifrar, deciframos e extraímos o comando específico enviado pelo comando IR. Dependendo do valor da variável command , aceleramos, abrandamos, mudamos de direção ou alternamos entre parar e arrancar.

void loop() {
  if (IrReceiver.decode()) {
    uint16_t command = IrReceiver.decodedIRData.command;
    if (command == 31) {         // VOL+
      prevspeed = currspeed;
      currspeed = min(currspeed + inc, MAXSPEED);
    } else if (command == 23) {  // VOL-
      prevspeed = currspeed;
      currspeed = max(currspeed - inc, MINSPEED);
    } else if (command == 21) { // MODE
      dir = -dir;
      delay(200);
    } else if (command == 7) {  // PLAY or PAUSE
      currspeed = currspeed > 0 ? 0 : prevspeed;
      delay(200);
    }
    IrReceiver.resume();
  }
  stepper.setSpeed(dir * currspeed);
  stepper.runSpeed();
}

Os códigos de comando estão mapeados para teclas específicas (Vol+->31, Vol–>23, Mode->21, Play/Pause->7) no comando IR. Este mapeamento depende do comando IR que estás a usar! Para descobrires que teclas correspondem a que códigos de comando no teu comando, vê o nosso tutorial sobre How to use an IR receiver and remote with Arduino.

Há alguns detalhes interessantes no código. Primeiro, se acelerarmos, temos de evitar ultrapassar o MAXSPEED. A função min() garante isso. Da mesma forma, ao abrandar, usamos a função max() para garantir que não baixamos de MINSPEED.

Mudar de direção é fácil: sempre que carrego em MODE no meu comando, o recetor IR lê o código de comando 21, e simplesmente mudamos o sinal da variável dir . Nota que a variável dir é usada mais à frente no código quando a velocidade é definida via stepper.setSpeed(dir*currspeed), e determina a direção da rotação (+1 = sentido dos ponteiros do relógio, -1 = sentido contrário).

O último comando é alternar entre correr ou parar usando a tecla PLAY/PAUSE do meu comando. Usamos um ternary condition (c ? a : b) aqui para verificar se a velocidade atual é maior que zero. Se for o caso, significa que o motor está a funcionar e definimos a velocidade atual para zero para parar. Caso contrário, se o motor não estiver a funcionar (velocidade zero), definimos a velocidade para a última conhecida (prevspeed).

Aplicações

Há imenso que podes fazer com um motor de passo controlado por IR. Aqui ficam algumas ideias divertidas e possíveis aplicações:

Estores ou Cortinas Automatizadas

Usa o motor de passo para controlar a abertura e fecho de estores ou cortinas em resposta a comandos do comando IR. Pode ser uma adição prática a sistemas de automação doméstica.

Braço Robótico

Constrói um pequeno braço robótico que pode ser controlado com o comando IR. O motor de passo pode controlar o movimento do braço, permitindo-lhe apanhar e manipular objetos.

Comedouro Automático para Animais

Cria um comedouro automático que distribui comida em horários específicos ou em resposta a comandos do comando IR. O motor de passo pode controlar o mecanismo de libertação da comida.

Sistema de Rega Automática

Constrói um sistema que rega plantas automaticamente com base num horário ou comandos do comando IR. O motor de passo pode controlar o fluxo de água ou o movimento de um braço de rega.

Abertura de Porta de Garagem

Usa o motor de passo para controlar a abertura e fecho de uma porta de garagem em resposta a comandos do comando IR. Pode ser uma adição útil a um sistema de automação doméstica.

Aspirador Robótico

Cria um pequeno aspirador robótico que pode ser controlado com o comando IR. O motor de passo pode controlar o movimento do aspirador, permitindo-lhe navegar pela divisão.

Comedouro Automático para Peixes

Constrói um comedouro automático para peixes que distribui comida em horários específicos ou em resposta a comandos do comando IR. O motor de passo pode controlar o mecanismo de libertação da comida.

Fechadura Inteligente

Usa o motor de passo para controlar o trancar e destrancar de uma porta em resposta a comandos do comando IR. Pode ser uma adição prática a um sistema de automação doméstica.

Abertura Automática de Janelas

Cria um sistema que abre e fecha janelas automaticamente com base na temperatura ou em comandos do comando IR. O motor de passo pode controlar o movimento da janela.

Barman Robótico

Constrói um barman robótico que pode misturar e servir bebidas com base em comandos do comando IR. O motor de passo pode controlar o movimento do mecanismo de distribuição de bebidas.

Conclusões

Neste tutorial, aprendeste a controlar um motor de passo 28byj-48 usando um comando IR e um driver ULN2003 com a ajuda de uma placa Arduino. Seguindo os passos deste guia, já deves conseguir integrar estes componentes nos teus próprios projetos e criar movimentos precisos de motor.

Começámos por reunir as peças necessárias, incluindo o motor de passo 28byj-48, um comando IR, um driver ULN2003 e uma placa Arduino. Depois ligámos estes componentes, garantindo que a cablagem estava correta e segura.

De seguida, escrevemos o código Arduino para receber sinais do comando IR e traduzi-los em movimentos específicos do motor. Utilizando a biblioteca IRremote, conseguimos facilmente capturar e interpretar os sinais enviados pelo comando. Depois usámos o driver ULN2003 para controlar o motor de passo, fornecendo a energia e sinais necessários para mover o motor na direção e velocidade desejadas.

Em conclusão, controlar um motor de passo 28byj-48 com um comando IR usando um driver ULN2003 é um projeto divertido e prático que abre um mundo de possibilidades para automação e robótica. Seja para construir um slider de câmara, um braço robótico ou qualquer outro projeto que exija controlo preciso de motores, este tutorial deu-te o conhecimento e as competências necessárias para começares.

Esperamos que tenhas achado este tutorial útil e que te tenha inspirado a explorar ainda mais possibilidades com motores de passo e Arduino. Consulta a secção de Links para mais recursos e projetos relacionados com controlo de motores de passo. Boas criações!

Perguntas Frequentes

Aqui estão algumas perguntas frequentes sobre o controlo de um motor de passo 28byj-48 com um comando IR usando um driver ULN2003:

P: Posso usar um motor de passo diferente com esta configuração?

R: Sim, podes usar um motor de passo diferente desde que tenha especificações compatíveis. Certifica-te de verificar a tensão, corrente e passos por volta do motor para garantir a compatibilidade com o driver ULN2003. Vê os nossos tutoriais sobre alternativas driver boards and stepper motors.

P: Posso usar um driver diferente em vez do ULN2003?

R: Sim, podes usar um driver diferente como o A4988 ou o DRV8825. No entanto, terás de modificar o código para corresponder à configuração dos pinos e sinais de controlo do novo driver.

P: Posso controlar vários motores de passo com esta configuração?

R: Sim, podes controlar vários motores de passo ligando cada motor a um driver ULN2003 separado e usando pinos diferentes no Arduino para cada driver. Terás de modificar o código para controlar cada motor individualmente.

P: Posso usar outro microcontrolador em vez do Arduino?

R: Sim, podes usar outro microcontrolador como o ESP32 ou o Raspberry Pi. No entanto, terás de adaptar o código à linguagem de programação e à configuração de pinos do microcontrolador escolhido.

P: Como posso alimentar o motor de passo?

R: O motor de passo pode ser alimentado com uma fonte de alimentação externa. Certifica-te de ligar o terminal positivo da fonte ao pino VCC do driver ULN2003 e o terminal negativo ao pino GND. A tensão da fonte deve corresponder à tensão nominal do motor (5-12V).

P: Posso controlar o motor de passo sem fios?

R: Sim, podes controlar o motor de passo sem fios usando um módulo de comunicação sem fios como Bluetooth ou Wi-Fi. Terás de integrar o protocolo de comunicação adequado no teu código e estabelecer ligação entre o microcontrolador e o módulo sem fios.

Se tiveres outras dúvidas ou questões, deixa um comentário abaixo ou consulta os links fornecidos para mais informações.

Links

Aqui estão alguns links para tutoriais relacionados: