Skip to content
7. Демонстрация результата

7. Демонстрация результата

Занятие 9. Демонстрация результата — и Задание 4

Цель занятия: обучающиеся выводят результат всеми каналами регламента: экран/консоль, цвет, звук, стрелка мотора на шкале.

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

  1. При каком наборе (A, B) выражение Задания 2 ложно?
  2. Как перевести угол оси в цифру на шкале 8 делений? (интервальный возврат: занятие 4)
  3. Что особенного делает Задание 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» шкалы при сборке — проверяйте перед каждой сдачей; возврат в стартовое положение перед раундом гарантирует, что судья видит переход стрелки, а не остаточное состояние; хотя перезапуск разрешён, цикл на два раунда избавляет от лишних действий под стрессом.

Каналы вывода компетенции 3 — полный набор. Экран/консоль: 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 делений.

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

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

  1. Ноль после проверки чётности — 0 % 2 == 0 → загорается зелёный, а должно быть «не горят». Ноль первым.
  2. Шкала сбилась относительно нулевой метки мотора после переноски — стрелка «плюс» смотрит вбок. Ритуал: совместить метки перед каждой сдачей.
  3. Ветка нуля не протестирована — вероятность нуля 1/11, за две проверки может не выпасть на тренировке, но выпадет на турнире.
  4. Индикация меняется до вывода числа — судья фиксирует события по порядку условия: сначала число на экран, потом свойства.

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

Задание 4 сдано на 30/30, ветка нуля продемонстрирована принудительно; блиц: «почему стрелку возвращаем на 0 перед каждым раундом?»

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