7. Демонстрация результата
Занятие 9. Демонстрация результата — и Задание 4
Цель занятия: обучающиеся выводят результат всеми каналами регламента: экран/консоль, цвет, звук, стрелка мотора на шкале.
Разминка-вспоминание (5 мин)
- При каком наборе (A, B) выражение Задания 2 ложно?
- Как перевести угол оси в цифру на шкале 8 делений? (интервальный возврат: занятие 4)
- Что особенного делает Задание 4 с числом 0?
Разбор (worked example): полное решение Задания 4 регламента — 30 баллов
Условие (Приложение 1). Устройство с двухцветной индикацией (зелёный/красный) и шкалой «+/−» со стрелкой на оси мотора (можно доразметить шкалу занятия 4). По команде судьи: сгенерировать случайное число −5…5, вывести на экран/консоль (5 б.); чётное → зелёный, нечётное → красный (5 б.); положительное → стрелка на «+», отрицательное → на «−» (5 б.); ноль → стартовое положение: индикаторы не горят, стрелка на «0». Две проверки (по 15 б.), перезапуск разрешён. Остановка по команде судьи. Итого 30.
Дерево решений
flowchart TD
G[n = randint от -5 до 5] --> E[вывести n на экран/консоль]
E --> Z{n == 0?}
Z -- да --> S0[индикаторы выкл, стрелка на 0 — стартовое положение]
Z -- нет --> P{n % 2 == 0?}
P -- да --> GR[зелёный индикатор]
P -- нет --> RD[красный индикатор]
GR --> SGN{n > 0?}
RD --> SGN
SGN -- да --> PLUS[стрелка на «+»]
SGN -- нет --> MINUS[стрелка на «−»]
Ноль — первым: иначе он провалится в «чётное-зелёное» и попытка потеряет 10 баллов из 15.
Конструкция
Шкала занятия 4 дорабатывается: три метки — «0» вверху, «+» на +90°, «−» на −90°. Стрелка на оси мотора-вывода; при старте программы стрелка выставляется на «0» — это и есть стартовое положение системы. Индикация — статусный светодиод хаба (зелёный/красный/выключен).
Эталонный код (SPIKE 3)
from hub import port, button, light_matrix, light
import motor, runloop, random, color
STRELKA = port.B
SPEED = 300
async def strelka(pos_deg):
"""0 = «0», +90 = «+», -90 = «−» (метки совмещены при сборке)."""
await motor.run_to_absolute_position(STRELKA, pos_deg, SPEED)
def indikator(c):
light.color(light.POWER, c) # статусный светодиод хаба
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 raund():
n = random.randint(-5, 5) # диапазон строго из условия
print("Число:", n) # 5 баллов
await light_matrix.write(str(n))
if n == 0: # особый случай — первым!
indikator(color.BLACK) # индикаторы не горят
await strelka(0) # стрелка на «0»
return
indikator(color.GREEN if n % 2 == 0 else color.RED) # 5 баллов
await strelka(90 if n > 0 else -90) # 5 баллов
async def main():
indikator(color.BLACK)
await strelka(0) # стартовое положение системы
for _ in range(2): # две проверки без перезапуска — надёжнее
await wait_press() # команда судьи = кнопка
await raund()
# остановка по команде судьи: центральной кнопкой хаба
runloop.run(main())Разбор: run_to_absolute_position требует совмещения нулевой метки мотора с меткой «0» шкалы при сборке — проверяйте перед каждой сдачей; возврат в стартовое положение перед раундом гарантирует, что судья видит переход стрелки, а не остаточное состояние; хотя перезапуск разрешён, цикл на два раунда избавляет от лишних действий под стрессом.
print, light_matrix.write. Цвет: light.color(light.POWER, color.GREEN); мигание — цикл цвет/чёрный с паузой (пример 3.1: «чётное — мигать красным» решается тем же raund с циклом мигания). Звук: from hub import sound; sound.beep(440, 500) — частота и длительность различают «сигнал 1» и «сигнал 2». Стрелка/шкала: run_to_absolute_position; «остаток от деления на шкале» из примера 3.1 — это strelka((n % k) * 45) на шкале занятия 4.Практика
Доразметить шкалу и совместить ноль
Метки «0», «+», «−»; прогнать strelka(0/90/-90) — стрелка попадает в метки визуально точно.
Контрольная точка: сдача Задания 4
Наставник-судья, две проверки, остановка по команде. Цель — 30/30. Прогонять до выпадения нуля хотя бы раз (или временно подменить ГСЧ на n = 0 для теста ветки).
Пример 1.2.1 регламента
«Показание датчика меньше порога — один сигнал, больше — другой»: собрать на звуке (beep 300 Гц vs 900 Гц) и на цвете. Это интеграция занятия 2 с сегодняшним выводом.
Остаток на шкале
Пример 3.1: ввести A энкодером, показать A % 8 стрелкой на шкале 8 делений.
Типичные ошибки
- Ноль после проверки чётности — 0 % 2 == 0 → загорается зелёный, а должно быть «не горят». Ноль первым.
- Шкала сбилась относительно нулевой метки мотора после переноски — стрелка «плюс» смотрит вбок. Ритуал: совместить метки перед каждой сдачей.
- Ветка нуля не протестирована — вероятность нуля 1/11, за две проверки может не выпасть на тренировке, но выпадет на турнире.
- Индикация меняется до вывода числа — судья фиксирует события по порядку условия: сначала число на экран, потом свойства.
Мини-проверка выхода
Задание 4 сдано на 30/30, ветка нуля продемонстрирована принудительно; блиц: «почему стрелку возвращаем на 0 перед каждым раундом?»