Проводка датчиків DS18B20: чому зникають показання
Написано для прошивки 0.2.181 (коміт 3df2d3d) · порталу 0.0.205Можливо, застаріло: поточна прошивка 0.2.205, поточний портал 0.0.236
Датчик, який «іноді пропадає», — не дрібниця. Без вдалого читання довше 15 секунд прошивка вважає його мертвим: картка показує «нема даних», а блокування тримає вимкненими ТЕНи, що до нього прив'язані. На апараті це виглядає як нагрів, що смикається без причини. Тими самими датчиками з тією ж прошивкою на столі все працює, тому людина зазвичай міняє датчики. Датчики тут майже ніколи ні до чого. Причина — у проводці між платою й гільзою, і вона виправляється.
Стаття — про роз'єми 1-Wire плат KC868-A6 (IO-1, IO-2) і KC868-A16
(HT1, HT2, HT3). Куди який дріт на самій колодці, розібрано в статтях про
шини A6, шини A16 і
колодку DA/IO. Тут розібрано, чому зібрана за ними шина
на апараті може губити датчики.
Як це виглядає в житті#
Бойовий A6, три DS18B20 на апараті з 24 кВт нагріву й мішалкою на частотнику:
| Що міряли за добу | Значення |
|---|---|
| подій «нема даних» по всіх датчиках | 255 |
| з них у датчика куба | 166 |
| типова тривалість відвалу (медіана) | 2 хв |
| найдовший відвал | 83 хв |
| ті самі датчики й прошивка на стенді | 0 |
Відвали в кожного датчика свої, одночасно вони не пропадали. Вони не залежать ні від температури, ні від того, чи ввімкнений нагрів, ні від мішалки. Тож справа не в тому, що «ТЕН наводить, коли гріє». Справа в самій лінії: на апараті вона настільки погана, що частина читань просто не доходить.
Підтяжка: на платі вже є, додати можна одну#
На KC868-A6 і KC868-A16 на кожному роз'ємі 1-Wire вже стоять резистор 4.7 кОм до 3.3 В і 100 Ом послідовно до ніжки ESP32 (аркуш Sensors принципової схеми: R23/R31 на A6, R157/R29/R150 на A16). Прошивка додатково вмикає внутрішню підтяжку ESP32, але вона слабка (~45 кОм) і погоди не робить. Для кабелю в кілька метрів плата готова як є.
Довгий кабель — інша справа. Кабель має ємність, і що він довший, то
повільніше 4.7 кОм витягує лінію з нуля в одиницю: фронт затягується, і
датчик або плата читає не той біт. Для кабелю понад 10 м загальну
підтяжку опускають до 2.2–3.3 кОм. На KC868 для цього досить одного
резистора між клемою даних і 3V на самій колодці, паралельно до того, що
на платі:
| Додали біля плати | Разом із 4.7 кОм на платі |
|---|---|
| 10 кОм | 3.2 кОм |
| 4.7 кОм | 2.35 кОм |
Що не робити — ставити по резистору на кожен датчик. Модулі й адаптери
DS18B20 часто продаються з уже впаяним 4.7 кОм (маркування 472). Три такі
модулі на одній шині разом із платою дають 1.2 кОм. Підтяжка тоді залежить
від того, скільки модулів причеплено, а датчикові з кожним резистором
важче притиснути лінію до нуля. Потрібна одна свідома підтяжка біля плати,
а не випадкова сума.
На ESP32 DevKit і WT32-ETH01 резистора на платі немає. Там зовнішні 4.7 кОм між лінією даних і 3.3 В обов'язкові, бо внутрішньої підтяжки ESP32 для DS18B20 замало.
Три жили, не дві#
DS18B20 уміє жити на двох дротах, живлячись від лінії даних («паразитне
живлення»). Прошивка oCBot цього не підтримує. Кожен датчик мусить мати
окрему жилу VDD на клему 3V (A6) чи 3.3V (A16), окремо DATA і окремо GND.
Якщо жила живлення обірвана чи не затиснута, картина підступна: при скануванні шини адреси датчиків знаходяться, бо на відповідь адресою датчикові досить заряду з лінії даних, а температури всі 0 °C. Це перевірено на залізі. Нулі на всіх датчиках разом при знайдених адресах означають не «холодно», а обірване живлення.
Живлення датчикам береться з тієї ж колодки. Клема 3V на A6 віддає до
200 мА на все разом, а DS18B20 під час вимірювання бере до 1.5 мА
(даташит), тож десяток датчиків бюджету не чіпає.
Ланцюжок, а не зірка#
1-Wire розрахована на одну лінію, вздовж якої датчики сидять один за одним: від плати до першого датчика, від нього до другого, і так далі (daisy chain). Відвід від магістралі до гільзи — якомога коротший.
«Зірка», коли від плати до однієї скрутки й звідти кожному датчикові свій довгий кабель, — найчастіша причина збоїв на апараті. Кожен кінець відгалуження відбиває фронт сигналу назад. Відбиття з різних кінців приходять у різний час, накладаються на біти, і плата читає сміття. На стенді кабелі короткі, відбиття встигають згаснути, і все працює. На апараті з трьома кабелями по 5–10 м збої йдуть постійно. Цю пастку описує й виробник мікросхеми: Maxim, application note 148 про довгі мережі 1-Wire.
Якщо прокласти ланцюжок фізично незручно (куб з одного боку, колона з іншого), розведіть датчики по різних роз'ємах. У A6 два роз'єми, у A16 три, і кожен — окрема шина зі своєю підтяжкою. Два коротких кабелі на різних шинах завжди кращі за одну зірку на одній. Заразом обрив одного кабелю не гасить усіх датчиків.
Кабель і сусідство з силовими#
- Вита пара,
DATAв парі зGND. Кабель FTP 5e зручний: одна пара —DATAіGND, друга —3Vі ще одна жилаGND. Вита пара гасить наведення, які приходять на обидва дроти пари однаково. Сигнальний 4×0.22 з екраном годиться для коротких відводів біля щитка. - Екран — на
GNDлише з боку плати. З боку гільзи екран обрізати й заізолювати. Екран, з'єднаний з обох кінців, стає ще одним провідником, по якому тече струм між кубом і щитком. - Окремо від силових кабелів. Не класти кабель датчиків в один жолоб чи гофру з кабелями ТЕНів і особливо з кабелем від частотника до двигуна мішалки: на виході частотника ШІМ зі стрімкими фронтами, це найсильніше джерело завад на апараті. Перетинати силові кабелі треба навхрест, а не вести поруч.
Роз'єми й гільзи#
Відвал на хвилини чи години, як 83 хв з таблиці вище, найчастіше дає контакт, а не завада:
- Гвинтова клема з голим багатодротовим кінцем. Жилки розповзаються, гвинт тримає дві з семи, і від вібрації мішалки контакт то є, то нема. На кінці — обтискна гільза (НШВИ) під переріз жили.
- Скрутка під ізострічкою на подовженні кабелю зонда. Паяти й ховати під термоусадку.
- Роз'єми на гільзі (авіаційні GX12/GX16 тощо): окислені піни, непропаяна жила в хвостовику, роз'єм біля куба, що гріється.
- Кабель зонда в гарячій зоні. ПВХ-ізоляція біля куба дубіє й тріскається. Біля гарячого — силікон.
Швидка перевірка: відкрити картку датчика й по черзі поворушити кожен роз'єм і клему на його шляху. Якщо від дотику датчик спалахує «нема даних», винуватця знайдено.
Що означає симптом#
Інтерфейс показує «нема даних» після 15 с без вдалого читання, портал отримує подію «нема даних» після 75 с. Короткі збої в секунду-дві на картці не видно. Видно їх у журналі.
| Що бачите | Що це найімовірніше | Куди дивитись |
|---|---|---|
| «нема даних» блимає на секунди й зникає, часто | погана форма сигналу: завади, відбиття, слабка підтяжка на довгому кабелі | зірка чи ланцюжок, сусідство з силовими, підтяжка |
| «нема даних» висить хвилинами чи годинами на одному датчику, решта на шині живі | контакт у його відводі або сам датчик | роз'єм, клема, гільза, кабель зонда |
| зникають усі датчики шини разом | магістраль або клема на платі | клеми DATA/GND на колодці, перший роз'єм, коротке замикання в кабелі |
| 85 °C нізвідки, потім норма | датчик перезапустився від просідання живлення: 85 °C — це значення, з яким він прокидається | жила VDD, контакт живлення, скрутки |
| 0 °C на всіх датчиках, а скан шини їх знаходить | обірване живлення VDD |
жила 3V/3.3V до датчиків |
Про 85 °C окремо. Справжні 85 °C у кубі цілком можливі, тому просто відкидати таке значення не можна. Прошивка розрізняє два випадки за налаштуванням датчика: oCBot ставить датчикам роздільність 10 біт, а датчик, що щойно перезапустився, повертається до заводських 12 біт. Із першого dev-релізу після 0.2.181 такі хибні 85 °C відкидаються, а справжні показуються.
Що пише журнал#
З того ж релізу прошивка сама пробує прочитати датчик до трьох разів за прохід, тож одиничні збої більше не гасять його на цілий цикл. Раз на 10 хв у журнал (Налаштування → Логи) і на портал іде підсумок лише по тих датчиках, у яких були збої:
sensor 0x…: 37 of 600 reads failed (no answer 5, CRC 31, bad data 1)
| Лічильник | Що означає | Що міняти |
|---|---|---|
no answer |
датчик не відповів зовсім | контакт DATA, живлення, обрив |
CRC |
відповідь прийшла, але зіпсована дорогою | завади й відбиття: топологія, вита пара, силові поруч, підтяжка на довгому кабелі |
bad data |
відповідь ціла, але не температура — здебільшого той самий хибний 85 °C | живлення датчика |
Адреса 0x… та сама, що в Периферії біля датчика.
Порядок пошуку#
- Зібрати статистику за добу: які датчики відвалюються, як часто й
надовго. Підсумок у журналі каже, чого більше,
no answerчиCRC. - Перевірити на столі. Той самий датчик коротким кабелем просто на колодку. Нуль збоїв означає, що датчик справний і шукати треба в проводці.
- Розвести по роз'ємах. Проблемний датчик окремим кабелем на
вільний роз'єм (
IO-1/IO-2на A6,HT1–HT3на A16). Якщо збої пішли за датчиком, винен його кабель. Якщо лишились на старій шині, винна магістраль чи сусіди на ній. - Поворушити роз'єми, дивлячись на картку.
- Поміряти. Під напругою на кінці кабелю біля датчика між
VDDіGNDмає бути не нижче 3.0 В (мінімум для DS18B20 за даташитом). Без напруги, з від'єднаним кабелем, між клемою даних і3Vмає бути близько 4.7 кОм, тобто підтяжка на платі ціла. - Переробити проводку, якщо переважає
CRC: ланцюжок замість зірки, вита пара, подалі від силових, на довгому кабелі — додатковий резистор біля плати.
Суміжні статті#
- Шини й роз'єми KC868-A6 — яка клема якою шиною значиться в прошивці.
- Шини й мережа KC868-A16 — три роз'єми датчиків і
чому шина 0 — це
HT2. - Підключення до колодки DA/IO — зонд екранованим кабелем дріт за дротом.
- Двигун і частотний перетворювач — екранований кабель до двигуна, щоб він менше заважав усьому поруч.
- Усунення типових несправностей — решта збоїв, не лише датчики.