Código básico para mover motores DC
Con ENA en el pin 11, IN1 en el 10 e IN2 en el 9.
Para las primeras pruebas, deja el robot con las ruedas en el aire (sobre una caja, por ejemplo). Así no sale disparado si algo no va como esperas.
1. Adelante, parar y atrás
#define ENA 11
#define IN1 10
#define IN2 9
void setup() {
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
}
void loop() {
// adelante
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 200);
delay(2000);
// parar
analogWrite(ENA, 0);
delay(1000);
// atrás
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, 200);
delay(2000);
analogWrite(ENA, 0);
delay(1000);
}
2. Una función para el motor
Una sola función que recibe la velocidad con signo: positiva hacia delante, negativa hacia atrás.
void motorA(int velocidad) { // de -255 a 255
velocidad = constrain(velocidad, -255, 255);
digitalWrite(IN1, velocidad > 0);
digitalWrite(IN2, velocidad < 0);
analogWrite(ENA, abs(velocidad));
}
motorA(150) avanza, motorA(-150) retrocede y motorA(0) para.
3. Arranque suave
Acelerar de golpe hace patinar las ruedas y pide un pico de corriente a la batería. Mejor subir poco a poco:
void loop() {
for (int v = 0; v <= 255; v += 5) {
motorA(v);
delay(20);
}
delay(1000);
for (int v = 255; v >= 0; v -= 5) {
motorA(v);
delay(20);
}
delay(1000);
}
4. Dos motores: las funciones de un robot
Con el segundo motor conectado (ENB en el 6, IN3 en el 8, IN4 en el 7), estas funciones mueven un robot de dos ruedas. Son las que usan el sigue-líneas:
#define ENA 11
#define IN1 10
#define IN2 9
#define IN3 8
#define IN4 7
#define ENB 6
int velocidad = 180;
void motores(int izq, int der) { // de -255 a 255 cada uno
izq = constrain(izq, -255, 255);
der = constrain(der, -255, 255);
digitalWrite(IN1, izq > 0);
digitalWrite(IN2, izq < 0);
analogWrite(ENA, abs(izq));
digitalWrite(IN3, der > 0);
digitalWrite(IN4, der < 0);
analogWrite(ENB, abs(der));
}
void avanzar() { motores(velocidad, velocidad); }
void retroceder() { motores(-velocidad, -velocidad); }
void girarIzquierda() { motores(-velocidad, velocidad); }
void girarDerecha() { motores(velocidad, -velocidad); }
void parar() { motores(0, 0); }
void setup() {
int pines[] = {ENA, IN1, IN2, IN3, IN4, ENB};
for (int p : pines) pinMode(p, OUTPUT);
}
void loop() {
avanzar(); delay(1500);
girarDerecha(); delay(500);
avanzar(); delay(1500);
parar(); delay(2000);
}
Los giros hacen rodar una rueda hacia delante y la otra hacia atrás: el robot gira sobre sí mismo. Para curvas más abiertas, frena una rueda en lugar de invertirla: motores(velocidad, velocidad / 3).
Si el robot va hacia atrás cuando le dices avanzar(), o gira al revés, intercambia los cables del motor que va mal en sus bornas OUT. Es más fácil que tocar el código.
¿Y ahora qué?
Con un sensor de ultrasonidos delante y estas funciones, ya tienes la base de un robot móvil que esquiva obstáculos.