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.




Contenido




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. Verifique las resistencias pull-up
  2. Raspberry Pi: las 1,8 kΩ integradas suelen ser suficientes
  3. Otras placas: añada resistencias externas de 4,7 kΩ

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

  5. Verifique la longitud del cable

  6. I2C: máximo 30 cm sin buffers
  7. Para distancias mayores use UART

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

  9. 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. Tras UART → I2C:
  2. Conéctese al dispositivo vía I2C
  3. Dirección por defecto: 0x50 (o la configurada previamente)
  4. Verificar: i2cdetect -y 1

  5. Tras I2C → UART:

  6. Conéctese al dispositivo vía UART
  7. Velocidad: 115200, 8N1

  8. Si cambió la dirección I2C:

  9. Escanee el bus: i2cdetect -y 1
  10. El dispositivo estará en la nueva dirección

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. Código de comando — use solo códigos válidos:
  3. 0x53 (SET)
  4. 0x47 (GET)
  5. 0x43 (CURVE)
  6. 0x51 (GETCURVE)
  7. 0x52 (FREQ)
  8. 0x58 (RESET)
  9. 0x5B (SWITCH_I2C)

Ejemplo de comando correcto:

python
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.

python
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

python
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)

python
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

python
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)

python
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