Место для баннера, продается :)

Какая кнопка на 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
  • Прочитано 2188 раз

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

Убедитесь, что вы вводите (*) необходимую информацию, где нужно
HTML-коды запрещены

Наверх

Последние новости от LEGO Mindstorms NXT 2

Лабораторный практик…

29-04-2013 Hits:3302 NXT 2 Capitano - avatar Capitano

Лабораторный практикум №4 по LEGO MINDSTORMS NXT

Целью данного урока является написание кода для подключения Wiimote по Bluetooth при помощи LabVIEW. Приведен пример написания кода для считывания состояния одной кнопки и статуса XYZ ускорения Wiimote.

Read more

Лабораторный практик…

24-04-2013 Hits:15277 NXT 2 Capitano - avatar Capitano

Лабораторный практикум №3 по LEGO MINDSTORMS NXT

Целью данного урока является написание кода, с помощью которого можно будет считывать состояние мотора робота NXT и заставить моторы двигаться, используя инструментарий LabVIEW NXT.

Read more

Лабораторный практик…

22-04-2013 Hits:3448 NXT 2 Capitano - avatar Capitano

Лабораторный практикум №2 по LEGO MINDSTORMS NXT

Целью данного урока является изучение основ среды программирования LabVIEW и получение практических навыков программирования с использованием инструментария LabVIEW NXT. Приведен пример написания кодов для считывания показаний датчиков на NXT-блоке.

Read more

Коментарии в материале

Мишени для тренировок…

01-12-2016 Hits:3222 Спортивная стрельба Capitano - avatar Capitano

Каталог мишеней для тренировок на основе "Официальной мишени для ПТ" Все файлы в формате PDF, при печати использовать реальный размер!

Read more

17.10.2015г. Чемпионат по Fi…

02-10-2015 Hits:1601 Спортивная стрельба Capitano - avatar Capitano

17.10.2015г. Чемпионат по Field Target. Киев.Украина

Приглашаются все желающие, 17 октября 2015г, принять участие в открытых соревнованиях по Field Target, в классах ППП и ПСП до 16,3дж в калибре 4,5мм. 

Read more