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

Калибровка датчиков

Мобильный робот калибрует датчик на известных поверхностях

Калибровка нужна, когда сырое число датчика ещё не отвечает на вопрос робота. Код 700 с датчика линии, почвы или света сам по себе ничего не значит, пока мы не сравнили его с известными условиями.

Коротко

Калибровка связывает сырые значения с понятной шкалой проекта: темно/светло, сухо/влажно, близко/далеко, линия/пол. Она не убирает шум, но помогает выбрать рабочие пороги и понять, где результат уже недостоверен.

Зачем это нужно

Одинаковые LDR-модули могут давать разные коды под одной лампой. Датчик влажности почвы зависит от земли и соли. Массив QTR на белом пластике и на серой фанере видит разные диапазоны. Поэтому значения из чужого проекта нельзя просто перенести в свой робот.

Примеры датчиков

Датчики, которым нужна калибровка

ДатчикЧто калибруемТипичные эталоныГлавный риск
LDR-модулькод светатень, рабочая лампа, окнодругой источник света меняет результат
QTR-8Aотражение линиибелое поле, чёрная линия, крайвысота и поверхность меняют шкалу
Ёмкостный датчик почвывлажность грунтасухой грунт, влажный грунтнет универсальных процентов
HC-SR04расстояниелинейка на нескольких точкахугол и материал объекта дают выбросы

Главный вопрос: какие реальные условия считаются минимумом и максимумом именно для этого робота? Без ответа map() только красиво растягивает случайные числа.

Главная идея

Калибровка отделяет три задачи:

ЗадачаВопросПример
Проверка диапазонакакие сырые значения возможны?raw меняется от 180 до 840
Привязка шкалычто считать 0% и 100%?сухая и влажная почва
Проверка решенияработает ли правило на новых данных?робот едет по другому участку трассы

Фильтр уменьшает разброс, но не исправляет неверный масштаб. Если сухая почва и влажная почва дают почти одинаковый код, сначала ищут физическую причину: питание, контакт, глубину, тип грунта или неисправный датчик.

Калибровка переводит сырой код в рабочую шкалу

Пошаговая процедура

  1. Определить, какое решение принимает робот: включить насос, повернуть по линии, остановиться перед стеной.
  2. Выбрать эталоны: сухо/влажно, белое/чёрное, 10 см/50 см.
  3. Записать сырые значения без фильтра.
  4. Повторить измерения несколько раз и посмотреть разброс.
  5. Выбрать рабочий диапазон и пороги с запасом.
  6. Проверить результат на данных, которые не использовались при подборе.
  7. Сохранить параметры вместе с условиями опыта.

Калибровка значений на Arduino

Сначала полезно вывести сырые значения в Serial Monitor. Так видно, меняется ли датчик в ожидаемую сторону и какой реальный диапазон получается на вашей схеме.

const int SENSOR_PIN = A0;

void setup() {
Serial.begin(9600);
}

void loop() {
int raw = analogRead(SENSOR_PIN);

Serial.print("raw=");
Serial.println(raw);

delay(200);
}

После опыта выбирают границы. Допустим, на вашей трассе датчик линии даёт около 180 над чёрной линией и около 840 над белым полем. Эти числа лучше оформить константами, чтобы было понятно, откуда взялась шкала.

const int SENSOR_PIN = A0;

const int RAW_MIN = 180;
const int RAW_MAX = 840;
const int OUTPUT_MIN = 0;
const int OUTPUT_MAX = 100;

void setup() {
Serial.begin(9600);
}

void loop() {
int raw = analogRead(SENSOR_PIN);
int clipped = constrain(raw, RAW_MIN, RAW_MAX);
int percent = map(clipped, RAW_MIN, RAW_MAX, OUTPUT_MIN, OUTPUT_MAX);

Serial.print("raw=");
Serial.print(raw);
Serial.print(" clipped=");
Serial.print(clipped);
Serial.print(" percent=");
Serial.println(percent);

delay(200);
}

constrain() обрезает выбросы за пределами выбранного диапазона. map() переводит ограниченное значение в рабочую шкалу 0...100. Для датчика, у которого большее сырое значение означает меньше физической величины, границы выхода можно поменять местами: OUTPUT_MAX, OUTPUT_MIN.

Важно: RAW_MIN и RAW_MAX нельзя оставлять «примерными навсегда». Их подбирают на своём датчике, своём питании и своей механике.

Калибровка, настройка и фильтрация

ДействиеМеняетПример
Настройкаповедение модуляпотенциометр порога на TCRT5000
Калибровкасвязь сырых чисел с задачейсухая и влажная почва
Фильтрацияразброс последовательных отсчётовсреднее из нескольких измерений

Сначала проверяют физику и диапазон, потом калибруют шкалу, и только после этого выбирают фильтр. Иначе можно сгладить ошибку так, что она станет красивой, но всё равно неправильной.

Что запомнить про калибровку

  • Сырое значение датчика не равно физической величине.
  • Границы нужно измерять на своём экземпляре и в своих условиях.
  • constrain() защищает рабочую шкалу от выбросов за выбранный диапазон.
  • map() удобен для простой линейной шкалы, но не делает датчик точным.
  • Фильтрация не заменяет калибровку.

Практика

  1. Выведите сырые значения любого аналогового датчика в Serial Monitor.
  2. Найдите минимальное и максимальное рабочее значение для своей задачи.
  3. Добавьте constrain() и map(), затем проверьте результат на промежуточных условиях.
  4. Запишите в тетрадь модель датчика, питание, дату и условия калибровки.

Проверьте себя

  1. Почему нельзя взять порог датчика линии из чужого проекта?
  2. Чем настройка потенциометра отличается от калибровки в программе?
  3. Зачем печатать одновременно raw, clipped и percent?
  4. Что произойдёт, если RAW_MIN и RAW_MAX поменять местами?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

  • формулируете основную мысль своими словами;
  • называете важные условия, ограничения или меры безопасности;
  • для схемы, кода или расчёта показываете ход решения и ожидаемый результат.

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

  • Сырое значение — число, полученное напрямую от датчика или АЦП.
  • Эталон — известное состояние, с которым сравнивают датчик.
  • Калибровка — подбор связи между сырым значением и рабочей шкалой.
  • Выброс — отдельное значение, резко отличающееся от ожидаемого.
  • Порог — граница принятия решения.

Связанные темы

Источники