Сигналы: цифровые и аналоговые
Огонь на сигнальной башне — это уже сигнал: горит значит враг идёт. Чем двоичный сигнал отличается от аналогового, где у нуля кончается ноль и начинается единица, почему датчик за два километра врёт и какими выводами Arduino что умеет. С живыми опытами: помеха на линии, ползунок длины кабеля и карта выводов платы.
Сигналы: как передать весть по проводу
На башне зажгли огонь. Это значит «враг идёт» — и больше ничего. Огонь не расскажет, сколько врагов и с какой стороны, зато его видно за тридцать километров, и понять его неправильно почти невозможно. Так выглядит двоичный сигнал в самом древнем своём виде: он либо есть, либо нет.
Костёр на башне
Цепочка сигнальных башен стояла и на Великой Китайской стене, и на русских засечных чертах, и в древней Греции: у Эсхила весть о падении Трои идёт домой именно так — от костра к костру. Гонец скакал бы неделю, огонь добирается за одну ночь.
Живая картинка — появится, когда загрузится страница.
В этой картинке уже спрятано всё, о чём дальше пойдёт речь.
- Договор о смысле. Огонь сам по себе ничего не значит. Значит он «враг идёт» только потому, что об этом условились заранее. Ровно так же единица на выводе D2 значит «кнопка нажата» только потому, что так написано в твоей программе.
- Два состояния. Горит или не горит. Третьего нет, и это не бедность, а защита: в дождь, в дым и в сумерках костёр всё равно либо виден, либо нет.
- Повторитель. Одна башня не видна из-за горизонта — значит, между ними ставят ещё одну. Она не придумывает весть, а зажигает свой костёр заново, в полную силу. Запомни это слово: в конце статьи оно вернётся, когда датчик окажется за два километра от платы.
Сигнал — это величина, которая меняется во времени и о смысле которой договорились заранее.
Двоичный и аналоговый
Сигнальная башня умеет сказать одно из двух. А если нужно передать не «враг идёт», а «врагов около трёхсот»? Тогда либо придумывают язык из многих коротких вестей (так работает любая цифровая связь), либо делают сигнал непрерывным — таким, у которого важна сама величина.
| Двоичный (цифровой) | Аналоговый | |
|---|---|---|
| Что несёт | одно из двух состояний: 0 или 1 | величину: сколько именно вольт |
| Примеры на столе | кнопка, концевик, светодиод, реле, обмен с датчиком по шине | фоторезистор, потенциометр, термистор, микрофон, датчик тока |
| На плате | digitalRead и digitalWrite | analogRead (а вот analogWrite — не он, см. ниже) |
| Помеха | пока не дотянулась до порога — её просто нет | любая помеха сразу становится частью показаний |
Разницу проще увидеть, чем описать. Двигай ползунок помехи: на верхней дорожке приёмник каждый раз решает «выше порога или ниже» и восстанавливает сигнал начисто, на нижней — принимает всё как есть, вместе с грязью.
Живая картинка — появится, когда загрузится страница.
Отсюда главный вывод, ради которого вся статья: двоичный сигнал можно восстановить, аналоговый — нет. Пока помеха меньше запаса до порога, на приёмнике не остаётся вообще никакого её следа. Именно поэтому далеко передают цифру, а звук с микрофона оцифровывают как можно ближе к самому микрофону.
Значит ли это, что аналоговый сигнал плох? Нет. Он честно несёт величину по одному проводу и без всякой программы: ручка газа, датчик температуры, фоторезистор. Просто жить ему полагается коротко — от датчика до ближайшего входа АЦП.
Уровни: где кончается ноль и начинается единица
«Единица» на выводе платы — это не какое-то особое электричество, а просто напряжение около пяти вольт. Ноль — напряжение около нуля. Но провод не обязан быть аккуратным: он может отдать 0,4 В, 1,8 В или 2,9 В. Что тогда прочитает плата?
У входа есть два порога, и заданы они долями питания. Всё, что ниже нижнего, вход обязан понять как ноль; всё, что выше верхнего, — как единицу. Между ними лежит серая зона: там не гарантировано ничего.
Живая картинка — появится, когда загрузится страница.
Серая зона — это не «плата сломалась», это честная запись в документации: «поведение не определено». Один и тот же вывод при 2,2 В может читаться как ноль, через секунду — как единица, а при нагреве платы поменять решение ещё раз. Поэтому вход никогда не оставляют болтаться в воздухе — его подтягивают (об этом отдельный урок «Кнопка и подтяжка»).
С выходом платы та же история наоборот: пока с вывода не берут ток, на нём почти ровно 5 В и почти ровно 0 В. Нагрузи вывод двадцатью миллиамперами — и высокий уровень просядет примерно до 4,2 В, а низкий приподнимется до 0,9 В. Для соседнего входа это по-прежнему уверенные единица и ноль, а вот для светодиода разница уже заметна.
Не перепутай питание логики. Arduino UNO работает на 5 В, а ESP32 и почти все современные модули — на 3,3 В. Подать пять вольт на трёхвольтовый вход — верный способ его сжечь. В обратную сторону обычно работает: 3,3 В больше, чем 3,0 В, поэтому пятивольтовый вход такую единицу поймёт.
Датчик за два километра
Теперь самое интересное. Датчик стоит не на столе, а в поле, в теплице или на дальнем конце цеха, и до платы от него — километры кабеля. Кабель выглядит как провод, но провод — это резистор: медная жила сечением 0,5 мм² даёт около 0,035 Ом на метр, а жил в линии две — сигнал уходит по одной и возвращается по другой. Два километра — это уже 140 Ом в цепи.
Живая картинка — появится, когда загрузится страница.
Первый опыт показывает беду, которую не ждут: питание датчика идёт по той же паре, что и сигнал. Ток покоя невелик — 20 мА при полных пяти вольтах, — но 140 Ом честно превращают его в потерянные вольты, и до датчика доезжает уже не пять. Сам датчик при этом не ломается: он начинает врать или вовсе не запускается, а на столе, где кабеля метр, всё работало.
Честная оговорка про модель: на схеме датчик показан своим сопротивлением (250 Ом — это ровно 20 мА при 5 В), поэтому в опыте он с просадкой начинает потреблять меньше. У настоящего датчика внутри стабилизатор, и свой ток он держит до последнего — значит, в жизни просадка будет ещё заметнее, чем здесь.
Живая картинка — появится, когда загрузится страница.
Второй опыт объясняет главное недоразумение про длинные линии. Само по себе сопротивление жил ничего не портит: падение напряжения — это ток, умноженный на омы, и если приёмник тока не берёт, то и терять нечего. Аналоговый вход платы почти ничего не берёт, поэтому на нём даже через десять километров стоит целых пять вольт. Стоит повесить на линию что-то потребляющее — оптрон, делитель, фильтр — и те же километры немедленно съедают вольты.
Третий переключатель показывает, почему в поле любят «сухой контакт»: концевик или поплавок просто замыкает линию, подтяжка стоит на плате, и вход видит не чистый ноль, а падение на жилах. Растёт длина — растёт и этот «ноль», но добирается он до серой зоны очень нескоро.
Сопротивление — не единственная беда длинной линии, просто её проще всего посчитать. Рядом живут ещё три.
- Ёмкость. Две жилы рядом — это конденсатор, около 50 пФ на метр. Вместе с подтяжкой она размазывает фронт: сигнал не переключается мгновенно, а заряжается. Числа для выбранной длины опыт показывает сам.
- Наводки. Длинный провод — прекрасная антенна. Рядом включился сварочный аппарат или пускатель — и на входе появился импульс, которого никто не посылал.
- Разные земли. На дальнем конце «ноль» может оказаться вовсе не нулём: по общему проводу текут чужие токи, и он поднимается на десятые доли вольта, а то и на вольты (см. урок «GND — общий провод»).
Как с этим справляются взрослые? Тремя способами, и все три — про то же самое, что делали башни с кострами.
- Токовая петля 4–20 мА. Датчик передаёт не напряжение, а ток. Ток в последовательной цепи одинаков везде, сколько бы омов ни было в линии, — сопротивление кабеля перестаёт врать вовсе. Заодно ноль сигнала — это 4 мА, а не 0: оборвался провод — приёмник видит 0 мА и понимает, что это обрыв, а не «датчик показывает минимум».
- Разностная передача (RS-485). Сигнал — это разница напряжений на двух свитых жилах. Наводка приходит на обе одинаково и в разнице исчезает.
- Цифра с проверкой. Весть передают числом с контрольной суммой: приёмник видит, что сообщение испорчено, и просит повторить. А чтобы дотянуться дальше, ставят повторитель — ту самую промежуточную башню.
Как посмотреть сигнал мультиметром
Прибор ставят в режим постоянного напряжения (DCV, «V⎓»), чёрный щуп — на GND платы, красный — на интересующий вывод. Дальше всё зависит от того, стоит сигнал на месте или бегает.
| Что на выводе | Что покажет мультиметр | Что это значит |
|---|---|---|
| постоянная единица | около 5 В | вывод действительно «высокий» |
| постоянный ноль | около 0 В | вывод «низкий», и это тоже рабочее состояние |
analogWrite(128) | около 2,5 В | прибор усредняет: он видит не половину напряжения, а половину времени |
| вход висит в воздухе | что угодно, и цифры «плывут» | это и есть непонятный вход, ему нужна подтяжка |
| короткий импульс раз в секунду | почти ноль | мультиметр его не увидит — нужен осциллограф |
Отсюда правило: мультиметр хорош для уровней и бесполезен для формы. Он ответит на вопросы «есть ли питание», «стоит ли на выводе единица», «не просел ли сигнал в конце линии». А чтобы увидеть фронт, длительность импульса или дребезг кнопки, нужен осциллограф или логический анализатор — оба есть в лаборатории, кнопка «Приборы».
Два практических совета, которые экономят полчаса. Первый: общий провод обязателен — если меряешь сигнал от чужой платы, чёрный щуп должен стоять на её GND, иначе прибор покажет разницу неизвестно с чем. Второй: прозвонку — только на обесточенной линии; в режиме «Ω» прибор сам подаёт напряжение, и на живой схеме он соврёт (подробности — в уроке «Мультиметр: как им мерить»).
Какие выводы Arduino что умеют
Цифровым сигналом на плате UNO умеют работать все 20 выводов — и читать его, и выдавать. Из них 6 умеют «аналоговый выход» (это не совсем правда, см. ниже), и ровно 6 умеют читать аналоговый сигнал. Ткни в вывод — картинка расскажет, что он может.
Живая картинка — появится, когда загрузится страница.
analogWrite— это не аналоговый выход. Настоящего аналогового выхода (ЦАП) у UNO нет вообще.
То, что делает analogWrite, называется ШИМ — широтно-импульсная модуляция. Вывод по-прежнему выдаёт только 0 и 5 В, но очень быстро моргает, и чем дольше он «включён» в каждом периоде, тем больше среднее напряжение. Лампочка, мотор и мультиметр это среднее видят, потому что не успевают за морганием. А вот вход другой платы увидит именно моргание. Нужно настоящее напряжение — ставят RC-фильтр или отдельную микросхему ЦАП.
С аналоговым входом всё проще и честнее: analogRead возвращает число от 0 до 1023, где 0 — это ноль вольт, а 1023 — опорное напряжение, по умолчанию питание платы. Одна ступенька — около 4,9 мВ; мерить разницу меньше этой ступеньки бессмысленно, как измерять миллиметры линейкой с сантиметровыми делениями.
Памятка
- Сигнал — это договор. Половина ошибок не в проводах, а в том, что смысл сигнала понимают по-разному на двух концах.
- Двоичный сигнал восстанавливается после помехи, аналоговый — нет. Далеко передавай цифру.
- У входа два порога и серая зона между ними. Висящий вход — это всегда серая зона.
- Вольты теряются там, где течёт ток. Нет тока — сопротивление линии почти не мешает.
- Мультиметром смотрят уровень, осциллографом — форму. Мигающий вывод прибор покажет средним.
- Цифровой сигнал — любой вывод, ШИМ — только шесть, аналоговый вход — только шесть, и настоящего аналогового выхода на UNO нет.