Skip to content
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

Эталонный код (SPIKE 3):

from hub import port, button, light_matrix
import color_sensor, runloop

LIGHT = port.D

def refl_median(n=5):
    vals = [color_sensor.reflection(LIGHT) for _ in range(n)]
    vals.sort()
    return vals[n // 2]

async def wait_press(b=button.RIGHT):
    while not button.pressed(b):
        await runloop.sleep_ms(10)
    while button.pressed(b):
        await runloop.sleep_ms(10)

async def main():
    # --- Калибровка на месте (перед сдачей, при свете зала) ---
    print("Белая карточка + кнопка");  await wait_press()
    w = refl_median()
    print("Чёрная карточка + кнопка"); await wait_press()
    b = refl_median()
    porog = (w + b) // 2
    print("W =", w, " B =", b, " POROG =", porog)

    # --- Чтение карточки по кнопке ---
    while True:
        await wait_press()
        val = 1 if refl_median() > porog else 0
        print("Карточка:", val)
        await light_matrix.write(str(val))

runloop.run(main())

Разбор: калибровочный блок остаётся в боевых программах Задания 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?»

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