Passa al contenuto

DimmerLink non rilevato su I2C: problema della modalità UART predefinita

DimmerLink viene fornito in modalità UART e non apparirà in una scansione del bus I2C finché non verrà commutato esplicitamente. Collegarlo in modalità UART può tirare le linee del bus I2C a livello basso e bloccare lo scanner. Questo articolo illustra la corretta procedura di commutazione e il cablaggio delle resistenze di pull-up necessario.

In breve: DimmerLink viene fornito dalla fabbrica in modalità UART. i2cdetect non mostrerà l'indirizzo 0x50 finché non invierai il comando SWITCH_I2C (02 5B) tramite UART a 115200 baud. Aggiungi inoltre resistenze di pull-up da 4,7 kΩ su SDA e SCL — molte schede non hanno pull-up integrati adeguati. Imposta VCC alla stessa tensione del livello logico del tuo MCU (5V, 3,3V o 1,8V).




Sintomo

Colleghi DimmerLink al tuo bus I2C, esegui i2cdetect -y 1 (o una scansione da Arduino), e si verifica una delle due situazioni:

  • la griglia degli indirizzi è completamente vuota — l'indirizzo 0x50 non è mostrato;
  • la scansione richiede molto più tempo del solito o sembra bloccarsi.



Causa 1 — Modalità errata (UART attiva)

Ogni modulo DimmerLink esce dalla fabbrica in modalità UART. In modalità UART:

  • il dispositivo non monitora il bus I2C;
  • i pin TX/SDA e RX/SCL funzionano come uscite UART;
  • il dispositivo non può rispondere agli indirizzi I2C — non apparirà mai in una scansione.

L'interfaccia I2C è attiva solo dopo che la modalità è stata commutata in I2C. La modalità è memorizzata in EEPROM e persiste tra i cicli di alimentazione, quindi è necessario commutare solo una volta.




Causa 2 — La modalità UART tira le linee del bus I2C a livello basso

Quando DimmerLink è in modalità UART e collegato al tuo bus I2C:

  • L'uscita UART TX è mantenuta a livello logico alto (stato di riposo) — questo non è un problema.
  • Alcune implementazioni UART tirano l'uscita a livello basso tra le trasmissioni o durante l'avvio.

Se la linea TX (collegata a SDA) va a livello basso, tira la linea I2C SDA a livello basso. Lo scanner I2C invia una condizione di START su SDA e SCL, ma SDA rimane basso — il bus appare permanentemente occupato. i2cdetect attende diversi secondi per indirizzo prima del timeout, facendo sembrare la scansione bloccata.

Questo non è un guasto hardware — una volta commutato DimmerLink in modalità I2C, SDA/SCL diventano vere linee I2C bidirezionali e il problema scompare.




Causa 3 — Resistenze di pull-up mancanti

I2C richiede resistenze di pull-up esterne su SDA e SCL. Senza di esse la tensione su queste linee non può salire a livello logico alto e il bus non funziona.

Scheda Pull-up I2C integrati Adeguatezza
Raspberry Pi 3/4/5 1,8 kΩ (sulla scheda) Generalmente sufficiente
Arduino Uno / Mega ~50 kΩ (debole) Insufficiente — aggiungere esterni
ESP8266 / ESP32 Debole (~50 kΩ) Insufficiente — aggiungere esterni
STM32 Nessuno Obbligatorio aggiungere esterni
Raspberry Pi Pico Nessuno Obbligatorio aggiungere esterni

Valore richiesto: 4,7 kΩ da SDA a VCC e 4,7 kΩ da SCL a VCC. Usa lo stesso VCC di DimmerLink (vedi sotto).




Causa 4 — Disallineamento tensione VCC

DimmerLink supporta tre tensioni di alimentazione:

VCC Livelli logici MCU tipico
5 V 5V TTL Arduino Uno, Mega
3,3V 3.3V CMOS ESP32, ESP8266, Raspberry Pi
1,8V 1.8V CMOS MCU a bassa tensione

Collega VCC alla stessa tensione del livello logico del tuo MCU. Non mescolare: un VCC di DimmerLink a 5V collegato a un MCU a 3,3V produrrà segnali a 5V su SDA/SCL, che possono danneggiare il MCU o causare errori logici.

Non è necessario un convertitore di livello — DimmerLink si adatta a qualsiasi VCC fornito.




Soluzione: commutazione passo passo alla modalità I2C


Cosa ti serve

  • Adattatore USB-UART (CP2102, CH340, FT232 o simile)
  • Cavetti jumper
  • Qualsiasi applicazione terminale seriale


Passo 1 — Collegare DimmerLink all'adattatore USB-UART

Pin DimmerLink Pin adattatore UART
VCC Uscita 3.3V
GND GND
TX/SDA RX
RX/SCL TX

Collega TX a RX e RX a TX (incrociato). Alimentazione dall'uscita 3.3V dell'adattatore — non usare 5V se il tuo adattatore UART fornisce solo segnali a 5V.


Passo 2 — Aprire il terminale seriale

Configurazione: 115200 baud, 8 bit dati, nessuna parità, 1 bit di stop (8N1).

Terminali consigliati:

  • Windows: RealTerm (modalità invio HEX)
  • Linux/macOS: picocom -b 115200 /dev/ttyUSB0


Passo 3 — Inviare il comando SWITCH_I2C

Invia byte grezzi: 02 5B

  • In RealTerm: scheda Send → campo Send Numbers: 02 5BSend
  • Su Linux/macOS — usa lo script Python seguente (richiede pyserial):
bash
python3 -c "
import serial
s = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
s.write(bytes([0x02, 0x5B]))
resp = s.read(1)
print('Risposta:', resp.hex() if resp else 'nessuna')
s.close()
"

Sostituisci /dev/ttyUSB0 con la tua porta effettiva (/dev/ttyACM0, /dev/ttyS0, ecc.). Installa pyserial se necessario: pip install pyserial.

Risposta attesa: 00 (un byte, OK).

Se non c'è risposta:

  • Verifica che TX/RX siano incrociati (TX adattatore → RX DimmerLink).
  • Conferma che la velocità è esattamente 115200 baud.
  • Conferma che VCC è collegato.


Passo 4 — Verificare la commutazione di modalità

Dopo aver ricevuto 00, DimmerLink è ora in modalità I2C. Scollega dall'adattatore UART, cabla per I2C e scansiona:

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

Risultato atteso: indirizzo 0x50 trovato.




Cablaggio per funzionamento I2C

Dopo la commutazione in modalità I2C, collegare come segue:


Raspberry Pi

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

Il RPi ha pull-up da 1,8 kΩ su GPIO2/3 — generalmente sufficienti per cavi inferiori a 30 cm. Aggiungi pull-up esterni da 4,7 kΩ se la comunicazione è instabile.


Arduino (Uno/Mega)

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

Aggiungi pull-up da 4,7 kΩ da A4 a 5V e da A5 a 5V.


ESP32

ESP32 DimmerLink
GPIO21 (SDA) TX/SDA
GPIO22 (SCL) RX/SCL
3,3V VCC
GND GND

Aggiungi pull-up da 4,7 kΩ da GPIO21 a 3.3V e da GPIO22 a 3.3V.


Schema di cablaggio pull-up I2C

text
VCC (uguale al VCC di DimmerLink)
 │
 ├── 4.7kΩ ── SDA
 │
 └── 4.7kΩ ── SCL



Verificare la comunicazione


Raspberry Pi (CLI)

bash
# Leggere la frequenza di rete (dovrebbe restituire 50 o 60)
i2cget -y 1 0x50 0x20
# Impostare la luminosità al 50%
i2cset -y 1 0x50 0x10 50
# Rileggere la luminosità
i2cget -y 1 0x50 0x10


Arduino

cpp
#include <Wire.h>
void setup() {
    Serial.begin(115200);
    Wire.begin();
    // Impostare la luminosità al 50%
    Wire.beginTransmission(0x50);
    Wire.write(0x10);  // registro DIM0_LEVEL
    Wire.write(50);    // 50%
    if (Wire.endTransmission() == 0) {
        Serial.println("DimmerLink: luminosità impostata al 50%");
    } else {
        Serial.println("Errore: DimmerLink non risponde");
    }
}


Python (Raspberry Pi)

python
from smbus2 import SMBus
try:
    bus = SMBus(1)
    freq = bus.read_byte_data(0x50, 0x20)
    print(f"DimmerLink OK — frequenza di rete: {freq} Hz")
    bus.close()
except OSError as e:
    print(f"Non trovato: {e}")
    print("Verifica: modalità I2C commutata, pull-up installati, VCC corretto")



Come tornare alla modalità UART

Se devi tornare alla modalità UART, scrivi il comando 0x03 (SWITCH_UART) nel registro COMMAND I2C (0x01):

Arduino:

cpp
Wire.beginTransmission(0x50);
Wire.write(0x01);   // registro COMMAND
Wire.write(0x03);   // SWITCH_UART
Wire.endTransmission();
// I2C non funziona più — riconnetti tramite UART

Raspberry Pi:

bash
i2cset -y 1 0x50 0x01 0x03
# Ora controllo solo tramite UART



Diagramma di flusso diagnostico

text
i2cdetect non mostra nulla a 0x50?
         │
         ├── VCC di DimmerLink è collegato e corretto? → No → Collegare VCC
         │
         ├── SWITCH_I2C è stato inviato (02 5B via UART)? → No → Inviare
         │
         ├── Pull-up da 4,7 kΩ su SDA e SCL? → No → Aggiungere
         │
         ├── SDA collegato a SDA, SCL a SCL? → No → Correggere cablaggio
         │
         └── i2cdetect si blocca (scansione lenta)?
                 → Modalità UART attiva → Inviare SWITCH_I2C prima



Checklist rapida

  • ☐ Comando SWITCH_I2C (`02 5B`) inviato via UART a 115200 baud
  • ☐ Risposta `00` ricevuta (conferma commutazione modalità)
  • ☐ VCC impostato alla stessa tensione della logica MCU (3,3V consigliato)
  • ☐ Pull-up 4,7 kΩ da SDA a VCC
  • ☐ Pull-up 4,7 kΩ da SCL a VCC
  • ☐ SDA collegato a SDA (non incrociato)
  • ☐ SCL collegato a SCL (non incrociato)
  • ☐ `i2cdetect -y 1` mostra `50` nella tabella



  • Articoli correlati



    Hai ancora domande?

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

    Condividi articolo
    Accedi per lasciare un commento