Arquitectura Software
El sistema IRStart tiene dos arquitecturas independientes: el mando (Remote, ESP32-C3) que emite códigos IR, y el módulo (Module, ATtiny13/85) que los recibe y controla la señal de arranque/parada.
Mando (Remote — ESP32-C3)
Bucle Principal
flowchart TD
A[Boot] --> B[init_components]
B --> C{¿Botón pulsado en boot?}
C -->|Start| D[Protocolo = RC5]
C -->|Stop| E[Protocolo = NEC]
C -->|Ready| F[Protocolo = SIRC]
C -->|Ninguno| G[Protocolo = RC5 default]
D --> H[init_ir]
E --> H
F --> H
G --> H
H --> I[Esperar liberación de botones]
I --> J[Mostrar LEDs modo]
J --> K[Loop]
K --> L{¿Botón Ready?}
L -->|Sí| M[Enviar Ready]
L -->|No| N{¿Botón Start?}
N -->|Sí| O[Enviar Start]
N -->|No| P{¿Botón Stop?}
P -->|Sí| Q[Enviar Stop]
P -->|No| R{¿Botón Mode?}
R -->|Sí| S[Cambiar modo]
R -->|No| T[Actualizar LEDs según modo]
M --> T
O --> T
Q --> T
S --> T
T --> K
Secuencia de Boot
init_components()configura todos los pines (GPIO, NeoPixel, Serial)- Se detecta qué botón está pulsado al encender para seleccionar el protocolo
- Se inicializa el protocolo IR con
init_ir() - Se espera a que el usuario suelte todos los botones (LED parpadea)
- Se muestran los colores de modo en los NeoPixels y se entra al bucle
| Protocolo | Botón en boot | Color Ready | Color Start | Color Stop |
|---|---|---|---|---|
| RC5 | Start | Rojo | Verde | Azul |
| NEC | Stop | Rojo | Verde | Azul |
| SIRC | Ready | Rojo | Verde | Azul |
Sistema de Modos
El mando tiene dos modos de operación:
| Modo | ID | Botón Start | Botón Stop | Botón Ready |
|---|---|---|---|---|
| IRSTART | 0 | Envía Start | Envía Stop | Prog/Ready |
| IRMENU | 1 | Menú Arriba | Menú Abajo | Menú Modo |
El cambio de modo se realiza con el botón Mode (GPIO 6) y es cíclico:
(modo_actual + 1) % NUM_MODES.
Envío de comandos
Cada protocolo implementa su propia inicialización y funciones de envío:
| Función | RC5 | NEC | SIRC |
|---|---|---|---|
| Init | rc5_init() |
nec_init() |
sirc_init() |
| Ready | rc5_send_prog() |
nec_send_ready() |
sirc_send_ready() |
| Start | rc5_send_start() |
nec_send_start() |
sirc_send_start() |
| Stop | rc5_send_stop() |
nec_send_stop() |
sirc_send_stop() |
Sistema de entrada
Todos los botones usan un debounce por software de 10 ms con doble lectura:
bool get_btn_start() {
bool state1 = digitalRead(BTN_START);
delay(10);
bool state2 = digitalRead(BTN_START);
return state1 && state2;
}
El DIP switch de 4 posiciones se lee como un valor de 4 bits, desplazado 1
bit a la izquierda (<< 1), generando un ID de robot par entre 0 y 30.
Módulo (Module — ATtiny13/85)
Bucle Principal
flowchart TD
A[Boot] --> B[init_pinout]
B --> C[rc5_init]
C --> D[Loop]
D --> E{¿module_is_started?}
E -->|Sí| F[LED ON fijo]
E -->|No| G[LED parpadeando]
F --> D
G --> D
ISR del Receptor IR
El módulo opera enteramente por interrupciones. El pin PIN_IR (PB1) se
configura con attachInterrupt(CHANGE) para detectar cada flanco (subida
y bajada) de la señal del TSOP4838.
| Parámetro | Valor |
|---|---|
| Pin | PB1 (digitalPinToInterrupt) |
| Modo | CHANGE (flanco de subida y bajada) |
| ISR | rc5_isr() |
Cadena de procesamiento RC5
TSOP4838 → PIN_IR (CHANGE INT) → rc5_isr() → rc5_register() → rc5_decode_pulse()
→ rc5_decode_event() → (14 bits) → rc5_manage_command()
rc5_isr(): Lee el estado del pin IR y llama arc5_register()con el trigger (RISING/FALLING)rc5_register(): Calcula el tiempo transcurrido desde el último flanco y llama arc5_decode_pulse()con eseelapsed. Incluye undelayMicroseconds(100)tras el cálculorc5_decode_pulse(): Clasifica el pulso como corto o largo según las constantes de timing, y llama arc5_decode_event()rc5_decode_event(): Máquina de estados de 4 estados para decodificar el código Manchester del protocolo RC5rc5_manage_command(): Cuando se completan 14 bits, procesa el comando:- Address PROG (0x0B): Programa un nuevo código de start/stop
- Address COMP (0x07): Compara con el código almacenado y ejecuta
- Default: Comandos fijos 0x01 (start) y 0x02 (stop)
Máquina de Estados RC5 (Receptor)
stateDiagram-v2
[*] --> STATE_MID1
STATE_MID1 --> STATE_MID0 : short space / long space
STATE_MID0 --> STATE_MID0 : short pulse / long pulse
STATE_MID0 --> STATE_MID1 : short space
STATE_MID1 --> STATE_MID1 : long space / short pulse
STATE_MID1 --> STATE_START1 : long pulse
STATE_START1 --> STATE_MID0 : short space / long space
STATE_START1 --> STATE_START0 : short pulse
STATE_START0 --> STATE_START0 : long pulse / short pulse
STATE_START0 --> STATE_MID1 : long space
Basado en la implementación de p1r.se/startmodule con la información de SB-Projects RC5 Protocol.
Control de señal
| Función | Efecto |
|---|---|
module_start() |
PIN_SIGNAL = HIGH, PIN_LED = HIGH, started = true |
module_stop() |
PIN_SIGNAL = LOW, PIN_LED = LOW, started = false |
module_feedback() |
5 parpadeos LED acelerados + pausa de 1.5 s |
El pin PIN_SIGNAL (PB0) es la salida física hacia el robot, y el LED (PB4)
refleja el estado de la señal.
Compilación condicional
| Macro | Función |
|---|---|
PIO_FRAMEWORK_ARDUINO_ENABLE_CDC |
Habilita CDC Serial en ESP32-C3 (Remote) |
Documento generado el 2025-06-25. Ver también Hardware, Protocolos IR, Problemas Conocidos.