3. Датчик освещённости: карточки
Занятие 3. Датчик освещённости: ввод карточками
Цель занятия: обучающиеся считывают карточку как логическое значение (белая = 1, чёрная = 0) и вводят число количеством карточек.
Разминка-вспоминание (5 мин)
- Зачем медиана, если можно взять одно показание датчика?
- Как из расстояния 17 см получить номер зоны при N=3 на поле 30 см?
- Белая карточка — это 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 гасит момент, когда карточку ещё подкладывают.
Практика
Откалиброваться и прочитать 10 карточек
Партнёр предъявляет карточки в случайном порядке — 10 из 10 верных на экране.
Ввод пары переменных A и B
По кнопке прочитать A, вывести; по кнопке прочитать B, вывести. Это заготовка Задания 2 (само логическое выражение — на занятии 8, сегодня только ввод).
Счётчик карточек
Реализовать «число = количество чёрных карточек, конец ввода — левая кнопка». Проверка: ввести 0, 3 и 5 — все три верно.
Стресс-тест освещением
Прочитать карточки у окна и в тени. Если появились ошибки — перекалиброваться и убедиться, что снова 10/10. Вывод записать: «калибровка — первое действие на новом месте».
Типичные ошибки
- Порог-константа «из дома» — на турнире другой свет, чёрная читается как белая. Калибровка на месте обязательна.
- Датчик выше 1 см от стола — регламент прямо требует 0,5–1 см; выше — контраст падает, ниже — карточка не пролезает.
- Чтение в момент подкладывания карточки — рука в кадре. Правило протокола: карточка лежит → потом кнопка.
- Глянцевые карточки — блик даёт «белое» на чёрной. Регламент рекомендует матовый картон — используйте его и на тренировках.
Мини-проверка выхода
Ввод пары карточек (A, B) с первого раза по протоколу «карточка → кнопка → значение на экране», оба значения верны; вопрос: «почему порог = (W+B)/2, а не 50?»