Control Experto de Motores DC: Consejos y Trucos con Controlador PID
Componentes y Suministros
| Arduino Due (o cualquier placa Arduino) | × | 1 |
| Pantalla TFT Makeblock Me (opcional) | × | 1 |
| Resistor 4.75 kΩ (x4) | × | 4 |
| Potenciómetro Rotativo (x4, 3 opcionales para ajustar coeficientes PID) | × | 4 |
| Transistor PNP Uso General (x4, ej. BC307A) | × | 4 |
| Motor DC Genérico | × | 1 |
| Interruptor Deslizante (para selección de dirección) | × | 1 |
| Sensor Velocidad Fotoeléctrico HC-020K | × | 1 |
| Protoboard y Cables Jumper | × | 1 |
Aplicaciones y Servicios Online
- Arduino IDE
Sobre este Proyecto
Control de Velocidad y Dirección de Motores DC mediante Controlador PID y Salidas PWM
Introducción
La mayoría de proyectos intentan controlar velocidad y dirección enviando PWM directamente al motor (incluso a través de un driver). Sin embargo, este método falla cuando se requiere precisión debido a la fricción y la inercia. La velocidad real nunca coincide con el punto de consigna (setpoint), generando un error significativo.
La solución es el control PID.
Controlador PID
Imagina conducir un coche: para arrancar pisas el acelerador a fondo; en crucero lo mantienes suave; si aceleras demasiado, lo sueltas. El PID hace lo mismo:
- Proporcional (P): Define la pendiente de aceleración según el error actual.
- Integral (I): Suma los errores en el tiempo para eliminar el error residual.
- Derivativo (D): Observa la tasa de cambio del error y aplica una corrección anticipada.
Función PID implementada en Arduino:
float controllerPID(float _E, float _Eprev, float _dT, float _Kp, float _Ki, float _Kd) {
float P = _Kp * _E;
float I = _Kp * 0.5 * _Ki * (_E + _Eprev) * _dT;
float D = _Kp * _Kd * (_E - _Eprev) / _dT;
return (P + I + D);
}
La salida final PWM se calcula sumando la salida actual más la salida del PID:
E = RPMset - RPM;
float cPID = controllerPID(E, Eprev, dT, Kp, Ki, Kd);
if (RPMset == 0) OutputRPM = 0;
else OutputRPM = OutputRPM + cPID;
if (OutputRPM < _minRPM) OutputRPM = _minRPM;
Circuito de Alimentación del Motor DC
Nunca alimentes un motor DC directamente desde el Arduino. Se necesitan transistores. Los motores se controlan por corriente, no voltaje. Usé 4 transistores PNP BC307A en puente H para invertir la corriente. Es crucial seleccionar transistores con ganancia (hfe) similar. Para dimensionar la resistencia de base:
R = (VT - VBEon) * hfe / IM
En mi caso: IM=70mA, hfe≈140, VBEon=0.62V, VT=3.3V (Arduino Due) → R≈5360Ω (usé 4.9kΩ).
Inversión de Dirección y Notas Importantes
Para invertir dirección, se invierte el flujo de corriente mediante el puente de 4 transistores. PWM Output#2 activa T1A/T1B (sentido horario), PWM Output#3 activa T2A/T2B (antihorario).
Corriente de arranque: Los motores consumen picos de corriente al arrancar (≈130% nominal). Si se invierte polaridad sin detenerse antes, pueden producirse picos destructivos. Mi código incluye una rutina que pone ambos PWM a cero y espera a que el motor se detenga antes de cambiar dirección.
Lectura de Velocidad
Sensor HC-020K (20 ranuras). Alimentado a 3.3V (compatibilidad Arduino Due). Función de lectura de frecuencia:
int readFrequency(int pin, float speed) {
// Cuenta flancos descendentes durante 1/speed segundos
// Devuelve frecuencia en Hz
}
RPM = 60 * readFrequency(pin, 4) / 20;
Mejoras Gráficas (Opcional)
Usé pantalla Makeblock Me TFT LCD con funciones personalizadas para dibujar ejes cartesianos, limpiar áreas y trazar gráficas en tiempo real (consigna vs real, coeficientes PID, error, salida).
Conclusión
Se adjuntan dos versiones del código: con y sin funciones gráficas. Normalmente un motor DC no baja del 10-20% de velocidad nominal, pero con PID se puede llegar al 5% en vacío.
Nota (25/02/2018): Si usas transistores NPN en lugar de PNP, la polarización es inversa: PNP E(+) C(-), NPN C(+) E(-).
Código
Versión Completa (con Gráficos)
Incluye configuración de pantalla, ejes cartesianos, alarmas visuales, ploteo de curvas y gestión de alarmas. Código extenso disponible en el tutorial original.
Versión Simplificada (Solo Control PID)
Incluye solo la lógica de control: lectura de entradas (potenciómetros para Kp, Ki, Kd, consigna, dirección), cálculo PID, cambio de dirección seguro, escritura PWM y lectura de velocidad. Código completo en el tutorial.
Esquemáticos
Prototipo explicativo del control de velocidad por PID y consideraciones para inversión de dirección. Ver imagen adjunta.
Proceso de manufactura
- Construya Efectos de Audio Controlados por Sensores con el Kit Satellite CCRMA
- Controla Dos Motores Paso a Paso con Arduino Nano y Joystick - Tutorial Sencillo
- Control de Matriz LED 8×8 con Arduino Uno: Guía Paso a Paso
- Sistema inteligente de monitorización de temperatura para escuelas: preciso, en tiempo real y seguro
- Librería Eficiente de Puerto I/O de 8 Bits para Arduino – Expande el Control Digital
- Teclado Prototipo de 64 Teclas con Arduino: Matriz con Registros de Desplazamiento
- Pantalla TFT Shield de Alto Rendimiento 2.8” para Arduino Nano – Display SPI 320×240
- Circuito de entrada analógica aislada para Arduino
- Detector de Rayos Económico con Arduino Uno
- Kit de Robot de Navegación Interior Inteligente para Proyectos Arduino
- Mejorando rendimiento de motores DC con aleaciones Tungsteno-Cobre