Перейти к содержимому

DimmerLink не обнаруживается на I2C: проблема режима UART по умолчанию

DimmerLink поставляется в режиме UART и не появится при сканировании шины I2C, пока не будет явно переключён. Подключение в режиме UART может притянуть линии шины I2C к низкому уровню и заблокировать сканер. Эта статья описывает правильную процедуру переключения и необходимую схему подключения подтягивающих резисторов.

Кратко: DimmerLink поставляется с завода в режиме UART. i2cdetect не покажет адрес 0x50, пока вы не отправите команду SWITCH_I2C (02 5B) через UART на скорости 115200 бод. Также добавьте подтягивающие резисторы 4,7 кОм на SDA и SCL — на многих платах встроенные подтяжки недостаточны. Установите VCC в соответствии с логическим напряжением вашего MCU (5 В, 3,3 В или 1,8 В).




Симптом

Вы подключаете DimmerLink к шине I2C, запускаете i2cdetect -y 1 (или сканирование из Arduino), и происходит одно из двух:

  • таблица адресов полностью пуста — адрес 0x50 не отображается;
  • сканирование длится гораздо дольше обычного или зависает.



Причина 1 — Неправильный режим (активен UART)

Каждый модуль DimmerLink поставляется с завода в режиме UART. В режиме UART:

  • устройство не отслеживает шину I2C;
  • выводы TX/SDA и RX/SCL работают как выходы UART;
  • устройство не может отвечать на I2C-адреса — оно никогда не появится при сканировании.

Интерфейс I2C активируется только после переключения режима на I2C. Режим сохраняется в EEPROM и не сбрасывается при отключении питания, поэтому переключение нужно выполнить только один раз.




Причина 2 — Режим UART притягивает линии шины I2C к низкому уровню

Когда DimmerLink находится в режиме UART и подключён к шине I2C:

  • Выход UART TX удерживается на высоком логическом уровне (состояние покоя) — это не проблема.
  • Некоторые реализации UART притягивают выход к низкому уровню между передачами или во время запуска.

Если линия TX (подключённая к SDA) переходит в низкий уровень, она притягивает линию I2C SDA к низкому уровню. Сканер I2C отправляет условие START на SDA и SCL, но SDA остаётся низким — шина выглядит постоянно занятой. i2cdetect будет ждать несколько секунд на каждом адресе до таймаута, из-за чего сканирование кажется зависшим.

Это не аппаратная неисправность — после переключения DimmerLink в режим I2C SDA/SCL становятся настоящими двунаправленными линиями I2C, и проблема исчезает.




Причина 3 — Отсутствуют подтягивающие резисторы

I2C требует внешние подтягивающие резисторы на SDA и SCL. Без них напряжение на этих линиях не может подняться до высокого логического уровня, и шина не функционирует.

Плата Встроенные подтяжки I2C Достаточность
Raspberry Pi 3/4/5 1,8 кОм (на плате) Обычно достаточно
Arduino Uno / Mega ~50 кОм (слабые) Недостаточно — добавьте внешние
ESP8266 / ESP32 Слабые (~50 кОм) Недостаточно — добавьте внешние
STM32 Нет Необходимо добавить внешние
Raspberry Pi Pico Нет Необходимо добавить внешние

Требуемое значение: 4,7 кОм от SDA к VCC и 4,7 кОм от SCL к VCC. Используйте то же VCC, что и для DimmerLink (см. ниже).




Причина 4 — Несоответствие напряжения VCC

DimmerLink поддерживает три напряжения питания:

VCC Логические уровни Типичный MCU
5 В 5V TTL Arduino Uno, Mega
3,3 В 3.3V CMOS ESP32, ESP8266, Raspberry Pi
1,8 В 1.8V CMOS Низковольтные MCU

Подключите VCC к тому же напряжению, что и логический уровень вашего MCU. Не смешивайте: VCC DimmerLink 5 В, подключённый к MCU с логикой 3,3 В, приведёт к появлению сигналов 5 В на SDA/SCL, что может повредить MCU или вызвать логические ошибки.

Преобразователь уровней не нужен — DimmerLink адаптируется к любому подаваемому VCC.




Решение: пошаговое переключение в режим I2C


Что вам понадобится

  • USB-UART адаптер (CP2102, CH340, FT232 или аналогичный)
  • Соединительные провода
  • Любое приложение для работы с последовательным портом


Шаг 1 — Подключите DimmerLink к USB-UART адаптеру

Пин DimmerLink Пин UART адаптера
VCC Выход 3.3V
GND GND
TX/SDA RX
RX/SCL TX

Соедините TX с RX и RX с TX (перекрёстно). Питание от выхода 3.3V адаптера — не используйте 5 В, если ваш UART-адаптер выдаёт только сигналы 5 В.


Шаг 2 — Откройте терминал последовательного порта

Настройки: 115200 бод, 8 бит данных, без чётности, 1 стоп-бит (8N1).

Рекомендуемые терминалы:

  • Windows: RealTerm (режим отправки HEX)
  • Linux/macOS: picocom -b 115200 /dev/ttyUSB0


Шаг 3 — Отправьте команду SWITCH_I2C

Отправьте сырые байты: 02 5B

  • В RealTerm: вкладка Send → поле Send Numbers: 02 5BSend
  • В Linux/macOS — используйте однострочник на Python (требуется pyserial):
bash
python3 -c "
import serial
s = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
s.write(bytes([0x02, 0x5B]))
resp = s.read(1)
print('Ответ:', resp.hex() if resp else 'нет')
s.close()
"

Замените /dev/ttyUSB0 на ваш порт (/dev/ttyACM0, /dev/ttyS0 и т.д.). Установите pyserial при необходимости: pip install pyserial.

Ожидаемый ответ: 00 (один байт, OK).

Если ответа нет:

  • Проверьте, что TX/RX соединены перекрёстно (TX адаптера → RX DimmerLink).
  • Убедитесь, что скорость точно 115200 бод.
  • Убедитесь, что VCC подключён.


Шаг 4 — Проверьте переключение режима

После получения 00 DimmerLink находится в режиме I2C. Отключите от UART-адаптера, подключите для I2C и выполните сканирование:

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("Найден по адресу 0x");
            Serial.println(addr, HEX);
        }
    }
}

Ожидаемый результат: найден адрес 0x50.




Подключение для работы по I2C

После переключения в режим I2C подключите следующим образом:


— (без ISR)

Разъём GPIO RPi Любой ESP32
Пин 1 (3.3V) VCC
Пин 6 (GND) GND
Пин 3 (GPIO2 / SDA) TX/SDA
Пин 5 (GPIO3 / SCL) RX/SCL

RPi имеет подтяжки 1,8 кОм на GPIO2/3 — обычно достаточно для кабелей до 30 см. Добавьте внешние подтяжки 4,7 кОм, если связь нестабильна.


Arduino (Uno/Mega)

Arduino Любой ESP32
A4 (SDA) TX/SDA
A5 (SCL) RX/SCL
5 В VCC
GND GND

Добавьте подтяжки 4,7 кОм от A4 к 5V и от A5 к 5V.


❌ нет

❌ нет Любой ESP32
GPIO21 (SDA) TX/SDA
GPIO22 (SCL) RX/SCL
3,3 В VCC
GND GND

Добавьте подтяжки 4,7 кОм от GPIO21 к 3.3V и от GPIO22 к 3.3V.


Схема подключения подтягивающих резисторов I2C

text
VCC (совпадает с VCC DimmerLink)
 │
 ├── 4.7kΩ ── SDA
 │
 └── 4.7kΩ ── SCL



Проверка связи


Raspberry Pi (CLI)

bash
# Чтение частоты сети (должно вернуть 50 или 60)
i2cget -y 1 0x50 0x20
# Установка яркости на 50%
i2cset -y 1 0x50 0x10 50
# Чтение яркости обратно
i2cget -y 1 0x50 0x10


Arduino

cpp
#include <Wire.h>
void setup() {
    Serial.begin(115200);
    Wire.begin();
    // Установка яркости на 50%
    Wire.beginTransmission(0x50);
    Wire.write(0x10);  // регистр DIM0_LEVEL
    Wire.write(50);    // 50%
    if (Wire.endTransmission() == 0) {
        Serial.println("DimmerLink: яркость установлена на 50%");
    } else {
        Serial.println("Ошибка: DimmerLink не отвечает");
    }
}


Python (Raspberry Pi)

python
from smbus2 import SMBus
try:
    bus = SMBus(1)
    freq = bus.read_byte_data(0x50, 0x20)
    print(f"DimmerLink OK — частота сети: {freq} Гц")
    bus.close()
except OSError as e:
    print(f"Не найден: {e}")
    print("Проверьте: режим I2C включён, подтяжки установлены, VCC корректен")



Как вернуться в режим UART

Если вам нужно вернуться в режим UART, запишите команду 0x03 (SWITCH_UART) в регистр COMMAND (0x01) по I2C:

Arduino:

cpp
Wire.beginTransmission(0x50);
Wire.write(0x01);   // регистр COMMAND
Wire.write(0x03);   // SWITCH_UART
Wire.endTransmission();
// I2C больше не работает — переподключитесь через UART

Raspberry Pi:

bash
i2cset -y 1 0x50 0x01 0x03
# Теперь управление только через UART



Диагностическая блок-схема

text
i2cdetect ничего не показывает по адресу 0x50?
         │
         ├── VCC DimmerLink подключён и корректен? → Нет → Подключите VCC
         │
         ├── Отправлена SWITCH_I2C (02 5B через UART)? → Нет → Отправьте
         │
         ├── Подтяжки 4,7 кОм на SDA и SCL установлены? → Нет → Добавьте
         │
         ├── SDA подключён к SDA, SCL к SCL? → Нет → Исправьте подключение
         │
         └── i2cdetect зависает (медленное сканирование)?
                 → Активен режим UART → Сначала отправьте SWITCH_I2C



Краткий чек-лист

  • ☐ Команда SWITCH_I2C (`02 5B`) отправлена через UART на скорости 115200 бод
  • ☐ Получен ответ `00` (подтверждение переключения режима)
  • ☐ VCC соответствует логическому напряжению MCU (рекомендуется 3,3 В)
  • ☐ Подтяжка 4,7 кОм от SDA к VCC
  • ☐ Подтяжка 4,7 кОм от SCL к VCC
  • ☐ SDA подключён к SDA (не перекрёстно)
  • ☐ SCL подключён к SCL (не перекрёстно)
  • ☐ `i2cdetect -y 1` показывает `50` в таблице



  • Связанные статьи



    Остались вопросы?

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

    Поделиться этой записью
    Войти оставить комментарий