Este proyecto documenta el desarrollo de una placa de control basada en el microcontrolador ARM Cortex M0, diseñada para interactuar con el protocolo de comunicación por infrarrojos (IR) de un modelo específico de aire acondicionado LG. Su propósito principal es controlar las señales para el testeo automatizado de la unidad (JIG de testeo).
Para cargar el firmware en el Cortex M0, se utiliza el programador de depuración Black Magic Probe (BMP).
Se utilizó una implementación del Black Magic Probe basada en un módulo ESP8266 para crear una sonda GDB Wi-Fi.
| Componente | Modelo |
|---|---|
| Placa Base | ESP8266 |
| Visualización | Módulo LCD Deek-Robot |
Los archivos binarios (.bin) del firmware a programar se encuentran en la carpeta del repositorio.
Comandos de consola
cd C:\nxp\MCUXpressoIDE_25.6.136\ide\tools\bin
.\arm-none-eabi-gdb.exe "C:\Users\Admin\Documents\MCUXpressoIDE_25.6.136\prueba\proyectoNS\Debug\proyectoNS.axf"
(gdb) target extended-remote 192.168.4.1:2022
Remote debugging using 192.168.4.1:2022
(gdb) monitor swdp_scan
Target voltage: 2989mV
Available Targets:
No. Att Driver
1 LPC11xx M0
(gdb) attach 1
(gdb) load
Loading section .text, size 0x398 lma 0x0
Start address 0x0000014c, load size 920
Transfer rate: 3 KB/sec, 920 bytes/write.
(gdb)kill
(gdb)quitLa conexión entre el ESP8266 (Programador) y la placa Cortex M0 (Target) se realiza mediante la interfaz Serial Wire Debug (SWD), utilizando los siguientes pines:
| ESP8266 | Señal SWD | Cortex M0 (Target) salida |
|---|---|---|
| GND | VSS | pinOut 3-5 |
| D3 | SWDIO | PinOut 4 |
| TSDA | SWCLK | PinOut 2 |
| 3V3 | VDD | PinOut 1 |
- Creación de Sonda GDB Wi-Fi (ESP8266): Visual Micro - Create a WiFi Black Magic GDB Probe from ESP8266
- Firmware BlackMagic ESP-IDF: walmis/blackmagic-espidf
El protocolo de comunicación IR de LG requiere una señal modulada de
Mediante el análisis de las señales con un osciloscopio, se obtuvieron los tiempos críticos para la codificación:
De estas imágenes se obtiene que el tiempo inicial del paquete de ráfaga es de
| Fase | Tiempo Medido |
|---|---|
| Ráfaga ON | |
| Ráfaga OFF |
De estas imágenes se obtiene que:
- El valor binario 1 es
$500 \mu\text{s}$ ON y$1.55 \text{ms}$ OFF. - El valor binario 0 es
$500 \mu\text{s}$ ON y$500 \mu\text{s}$ OFF.
| Bit | Ráfaga ON (Carrier 38kHz) | Ráfaga OFF |
|---|---|---|
| 1 (Valor Binario Alto) | ||
| 0 (Valor Binario Bajo) |
Este proyecto fue diseñado para controlar el testeo de aire acondicionado. La lógica se basa en la selección de entradas (IN1-2-3-4) por un PLC, que dispara un flanco para activar la operación deseada (calor, frío máx/mín).
La Board está configurada con un clocking de
Estas son las secuencias de 29 bits que el Cortex M0 debe transmitir. Todas las secuencias deben ser precedidas por la Ráfaga ON-OFF (
| Función de Testeo (Disparo por PLC) | Secuencia de Bits de Datos (29 bits) |
|---|---|
| Apagado | |
| 30°C Calor | |
| 18°C Frío con FAN Máx | |
| 18°C Frío con FAN Mín | |
| Encendido |
// Leer entradas
uint32_t curr_pio3_5 = (LPC_GPIO3->DATA >> 5) & 0x1;
uint32_t curr_pio0_6 = (LPC_GPIO0->DATA >> 6) & 0x1;
uint32_t curr_pio0_7 = (LPC_GPIO0->DATA >> 7) & 0x1;
uint32_t curr_pio2_9 = (LPC_GPIO2->DATA >> 9) & 0x1;
if (prev_pio3_5 == 0 && curr_pio3_5 == 1) {
LPC_GPIO1->MASKED_ACCESS[1 << 1] = 1 << 1;
delay_ms(100);
LPC_GPIO1->MASKED_ACCESS[1 << 1] = 0;
delay_ms(100);
portadora();
transmit("10001000110000000000010100010");
delay_ms(100);
}
if (prev_pio0_6 == 0 && curr_pio0_6 == 1) {
LPC_GPIO1->MASKED_ACCESS[1 << 1] = 1 << 1;
delay_ms(100);
LPC_GPIO1->MASKED_ACCESS[1 << 1] = 0;
delay_ms(100);
portadora();
transmit("10001000000011001111101001010");
delay_ms(100);
}
if (prev_pio0_7 == 0 && curr_pio0_7 == 1) {
LPC_GPIO1->MASKED_ACCESS[1 << 1] = 1 << 1;
delay_ms(100);
LPC_GPIO1->MASKED_ACCESS[1 << 1] = 0;
delay_ms(100);
portadora();
transmit("10001000000010000011000010110");
delay_ms(100);
}
if (prev_pio2_9 == 0 && curr_pio2_9 == 1) {
LPC_GPIO1->MASKED_ACCESS[1 << 1] = 1 << 1;
delay_ms(100);
LPC_GPIO1->MASKED_ACCESS[1 << 1] = 0;
delay_ms(100);
portadora();
transmit("100010000000100000110100111110");
delay_ms(100);
}


