Ir al contenido

← - Lambda FAQ y solución de problemas | Contenido

FAQ y solución de problemas

Preguntas frecuentes y soluciones a problemas comunes al trabajar con DimmerLink.


Problemas de conexión

Sin respuesta del dispositivo

Symptoms: I send a command, but there's no response.

Posibles causas y soluciones:

Causa Solución
Falta el byte de inicio (UART) Añada 0x02 al inicio del comando
Velocidad incorrecta (UART) Configure 115200 baud
TX/RX invertidos Verifique el cableado cruzado: TX→RX, RX→TX
Interfaz en otro modo ¿Dispositivo en modo I2C? Cambie a UART
Dirección incorrecta (I2C) La dirección por defecto es 0x50 (puede estar cambiada)
Sin resistencias pull-up (I2C) Añada resistencias de 4,7 kΩ en SDA y SCL
Sin alimentación Verifique VCC y GND

Diagnóstico I2C:

bash
# Linux/Raspberry Pi
i2cdetect -y 1

Si el dispositivo funciona, la dirección 50 aparecerá en la tabla.

Diagnóstico UART:

python
import serial
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
ser.write(bytes([0x02, 0x52]))  # Request frequency
print(ser.read(2).hex())  # Expect "0032" or "003c"

I2C Doesn't See Device

Síntomas: i2cdetect muestra una tabla vacía, la dirección 0x50 no aparece.

Soluciones:

  1. Check pull-up resistors - Raspberry Pi: built-in 1.8kΩ usually sufficient - Other boards: add external 4.7kΩ

  2. Check wiring
    SDA → SDA (not crossed!) SCL → SCL

  3. Check wire length - I2C: maximum 30 cm without buffers - For longer distances use UART

  4. Check if I2C is enabled
    bash # Raspberry Pi sudo raspi-config # Interface Options → I2C → Enable

  5. Check bus number
    bash ls /dev/i2c-* # May be i2c-0 or i2c-1 i2cdetect -y 0 # try different bus


Permission Denied (Linux)

Síntomas: PermissionError: [Errno 13] Permission denied: '/dev/ttyUSB0'

Solución:

bash
# Add user to groups
sudo usermod -a -G dialout,i2c $USER

# Log out and back in, or reboot
logout

El dispositivo no responde tras cambiar de interfaz

Symptoms: After SWITCH_I2C command (0x5B) or SWITCH_UART (via I2C), device doesn't respond.

Causa: Este es un comportamiento normal. Tras cambiar de interfaz, la interfaz anterior se desactiva.

Soluciones:

  1. After UART → I2C: - Connect to device via I2C - Default address: 0x50 (or previously configured) - Check: i2cdetect -y 1

  2. After I2C → UART: - Connect to device via UART - Speed: 115200, 8N1

  3. If you changed the I2C address: - Scan the bus: i2cdetect -y 1 - Device will be at the new address

Ejemplo de cambio UART → I2C:

python
import serial
from smbus2 import SMBus

# 1. Send switch command via UART
ser = serial.Serial('COM3', 115200, timeout=1)
ser.write(bytes([0x02, 0x5B]))  # SWITCH_I2C
resp = ser.read(1)
if resp and resp[0] == 0x00:
    print("Switched to I2C")
ser.close()

# 2. Now work via I2C
bus = SMBus(1)
freq = bus.read_byte_data(0x50, 0x20)
print(f"Mains frequency: {freq} Hz")

Errores de protocolo

Error 0xFC — Error de escritura EEPROM

Causa: No se pudieron guardar los ajustes en la memoria no volátil.

Possible causes:
- Flash memory problem
- Power supply voltage too low

Solution:
- Check power supply voltage (minimum 2.7V for Flash write)
- Retry the command


Error 0xF9 — Error de sintaxis

Causa: Comando desconocido o formato inválido.

Verifique:

  1. Byte de inicio — el comando debe comenzar con 0x02
  2. Command code — use only valid codes: - 0x53 (SET) - 0x47 (GET) - 0x43 (CURVE) - 0x51 (GETCURVE) - 0x52 (FREQ) - 0x58 (RESET) - 0x5B (SWITCH_I2C)

Ejemplo de comando correcto:

plaintext
Correct:   02 53 00 32  (SET brightness 50%)
Incorrect: 53 00 32     (no start byte)
Incorrect: 02 99 00     (unknown command 0x99)

Error 0xFD — Índice inválido

Causa: Se especificó un índice de dimmer inexistente.

Solución: Use el índice 0x00. La versión actual solo admite un dimmer.

plaintext
Correct:   02 53 00 32  (dimmer 0)
Incorrect: 02 53 05 32  (dimmer 5 doesn't exist)

Error 0xFE — Parámetro inválido

Causa: Valor del parámetro fuera del rango permitido.

Check:
- Brightness: 0-100 (not 0-255!)
- Curve: 0, 1, or 2
- I2C address: 0x08-0x77

plaintext
Correct:   02 53 00 64  (brightness 100%)
Incorrect: 02 53 00 FF  (255 > 100)

Correct:   02 43 00 02  (LOG curve)
Incorrect: 02 43 00 05  (curve 5 doesn't exist)

Problemas de atenuación

Lamp Doesn't Light at Low Brightness

Symptoms: Incandescent lamp doesn't light below 25% brightness.

Causa: Este es un comportamiento normal de las lámparas incandescentes. A baja potencia, el calentamiento del filamento es insuficiente para producir luz visible.

Solución: Use niveles de brillo del 25% o superiores para lámparas incandescentes.


Brightness Doesn't Match Expectations

Síntomas: El 50% parece 20% u 80%.

Causa: Se seleccionó una curva de atenuación incorrecta.

Solución: Elija la curva que corresponda a su tipo de carga (vea la sección a continuación).


Formato GET y SET

Ambos comandos SET y GET funcionan con el mismo formato:

  • SET acepta porcentaje: 0–100
  • GET devuelve porcentaje: 0–100
python
dimmer.set_level(50)       # Set 50%
level = dimmer.get_level() # Get 50

UART vs I2C — ¿Cuál elegir?

UART limitations:
- Recommended interval between commands: 10-20 ms
- More frequent commands may cause buffer data loss
- UART is a relatively slow interface

Recommendation: If you need frequent brightness changes (smooth transitions, animations), use I2C — it's significantly faster.

python
# UART: no more than 3-5 commands/sec
for level in range(0, 101, 10):
    ser.write(bytes([0x02, 0x53, 0x00, level]))
    time.sleep(0.3)  # Minimum 200-300 ms between commands

# I2C: can be much faster
for level in range(0, 101):
    bus.write_byte_data(0x50, 0x10, level)
    time.sleep(0.01)  # 10 ms — smooth transition

Elección de la curva de atenuación

¿Qué curva elegir?

Curva Código Ideal para Característica
LINEAR 0 Universal Relación lineal de potencia
RMS 1 Lámparas incandescentes Brillo lineal para incandescentes
LOG 2 Lámparas LED Se ajusta a la percepción del ojo

LINEAR (por defecto)

plaintext
Power
100% │         ╱
     │       ╱
 50% │     ╱
     │   ╱
  0% │ ╱
     └──────────────
       0%   50%  100%
          Level
  • La potencia depende linealmente del nivel
  • Opción universal
  • Adecuada para la mayoría de cargas

RMS

plaintext
Brightness
100% │         ╱
     │       ╱
 50% │     ╱
     │   ╱
  0% │ ╱
     └──────────────
       0%   50%  100%
          Level
  • Compensa la no linealidad de las lámparas incandescentes
  • Nivel 50% = 50% de brillo percibido
  • Ideal para lámparas incandescentes

LOG (Logarítmica)

plaintext
Brightness
100% │              ╱
     │           ╱
 50% │       ╱
     │   ╱
  0% │╱
     └──────────────
       0%   50%  100%
          Level
  • Tiene en cuenta la percepción logarítmica del ojo
  • Cambios suaves de brillo en niveles bajos
  • Recomendada para lámparas LED

Recomendaciones

Tipo de carga Curva recomendada
LED (regulable) LOG (2)
Lámpara incandescente RMS (1)
Calefactor LINEAR (0)
Motor (ventilador) LINEAR (0)
Don't know Pruebe las tres

⚠️ Importante: Las lámparas de descarga de gas (halógenas, fluorescentes, HID, sodio) no son compatibles — requieren alto voltaje para el encendido y el mantenimiento de la descarga.

Cómo cambiar la curva:

python
# UART
ser.write(bytes([0x02, 0x43, 0x00, 2]))  # LOG

# I2C
bus.write_byte_data(0x50, 0x11, 2)  # LOG

Códigos de error

Tabla resumen

Código Nombre Descripción Solución
0x00 OK Éxito
0xF9 ERR_SYNTAX Formato inválido Verifique el byte START y el código de comando
0xFC ERR_NOT_READY Error de escritura EEPROM Verifique la alimentación, reintente
0xFD ERR_INDEX Índice inválido Use el índice 0
0xFE ERR_PARAM Parámetro inválido Verifique los rangos de valores

Ejemplo de manejo de errores

Python:

python
ERROR_CODES = {
    0x00: "OK",
    0xF9: "Invalid command syntax",
    0xFC: "EEPROM write error",
    0xFD: "Invalid dimmer index",
    0xFE: "Invalid parameter value"
}

def check_response(resp):
    if not resp:
        return "No response"
    code = resp[0]
    return ERROR_CODES.get(code, f"Unknown error: 0x{code:02X}")

Arduino:

cpp
const char* getErrorMessage(uint8_t code) {
    switch (code) {
        case 0x00: return "OK";
        case 0xF9: return "Syntax error";
        case 0xFC: return "EEPROM write error";
        case 0xFD: return "Invalid index";
        case 0xFE: return "Invalid parameter";
        default: return "Unknown error";
    }
}

Cargas compatibles

Compatibles

Tipo de carga Soporte Notas
Lámpara incandescente Mínimo 25% para luz visible
Lámpara halógena Funciona como incandescente
LED (regulable) Only with "dimmable" marking
Calefactor Carga resistiva
Motor (ventilador) Motores universales/de escobillas

⚠️ Important about motors:
- ✓ Universal brush motors (vacuums, mixers, drills)
- ✗ Induction/asynchronous motors (most fans, pumps) — will hum and overheat!
If unsure about motor type — don't use dimming.

No compatibles

Tipo de carga Razón
Lámparas fluorescentes Descarga de gas, requieren balasto
Lámparas HID, sodio Descarga de gas, alto voltaje
LED without "dimmable" No diseñadas para atenuación
Drivers LED con transformador Pueden sobrecalentarse o fallar

Parpadeo de la lámpara

Síntomas: La lámpara parpadea o titila durante el funcionamiento.

Posibles causas y soluciones:

Causa Solución
LED lamp not "dimmable" Reemplace con LED regulable
Potencia LED demasiado baja Añada carga mínima (lámpara incandescente en paralelo)
Interferencias en la red Añada un circuito RC snubber a la salida del dimmer
Mal contacto Verifique todas las conexiones

💡 Nota: DimmerLink elimina el parpadeo por software. Si el parpadeo persiste — la causa está en la carga o el cableado.


Consejos generales

Lista de verificación antes de comenzar

DimmerLink:

  • ☐ Alimentación conectada (VCC y GND)
  • ☐ TX/RX conectados en cruce (para UART)
  • ☐ SDA/SCL conectados directamente (para I2C)
  • ☐ Resistencias pull-up instaladas (para I2C)
  • ☐ Dispositivo en el modo correcto (UART o I2C)
  • Dimmer:

  • ☐ Z-C y Dim conectados a DimmerLink
  • ☐ Dimmer conectado a la red AC (¡PRECAUCIÓN!)
  • ☐ Load power doesn't exceed dimmer rating
  • ☐ La carga es compatible (vea la tabla anterior)
  • Prueba mínima de funcionamiento

    UART:

    python
    import serial
    
    ser = serial.Serial('COM3', 115200, timeout=1)  # Or '/dev/ttyUSB0'
    
    # Request mains frequency
    ser.write(bytes([0x02, 0x52]))
    resp = ser.read(2)
    
    if len(resp) == 2 and resp[0] == 0x00:
        print(f"Device working! Mains frequency: {resp[1]} Hz")
    else:
        print(f"Error: {resp.hex() if resp else 'no response'}")
    

    I2C:

    python
    from smbus2 import SMBus
    
    try:
        bus = SMBus(1)
        freq = bus.read_byte_data(0x50, 0x20)
        print(f"✓ Device working! Mains frequency: {freq} Hz")
    except OSError as e:
        print(f"✗ Connection error: {e}")
        print("Check:")
        print("  - SDA/SCL wiring")
        print("  - Pull-up resistors")
        print("  - Is I2C enabled: sudo raspi-config")
    

    What's Next?

    ← - Lambda FAQ y solución de problemas | Contenido