Proyecto integrador para modelar y controlar la velocidad de una banda transportadora accionada por un motor DC con encoder Hall. El proyecto está separado en dos interfaces:
- GUI_Arduino: interfaz de escritorio para conexión serial con Arduino, control en tiempo real y comparación contra el modelo.
- GUI_Modelado: interfaz Streamlit dedicada al análisis matemático del sistema.
El firmware del Arduino se desarrolla con PlatformIO.
Proyecto_Integrador/
+-- Banda_GUI/
| +-- platformio.ini
| +-- src/
| +-- main.cpp # Firmware Arduino/PlatformIO
+-- GUI_Arduino/
| +-- main.py # Interfaz de escritorio de Arduino
| +-- constants.py
| +-- data_manager.py
| +-- model_engine.py
| +-- plot_widgets.py
| +-- serial_manager.py
| +-- requirements.txt
+-- GUI_Modelado/
| +-- GUI.py # Interfaz Streamlit de modelado matemático
| +-- control_math.py
| +-- requirements.txt
+-- Pruebas_Arduino/ # Códigos necesarios para obtener modelado y hacer pruebas
+-- Docs/
+-- LICENSE
+-- README.md
El firmware está en:
Banda_GUI/src/main.cpp
La placa configurada actualmente es Arduino Uno:
[env:uno]
platform = atmelavr
board = uno
framework = arduino
monitor_speed = 115200
upload_speed = 115200| Elemento | Pin |
|---|---|
| Encoder A | 2 |
| Encoder B | 3 |
| L298N IN1 | 8 |
| L298N IN2 | 9 |
| L298N ENA/PWM | 10 |
PPR motor = 16.0
Relación de reducción = 270.0
CPR = PPR motor * relación de reducción
Periodo de muestreo = 50 msEl setpoint usado actualmente está limitado a:
11 RPM <= setpoint <= 35 RPM
La GUI de Arduino y el firmware aplican este rango.
El setpoint se ingresa en RPM. El firmware calcula un PWM base con la relación experimental:
PWM = 0.0416*RPM^3 - 2.3343*RPM^2 + 44.086*RPM - 210.76
Ese PWM base se usa como acción inicial o feed-forward. Luego el controlador seleccionado suma una corrección según el error medido por el encoder. El resultado final se limita al rango válido de Arduino:
0 <= PWM <= 255
Los modelos usados en GUI_Arduino y GUI_Modelado son:
| Controlador | Función de transferencia | Parámetros |
|---|---|---|
| P | C(s) = Kp |
Kp |
| PI | C(s) = Kp + Ki/s |
Kp, Ki |
| PD | C(s) = Kp + Kd*s |
Kp, Kd |
| PID | C(s) = Kp + Ki/s + Kd*s |
Kp, Ki, Kd |
La interfaz de Arduino envía comandos de texto terminados en salto de línea.
| Comando | Función |
|---|---|
START |
Inicia el control y la transmisión de datos |
STOP |
Detiene el motor |
RESET |
Reinicia conteos e integrador |
SETPOINT:<rpm> |
Cambia el setpoint en RPM, limitado internamente a 11-35 RPM |
CTRL:P |
Selecciona controlador proporcional |
CTRL:PI |
Selecciona controlador proporcional-integral |
CTRL:PD |
Selecciona controlador proporcional-derivativo |
CTRL:PID |
Selecciona controlador PID |
GAINS:<kp>,<ki>,<kd> |
Actualiza las ganancias del controlador |
El firmware responde con datos CSV por serial:
tiempo_s,rpm_medida,setpoint_rpm,error_rpm,pwm,controlador
Interfaz de escritorio hecha con Tkinter + Matplotlib.
Incluye:
- Selección de puerto serial.
- Botones para conectar, desconectar, iniciar, detener y limpiar datos.
- Setpoint en RPM dentro del rango
11-35. - Selección de controlador P, PI, PD o PID.
- Ajuste de ganancias
Kp,KiyKd. - Envío manual de parámetros mediante el botón Enviar parámetros.
- Gráfica superior con RPM real, setpoint y modelo matemático.
- Gráfica inferior del error.
- Cambio de color por controlador:
- P: cian
- PI: verde
- PD: amarillo
- PID: morado
Cuando se cambia el setpoint o controlador, la gráfica conserva el historial: desde el instante del cambio hacia adelante se dibuja el nuevo tramo.
cd "C:\Users\Manuel\Desktop\Universidad\Control Automático\VScode\Proyecto_Integrador\GUI_Arduino"
pip install -r requirements.txt
python GUI.pyInterfaz Streamlit dedicada solo al modelado matemático.
Incluye:
- Setpoint entre
11 RPMy35 RPM. - Selección de modelo de planta: primer orden o segundo orden.
- Controladores P, PI, PD y PID.
- Respuesta temporal en lazo cerrado.
- Lugar de las raíces y regiones de estabilidad.
- Mapa de polos y ceros.
- Diagramas de Bode y márgenes.
- Diagnóstico de estabilidad.
Las gráficas temporales se muestran hasta que la respuesta entra y permanece dentro de la región del 2% del setpoint. Si la respuesta no alcanza esa región, la gráfica se extiende hasta 10 segundos.
cd "C:\Users\Manuel\Desktop\Universidad\Control Automático\VScode\Proyecto_Integrador\GUI_Modelado"
pip install -r requirements.txt
streamlit run GUI.pyDesde la carpeta Banda_GUI:
cd "C:\Users\Manuel\Desktop\Universidad\Control Automático\VScode\Proyecto_Integrador\Banda_GUI"
pio run
pio run -t uploadTambién se puede cargar desde VSCode usando el botón Upload de PlatformIO.
- Conectar el Arduino por USB.
- Cargar el firmware con PlatformIO si hubo cambios en
main.cpp. - Ejecutar
GUI_Arduino. - Seleccionar el puerto serial y presionar Conectar.
- Elegir setpoint, controlador y ganancias.
- Presionar Enviar parámetros.
- Presionar START.
- Observar la velocidad real, la respuesta del modelo y el error.
- Si se cambia setpoint, controlador o ganancias, volver a presionar Enviar parámetros.
- Presionar STOP antes de desconectar.
- Python 3.9 o superior.
- VSCode.
- Extensión PlatformIO.
- Arduino Uno o placa compatible.
- Driver serial correspondiente a la placa, si aplica.
Este proyecto se distribuye bajo licencia MIT. Consulta el archivo LICENSE para más detalles.