Ir al contenido

DimmerLink no detectado en I2C: problema del modo UART por defecto

DimmerLink viene en modo UART y no aparecerá en un escaneo del bus I2C hasta que se cambie explícitamente. Conectarlo en modo UART puede arrastrar las líneas del bus I2C a nivel bajo y bloquear el escáner. Este artículo explica el procedimiento correcto de cambio y el cableado de resistencias pull-up requerido.

Resumen: DimmerLink viene de fábrica en modo UART. i2cdetect no mostrará la dirección 0x50 hasta que envíe el comando SWITCH_I2C (02 5B) por UART a 115200 baudios. Además, agregue resistencias pull-up de 4,7 kΩ en SDA y SCL — muchas placas no tienen pull-ups integrados adecuados. Configure VCC a la misma tensión que el nivel lógico de su MCU (5V, 3,3V o 1,8V).




Síntoma

Conectas DimmerLink a tu bus I2C, ejecutas i2cdetect -y 1 (o escaneas desde Arduino), y ocurre una de dos cosas:

  • la tabla de direcciones está completamente vacía — la dirección 0x50 no aparece;
  • el escaneo tarda mucho más de lo normal o parece bloquearse.



Causa 1 — Modo incorrecto (UART activo)

Cada módulo DimmerLink sale de fábrica en modo UART. En modo UART:

  • el dispositivo no monitorea el bus I2C;
  • los pines TX/SDA y RX/SCL funcionan como salidas UART;
  • el dispositivo no puede responder a direcciones I2C — nunca aparecerá en un escaneo.

La interfaz I2C solo está activa después de cambiar el modo a I2C. El modo se almacena en EEPROM y persiste entre ciclos de energía, por lo que solo necesitas cambiarlo una vez.




Causa 2 — El modo UART arrastra las líneas del bus I2C a nivel bajo

Cuando DimmerLink está en modo UART y conectado a tu bus I2C:

  • La salida UART TX se mantiene en nivel lógico alto (estado de reposo) — esto no es un problema.
  • Algunas implementaciones UART arrastran la salida a nivel bajo entre transmisiones o durante el arranque.

Si la línea TX (que está cableada a SDA) pasa a nivel bajo, arrastra la línea I2C SDA a nivel bajo. El escáner I2C envía una condición START en SDA y SCL, pero SDA permanece bajo — el bus parece permanentemente ocupado. i2cdetect espera varios segundos por dirección antes del tiempo de espera, haciendo que el escaneo parezca bloqueado.

Esto no es una falla de hardware — una vez que DimmerLink se cambia a modo I2C, SDA/SCL se convierten en verdaderas líneas I2C bidireccionales y el problema desaparece.




Causa 3 — Resistencias pull-up faltantes

I2C requiere resistencias pull-up externas en SDA y SCL. Sin ellas, el voltaje en estas líneas no puede subir a nivel lógico alto y el bus no funciona.

Placa Pull-ups I2C integrados Suficiencia
Raspberry Pi 3/4/5 1,8 kΩ (en la placa) Generalmente suficiente
Arduino Uno / Mega ~50 kΩ (débil) Insuficiente — agregar externos
ESP8266 / ESP32 Débil (~50 kΩ) Insuficiente — agregar externos
STM32 Ninguno Obligatorio agregar externos
Raspberry Pi Pico Ninguno Obligatorio agregar externos

Valor requerido: 4,7 kΩ de SDA a VCC, y 4,7 kΩ de SCL a VCC. Use el mismo VCC que para DimmerLink (ver más abajo).




Causa 4 — Desajuste de tensión VCC

DimmerLink soporta tres tensiones de alimentación:

VCC Niveles lógicos MCU típico
5 V 5V TTL Arduino Uno, Mega
3,3V 3.3V CMOS ESP32, ESP8266, Raspberry Pi
1,8V 1.8V CMOS MCU de bajo voltaje

Conecte VCC a la misma tensión que el nivel lógico de su MCU. No mezcle: un VCC de DimmerLink de 5V conectado a un MCU de 3,3V producirá señales de 5V en SDA/SCL, lo que puede dañar el MCU o causar errores lógicos.

No se necesita un convertidor de niveles — DimmerLink se adapta a cualquier VCC que le suministre.




Solución: cambio paso a paso al modo I2C


Lo que necesitas

  • Adaptador USB-UART (CP2102, CH340, FT232 o similar)
  • Cables de conexión
  • Cualquier aplicación de terminal serie


Paso 1 — Conectar DimmerLink al adaptador USB-UART

Pin DimmerLink Pin adaptador UART
VCC Salida 3.3V
GND GND
TX/SDA RX
RX/SCL TX

Cablee TX a RX y RX a TX (cruzado). Alimente desde la salida 3.3V del adaptador — no use 5V si su adaptador UART solo proporciona señales de 5V.


Paso 2 — Abrir terminal serie

Configuración: 115200 baudios, 8 bits de datos, sin paridad, 1 bit de stop (8N1).

Terminales recomendados:

  • Windows: RealTerm (modo de envío HEX)
  • Linux/macOS: picocom -b 115200 /dev/ttyUSB0


Paso 3 — Enviar comando SWITCH_I2C

Envíe bytes crudos: 02 5B

  • En RealTerm: pestaña Send → campo Send Numbers: 02 5BSend
  • En Linux/macOS — use el script Python a continuación (requiere pyserial):
bash
python3 -c "
import serial
s = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
s.write(bytes([0x02, 0x5B]))
resp = s.read(1)
print('Respuesta:', resp.hex() if resp else 'ninguna')
s.close()
"

Reemplace /dev/ttyUSB0 con su puerto real (/dev/ttyACM0, /dev/ttyS0, etc.). Instale pyserial si es necesario: pip install pyserial.

Respuesta esperada: 00 (un byte, OK).

Si no hay respuesta:

  • Verifique que TX/RX estén cruzados (TX del adaptador → RX de DimmerLink).
  • Confirme que la velocidad es exactamente 115200 baudios.
  • Confirme que VCC está conectado.


Paso 4 — Verificar el cambio de modo

Después de recibir 00, DimmerLink está ahora en modo I2C. Desconecte del adaptador UART, cablee para I2C y escanee:

Raspberry Pi:

bash
i2cdetect -y 1

Arduino:

cpp
#include <Wire.h>
void setup() {
    Serial.begin(115200);
    Wire.begin();
    for (uint8_t addr = 1; addr < 127; addr++) {
        Wire.beginTransmission(addr);
        if (Wire.endTransmission() == 0) {
            Serial.print("Encontrado en 0x");
            Serial.println(addr, HEX);
        }
    }
}

Resultado esperado: dirección 0x50 encontrada.




Cableado para operación I2C

Después de cambiar al modo I2C, conecte de la siguiente manera:


— (sin ISR)

Cabecera GPIO RPi Cualquier ESP32
Pin 1 (3.3V) VCC
Pin 6 (GND) GND
Pin 3 (GPIO2 / SDA) TX/SDA
Pin 5 (GPIO3 / SCL) RX/SCL

El RPi tiene pull-ups de 1,8 kΩ en GPIO2/3 — generalmente suficientes para cables de menos de 30 cm. Agregue pull-ups externos de 4,7 kΩ si la comunicación es inestable.


Arduino (Uno/Mega)

Arduino Cualquier ESP32
A4 (SDA) TX/SDA
A5 (SCL) RX/SCL
5 V VCC
GND GND

Agregue pull-ups de 4,7 kΩ de A4 a 5V y de A5 a 5V.


❌ no

❌ no Cualquier ESP32
GPIO21 (SDA) TX/SDA
GPIO22 (SCL) RX/SCL
3,3V VCC
GND GND

Agregue pull-ups de 4,7 kΩ de GPIO21 a 3.3V y de GPIO22 a 3.3V.


Diagrama de cableado de resistencias pull-up I2C

text
VCC (igual que VCC de DimmerLink)
 │
 ├── 4.7kΩ ── SDA
 │
 └── 4.7kΩ ── SCL



Verificar comunicación


Raspberry Pi (CLI)

bash
# Leer frecuencia de red (debería retornar 50 o 60)
i2cget -y 1 0x50 0x20
# Configurar brillo al 50%
i2cset -y 1 0x50 0x10 50
# Leer brillo de vuelta
i2cget -y 1 0x50 0x10


Arduino

cpp
#include <Wire.h>
void setup() {
    Serial.begin(115200);
    Wire.begin();
    // Configurar brillo al 50%
    Wire.beginTransmission(0x50);
    Wire.write(0x10);  // registro DIM0_LEVEL
    Wire.write(50);    // 50%
    if (Wire.endTransmission() == 0) {
        Serial.println("DimmerLink: brillo configurado al 50%");
    } else {
        Serial.println("Error: DimmerLink no responde");
    }
}


Python (Raspberry Pi)

python
from smbus2 import SMBus
try:
    bus = SMBus(1)
    freq = bus.read_byte_data(0x50, 0x20)
    print(f"DimmerLink OK — frecuencia de red: {freq} Hz")
    bus.close()
except OSError as e:
    print(f"No encontrado: {e}")
    print("Verifique: modo I2C activado, pull-ups instalados, VCC correcto")



Cómo volver al modo UART

Si necesita volver al modo UART, escriba el comando 0x03 (SWITCH_UART) en el registro COMMAND I2C (0x01):

Arduino:

cpp
Wire.beginTransmission(0x50);
Wire.write(0x01);   // registro COMMAND
Wire.write(0x03);   // SWITCH_UART
Wire.endTransmission();
// I2C ya no funciona — reconecte vía UART

Raspberry Pi:

bash
i2cset -y 1 0x50 0x01 0x03
# Ahora control solo vía UART



Diagrama de flujo de diagnóstico

text
¿i2cdetect no muestra nada en 0x50?
         │
         ├── ¿VCC de DimmerLink conectado y correcto? → No → Conectar VCC
         │
         ├── ¿Se envió SWITCH_I2C (02 5B vía UART)? → No → Enviar
         │
         ├── ¿Pull-ups de 4,7 kΩ en SDA y SCL? → No → Agregar
         │
         ├── ¿SDA cableado a SDA, SCL a SCL? → No → Corregir cableado
         │
         └── ¿i2cdetect se bloquea (escaneo lento)?
                 → Modo UART activo → Enviar SWITCH_I2C primero



Checklist rápido

  • ☐ Comando SWITCH_I2C (`02 5B`) enviado vía UART a 115200 baudios
  • ☐ Respuesta `00` recibida (confirma cambio de modo)
  • ☐ VCC configurado a la misma tensión que la lógica del MCU (3,3V recomendado)
  • ☐ Pull-up 4,7 kΩ de SDA a VCC
  • ☐ Pull-up 4,7 kΩ de SCL a VCC
  • ☐ SDA cableado a SDA (no cruzado)
  • ☐ SCL cableado a SCL (no cruzado)
  • ☐ `i2cdetect -y 1` muestra `50` en la tabla



  • Artículos relacionados



    ¿Todavía tienes preguntas?

    Ask on forum.rbdimmer.com or open a GitHub Issue.

    Compartir esta publicación
    Iniciar sesión para dejar un comentario