Curso C para Arduino
⚙️ Tipos de motores más comunes
| Tipo de motor | Controlable por | Usos comunes |
|---|---|---|
| Servo | PWM | Brazo robótico, dirección, ejes |
| DC (corriente continua) | PWM + H-Bridge | Ruedas, ventiladores, bombas |
| Paso a paso (stepper) | Secuencias de pasos | Impresoras 3D, CNC, cámaras |
🔸 1. Servomotores (SG90, MG996R...)
Los servos se controlan con una señal PWM especial, que determina su ángulo entre 0° y 180°.
📦 Conexión
- Rojo: 5V
- Marrón o negro: GND
- Naranja o amarillo: señal (ej. pin 9)
🧪 Código básico con Servo.h
1#include <Servo.h> 2 3Servo servoMotor; 4 5void setup() { 6 servoMotor.attach(9); // Pin de control 7} 8 9void loop() { 10 servoMotor.write(0); // Gira a 0 grados 11 delay(1000); 12 servoMotor.write(90); // Gira a 90 grados 13 delay(1000); 14 servoMotor.write(180); // Gira a 180 grados 15 delay(1000); 16}
🔸 2. Motores DC con L298N o L293D
Para controlar un motor DC necesitas:
- Alimentación externa (el motor no debe alimentarse directamente del Arduino)
- Un puente H (como L298N, L293D)
- Señales PWM para velocidad y digitales para dirección
📦 Conexión básica L298N
| L298N Pin | Arduino |
|---|---|
| ENA | PWM (ej. 9) |
| IN1 | 8 |
| IN2 | 7 |
| GND | GND |
| 12V | Fuente externa |
🧪 Código para dirección + velocidad
1const int ENA = 9; 2const int IN1 = 8; 3const int IN2 = 7; 4 5void setup() { 6 pinMode(ENA, OUTPUT); 7 pinMode(IN1, OUTPUT); 8 pinMode(IN2, OUTPUT); 9} 10 11void loop() { 12 // Adelante 13 digitalWrite(IN1, HIGH); 14 digitalWrite(IN2, LOW); 15 analogWrite(ENA, 200); // velocidad de 0 a 255 16 delay(2000); 17 18 // Detener 19 analogWrite(ENA, 0); 20 delay(1000); 21 22 // Atrás 23 digitalWrite(IN1, LOW); 24 digitalWrite(IN2, HIGH); 25 analogWrite(ENA, 150); 26 delay(2000); 27}
🔸 3. Motores paso a paso
Se mueven paso a paso, permitiendo control muy preciso de ángulo y posición.
🔹 Ejemplo: 28BYJ-48 + ULN2003
Se conecta a través de una placa controladora ULN2003 que usa 4 pines digitales.
🧪 Código con Stepper.h
1#include <Stepper.h> 2 3const int pasosPorVuelta = 2048; 4 5Stepper motor(pasosPorVuelta, 8, 10, 9, 11); // orden de pines recomendado 6 7void setup() { 8 motor.setSpeed(10); // RPM 9} 10 11void loop() { 12 motor.step(pasosPorVuelta); // una vuelta completa 13 delay(1000); 14 motor.step(-pasosPorVuelta); // en sentido contrario 15 delay(1000); 16}
🔹 Ejemplo avanzado: NEMA17 + A4988
- Controla motores paso a paso más potentes.
- Usa 2 pines: STEP y DIR.
Se debe ajustar el potenciómetro del A4988 para limitar corriente.
🧪 Código básico (sin librería):
1const int DIR = 3; 2const int STEP = 4; 3 4void setup() { 5 pinMode(DIR, OUTPUT); 6 pinMode(STEP, OUTPUT); 7} 8 9void loop() { 10 digitalWrite(DIR, HIGH); // dirección 11 for (int i = 0; i < 200; i++) { 12 digitalWrite(STEP, HIGH); 13 delayMicroseconds(800); 14 digitalWrite(STEP, LOW); 15 delayMicroseconds(800); 16 } 17 18 delay(1000); 19}
🎚️ PWM (Pulse Width Modulation)
- Señal digital que simula valores analógicos mediante pulsos rápidos.
- En Arduino, se genera con
analogWrite(pin, valor)dondevalorva de 0 a 255. - Se usa para:
- Controlar velocidad de motores DC
- Atenuar LEDs
- Simular tensión variable
📌 Pines PWM en Arduino UNO: 3, 5, 6, 9, 10, 11
🧠 Recomendaciones
| Motor | Controlador | Librería útil | Notas |
|---|---|---|---|
| Servo (SG90, etc) | Directo | Servo.h | Ideal para ángulos precisos |
| DC | L298N, L293D | Ninguna o PWM | Usa analogWrite() + IN1/2 |
| Stepper (28BYJ) | ULN2003 | Stepper.h | Control por pasos |
| Stepper (NEMA) | A4988/DRV8825 | AccelStepper | Control suave y preciso |
🧪 Proyecto sugerido
"Brazo robótico controlado por potenciómetros"
- 3 servos (base, brazo, pinza)
- Cada uno controlado por un potenciómetro
- Muestra los ángulos en pantalla OLED o Serial