Bem-vindo a mais um artigo aqui na EletronWorld. Hoje vamos efetuar a configuração e programação de um motor de passo junto a um encoder rotativo. Para fazer isso, além do Arduino, irei utilizar os componentes a seguir.
Um Típico motor de passo, comumente vendido pelas lojas de componentes eletrônicos. Que inclusive já vem com o módulo driver ULN2003. Veja na figura abaixo:
Os motores de passo são amplamente utilizados em diversos equipamentos eletrônicos, e basicamente são motores os quais são empregados em situações onde se necessita maior precisão dos movimentos. Isso porque os mesmos permitem o ajuste do ângulo de rotação e controle de velocidade através de sinais de impulsos.
Outro componente utilizado neste tutorial, é um típico encoder. No caso estou utilizando o encoder Keyes KY-040. Basicamente ele converte movimentos rotativos em impulsos elétricos de onda quadrada. O modelo empregado, que também pode ser adquirido facilmente em lojas especializadas na área, possui ainda um botão, que pode ser utilizado ao pressionar o eixo do componente. Veja a figura abaixo:
Por fim ainda, vamos colocar um resistor e um led para testar a funcionalidade do botão embutido junto ao encoder.
Circuito
Nosso objetivo aqui é movimentar o motor de passo através do encoder. O programa irá interpretar e enviar os comandos ao motor de passo. Para isso, iremos utilizar das interrupções no Arduino. Se você ainda não viu, recomendo que faça a leitura do artigo abaixo, que já foi publicado aqui recentemente.
Arduino Interrupções (Em andamento)
Código
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
// Bibliotecas e Definições #include "Stepper.h" const int stepsPerRevolution = 32; volatile boolean GiroIdentificado; // Variável para a interrupção volatile boolean RotDirection; // Direção rotação encoder // Terminais de conexão do Encoder const int PinoCLK = 2; const int PinoDT = 3; const int PinoSW = 4; // Declaração de variáveis utilizadas para a posição e led int led = 6; int RotPosition = 0; int PrevPosition; int Steps; // Configuração do motor de passo Stepper MotorStepper(stepsPerRevolution, 8, 10, 9, 11); // Rotina da interrupção void interrupt () { delay(4); if (digitalRead(PinoCLK)) RotDirection = digitalRead(PinoDT); else RotDirection = !digitalRead(PinoDT); GiroIdentificado = true; } void setup () { pinMode(PinoCLK,INPUT); // Configuração variáveis como entrada pinMode(PinoDT,INPUT); pinMode(PinoSW,INPUT); digitalWrite(PinoSW, HIGH); // Resistor de Pull-up para o botão attachInterrupt (0,interrupt,FALLING); // Configuração da interrupção pinMode(led,OUTPUT); // Config. Led como saída } void loop () { MotorStepper.setSpeed(600); // Teste se o botão for pressionado if (!(digitalRead(PinoSW))) { if (RotPosition == 0) { } else { // Troca o estado do led digitalWrite(led, !digitalRead(led)); delay(500); } } // Rotina caso o encoder seja rotacionado if (GiroIdentificado) { PrevPosition = RotPosition; // Armazena Posição anterior if (RotDirection) { RotPosition = RotPosition - 1;} // Decrementa else { RotPosition = RotPosition + 1;} // Incrementa // Para não repetir loop até nova rotação GiroIdentificado = false; // Rotina da direção que o motor irá girar // Mover motor CW if ((PrevPosition + 1) == RotPosition) { Steps = 50; MotorStepper.step(Steps); } // Mover motor CCW if ((RotPosition + 1) == PrevPosition) { Steps = -50; MotorStepper.step(Steps); } } } |
Deixar um comentário