← - 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
- Errores de protocolo
- Problemas de atenuación
- Elección de la curva de atenuación
- Códigos de error
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:
# Linux/Raspberry Pi
i2cdetect -y 1
Si el dispositivo funciona, la dirección 50 aparecerá en la tabla.
Diagnóstico UART:
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:
- Verifique las resistencias pull-up
- Raspberry Pi: las 1,8 kΩ integradas suelen ser suficientes
-
Otras placas: añada resistencias externas de 4,7 kΩ
-
Check wiring
SDA → SDA (not crossed!) SCL → SCL -
Verifique la longitud del cable
- I2C: máximo 30 cm sin buffers
-
Para distancias mayores use UART
-
Check if I2C is enabled
bash # Raspberry Pi sudo raspi-config # Interface Options → I2C → Enable -
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:
# 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:
- Tras UART → I2C:
- Conéctese al dispositivo vía I2C
- Dirección por defecto: 0x50 (o la configurada previamente)
-
Verificar:
i2cdetect -y 1 -
Tras I2C → UART:
- Conéctese al dispositivo vía UART
-
Velocidad: 115200, 8N1
-
Si cambió la dirección I2C:
- Escanee el bus:
i2cdetect -y 1 - El dispositivo estará en la nueva dirección
Ejemplo de cambio UART → I2C:
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:
- Byte de inicio — el comando debe comenzar con
0x02 - Código de comando — use solo códigos válidos:
0x53(SET)0x47(GET)0x43(CURVE)0x51(GETCURVE)0x52(FREQ)0x58(RESET)0x5B(SWITCH_I2C)
Ejemplo de comando correcto:
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.
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
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
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.
# 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)
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
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)
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:
# 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:
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:
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:
Dimmer:
Prueba mínima de funcionamiento
UART:
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:
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?
- Inicio rápido — comience con un ejemplo simple
- Comandos UART — lista completa de comandos
- Registros I2C — mapa de registros
- Ejemplos de código — scripts listos para usar