Protocolos IR
El mando implementa tres protocolos infrarrojos que se seleccionan durante el
arranque. Cada protocolo tiene su propia codificación, temporización y
frecuencia portadora. El módulo receptor solo decodifica RC5.
Comparativa de Protocolos
| Característica |
RC5 |
NEC |
SIRC |
| Frecuencia portadora |
36 kHz |
37 kHz |
37 kHz |
| Codificación |
Manchester (bi-fase) |
Pulso-espacio |
Pulso-espacio |
| Bits de comando |
6 |
8 |
7 |
| Bits de dirección |
5 |
8 |
5 |
| Bit de toggle |
Sí (1 bit) |
No |
No |
| Repetición |
Reenvío completo |
Código de repetición especial |
Reenvío completo |
| Fin de trama |
Liberación de portadora |
Pulso final 560 µs |
Liberación de portadora |
| Tiempo entre comandos |
— |
110 ms |
45 ms |
| Usado por módulo |
✅ Sí |
❌ No |
❌ No |
RC5 (Remote Control 5)
Protocolo principal del sistema, desarrollado originalmente por Philips.
El mando lo usa en modo IRSTART e IRMENU.
| S1 | S2 | T | A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | C0 |
| Start | Toggle | Dirección (5 bits) | Comando (6 bits) |
| Campo |
Bits |
Posición |
Descripción |
| Start |
2 |
13–12 |
Bits de inicio (S1=1, S2=1) |
| Toggle |
1 |
11 |
Bit de alternancia (cambia cada pulsación) |
| Address |
5 |
10–6 |
Dirección del dispositivo |
| Command |
6 |
5–0 |
Código del comando |
Codificación Manchester
En RC5 cada bit se codifica en dos medios bits:
- Bit 1: portadora OFF → portadora ON (flanco de bajada en el medio)
- Bit 0: portadora ON → portadora OFF (flanco de subida en el medio)
Cada medio bit tiene una duración nominal de 889 µs (1/36 kHz × 32 ciclos).
Temporización del Receptor
El receptor usa la siguientes ventanas de detección (en µs):
| Pulso |
Mínimo |
Máximo |
| Corto |
444 µs |
1333 µs |
| Largo |
1334 µs |
2222 µs |
⚠️ Advertencia: El gap entre corto y largo es de solo 1 µs
(MAX_SHORT = 1333, MIN_LONG = 1334). Esto no deja histéresis y puede
causar detecciones erróneas con tolerancia de reloj. Ver
SW-04.
Direcciones y Comandos
| Dirección |
Uso |
Comandos |
| 0x07 (COMP) |
Competición — Start/Stop |
0x01 = Stop, 0x02 = Start + ID robot |
| 0x0B (PROG) |
Programación — Configurar ID |
0x01 + ID = Programar |
| 0x1B (IRMENU) |
Control de menú remoto |
0x0C = Mode, 0x0D = Up, 0x0E = Down |
ID de Robot
El DIP switch de 4 bits genera un ID entre 0 y 30 (par, dip << 1).
Cuando el ID es 0, se usan comandos fijos; cuando es distinto de 0, se
codifica en los bits superiores del comando:
- Start con ID ≠ 0:
(id << 1) | 0b00000001 → bit bajo = 1
- Stop con ID ≠ 0:
(id << 1) & 0b11111110 → bit bajo = 0
Implementación en el Mando
rc5.cpp:1-139
| Función |
Dirección |
Comando |
Canal PWM |
rc5_send_prog() |
0x0B |
0x01 (id=0) / id<<1 |
IR_PROG (Ch.1) |
rc5_send_start() |
0x07 |
0x02 (id=0) / (id<<1)\|1 |
IR_CMD (Ch.0) |
rc5_send_stop() |
0x07 |
0x01 (id=0) / (id<<1)&0xFE |
IR_CMD (Ch.0) |
rc5_send_menu_mode() |
0x1B |
0x0C |
IR_CMD (Ch.0) |
rc5_send_menu_up() |
0x1B |
0x0D |
IR_CMD (Ch.0) |
rc5_send_menu_down() |
0x1B |
0x0E |
IR_CMD (Ch.0) |
| Parámetro |
Valor |
| PWM freq |
36 kHz |
| Resolución PWM |
10 bits (0–1023) |
| Duty cycle |
1/5 (≈205) |
| Duración medio bit |
889 µs |
Implementación en el Módulo
rc5.cpp:1-121
| Constante |
Valor |
MIN_SHORT |
444 µs |
MAX_SHORT |
1333 µs |
MIN_LONG |
1334 µs |
MAX_LONG |
2222 µs |
NEC
Protocolo desarrollado por NEC Corporation, usado en muchos mandos de consumo.
| Start Burst | Address | ~Address | Command | ~Command | Stop Bit |
| 9 ms ON | 8 bits | 8 bits | 8 bits | 8 bits | 560 µs |
| 4.5 ms OFF | | (invert) | | (invert) | |
| Campo |
Descripción |
| Start Burst |
9 ms portadora ON + 4.5 ms OFF |
| Address |
Dirección de 8 bits (0x01 fijo) |
| ~Address |
Dirección invertida (verificación) |
| Command |
Comando de 8 bits |
| ~Command |
Comando invertido (verificación) |
| Stop Bit |
Pulso final de 560 µs |
Codificación de bits
| Bit |
Portadora ON |
Espacio |
| 0 |
560 µs |
560 µs |
| 1 |
560 µs |
1690 µs |
Código de Repetición
Para repeticiones (botón mantenido pulsado), se envía un código especial:
- 9 ms portadora ON + 2.25 ms OFF + 560 µs ON
Implementación
nec.cpp:1-134
| Parámetro |
Valor |
| PWM freq |
37 kHz |
| Duty cycle |
1/3 (≈341) |
| Tiempo entre comandos |
110 ms |
| Address |
0x01 |
| CMD_READY |
0x00 |
| CMD_START |
0x01 |
| CMD_STOP |
0x02 |
SIRC (Sony Infrared Remote Control)
Protocolo de Sony, usado en productos de consumo (TV, audio).
| Start Burst | Command (7 bits) | Address (5 bits) |
| 2.4 ms ON | LSB primero | LSB primero |
| 0.6 ms OFF | | |
| Campo |
Descripción |
| Start Burst |
2.4 ms portadora ON + 0.6 ms OFF |
| Command |
7 bits, LSB primero |
| Address |
5 bits, LSB primero |
Codificación de bits
| Bit |
Portadora ON |
Espacio |
| 0 |
600 µs |
600 µs |
| 1 |
1200 µs |
600 µs |
Nota: En SIRC, los bits se envían en orden LSB primero (a diferencia
de NEC y RC5 que usan MSB primero). Ver el bucle for (int i = 0; i < 7; i++)
en la implementación.
Implementación
sirc.cpp:1-95
| Parámetro |
Valor |
| PWM freq |
37 kHz |
| Duty cycle |
1/3 (≈341) |
| Tiempo entre comandos |
45 ms |
| Address |
0x01 |
| CMD_READY |
0x00 |
| CMD_START |
0x01 |
| CMD_STOP |
0x02 |
Flujo de Comunicación
sequenceDiagram
participant User
participant Remote as Mando (ESP32-C3)
participant Module as Módulo (ATtiny13)
participant Robot
Note over User,Robot: Fase de Programación (RC5)
User->>Remote: Pulsa Ready
Remote->>Module: RC5 ADDR_PROG + ID (IR_PROG)
Module->>Module: Guarda ID en EEPROM
Module->>Module: Feedback LED ×5
Note over User,Robot: Fase de Competición (RC5/NEC/SIRC)
User->>Remote: Pulsa Start
Remote->>Module: Protocolo + CMD_START (IR_CMD)
Module->>Module: Compara con EEPROM
Module->>Robot: PIN_SIGNAL = HIGH
User->>Remote: Pulsa Stop
Remote->>Module: Protocolo + CMD_STOP (IR_CMD)
Module->>Robot: PIN_SIGNAL = LOW
Documento generado el 2025-06-25. Ver también Arquitectura Software, Hardware, Problemas Conocidos.