/******************************************************************************* Projeto I10 - Controlando motores DC com sensor capacitivo - 4 velocidades Autor: Angelo Luis Ferreira Data: 26/01/2021 http://squids.com.br/arduino *******************************************************************************/ //motor A const byte A_IA = 9; // Motor A Input A --> MOTOR A (+) (PWM) const byte A_IB = 6; // Motor A Input B --> MOTOR A (-) (PWM) //motor B const byte B_IA = 11; // Motor B Input A --> MOTOR B (+) (PWM) const byte B_IB = 10; // Motor B Input B --> MOTOR B (-) (PWM) // controle #define setTurn 2 // Entrada da botão que altera o sentido de rotação //variáveis int motorSpeed = 0; // armazenar o valor de velocidade atual boolean stateBreak = 0; // armazenar breack (0 ou 1) - 0: em movimento / 1: parado boolean stateTurn = 0; // armazenar rotação (0 ou 1) - 0: horário / 1: anti-horário // conexão pinos do sensor capacitivo const byte tecla1 = 4; const byte tecla2 = 5; const byte tecla3 = 12; const byte tecla4 = 13; // Inicializa Pinos e Comunicação Serial void setup(){ Serial.begin(9600); // inicia a comunicação serial // define pinos como saída do Arduino pinMode(A_IA,OUTPUT); // motor A pinMode(A_IB,OUTPUT); // motor A pinMode(B_IA,OUTPUT); // motor B pinMode(B_IB,OUTPUT); // motor B // define botões como entrada (pullup interno) pinMode(setTurn, INPUT_PULLUP); // define teclados do sensor capacitivo pinMode(tecla1, INPUT); pinMode(tecla2, INPUT); pinMode(tecla3, INPUT); pinMode(tecla4, INPUT); // inicia com os motores desligados motorBreak(); // exibe valores e sentido de rotação printMonitor(); } // loop infinito void loop() { rotation(); //verifica se o pushbutton foi pressionao if (!stateBreak) { menuSensor(); // inicia teclado sensor capacitivo } else { motorBreak(); } } // menu do sensor capacitivo 4 teclas void menuSensor() { // Marcha 1 - velocidade 30% da velocidade máxima if (digitalRead(tecla1)) { // motorSpeed = (255 * 0.30); delay(50); motorRun(motorSpeed); } // Marcha 2 - velocidade 50% da velocidade máxima if (digitalRead(tecla2)) { // motorSpeed = (255 * 0.50); motorRun(motorSpeed); } // Marcha 3 - velocidade 75% da velocidade máxima if (digitalRead(tecla3)) { // motorSpeed = (255 * 0.75); motorRun(motorSpeed); } // Marcha 4 - velocidade 50% da velocidade máxima if (digitalRead(tecla4)) { // motorSpeed = 255; motorRun(motorSpeed); } // break rápido if (digitalRead(tecla1) && digitalRead(tecla4)) { stateBreak = 1; motorSpeed = 0; printMonitor(); } } // verifica se o push button foi acionado e altera o estado void rotation() { if (!digitalRead(setTurn)) { // verifica se o botão foi acionado stateTurn = !stateTurn; motorBreak(); motorRun(motorSpeed); // roda motor na velocidade programada while(!digitalRead(setTurn)) {} // espera soltar o botão delay(50);// reduzir bouncing do push button printMonitor(); } } // função para rodar o motor na velocidade e sentido de rotação definidos void motorRun(int velocidade) { if (!stateTurn) { // sentido horário (frente) digitalWrite(A_IB,LOW); digitalWrite(B_IB, LOW); analogWrite(A_IA, velocidade); // velocidade em função do sinal PWM analogWrite(B_IA, velocidade); // velocidade em função do sinal PWM } else { // sentido anti-horário (backward) digitalWrite(A_IA,LOW); digitalWrite(B_IA, LOW); analogWrite(A_IB, velocidade); // velocidade em função do sinal PWM analogWrite(B_IB, velocidade); // velocidade em função do sinal PWM } } // freio do motor void motorBreak() { digitalWrite(A_IA,LOW); digitalWrite(A_IB,LOW); digitalWrite(B_IA, LOW); digitalWrite(B_IB,LOW); delay(300); stateBreak = 0; } // imprime no monitor serial void printMonitor() { Serial.print("Sentido: "); if (!stateTurn) { Serial.print("Horário - Para frente"); } else { Serial.print("Anti Horário - Para trás"); } Serial.print(" | "); Serial.print("Velocidade: "); Serial.println(motorSpeed); }