⬤ Motor DC · Iniciante
📈 Motor DC — Controlo de Velocidade
⏱️ 25 min🧩 setSpeed() · PWM · analogRead() · Potenciómetro
📈 PWM e setSpeed()
ℹ️setSpeed(v) define o duty cycle do PWM no enable do L293D: 0 = parado, 255 = máximo. A velocidade real depende do motor e da carga.
ex_dc_pwm.ino
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <AFMotor.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
AF_DCMotor motor(1);
void setup() {
lcd.init(); lcd.backlight();
motor.run(FORWARD);
lcd.setCursor(0,0); lcd.print("Motor DC: PWM");
lcd.setCursor(0,1); lcd.print("Vel: ");
lcd.setCursor(0,2); lcd.print("PWM: ");
}
void loop() {
for(int v=0; v<=255; v+=5) {
motor.setSpeed(v);
lcd.setCursor(5,1); lcd.print(v); lcd.print(" ");
lcd.setCursor(5,2); lcd.print(v*100/255); lcd.print(" % ");
delay(30);
}
for(int v=255; v>=0; v-=5) {
motor.setSpeed(v);
lcd.setCursor(5,1); lcd.print(v); lcd.print(" ");
delay(30);
}
}
🎛️ Controlo Manual com Potenciómetro
ex_dc_pot.ino
#define POT A0
int ultV = -1;
void loop() {
int raw = analogRead(POT);
int vel = map(raw, 0, 1023, 0, 255);
if(abs(vel-ultV) > 2) { // zona morta de 2
motor.setSpeed(vel);
lcd.setCursor(0,1); lcd.print("Pot:");lcd.print(raw);lcd.print(" V:");lcd.print(vel);lcd.print(" ");
ultV = vel;
}
delay(50);
}
☀️ Velocidade por Luminosidade (LDR)
ex_dc_ldr.ino
#define LDR A1
void loop() {
int ldr = analogRead(LDR);
int vel = map(ldr, 0, 1023, 50, 255);
motor.setSpeed(vel);
lcd.setCursor(0,0); lcd.print("LDR:");lcd.print(ldr);
lcd.setCursor(0,1); lcd.print("Vel:");lcd.print(vel);
delay(100);
}
🏆 Para ir mais longe
- Qual a velocidade mínima (setSpeed) a partir da qual o teu motor arranca? Mede
- Usa Serial Plotter para ver a relação setSpeed vs. som do motor
- Implementa limitador: motor nunca excede 200/255 mesmo que o pot esteja no máximo
- Cria modo automático: velocidade alta de dia (LDR alto) e baixa de noite (LDR baixo)