/******************************************************************************* Projeto I08 - Controlando motores DC com drive ponte H L9190 Autor: Angelo Luis Ferreira Data: 16/12/2020 http://squids.com.br/arduino *******************************************************************************/ //motor A const byte A_IA = 13 ; // Motor A Input A --> MOTOR A (+) const byte A_IB = 11 ; // Motor A Input B --> MOTOR A (-) (PWM) //motor B const byte B_IA = 12; // Motor B Input A --> MOTOR B (+) const byte B_IB = 10; // Motor B Input B --> MOTOR B (-) (PWM) // controle #define switchPin 2 // Entrada da botão que inverte a rotação #define turnPin 8 // Entrada do botão liga e desliga o circuito #define potPin 0 // Potenciômetro no pino analógico 0 //variáveis int motorSpeed = 0; // armazenar o valor de velocidade atual boolean stateSwitch = 0; // armazenar o status do switchPin (0 ou 1) boolean stateTurn = 0; // armazenar rotação (0 ou1) // leds const byte ledGreen = 7; const byte ledYellow = 6; const byte ledRed = 5; //Inicializa Pinos void setup(){ // 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 pinos dos leds como saída pinMode(ledGreen, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledRed, OUTPUT); // define botões como entrada (pullup interno) pinMode(switchPin, INPUT_PULLUP); pinMode(turnPin, INPUT_PULLUP); // inicia com os motores desligados motorBreak(); } void loop() { turnOnOff(); // verifica o botão liga/desliga if (stateTurn) { // ligado // velocidade a partir do potenciômetro (0 a 255) motorSpeed = analogRead(potPin)/4; // verifica se os botões foram acionados turnLed(motorSpeed); turnRotation(); if(stateSwitch) { // gira no sentido anti-horário (para trás) digitalWrite(A_IA,LOW); digitalWrite(B_IA, LOW); // define a velocidade de 0 a 255 (máxima velocidade = 255) analogWrite(A_IB, motorSpeed); analogWrite(B_IB, motorSpeed); } else { // gira no sentido horário (para frente) digitalWrite(A_IA,HIGH); digitalWrite(B_IA, HIGH); // define a velocidade de 255 a 0 (máxima velocidade = 0) analogWrite(A_IB, 255-motorSpeed); analogWrite(B_IB, 255-motorSpeed); } } else { // desligado //apaga os leds turnOffLeds(); // freia os motores motorBreak(); } } // controle para ligar e desligar motores void turnOnOff() { if (!digitalRead(turnPin)) { // verifica se o botão foi acionado stateTurn = !stateTurn; while(!digitalRead(turnPin)) {} delay(50); } } // controle sentido de rotação void turnRotation() { if (!digitalRead(switchPin)) { // verifica se o botão foi acionado motorBreak(); // sempre parar o motor antes de mudanças bruscas stateSwitch = !stateSwitch; while(!digitalRead(switchPin)) {} delay(50); } } // freio do motor void motorBreak() { digitalWrite(A_IA,LOW); digitalWrite(A_IB,LOW); digitalWrite(B_IA, LOW); digitalWrite(B_IB,LOW); } // controle para acender leds de acordo com a velocidade void turnLed(byte j) { turnOffLeds(); if (j<=+85) { digitalWrite(ledGreen, HIGH); } else if ((85< j) && (j<= 170)) { digitalWrite(ledYellow, HIGH); } else if (j>=170) { digitalWrite(ledRed, HIGH); } } // apaga todos leds void turnOffLeds() { digitalWrite(ledGreen, LOW); digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); }