Para acionar o motor de passo vou usar o EasyDriver. Esta pequena plaquinha contem o Allegro A3967, um controlador bastante versátil e fácil de interfacear. Neste exemplo, as ligações que eu fiz no EasyDriver são:
- O sinal GND ao terra do Arduino
- O sinal STEP ao pino D do Arduino
- O sinal DIR ao pino D do Arduino
- O sinal ENABLE ao pino D do Arduino
- Os pinos MOTOR A B C D às bobinas do motor de passo
- Os pinos PWR IN (alimentação do motor) a uma fonte externa de 12V
Uma característica deste controlador é que normalmente temos corrente nas bobinas quando o motor está parado (para segurar o motor na posição), o que gera um certo aquecimento da placa e do motor. Como não estou preocupado em segurar o motor, uso o pino ENABLE para desabilitar as saídas quando o motor estiver parado.
Para mover o motor basta enviar um pulso no sinal STEP. Por default o controlador trabalha com microstepping - cada pulso corresponde a um oitavo de passo. O sinal DIR define a direção do movimento.
A tecla Play é usada para ligar e desligar o movimento. As teclas Next e Prev controlam o sinal DIR, permitindo definir se o movimento será para frente ou para trás. Estas duas teclas só atuam quando o motor estiver parado.
O programa não é muito complicado:
- /*
- * Segundo exemplo de comando do Arduino via IR
- */
- #include <IRremote.h>
- // variaveis para recepção dos comandos IR
- const int RECV_PIN = 11;
- IRrecv irrecv(RECV_PIN);
- // comandos
- typedef unsigned long dword;
- const dword addr = 0;
- const dword cmdPlay = 0x22;
- const dword cmdNext = 0xC2;
- const dword cmdPrev = 0x02;
- #define CMD_IR(cmd) ((addr << 24) | \
- ((~addr & 0xFF) << 16) | \
- (cmd << 8) | \
- (~cmd & 0xFF) )
- // pinos dos LEDs
- const int LED_R = 4;
- const int LED_Y = 3;
- const int LED_G = 2;
- // pinos do EasyDriver
- const int ED_DIR = 6;
- const int ED_STEP = 5;
- const int ED_ENAB = 13;
- // variaveis de controle do motor
- enum { PARADO, ANDANDO } modo = PARADO;
- void setup()
- {
- // Configura conexões dos LEDS
- pinMode (LED_G, OUTPUT);
- pinMode (LED_Y, OUTPUT);
- pinMode (LED_R, OUTPUT);
- // Configura conexões com o EasyDriver
- pinMode (ED_DIR, OUTPUT);
- pinMode (ED_STEP, OUTPUT);
- pinMode (ED_ENAB, OUTPUT);
- digitalWrite (ED_ENAB, HIGH); // desliga
- digitalWrite (ED_DIR, LOW);
- digitalWrite (ED_STEP, LOW);
- // Inicia recepção IR
- irrecv.enableIRIn();
- }
- void loop() {
- decode_results results;
- if (irrecv.decode(&results) && results.decode_type==NEC) {
- // recebeu um comando NEC
- switch (results.value) {
- case CMD_IR(cmdPlay):
- digitalWrite(LED_G, HIGH);
- digitalWrite(LED_Y, LOW);
- digitalWrite(LED_R, LOW);
- if (modo == ANDANDO) {
- modo = PARADO;
- digitalWrite (ED_ENAB, HIGH);
- } else {
- modo = ANDANDO;
- digitalWrite (ED_ENAB, LOW);
- }
- break;
- case CMD_IR(cmdPrev):
- digitalWrite(LED_G, LOW);
- digitalWrite(LED_Y, HIGH);
- digitalWrite(LED_R, LOW);
- if (modo == PARADO) {
- digitalWrite (ED_DIR, HIGH);
- }
- break;
- case CMD_IR(cmdNext):
- digitalWrite(LED_G, LOW);
- digitalWrite(LED_Y, LOW);
- digitalWrite(LED_R, HIGH);
- if (modo == PARADO) {
- digitalWrite (ED_DIR, LOW);
- }
- break;
- }
- // decodificar o próximo comando
- irrecv.resume();
- }
- // Move o motor se ligado
- if (modo == ANDANDO) {
- digitalWrite (ED_STEP, HIGH);
- delay (1);
- digitalWrite (ED_STEP, LOW);
- delay (1);
- }
- }
O vídeo e a foto dão uma dica do que eu pretendo fazer no próximo post.
Nenhum comentário:
Postar um comentário