Logo
Версия для печати

Какая кнопка на NXT-блоке нажата?

Какая кнопка на NXT-блоке нажата? Какая кнопка на NXT-блоке нажата?
То, что NXT-G предоставляет возможность получать состояние кнопок, расположенных на NXT-блоке, ни для кого не является секретом. С помощью специального программного блока можно в любой момент времени узнать, в каком положении находится та или иная кнопка. Но иногда возникает необходимость узнать, а нажата ли вообще какая-нибудь кнопка? И если нажата, то какая?

 

С помощью специального программного блока можно в любой момент времени узнать, в каком положении находится одна из трех кнопок: левая серая, большая оранжевая и правая серая.

Но иногда возникает необходимость узнать, а нажата вообще какая-нибудь кнопка, если да, то какая? Например, когда с помощью одного NXT-блока, посредством Bluetooth, выполняется управление роботом, оснащенным другим NXT-блоком: нажатие на левую кнопку вызывает поворот налево, а на правую - поворот направо.

Базовый блок "NXT Buttons" не позволяет это сделать за один запрос. Следовательно, необходимо такую функциональность реализовать.

Если попытаться составить алгоритм выяснения состояния кнопок, то он может выглядеть следующим образом:

  1. Опросить состояние левой кнопки; если она нажата перейти к пункту 5.
  2. Опросить состояние правой кнопки; если она нажата, перейти к пункту 5.
  3. Опросить состояние средней кнопки; если она нажата, перейти к пункту 5.
  4. Если ни одна из кнопок не нажата, вернуть это состояние в основную программу.
  5. Вернуть в основную программу, какая кнопка нажата.


Как видно, данная реализация после опроса состояния всех кнопок, возвращает извещение о том, какая из них нажата. Каким образом лучше закодировать это сообщенение?

Дело в том, что NXT-G уже оперирует цифрами 1, 2 и 3 для того, чтобы обозначить кнопки на NXT-блоке.
1 - Right
2 - Left
3 – Select

Поэтому удобно, чтобы реализация алгоритма, описанного выше, тоже использовала эти значения. Тогда пусть она возвращает:
1 - если нажата правая кнопка,
2 - если нажата левая кнопка,
3 - если нажата средняя кнопка.

В дополнение, необходимо число, которым можно было бы закодировать состояние, что никакая кнопка не нажата. Пусть таким числом будет "0".

Теперь для последовательного опроса кнопок можно воспользоваться фактом, что при программировании блока "NXT Buttons" через канал данных передается код кнопки, состояние которой необходимо узнать. Поскольку кнопок всего три, можно опрашивать их в цикле: сначала кнопку с кодом 1 (правую), затем кнопку с кодом 2 (левую) и т.д. Как только найдено, что какая-то кнопка нажата, дальнейший обход по циклу не имеет смысла, поэтому он завершается.

Также нужно помнить, что счетчик цикла начинается с нуля, в то время как для опроса необходимо работать с номерами от "1".

Итак, опрос состояния кнопок:

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

Хотя каждая итерация цикла и выполняется довольно быстро, вполне вероятно событие, что конкретная кнопка была нажата только между двумя соседними опросами ее состояния, т.е. на момент самого опроса она не зажата. Это поведение совпадает с шаблоном состояния Bumped. Следовательно, каждую кнопку нужно проверять на два состояния - номер кнопки возвращается, если кнопка зажата (Pressed) или нажата (Bumped).

Теперь нужно получить номер нажатой кнопки или "0", если ни одна кнопка не нажата. Очевидно, что нужно выяснить, по какому условию произошел выход из цикла: по достижению конца всех допустимых итераций (выполнено все три итерации цикла) или же по выявлению нажатой кнопки. Поскольку на момент завершения цикла одно из этих условий уже Истина (True), можно это использовать для определения, что возвращается как результат алгоритма: "0" или номер кнопки.

Если оформлять данную реализацию как процедуру (через MyBlock), то необходимо, чтобы в качестве выхода из нее шел один (в данном конкретном случае) канал данных. Т.е. он должен выходить из условия, рассмотренного выше. Чтобы не заводить ненужные сущности, такие как переменные, внутри этого условия, можно использовать прием преобразования счетчика цикла в выходные данные: для получения нуля - счетчик умножается на ноль, для получения номера клавиши - к счетчику прибавляется единица, точнее берется уже инкрементированное значение и увеличивается на ноль. Тогда из условия выходит только один канал данных с нужным числом.

Целиком содержимое нового блока будет выглядеть следующим образом:

В таком виде его можно использовать, например, чтобы перемещать фигурку по экрану:

- В цикле опрашивается, не была ли нажата какая-то кнопка.
- Если нажата левая кнопка (третья вкладка), уменьшаем Xcoord, ответственный за координату Х перемещаемой фигуры.

- Если нажата правая кнопка (вторая вкладка), увеличиваем Xcoord.
- Возрващамые значения "0" (первая вкладка) и "3" (четвертая вкладка) игнорируются - значение Xcoord не изменяется.

Важно также отметить, что Xcoord изменяется только тогда, когда фигура находится все еще в зоне видимости на экране. Т.е. координата Х не должна принимать слишком маленьких и слишком больших значений.

 
  • Оцените материал
    (0 голосов)
  • Опубликовано в NXT 2
  • Прочитано 2157 раз

Оставить комментарий

Авторские права © capitano.com.ua 2013