Обработка датчика

На скриншоте показан потенциометр в Tinkercad: крайние выводы подключаются к питанию и земле, а средний вывод идёт на аналоговый вход. Это удобный первый «датчик», потому что его значение можно менять прямо во время симуляции.
Датчик превращает физическое явление в сигнал, но само число с аналогового входа ещё не является готовым решением. Программе нужно прочитать его, понять рабочий диапазон, сравнить с порогом и выбрать действие. Если сигнал шумит около границы, одного порога часто недостаточно: робот начинает быстро переключаться между двумя командами.
Аналоговый вход измеряет напряжение и с помощью аналого-цифрового преобразователя выдаёт целое число. Диапазон чисел, опорное напряжение и разрешение зависят от платы и настроек. В визуальной программе результат можно сравнить с порогом, привести к удобному диапазону и использовать для выбора поведения робота.
Зачем это нужно
Кнопка сообщает два состояния, а многие датчики дают целый диапазон. Фоторезистивный модуль меняет сигнал при изменении освещённости. Потенциометр задаёт желаемую скорость. Аналоговый датчик расстояния выдаёт напряжение, связанное с расстоянием по характеристике производителя. Датчик линии может показывать не только «чёрное или белое», но и промежуточные значения на границе.
Без обработки робот видит поток чисел. Чтобы превратить их в поведение, программа должна ответить на вопросы:
- какой контакт и тип входа используются;
- какой диапазон допустим для входа конкретной платы;
- что означают малые и большие значения именно этого датчика;
- где провести границу между состояниями;
- насколько устойчив сигнал;
- что делать при обрыве, насыщении или выходе за ожидаемый диапазон.
Удачная визуальная программа не просто соединяет блок датчика с мотором. Она показывает путь от измерения к решению.
Главная идея
Обработку аналогового датчика удобно представлять цепочкой:
физическая величина → напряжение → код АЦП → обработанное значение → решение → действие
АЦП, или аналого-цифровой преобразователь, сравнивает входное напряжение с опорным диапазоном и переводит результат в один из дискретных кодов. При разрешении n бит теоретический код лежит от 0 до 2ⁿ − 1. Например, при 10 бит получается диапазон от 0 до 1023, а при 12 бит — от 0 до 4095. Это примеры математической связи, а не обещание для любой платы.
В этой методичке Tinkercad симулирует Arduino Uno с 10-битным АЦП, поэтому блок чтения A0 возвращает код от 0 до 1023. Порог 500 можно взять для первой проверки потенциометра, но для конкретного виртуального датчика границу всё равно выбирают по наблюдаемым значениям.
Как подключается аналоговый источник
Для первого опыта удобен потенциометр. Его крайние выводы образуют резистивную дорожку между питанием и землёй, а средний вывод — ползунок — выдаёт часть напряжения. Ползунок подключают к аналоговому входу. Так получается управляемый делитель напряжения.
На первом скриншоте три пути разделены:
- зелёный провод идёт к источнику питания, подходящему для входного диапазона платы;
- графитовый провод соединён с общей землёй;
- синий провод от ползунка идёт только к аналоговому входу.
С датчиковым модулем поступают по его документации: вывод питания соединяют с разрешённым напряжением, землю — с общей землёй контроллера, аналоговый выход — с подходящим аналоговым входом. Обозначения и уровни разных модулей не обязаны совпадать.
Напряжение — это разность потенциалов. Чтобы контроллер правильно измерял внешний аналоговый сигнал, источник сигнала и контроллер обычно должны иметь общую точку отсчёта — GND. Исключения требуют специальной изоляции и отдельной схемотехники.
Нельзя подавать на аналоговый контакт напряжение вне разрешённого диапазона платы. Формулировка «Arduino работает от пяти вольт» не универсальна: существуют платы с другой логикой, опорным напряжением и ограничениями. Перед подключением проверяют документацию платы и датчика. Если максимальный выход датчика выше допустимого входа, нужен правильно рассчитанный согласующий узел, а не только изменение блока в программе.
Оставленный неподключённым аналоговый вход может выдавать изменяющиеся значения из-за наводок. Такой результат не является показанием датчика.
Что выдаёт блок чтения
Блок read analog pin A0 в Tinkercad возвращает сырой код АЦП. Проценты, напряжение или физическую величину ученик получает отдельными математическими блоками. Поэтому на входе ветвления нужно ожидать именно число от 0 до 1023.
| Вид результата | Что он означает | Что проверить |
|---|---|---|
| сырой код | номер уровня АЦП | разрешение и реальный диапазон платы |
| доля или процент | нормированное положение в диапазоне | какие границы приняты за минимум и максимум |
| напряжение | расчёт по коду и опоре | действительное опорное напряжение и единицы |
| физическая величина | результат формулы или библиотеки | модель датчика, коэффициенты и область применимости |
Если блок скрывает преобразование, полезно временно вывести его результат в монитор и проверить крайние положения потенциометра. Значение должно меняться последовательно, без внезапных больших скачков и без превышения обещанного средой диапазона. Полностью достичь крайних кодов удаётся не в каждой реальной схеме: питание, опора, допуски и шум влияют на результат.
Порог превращает число в решение
Допустим, при слабом освещении робот должен включать подсветку. Программа читает датчик и сравнивает результат с порогом. Направление сравнения нельзя угадывать: у одной схемы код растёт на свету, у другой уменьшается. Сначала наблюдают реальные значения в двух состояниях, затем выбирают знак сравнения.
Простейшая логика состоит из трёх блоков:
- прочитать аналоговый вход;
- проверить, находится ли значение выше или ниже выбранной границы;
- выполнить действие для каждой ветви.
Порог должен лежать между характерными значениями двух состояний, а не выбираться только потому, что это «середина шкалы». Например, если рабочие наблюдения при свете сосредоточены в одной области, а в тени — в другой, границу выбирают в устойчивом промежутке и затем проверяют при разных условиях.
Калибровка под реальную установку
Два экземпляра датчика, разное расстояние до поверхности или внешнее освещение могут изменить показания. Калибровка связывает рабочие значения конкретной собранной системы с ожидаемым диапазоном.
Практичная последовательность:
- запустить режим калибровки;
- получить первое настоящее измерение и принять его одновременно за текущие минимум и максимум;
- перемещать датчик по всем ожидаемым условиям;
- обновлять минимум, когда новое значение меньше сохранённого;
- обновлять максимум, когда новое значение больше сохранённого;
- проверить, что между минимумом и максимумом есть достаточный рабочий размах;
- преобразовывать последующие значения относительно этих границ;
- ограничивать результат ожидаемым диапазоном, если среда предоставляет такой блок.
Инициализация первым измерением переносима лучше, чем предположение, будто АЦП всегда 10-битный. Если сохранённые минимум и максимум равны, нормализация с делением на их разность невозможна: делитель равен нулю, поэтому программа должна сообщить об ошибке калибровки или использовать безопасное значение. Если размах ненулевой, но слишком мал, деление математически возможно, однако шум сильно усиливается и результат становится неустойчивым. Поэтому проекту нужен минимально допустимый размах, выбранный по наблюдениям реального датчика.
Линейное преобразование удобно для потенциометра, но не делает нелинейный датчик линейным. Для получения расстояния, температуры или другой физической величины используют характеристику и формулу именно выбранного датчика.
Шум, усреднение и задержка реакции
Даже исправный аналоговый сигнал обычно немного меняется. Причинами могут быть электрический шум, нестабильность питания, движение объекта и дискретность АЦП. Одиночное измерение не всегда описывает устойчивое состояние.
Один из способов сглаживания — среднее нескольких последних измерений. Оно уменьшает случайные колебания, но добавляет задержку: чем длиннее окно, тем медленнее программа замечает реальное изменение. Для быстрого робота слишком сильное сглаживание опасно так же, как отсутствие фильтрации. Метод и размер окна выбирают по требуемой скорости реакции, а не по правилу «чем больше, тем лучше».
Перед фильтрацией полезно проверить аппаратную часть: общий GND, качество контактов, длину проводов, питание датчика и соблюдение рекомендаций производителя. Программный фильтр не исправляет неправильное подключение.
Зачем нужны два порога
Если сигнал колеблется около одного порога, условие быстро меняется с «да» на «нет» и обратно. Лампа мерцает, реле щёлкает, а мотор получает противоречивые команды. Для устойчивого переключения применяют гистерезис — разные границы включения и выключения.
Например, для сигнала, который растёт при приближении объекта:
- перейти в активное состояние, когда значение стало выше верхней границы;
- оставаться активным, пока значение находится между границами;
- выйти из активного состояния, когда значение стало ниже нижней границы.
Между порогами программа сохраняет предыдущее состояние. Значит, ей нужна переменная состояния, а не только два независимых условных блока.

Скриншот показывает, что значение аналогового входа сначала сохраняют в переменную, а затем используют в действиях программы. В учебной версии можно начать с прямого использования значения в задержке или яркости, а затем добавить пороги, калибровку и сохранённое состояние.
Расстояние между порогами создаёт область, где новое переключение не происходит. Чем шире эта область, тем устойчивее система к шуму, но тем большего изменения сигнала она требует для обратного перехода.
Пример: подсветка при недостатке света
Сначала программа в течение ограниченного режима калибровки собирает минимальное и максимальное значения при ожидаемом освещении. Затем она читает датчик через равные интервалы, при необходимости сглаживает несколько измерений и сравнивает результат с двумя порогами.
Если электрическая схема выдаёт меньший код в темноте, подсветка включается ниже нижней границы, остаётся в текущем состоянии внутри промежутка и выключается выше верхней границы. Если направление сигнала обратное, условия меняются местами. Это определяют наблюдением и документацией, а не названием датчика.
Физический светодиод требует собственной правильной цепи с токоограничением, а мощная лампа — подходящего драйвера. Блок результата не отменяет ограничений выхода контроллера.
Пример: датчик линии выбирает поворот
Одному нижнему датчику можно задать порог между светлой поверхностью и линией. Но результат зависит от высоты, материала, внешнего света и скорости. Перед маршрутом робот записывает показания над обоими типами поверхности. Затем порог выбирают между устойчивыми областями, а не копируют из чужого проекта.
Если код находится близко к границе, гистерезис предотвращает быстрый переход между командами. Для более точного движения одного порога может быть мало: используют два датчика, нормированную ошибку и регулятор. Это следующий уровень после освоения цепочки «измерение → сравнение → действие».
Что запомнить про аналоговый датчик
- Аналоговый вход возвращает цифровой код измеренного напряжения, а не автоматически готовую физическую величину.
- Разрешение, опорное напряжение, диапазон кода и допустимые уровни зависят от платы и настроек.
- Питание, земля и сигнальный вывод трёхпроводного датчика выполняют разные роли.
- Сырой код исследуют в реальных рабочих условиях до выбора порога.
- Калибровка начинается с настоящего измерения и учитывает конкретную установку.
- Усреднение уменьшает случайные колебания, но замедляет реакцию.
- Два порога и сохранённое состояние подавляют частое переключение около границы.
- Программная обработка не защищает контакт от недопустимого напряжения.
Практика
Задание 1
Подключите потенциометр как делитель напряжения и выведите сырой результат аналогового блока. Запишите наблюдаемый минимум, максимум и направление изменения при повороте ручки.
Задание 2
Сделайте индикатор, который меняет состояние по одному порогу. Медленно удерживайте потенциометр около границы и опишите наблюдаемое поведение.
Задание 3
Замените один порог двумя и добавьте переменную сохранённого состояния. Подберите расстояние между границами так, чтобы переключение стало устойчивым, но реакция оставалась удобной.
Задание 4
Создайте режим калибровки реального датчика. Минимум и максимум должны инициализироваться первым измерением. Предусмотрите безопасное поведение, если рабочий размах оказался слишком мал.
Проверьте себя
- Какую величину непосредственно измеряет аналоговый вход?
- Почему диапазон 0–1023 нельзя считать универсальным для всех плат?
- Как подключаются три вывода потенциометра для измерения положения?
- Зачем контроллеру и внешнему датчику общая земля?
- Почему порог выбирают после наблюдения рабочих значений?
- Как усреднение влияет на шум и скорость реакции?
- Что происходит с состоянием, когда сигнал находится между порогами гистерезиса?
- Почему программное ограничение числа не защищает вход от слишком высокого напряжения?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
| Термин | Значение |
|---|---|
| аналоговый сигнал | напряжение, способное принимать множество значений в допустимом диапазоне |
| АЦП | узел, преобразующий измеренное аналоговое напряжение в цифровой код |
| разрешение | число бит, определяющее количество различимых кодов преобразования |
| опорное напряжение | основа диапазона, относительно которой АЦП выполняет преобразование |
| сырой код | результат АЦП до перевода в процент или физическую величину |
| порог | граница, по которой программа выбирает состояние или действие |
| калибровка | определение рабочих границ и коэффициентов на реальной собранной системе |
| сглаживание | обработка нескольких измерений для уменьшения случайных колебаний |
| гистерезис | разные пороги прямого и обратного переключения с сохранением состояния между ними |
Связанные темы
- Обработка кнопки — цифровой вход, у которого есть только два логических уровня.
- Плавное мигание светодиодом — преобразование измеренного значения в управляемую яркость.
- Драйвер моторов — передача решения датчика силовому исполнительному устройству.
- Библиотеки — готовые блоки, которые могут переводить сырой код в величину датчика.
Источники
- Arduino Language Reference: analogRead — принцип чтения, примеры разрешения разных плат и предупреждение о неподключённом входе.
- Arduino Built-in Example: Analog Read Serial — наблюдение сырого аналогового значения.
- Arduino Built-in Example: Calibration — сбор минимального и максимального показаний для калибровки.
- Arduino Built-in Example: Smoothing — усреднение последовательности аналоговых измерений.
- Arduino Language Reference —
analogRead(),analogReadResolution()иanalogReference(). - Texas Instruments: Inverting Comparator With Hysteresis Circuit — два порога переключения и устойчивое состояние между ними.
- Ni3nayka/microcontroller_learn_1523 — скриншот схемы Tinkercad для
analogRead. - 博客园: 用Tinkercad学arduino之 模拟输入 改变灯闪频率 — скриншот блочной программы Tinkercad с чтением аналогового входа.