Перейти к содержимому
3. Датчик освещённости: карточки

3. Датчик освещённости: карточки

Занятие 3. Датчик освещённости: ввод карточками

Цель занятия: обучающиеся считывают карточку как логическое значение (белая = 1, чёрная = 0) и вводят число количеством карточек.

Разминка-вспоминание (5 мин)

  1. Зачем медиана, если можно взять одно показание датчика?
  2. Как из расстояния 17 см получить номер зоны при N=3 на поле 30 см?
  3. Белая карточка — это 0 или 1 по регламенту?

Разбор (worked example): калибровка и чтение карточки

Датчик отражения возвращает процент отражённого света (0–100). Абсолютные значения зависят от освещения зала и высоты датчика — поэтому порог не пишут константой из головы, его калибруют на месте:

калибровка:
    положить белую карточку → W ← медиана отражения (например, 82)
    положить чёрную карточку → B ← медиана отражения (например, 9)
    POROG ← (W + B) / 2                # середина, максимальный запас в обе стороны

чтение:
    r ← медиана отражения
    значение ← 1 если r > POROG иначе 0

Эталонный код (C++, ESP32):

#include "stend.h"
#include <algorithm>

int reflMedian(int n = 5) {
  int v[9];
  for (int i = 0; i < n; i++) v[i] = reflection();
  std::sort(v, v + n);
  return v[n / 2];
}

void waitPress(Btn b = BTN_R) {      // ждать нажатие И отпускание — иначе одно нажатие сработает дважды
  while (!pressed(b)) delay(10);
  while (pressed(b))  delay(10);
}

int porog;

void setup() {
  Serial.begin(115200);
  stendBegin();
  // --- Калибровка на месте (перед сдачей, при свете зала) ---
  Serial.println("Белая карточка + кнопка");  waitPress();
  int w = reflMedian();
  Serial.println("Чёрная карточка + кнопка"); waitPress();
  int b = reflMedian();
  porog = (w + b) / 2;
  Serial.printf("W = %d  B = %d  POROG = %d\n", w, b, porog);
}

void loop() {
  // --- Чтение карточки по кнопке ---
  waitPress();
  int val = reflMedian() > porog ? 1 : 0;
  Serial.printf("Карточка: %d\n", val);
  screen(String(val));
}

Разбор: калибровочный блок остаётся в боевых программах Задания 2 — свет в зале турнира другой, чем дома; порог посередине даёт запас ≈35 пунктов в обе стороны, так что лёгкое смещение карточки не ломает чтение; медиана из 5 гасит момент, когда карточку ещё подкладывают.

Кодирование числа карточками (компетенция 1.3.2). Регламент допускает задачи вида «количество чёрных карточек кодирует число»: карточки предъявляют по одной, подтверждая кнопкой; счётчик увеличивается на 1 на каждую чёрную (или белую — читайте условие!); вторая кнопка завершает ввод и выводит число. Это цикл со счётчиком и условием — та же конструкция, что и зоны.

Практика

Откалиброваться и прочитать 10 карточек

Партнёр предъявляет карточки в случайном порядке — 10 из 10 верных на экране.

Ввод пары переменных A и B

По кнопке прочитать A, вывести; по кнопке прочитать B, вывести. Это заготовка Задания 2 (само логическое выражение — на занятии 8, сегодня только ввод).

Счётчик карточек

Реализовать «число = количество чёрных карточек, конец ввода — левая кнопка». Проверка: ввести 0, 3 и 5 — все три верно.

Стресс-тест освещением

Прочитать карточки у окна и в тени. Если появились ошибки — перекалиброваться и убедиться, что снова 10/10. Вывод записать: «калибровка — первое действие на новом месте».

Техника безопасности. Не светить датчиком/подсветкой в глаза; карточки подкладывать пальцами сбоку, не подставляя их под движущиеся части устройства.

Типичные ошибки

  1. Порог-константа «из дома» — на турнире другой свет, чёрная читается как белая. Калибровка на месте обязательна.
  2. Датчик выше 1 см от стола — регламент прямо требует 0,5–1 см; выше — контраст падает, ниже — карточка не пролезает.
  3. Чтение в момент подкладывания карточки — рука в кадре. Правило протокола: карточка лежит → потом кнопка.
  4. Глянцевые карточки — блик даёт «белое» на чёрной. Регламент рекомендует матовый картон — используйте его и на тренировках.

Мини-проверка выхода

Ввод пары карточек (A, B) с первого раза по протоколу «карточка → кнопка → значение на экране», оба значения верны; вопрос: «почему порог = (W+B)/2, а не 50?»

Уровни сложности