Публикации сообщества

Михаил Семионенков • 6 июня 2019

Программирование условий с роботом

Это продолжение серии о введении в программирование с роботом на примере программирования робота Maqueen. Тем, у кого робот есть, стоит посмотреть публикацию, где описана процедура программирования робота Maqueen в среде makecode. Просто любопытствующие могут читать этот материал как самостоятельный текст.

Проверка условий - один из китов программирования: она позволяет создавать развитую логику программы, отличает программу от примитивной пошаговой инструкции. Знакомство с проверкой условий, естественно, - очень важный момент в обучении программированию. С роботом проверка условий "всплывает" вполне органично: у робота есть датчики, и поведение робота зависит от информации с "органов чувств".

Самый простой пример - препятствие на пути робота. С помощью ультразвукового датчика можно обнаружить препятствие впереди, оценить расстояние до него и изменить поведение. Детям можно рассказать (или напомнить) о летучей мыши, которая использует природный прототип датчика дальности. Датчик дальности необходимо опрашивать, то есть, обращаться к нему за текущим расстоянием до препятствия. Датчик посылает сигнал и ловит отражённый от препятствия сигнал. Если сигнал к датчику не возвращается, датчик возвращает значение 0. Если сигнал вернулся, то по времени между сигналом и получением отражённого сигнала, датчик вычисляет расстояние до препятствия и возвращает число. 

Прежде, чем переходить к практике - важное замечание: робот, конечно, очень привлекателен для развития начального интереса, но "железо" менее "стерильно", чем программное обеспечение, и существует риск отказов и неустойчивой работы. Это создаёт определённые методические проблемы, поскольку подача материала может прерываться техническими сбоями. Конечно, опытный педагог найдёт способ обыграть ситуацию и сделать занятие интереснее, богаче, но о подстерегающих проблемах лучше, конечно, знать заранее.

Датчик дальности робота Maqueen, работу с которым я поставил во главу угла в теме "Программирование условий", оказался не без сюрпризов: программы не всегда работали, как положено.

Наблюдения показали, что контакты датчика иногда "не в форме". Привожу изображение платы Maqueen, где стрелочками указаны неописанные лампочки. По опыту получается, что это индикаторы работы передатчика и приёмника датчика дальности. При нормальной работе они оба горят синим цветом, если это не так, надо попытаться решить проблему.    

Плата Maqueen
Плата Maqueen

 

Задача: Проверить, что датчик возвращает число больше нуля

План:

Если значение, полученное с датчика, больше нуля -   сыграть мелодию да-да-дам...

1. Достаём блок Логика.если(истина) то и вставляем его в блок при начале (рис. 1) 

рис. 1 "если"
рис. 1 Блок "если (условие) то"


На место истина надо теперь поставить "значение, полученное с датчика, больше 0". Для этого:
2. Вставляем на место истина блок Логика.Сравнение (рис. 2)

рис. 2
рис. 2


В блоке - 3 позиции: 0, символ, 0. Эти 3 позиции нужно заполнить следующим образом:
1. "Значение, полученное с датчика"
2. ">"
3. "0" 

Знак ">" выбираем из меню, 0 в последней позиции уже есть, осталось добавить в первую позицию блок maqueen.sensor unit(cm).

Получили (рис. 3)

рис. 3
рис. 3

"sensor unit(cm)" означает "значение с датчика дальности в сантиметрах".

3. В блок если вставляем блок Музыка.запустить мелодию(да-да-дам) повторить (один раз).
(рис. 4) 

рис. 4
рис. 4

 

Программа готова. Прочитаем её:

если  sensor unit(cm) (значение с датчика расстояния) > 0 то

     запустить мелодию(да-да-дам) повторить (один раз).

Задача: Двигаться вперёд, пока расстояние до препятствия больше 20 см

Для решения этой задачи полезен блок Циклы.пока

Цикл пока будет будет выполнять какие-то действия (в нашем случае - движение вперед), пока нужный результат не будет достигнут (расстояние до препятствия станет меньше 20 см).
Помните лягушку, которая барахталась в кринке с молоком, пока не взбила масло?

План:
Начать движение вперёд
Пока расстояние до препятствия > 20 см 
     Двигаться вперёд
Остановиться

Теперь в блоках:

1. Основное.при начале 
    maqeen.Motor (M1) dir (CW) speed (255) // запускаем моторы
    maqeen.Motor (M2) dir (CW) speed (255)
    Циклы.пока
(рис. 5)

рис. 5
рис. 5

2. Теперь истина надо заменить на условие "дальность > 20". Опять достаем блок Логика.Сравнение и так далее по предыдущей задаче (рис. 6). 

рис. 6
рис.6

3. В блоке пока не заполнена часть делать. Поскольку действие - это продолжение движения, то делать ничего и не надо: моторы уже работают, робот движется.
Но в этом случае обращения к датчику будут происходить непрерывно: сразу после проверки значения датчик будет опрашиваться опять (если значение больше 20 см).
Поставим паузу 100 миллисекунд (то есть, одну десятую секунды, рис. 7).

рис. 7
рис. 7


Цикл пока теперь будет опрашивать датчик каждую одну десятую секунды, пока значение с датчика больше 20.
А когда значение станет равным 20 или меньше? Цикл пока завершит свою работу.

4. Завершаем программу: останавливаем моторы и исполняем мелодию (рис. 8).

рис. 8
рис. 8

 

Испытаем программу. Робот подъехал к препятствию ближе, чем на 20 сантиметров. Почему так получилось? 

Задача: Убедиться, что датчик может возвращать 0

Подсказка. Датчик ловит сигнал, отраженный препятствием. Зеркало отражает "сигнал" солнца...

Задача: составить свою задачу, в которой нужно задействовать датчик расстояния до препятствия