суббота, 20 августа 2016 г.

EV3 Gunstick

Если вы помните, в одной из наших ранних серий мы строили NXT-джойстик и управляли с его помощью компьютером. С тех пор нас неоднократно просили сделать что-то подобное на платформе EV3. Времена теперь уже не те и проводной контроллер - это не интересно, поэтому мы замахнулись сразу на Bluetooth-джойстик.



Наверное все знают, что слово Joystick образовано из двух слов Joy - радость, Stick - палка, связано это с тем, что первые джойстики для игровых автоматов выглядели именно nак -  рукоятка, которую нужно было бодро дергать и при этом громко вопить от радости.



В нашем сегодняшнем проекте джойстик будет необычным, он будет представлять собой ружье (Gun), подобное построенному нами в проекте EV3 Doom, однако это будет именно джойстик, с которым мы будем бегать в мрачных лабиринтах настоящего, олдскульного Doom2. Отсюда и название проекта - EV3 Gunstick.


Конструкция "пушки" довольно проста и незатейлива, инструкцию по сборке в формате LEGO Difital Designer вы можете скачать по ссылке. Мы используем три датчика касания (кнопки) для перемещения вперед, выстрела и "стрейфа" (удерживая эту кнопку можно двигаться боком, уклоняясь от выстрелов и выглядывать из-за углов). Для разворота влево-вправо мы сначала попробовали использовать гироскоп, в принципе играть с помощью его можно, если бы не два "но" - во первых в пылу битвы сложно контролировать точно горизонтальное расположение нашего Gunstick, поэтому гироскоп начинает врать, другая проблема - наличие у него "дрейфа" - набегания ошибки со временем. Так же мы попробовали использовать ИК-дальномер в режиме поиска маяка - с ним играть лучше, "дрейфа" нет, центровка относительно центра экрана не слетает, но есть другая проблема - может быть это проблема именно нашего датчика, но время от времени он зависает на полсекунды (перестает обновлять показания), впрочем затем продолжая нормально работать. Смена канала, порта датчиков, проводов не помогла. Попробуйте, возможно Вам повезет больше - нам кажется ИК+маяк - был бы наилучшим вариантом для этого проекта. В итоге мы стали использовать датчик компаса Hitechnic, с ним все заработало стабильно. Еще как запасной вариант, для тех у кого есть IR Seeker и ИК-мяч - их тоже можно использовать в данном проекте вместо ИК-датчика и EV3-маяка.

Датчики подключены так:
1 - кнопка выстрела
2 - кнопка "вперед"
3 - кнопка "стрейф"
4 - компас (ИК-дальномер, гироскоп и т.п.)

Программу на стороне блока мы написали в стандартной среде EV3. В последнее время нам больше по душе EV3 Basic, но. к сожалению. в нем невозможно отправлять числовые значения по Bluetooth, только текст, что для нашего проекта не совсем удобно.

Программа устроена довольно просто. Установив соединение с компьютером по Bluetooth, мы в бесконечном цикле собираем показания с датчиков и формируем из них пакет данных следующим образом:

По умолчанию передаваемый пакет (целое число) равно 1000000.
Если нажата кнопка на блоке "Вверх" (в игре используется для открывания дверей), прибавляем к нему 100000.
Если нажата кнопка "Выстрел", прибавляем 10000.
Если нажата кнопка "идти вперед" - прибавляем 1000.
Если нажата кнопка "стрейф" (движение боком) +100.


Далее нам нужна информация об ориентации игрока в пространстве, ее мы собираем с датчика компас (гироскоп, ИК-дальномер+ маяк и т.д.). Ограничив максимальное отклонение +/-50 градусов и прибавив к нему 50 получаем число в интервале 0..99, которое прибавляем также к пакету данных.


В итоге в результирующем, передаваемом не компьютер единственном числе, например 1011025, передается информация о том, что игрок в данный момент движется вперед с легким разворотом влево и стреляет.


Программу, принимающую пакеты данных на компьютере мы написали на языке Processing, его свободно можно скачать по ссылке.
Для эмуляции нажатия кнопок на клавиатуре и перемещений указателя мыши в программе используется класс Robot модуля java.awt
После подключения вашего EV3 по Bluetooth к компьютеру на ПК появится пара вируальных COM-портов. Для настройки на нужный порт введите в строке с Serial.list()[0] порядковый номер входящего EV3 COM-порта на вашем компьютере.

void setup() 
{
  keySim = new KeystrokeSimulator(); 

  try { 
    robot = new Robot();
    robot.setAutoDelay(0);
  } 
  catch (Exception e) {
    e.printStackTrace();
  }

  String portName = Serial.list()[0];
  myPort = new Serial(this, portNam, 115200); 
}

Давайте посмотрим как работает наш "робот". Углы поворотов конечно не идеальны, впрочем это и не было целью проекта, мы хотели проработать принцип формирования пакетов данных и передачи их на ПК и это получилось в полном объеме.


Скачать инструкцию по сборке и исходные коды программ.

Самое популярное