Se rendre au contenu

DimmerLink non détecté sur I2C : problème du mode UART par défaut

DimmerLink est livré en mode UART et n'apparaîtra pas lors d'un scan du bus I2C tant qu'il n'aura pas été explicitement basculé. Le connecter en mode UART peut tirer les lignes du bus I2C vers le bas et bloquer le scanner. Cet article décrit la procédure de basculement correcte et le câblage des résistances de tirage requis.

En bref : DimmerLink est livré d'usine en mode UART. i2cdetect n'affichera pas l'adresse 0x50 tant que vous n'aurez pas envoyé la commande SWITCH_I2C (02 5B) via UART à 115200 bauds. Ajoutez également des résistances de tirage de 4,7 kΩ sur SDA et SCL — de nombreuses cartes n'ont pas de pull-ups intégrés suffisants. Réglez VCC à la même tension que le niveau logique de votre MCU (5V, 3,3V ou 1,8V).




Symptôme

Vous connectez DimmerLink à votre bus I2C, lancez i2cdetect -y 1 (ou un scan depuis Arduino), et l'un des deux cas se produit :

  • la grille d'adresses est complètement vide — l'adresse 0x50 n'est pas affichée ;
  • le scan prend beaucoup plus de temps que d'habitude ou semble se bloquer.



Cause 1 — Mauvais mode (UART actif)

Chaque module DimmerLink quitte l'usine en mode UART. En mode UART :

  • l'appareil ne surveille pas le bus I2C ;
  • les broches TX/SDA et RX/SCL fonctionnent comme des sorties UART ;
  • l'appareil ne peut pas répondre aux adresses I2C — il n'apparaîtra jamais dans un scan.

L'interface I2C n'est active qu'après le basculement du mode en I2C. Le mode est stocké en EEPROM et persiste après les mises hors tension, vous n'avez donc besoin de basculer qu'une seule fois.




Cause 2 — Le mode UART tire les lignes du bus I2C vers le bas

Lorsque DimmerLink est en mode UART et connecté à votre bus I2C :

  • La sortie UART TX est maintenue à l'état logique haut (état de repos) — ce n'est pas un problème.
  • Certaines implémentations UART tirent la sortie vers le bas entre les transmissions ou pendant le démarrage.

Si la ligne TX (qui est câblée à SDA) passe à l'état bas, elle tire la ligne I2C SDA vers le bas. Le scanner I2C envoie une condition START sur SDA et SCL, mais SDA reste bas — le bus semble occupé en permanence. i2cdetect attend plusieurs secondes par adresse avant expiration, ce qui donne l'impression que le scan est bloqué.

Ce n'est pas une panne matérielle — une fois DimmerLink basculé en mode I2C, SDA/SCL deviennent de véritables lignes I2C bidirectionnelles et le problème disparaît.




Cause 3 — Résistances de tirage manquantes

L'I2C nécessite des résistances de tirage externes sur SDA et SCL. Sans elles, la tension sur ces lignes ne peut pas monter à l'état logique haut et le bus ne fonctionne pas.

Carte Pull-ups I2C intégrés Suffisance
Raspberry Pi 3/4/5 1,8 kΩ (sur la carte) Généralement suffisant
Arduino Uno / Mega ~50 kΩ (faible) Insuffisant — ajouter des externes
ESP8266 / ESP32 Faible (~50 kΩ) Insuffisant — ajouter des externes
STM32 Aucun Externes obligatoires
Raspberry Pi Pico Aucun Externes obligatoires

Valeur requise : 4,7 kΩ de SDA à VCC, et 4,7 kΩ de SCL à VCC. Utilisez le même VCC que pour DimmerLink (voir ci-dessous).




Cause 4 — Inadéquation de la tension VCC

DimmerLink prend en charge trois tensions d'alimentation :

VCC Niveaux logiques MCU typique
5 V 5V TTL Arduino Uno, Mega
3,3V 3.3V CMOS ESP32, ESP8266, Raspberry Pi
1,8V 1.8V CMOS MCU basse tension

Connectez VCC à la même tension que le niveau logique de votre MCU. Ne mélangez pas : un VCC DimmerLink de 5V connecté à un MCU 3,3V produira des signaux 5V sur SDA/SCL, ce qui peut endommager le MCU ou provoquer des erreurs logiques.

Un convertisseur de niveaux n'est pas nécessaire — DimmerLink s'adapte à la tension VCC que vous fournissez.




Solution : basculement étape par étape en mode I2C


Ce dont vous avez besoin

  • Adaptateur USB-UART (CP2102, CH340, FT232 ou similaire)
  • Fils de connexion
  • N'importe quelle application de terminal série


Étape 1 — Connecter DimmerLink à l'adaptateur USB-UART

Broche DimmerLink Broche adaptateur UART
VCC Sortie 3.3V
GND GND
TX/SDA RX
RX/SCL TX

Câblez TX vers RX et RX vers TX (croisé). Alimentation depuis la sortie 3.3V de l'adaptateur — n'utilisez pas 5V si votre adaptateur UART ne fournit que des signaux 5V.


Étape 2 — Ouvrir un terminal série

Configuration : 115200 bauds, 8 bits de données, pas de parité, 1 bit de stop (8N1).

Terminaux recommandés :

  • Windows : RealTerm (mode d'envoi HEX)
  • Linux/macOS : picocom -b 115200 /dev/ttyUSB0


Étape 3 — Envoyer la commande SWITCH_I2C

Envoyez les octets bruts : 02 5B

  • Dans RealTerm : onglet Send → champ Send Numbers : 02 5BSend
  • Sous Linux/macOS — utilisez le script Python ci-dessous (nécessite pyserial) :
bash
python3 -c "
import serial
s = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
s.write(bytes([0x02, 0x5B]))
resp = s.read(1)
print('Réponse:', resp.hex() if resp else 'aucune')
s.close()
"

Remplacez /dev/ttyUSB0 par votre port réel (/dev/ttyACM0, /dev/ttyS0, etc.). Installez pyserial si nécessaire : pip install pyserial.

Réponse attendue : 00 (un octet, OK).

En cas d'absence de réponse :

  • Vérifiez que TX/RX sont croisés (TX adaptateur → RX DimmerLink).
  • Confirmez que le débit est exactement 115200 bauds.
  • Confirmez que VCC est connecté.


Étape 4 — Vérifier le basculement de mode

Après avoir reçu 00, DimmerLink est maintenant en mode I2C. Déconnectez l'adaptateur UART, câblez pour I2C et scannez :

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("Trouvé à 0x");
            Serial.println(addr, HEX);
        }
    }
}

Résultat attendu : adresse 0x50 trouvée.




Câblage pour le fonctionnement I2C

Après le basculement en mode I2C, connectez comme suit :


DimmerLink

En-tête GPIO RPi ❌ non supporté
Pin 1 (3.3V) VCC
Pin 6 (GND) GND
Pin 3 (GPIO2 / SDA) TX/SDA
Pin 5 (GPIO3 / SCL) RX/SCL

Le RPi dispose de pull-ups de 1,8 kΩ sur GPIO2/3 — généralement suffisants pour des câbles de moins de 30 cm. Ajoutez des pull-ups externes de 4,7 kΩ si la communication est instable.


Arduino (Uno/Mega)

Arduino ❌ non supporté
A4 (SDA) TX/SDA
A5 (SCL) RX/SCL
5 V VCC
GND GND

Ajoutez des pull-ups de 4,7 kΩ de A4 à 5V et de A5 à 5V.


RBDdimmer (ancienne)

RBDdimmer (ancienne) ❌ non supporté
GPIO21 (SDA) TX/SDA
GPIO22 (SCL) RX/SCL
3,3V VCC
GND GND

Ajoutez des pull-ups de 4,7 kΩ de GPIO21 à 3.3V et de GPIO22 à 3.3V.


Schéma de câblage des résistances de tirage I2C

text
VCC (identique au VCC de DimmerLink)
 │
 ├── 4.7kΩ ── SDA
 │
 └── 4.7kΩ ── SCL



Vérifier la communication


Raspberry Pi (CLI)

bash
# Lire la fréquence du secteur (devrait retourner 50 ou 60)
i2cget -y 1 0x50 0x20
# Régler la luminosité à 50 %
i2cset -y 1 0x50 0x10 50
# Relire la luminosité
i2cget -y 1 0x50 0x10


Arduino

cpp
#include <Wire.h>
void setup() {
    Serial.begin(115200);
    Wire.begin();
    // Régler la luminosité à 50 %
    Wire.beginTransmission(0x50);
    Wire.write(0x10);  // registre DIM0_LEVEL
    Wire.write(50);    // 50 %
    if (Wire.endTransmission() == 0) {
        Serial.println("DimmerLink : luminosité réglée à 50 %");
    } else {
        Serial.println("Erreur : DimmerLink ne répond pas");
    }
}


Python (Raspberry Pi)

python
from smbus2 import SMBus
try:
    bus = SMBus(1)
    freq = bus.read_byte_data(0x50, 0x20)
    print(f"DimmerLink OK — fréquence du secteur : {freq} Hz")
    bus.close()
except OSError as e:
    print(f"Non trouvé : {e}")
    print("Vérifiez : mode I2C activé, pull-ups installés, VCC correct")



Comment revenir au mode UART

Si vous devez revenir au mode UART, écrivez la commande 0x03 (SWITCH_UART) dans le registre COMMAND I2C (0x01) :

Arduino :

cpp
Wire.beginTransmission(0x50);
Wire.write(0x01);   // registre COMMAND
Wire.write(0x03);   // SWITCH_UART
Wire.endTransmission();
// L'I2C ne fonctionne plus — reconnectez via UART

Raspberry Pi :

bash
i2cset -y 1 0x50 0x01 0x03
# Contrôle désormais uniquement via UART



Organigramme de diagnostic

text
i2cdetect n'affiche rien à 0x50 ?
         │
         ├── Le VCC de DimmerLink est-il connecté et correct ? → Non → Connecter VCC
         │
         ├── SWITCH_I2C a-t-il été envoyé (02 5B via UART) ? → Non → Envoyer
         │
         ├── Des pull-ups 4,7 kΩ sur SDA et SCL ? → Non → Ajouter
         │
         ├── SDA câblé à SDA, SCL à SCL ? → Non → Corriger le câblage
         │
         └── i2cdetect bloque (scan lent) ?
                 → Mode UART actif → Envoyer SWITCH_I2C d'abord



Checklist rapide

  • ☐ Commande SWITCH_I2C (`02 5B`) envoyée via UART à 115200 bauds
  • ☐ Réponse `00` reçue (confirme le changement de mode)
  • ☐ VCC réglé à la même tension que la logique du MCU (3,3V recommandé)
  • ☐ Pull-up 4,7 kΩ de SDA à VCC
  • ☐ Pull-up 4,7 kΩ de SCL à VCC
  • ☐ SDA câblé à SDA (pas croisé)
  • ☐ SCL câblé à SCL (pas croisé)
  • ☐ `i2cdetect -y 1` affiche `50` dans le tableau



  • Articles connexes



    Encore des questions ?

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

    Partager cet article
    Se connecter pour laisser un commentaire.