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

NXT-G: неочевидное поведение программы при работе с датчиком касания

NXT-G: неочевидное поведение программы при работе с датчиком касания NXT-G: неочевидное поведение программы при работе с датчиком касания
Среда NXT-G при работе с датчиком касания предоставляет несколько событий, реакцию на которые можно обработать в программе. Но есть и ряд «не очевидностей». Давайте рассмотрим их подробнее.

 

Среда NXT-G при работе с датчиком касания предоставляет несколько событий, реакцию на которые можно обработать в программе.

Pressed - датчик касания зажат
Released - датчик касания отжат (не зажат)
Bumped - датчик касания нажат (зажат и отпущен)

Первая неочевидность возникает, когда мы знакомимся с с официальной документацией NXT-G. Она описывает действие Bumped как быстрое зажатие и отжатие в течении момента времени меньше, чем 0.5 секунды: Choose Bumped if you want the block to be triggered after a quick press and release of the touch sensor (less than 0.5 seconds in duration).

На самом деле простые тесты покажут, что Bumped обрабатывается как момент перехода между состоянием «зажато» в состояние «отжато», причем неважно, сколько при этом он был зажат.

Рассмотрим две программы:

- Первый звуковой сигнал будет после зажатия на датчик касания.
- После того, как датчик отпущен - ничего не происходит.
- Нажмите на датчик еще раз, подержите его секунду-две, сразу после того как он отпущен, прозвучит еще один звуковой сигнал.

- Первый звуковой сигнал будет после зажатия на датчик касания.
- Второй сигнал - после отжатия датчика.
- Если зажать датчик еще раз, подержать его секунду-две, то сразу после того как он отпущен, прозвучит третий звуковой сигнал.

Из того, как обрабатывается событие Bumped ( датчик отжат -> датчик нажат -> датчик нажат), вытекает еще одна особенность, которую необходимо предусматривать при программировании робота.

Например, робот должен стукнуть по мячу манипулятором с расположенным на нем датчиком касания. Если перед мячом нет никаких препятствий, то удар по мячу однозначно определиться датчиком касания - сначала мяч коснется датчика, потом отскочит от него, о чем датчик сообщит роботу, и робот остановит манипулятор. Но если, скажем, мяч лежит у стенки, то мяч не отскочит от датчика, оставляя его зажатым, что приведет к тому, что блок Wait все еще будет в ожидании события и не остановит моторы.

Самая "странная" неочевидность возникает тогда, когда необходимо опрашивать состояния датчика Pressed и Bumped в ходе одной и той же программы с помощью блока опроса датчика (Sensor block) и блока Выбор (Switch).

Следующие программы иллюстрируют работу с датчиком через эти блоки:

Программы делают одно и тоже: после нескольких звуковых сигналов на дисплее отобразится, был ли датчик нажат (Bumped) или нет.

Все становится гораздо сложнее, если необходимо написать программу для робота, например, работающего по следующему алгоритму: если датчик нажат (Bumped) - начать движение или остановится; если датчик зажат (Pressed) - ускоряться, если датчик отжат (Released) - замедляться.

Если описать это задание в виде блок-схемы:

то очевидная реализация его на NXT-G не работает:

Первое условие никогда не распознает действие "нажато" (Bumped) и программа всегда идет по нижней ветке первого условия.

Эксперименты показывают, что как только, помимо проверки на состояние Bumped, в одной области видимости появляется проверка на состояние Pressed или Released, первая проверка перестает работать.

Так, например, если добавить еще одну проверку внутрь цикла в программу, приведенную выше, то первая проверка игнорируется.

Но если одну из проверок вынести из цикла (т.е. сделать их в разных областях видимости), то Bumped состояние будет проверяться корректно:

Как вывод, можно сказать, что опрос Bumped и Pressed/Released состояний сенсора касания в рамках одной программы возможен, но, скорее всего, придется писать свою собственную реализацию механизма выявления состояния Bumped, который во многом зависит от того, как нужно будет по условиям задачи отличать Bumped от Released.

Автор: KoAl, http://nnxt.blogspot.com

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

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

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

Наверх

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

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

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

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

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

Read more

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

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

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

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

Read more

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

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

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

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

Read more

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

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

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

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

Read more

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

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

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

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

Read more