O L293D contém dois H-bridges — 4 transistores por canal que permitem inverter a polaridade da tensão no motor. A velocidade é controlada por PWM no pino de enable.
| IN1 (D4) | IN2 (D8) | Estado do motor | AFMotor |
|---|---|---|---|
| HIGH | LOW | FORWARD (frente) | motor.run(FORWARD) |
| LOW | HIGH | BACKWARD (trás) | motor.run(BACKWARD) |
| LOW | LOW | BRAKE (travagem rápida) | motor.run(BRAKE) |
| — | — | RELEASE (motor livre) | motor.run(RELEASE) |
#include <AFMotor.h>
// Canais: 1 = M1 (D3,D4,D8) | 2 = M2 (D11,D7,D2)
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
motor1.setSpeed(200); // 0 = parado | 255 = máximo
motor1.run(FORWARD); // FORWARD | BACKWARD | BRAKE | RELEASE#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <AFMotor.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
AF_DCMotor motor(1);
void estadoLCD(const char* dir, int spd) {
lcd.setCursor(0,1); lcd.print("Dir: "); lcd.print(dir); lcd.print(" ");
lcd.setCursor(0,2); lcd.print("Vel: "); lcd.print(spd); lcd.print("/255 ");
}
void setup() {
lcd.init(); lcd.backlight();
lcd.setCursor(0,0); lcd.print("Motor DC Canal 1");
motor.setSpeed(200);
}
void loop() {
motor.run(FORWARD); estadoLCD("FORWARD", 200); delay(2500);
motor.run(BRAKE); estadoLCD("BRAKE", 0); delay(800);
motor.run(BACKWARD); estadoLCD("BACKWARD", 200); delay(2500);
motor.run(RELEASE); estadoLCD("RELEASE", 0); delay(800);
}void rampa(AF_DCMotor& m, int vI, int vF, int ms) {
int passos = abs(vF-vI);
int espera = passos > 0 ? ms/passos : ms;
int d = vF > vI ? 1 : -1;
for(int v=vI; v!=vF; v+=d) {
m.setSpeed(v);
lcd.setCursor(5,2); lcd.print(v); lcd.print(" ");
delay(espera);
}
m.setSpeed(vF);
}
void loop() {
motor.run(FORWARD);
rampa(motor, 0, 220, 2000); delay(1000);
rampa(motor, 220, 0, 2000);
motor.run(RELEASE); delay(500);
}