Датчик уровня воды в подвале я вытянул с первого этажа шестиметровым плоским шлейфом. Первый день шина отвечала как по учебнику, к концу недели раз в час в мониторе мелькал мусор, а через месяц она умолкла окончательно — и намертво: не помогали ни перезапуск скетча, ни переподключение разъёмов. Так я выучил правило, которое теперь висит над стендом: «шина виснет» — не диагноз, а симптом, и у него три разных виновника.
Виновники такие: ёмкость длинного провода размазывает фронты, помехи от соседних силовых линий бьют по сигналам, а зависший слейв держит линию и глушит всех. Лечатся они по-разному, и перепутать дорого: лечить наводки утолщением подтяжки бессмысленно, а ёмкость — перепрошивкой. Бюджет ёмкости в пФ и метрах, буферы-повторители и активные удлинители считал отдельный урок про длину проводов; здесь — протокол спасения по симптомам: подтяжка как щуп, экранированный провод и скорость как последняя гайка.
Числа, от которых пляшем. Фронт сигнала — примерно 0,85 × R × C, где R — сопротивление подтяжки, C — ёмкость линии. Стандарт отводит фронту около микросекунды на 100 кГц; шлейф даёт порядка 50 пФ на метр. При 4,7 кОм и четырёх метрах фронт выходит около 0,8 мкс — на самой границе: добавьте шестой метр или окисленный контакт в разъёме, и мастер начнёт путать ноль с единицей. Дальше всё — про то, как вернуть запас и не убить при этом остальное.
Три болезни, один симптом: как различить
Ёмкостная болезнь опознаётся по зависимости от длины: на коротком хвосте шина безупречна, на длинной — мусор, и утяжеление подтяжки до 2,2 кОм возвращает картинку. Наводки опознаются по соседям: симптомы пляшут, когда щёлкает реле, заводится компрессор или включается лампа, и экранирование помогает лучше подтяжек. Зависший слейв самый наглый: шина молчит совсем, SDA придавлена, и лечится только переинициализацией или перезагрузкой — против него написаны таймауты и защита скетча.
Мой порядок осмотра при «виснет». Первый шаг — воткнуть 2,2 кОм вместо 4,7 на десять секунд: ожило — это ёмкость, дальше считаем метры. Второй — увести шину от силового жгута или накинуть экран: ожило — наводки. Третий — отключать модули по одному с прогоном: если без одного из них всё чисто, а с ним намертво, это его зависание, и вина не в проводе. Три шага занимают пять минут и почти всегда ставят диагноз точнее форумной эвристики «у I2C плохая совместимость».
Отдельный сюжет — медленное умирание. Моя подвальная шина деградировала месяц: сначала раз в час, потом раз в десять минут, потом намертво. Виновником вышел разъём, который за полгода окислился: плохой контакт добавляет и ёмкость, и шум, и эти прибавки копятся незаметно. Если симптомы ползут по неделям — ищите механику: разъёмы, скрутки, перемотанные места. Свежий контакт возвращает шину к заводскому состоянию быстрее любой перепрошивки, и повторный прогон тестером из конца урока это подтвердит за минуту.
| Симптом | Диагноз | Первое действие |
|---|---|---|
| мусор растёт с длиной, спасает 2,2 кОм | ёмкость линии съела запас фронта | короче провод, подтяжка 2,2 кОм, потом скорость |
| симптомы пляшут вместе с реле и лампами | наводки от силовых соседей | экранированный кабель, витая пара, развести жгуты |
| SDA придавлена, шина мертва намертво | зависший слейв держит линию | отключать модули по одному; таймауты в скетч |
| мусор только на быстрой шине 400 кГц | скорость не по бюджету фронта | вернуть Wire.setClock(100000) |
Экран и витая пара: режем помехи, помня про ёмкость
Экранированный кабель — рабочее лекарство от наводок, и у него одна типовая грабля. Экран заземляют с ОДНОЙ стороны: замкнутый с двух концов, он собирает наведённые токи и приносит в проект гул вместо защиты. Вторая цена: экран добавляет ёмкость на жилы, поэтому там, где голый шлейф влезал в бюджет, экранированный может не влезть — проверяйте фронтом, а не верой. На моих подвальных шести метрах скромный экранированный микрофонный кабель убрал помехи от стартера люминесцентной лампы полностью — и добавил примерно пятую часть к ёмкости, с которой я честно пересчитал подтяжку.
Дешевле экрана бывает витая пара из Cat5: SDA живёт в паре с землёй, SCL — в своей паре, и земля забирает на себя большую часть излучения и наводок. Правила раскладки те же, что у всякой слаботочки: не тянуть шину в одном жгуте с силовыми линиями, перекрещивать с ними под прямым углом, держаться подальше от импульсных блоков питания и стартеров. При коммутации силовой части не лишним будет и урок про реле и монтаж 220 В — соседство с сетью диктует свою геометрию жгутов. На двух-трёх метрах обычной макетной жизни это уже лишнее: экран и пара нужны, когда шина пошла по дому.
Про номиналы подтяжек — одна строка, потому что токи и границы считал отдельный урок про подтяжки: 4,7 кОм — типовая сцена для метра-двух, 2,2 кОм — подлиннее, ниже примерно полутора килоом на 5 В опускаться нельзя, слейв обязан глотать до 3 мА. И помните про параллельные бортовые резисторы: три модуля по 10 кОм — уже 3,3 кОм суммарно, внешние добавляются с этим расчётом, а не поверх.
Есть и потолок от самого стандарта — 400 пикофарад суммарной ёмкости на шину, включая выводы всех чипов. Шлейф списывает с метра около пятидесяти, значит, восемь метров в упор подходят к лимиту, и подтяжкой это не лечится: резистор маскирует раздутый фронт, но ёмкость никуда не девает. Дальше только геометрия — короче шлейф, буфер-повторитель или перенос самого мастера к датчику.
Про землю на длинной трассе — отдельное слово. Жила земли обязана быть не тоньше сигнальных: по ней замыкается и ток подтяжки, и вся помеха, а полметра тонкой скрутки добавляют разность потенциалов между концами, на которой мастер путает уровни ещё до всяких наводок. Мои подвальные шесть метров живут на сдвоенной жиле земли — с тех пор, как землю удвоил, случайные сбои раз в час ушли даже до экрана.
#include <Wire.h> // Тестер длинной шины: 50 опросов часов, счёт брака и паузы между// попытками. Скорость - одной строкой: Wire.setClock(100000), для// проблемных линий помогает и 50000. Держать в скетче, пока шина// под подозрением; после ремонта убрать.const int TRIALS = 50; void setup() { Wire.begin(); Wire.setClock(100000); // стандартная страховка на длинной линии Serial.begin(9600); Serial.println("Прогон опросов DS3231: 50 попыток"); int ok = 0; int bad = 0; for (int t = 0; t < TRIALS; t++) { Wire.beginTransmission(0x68); Wire.write(0x00); // регистр секунд int code = Wire.endTransmission(); if (code == 0) { Wire.requestFrom(0x68, 7); if (Wire.available() == 7) ok++; else bad++; } else { bad++; // адрес не подтвердился или срыв передачи } delay(20); } Serial.print("Здоровых опросов: "); Serial.println(ok); Serial.print("Брака: "); Serial.println(bad); if (bad == 0) Serial.println("Шина чистая на этой длине"); else Serial.println("Есть брак: подтяжка, экран или скорость");} void loop() { delay(3000);}Скорость как последняя гайка
Понижение скорости — ход, который ничего не стоит и почти всегда даёт запас. На Uno шина и так живёт на 100 кГц, поэтому речь о двух случаях: вы сами поднимали её ради бодрого экрана — выигрыш в миллисекундах честно посчитал урок про 100 против 400 кГц — либо какая-то библиотека подняла её молча через регистры. Строка Wire.setClock(100000) возвращает стандартную частоту, а Wire.setClock(50000) удваивает лимит фронта: тот же кабель, что юлил на границе, проходит с двойным запасом.
Цена вопроса копеечная. Полный опрос часов — семь байтов, около миллисекунды на 100 кГц и около двух на 50 кГц: термостат с опросом раз в секунду этой разницы не заметит. Проигрывают те, кто льёт страницы в EEPROM или рисует экранную анимацию, — им ёмкость надо лечить проводом, а не скоростью. Мой порядок лечения длинной шины: подтяжка, экран, длина, и только потом скорость — она лечит фронты, но не помехи, и молчаливые глюки от соседа-компрессора переживёт любые цифры в setClock.
Стенд считает фронты по формуле, и в этом его честность: цифры на живой шине даст осциллограф или логический анализатор, но соотношение сил оно показывает верно. Двенадцать секунд на границе — четыре метра с 4,7 кОм; щёлкните подтяжкой — и те же метры проходят с запасом; накиньте экран на шесть метров — и даже 2,2 кОм пасует. Именно эти три кнопки в моей голове заменяют форум: каждая отвечает на свой вопрос, а вместе — ставят диагноз.
Чего в стенде нет — зависшего слейва и наводок: это болезни не расчёта, а наблюдения. Их ловят отключением по одному и перекладкой жгутов, о чём выше. И последний пункт протокола, про который забывают чаще всего: иногда честнее перенести мастера к датчику, чем тянуть шину к мастеру. Плата в подвале с одной парой проводов связи живёт спокойнее, чем идеальная шина на шести метрах шлейфа — урок про длину проводов заканчивает именно этой мыслью, и я с ним согласен на все сто.
- 1. На четырёх метрах шлейфа с 4,7 кОм фронт около 0,8 мкс. Что означает эта цифра?
- 2. Симптомы пляшут, когда щёлкает реле рядом. Первое действие?
- 3. SDA придавлена, шина молчит намертво, перезапуск скетча не помогает. Похоже на?
- 4. Почему экран заземляют с одной стороны?
- 5. Полный опрос DS3231 на 50 кГц вместо 100 кГц занимает:
- «Шина виснет» — симптом с тремя виновниками: ёмкость, наводки, зависший слейв; лечатся по-разному
- Фронт около 0,85 × R × C: шлейф ~50 пФ/м, при 4,7 кОм четыре метра — уже на границе лимита
- Проба подтяжкой 2,2 кОм за десять секунд отличает ёмкость от наводок; ниже ~1,5 кОм на 5 В опускаться нельзя
- Экран — на землю с одной стороны; витая пара SDA-GND и SCL-GND из Cat5 лучше плоского шлейфа
- Wire.setClock(100000) и 50000 удваивают запас по фронту; скорость лечит фронты, но не помехи
Частые вопросы по теме урока
- На четырёх метрах шлейфа с 4,7 кОм фронт около 0,8 мкс. Что означает эта цифра?
- Стандарт отводит фронту около 1 мкс на 100 кГц. Восемь десятых — запаса нет: шестой метр, окисленный контакт или экран сдвинут фронт за лимит. На границе лимита: добавьте метр — и мастер начнёт путать биты
- Симптомы пляшут, когда щёлкает реле рядом. Первое действие?
- Это наводки, а не ёмкость: скорость и номиналы подтяжек почти ни при чём. Экран с землёй с одной стороны, витая пара и разнос жгутов — верный ход. Экранированный кабель и развести жгуты
- SDA придавлена, шина молчит намертво, перезапуск скетча не помогает. Похоже на?
- Придавленная SDA — подпись зависшего слейва. Отключайте модули по одному, а в скетч ставьте таймауты; ёмкость и наводки дают мусор, а не мёртвую шину. Зависший слейв, держащий линию
- Почему экран заземляют с одной стороны?
- Экран с двумя землями — виток для наведённых токов. Земля с одной стороны рвёт петлю; вторая цена экрана — добавленная ёмкость на жилы. Замкнутый с двух концов, он собирает наведённые токи и приносит гул
- Полный опрос DS3231 на 50 кГц вместо 100 кГц занимает:
- Семь байтов — около миллисекунды на 100 кГц, вдвое больше на 50. Для опросов раз в секунду цена нулевая; EEPROM-страницы и анимация экрана так лечить нельзя. около двух миллисекунд вместо одной — для термостата незаметно