Показаны сообщения с ярлыком bluetooth. Показать все сообщения
Показаны сообщения с ярлыком bluetooth. Показать все сообщения

суббота, 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); 
}

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


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

среда, 16 марта 2016 г.

Соединяем EV3 и Arduino по Bluetooth



В наших предыдущих проектах, таких как "EV3 Bluetooth - гитара" и "Электроскрипка из LEGO EV3" мы использовали Bluetooth для передачи данных с EV3 на Arduino.

 


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

Мы долго ждали, пока кто-нибудь не напишет библиотеку для Arduino, позволяющую этой платформе полноценно взаимодействовать с EV3, но так и не дождались, поэтому решили написать такой инструмент сами. Надеемся он будет полезен Mindstorms-сообществу и пригодится в ваших проектах. 

Исходники  EV3 открыты и мы заглянули в них в поисках описания Bluetooth-протокола. Оказалось, что он неплохо прокомментирован и понятен. EV3 может отправлять и принимать через именованные майл-слоты три типа данных - числа, текст и логические значения.

Например, передавая текст "text" в удаленный слот с именем text вы отправите по Bluetooth последовательно 11000100819E05746578740005007465787400, а отправляя число -3,14 в слот с именем Numeric отправите 13000100819E084E756D65726963000400C3F548C0. Непонятно, правда? 

Чтобы не иметь дело с длинными  строками цифр мы публикуем ряд функций для Arduino, используя которые вы сможете общаться с вашим EV3. Мы не оформляли их в виде библиотеки, так как писали их в общем-то для собственных нужд.


Первым делом вы должны "спарить" ваш EV3 и Bluetooth-модуль, подключенный к Arduino и узнать имя модуля на стороне Arduino. Ваш EV3 не будет знать, что общается не с себе подобным, а с кучей микросхем и проводов, притворяющихся другим EV3. Это здорово, потому что общаться с Arduino вы  сможете из любого языка программирования для платформы EV3, который умеет работать с Bluetooth, будь то EV3-G, EV3 Basic или RobotC.

Например, на языке EV3-G код, который будет отправлять данные на Arduino будет выглядеть так:


Первый синий блок устанавливет соединение в Arduino-Bluetooth-модулем, в нем важно указать корректное имя модуля, которое вы ухнали при "спаривании". В данном примере мы отправляем логическое значение "Истина" в майл-слот с именем Status по нажатию кнопки, подключенной в первому порту.

Принимает данные с Arduino вот такая конструкция, Важно указать тип принимаемых данных и имя майл-слота.


Давайте смотреть скачанный по ссылке выше код.

Функция AskForEV3Message() опрашивает приемный буфер на предмет пакета данных, присланных с EV3. при их наличии она разбирает пакет и записывает в переменную in_message_type единицу, если пришло логическое значение, 2 - для числа и 3 - для текста. Если сообщения не было - в переменной будет 0. В случае наличия сообщения в переменную in_mailbox запишется имя слота, а в одну из переменных in_value_logic, in_value_numeric или in_value_chars - принятое значение, в зависимости от его типа в in_message_type.

Таким образом в программе вы можете использовать функцию приема данных AskForEV3Message()  с EV3 например таким образом:

AskForEV3Message();
if (in_message_type != 0) Serial.println(in_mailbox);
if (in_message_type == 1) Serial.println(in_value_logic);
if (in_message_type == 2) Serial.println(in_value_numeric);
if (in_message_type == 3) Serial.println(in_value_chars);

Смотрим дальше, теперь давайте отправим данные на удаленный EV3 из вашей Arduino-программы. Вы можете использовать три функция MakeLogicEV3Message, MakeNumericEV3Message и MakeTextEV3Message для отправки данных соответствующих типов, пример:

// отправляем в EV3-слот TestLogic истину
MakeLogicEV3Message("TestLogic", true);

// отправляем в в EV3-слот MyNumeric случайное число от 0 до 100
MakeNumericEV3Message("MyNumeric", (int)random(100));

// отправляем в в EV3-слот EV3Text строку "text_example"
MakeTextEV3Message("EV3Text", "text_example");

Давайте договоримся, что вы откроете код вашего будущего проекта также, как мы делаем это для вас. Удачи!

суббота, 31 октября 2015 г.

EV3 TV Gun

Помните световой пистолет на Nes и игру Hogan's Alley? Нет? Может быть помните хотя бы стрельбу по уткам в Duck Hunt на Dendy? В нашем новом EV3-проекте мы тоже будем стрелять по экрану из пистолета! 
Проект собран на основе домашней версии набора EV3 #31313, имеет открытый исходный код и отличную инструкцию по сборке. Для прицеливания используется анализ отклонения от ИК-маяка, который нужно положить перед экраном, углы на цели - подобрать в зависимости от диагонали вашего экрана и расстояния до него. Программа для блока EV3 написана на языке LEGO EV3-G, программа для компьютера - на Processing (для ее работы требуется скачать Processing 3).  



Инструкция по сборке в двух вариантах:
PDF - для просмотра используйте Adobe Acrobat Reader 
LXF - для просмотра используйте LEGO Digital Designer 

В проекте используется две программы:

EV3TVGun.ev3 закачивается на блок. Блок нужно связать с компьютером по Bluetooth и в переменной PC указать Bluetooth-имя компьютера. При необходимости скорректируйте углы прицеливания в соответствующих блоках условий.

Папка EV3TVGun содержит программу на языке Processing (третьей версии, скачать Processing можно здесь). Ее нужно поместить в Вашу папку со скетчами (обычно в Documents\Processing\).
В коде программы при необходимости исправьте в строке 30 com-порт
  String portName = Serial.list()[1];
1 - это НЕ 1-й com-порт, а номер второго по счету com-порта в системе, т.е. первый активный имеет номер 0, второй 1 и т.д.  

Инструкция и программы к проекту доступны по ссылке

вторник, 27 октября 2015 г.

NXT Bluetooth Joystick HiTechnic Car

В 57-й серии мы совместим две достаточно известные модели - HiTechnic IR Car и NXT Joystick от Philippe Hurbain. Наше программное обеспечение, написанное на NXT-G, позволит управлять с джойстика моделью HT Car. Для более точного и четкого рулевого управления используется ПИД-регулятор. Кнопка на джойстике включает турбо-ускорение. HT Car действительно очень быстрая, в ее конструкции используется повышающий редуктор, а низкая масса позволяет довольно резво разгоняться. Применив некоторые ухищрения можно управлять компьютером, используя LEGO NXT джойстик.

Программа





EV3 EL3CTRIC GUITAR + Bluetooth Arduino MIDI-сontroller

Превращаем бонусную модель EV3 "EL3CTRIC GUITAR" в беспроводную MIDI-гитару. Приемником и конвертером сигнала выступает плата Arduino. Нота или аккорд, сгенерированные, гитарой передаются по bluetooth, конвертируются arduino в MIDI протокол и передаются на выход - на любое MIDI-устройство (синтезатор, ПК-секвенсор и т.п.). Далее мы обрабатываем сигнал гитарными примочками и пускаем на гитарный комбик.

Программа


NXT Support Gunner + Bluetooth

XT Support Gunner - пушка с наведением в двух плоскостях, с возможностью стрельбы очередью - собрана из LEGO Mindsorms NXT 2.0. Робот управляется с компьютера из языка Python с использованием модулей nxt-python, PyBluez, pygame. На роботе запущен MotorControl, который принимает команды через Bluetooth.

Программа


понедельник, 26 октября 2015 г.

NXT Jeep

Робот Джип собран по инструкции из книги David J. Perdue "The Unofficial LEGO MINDSTORMS NXT 2.0 Inventor's Guide" . Управляем джипом используя компьютерный руль и педали. Угол поворота колес полностью соответствует углу поворота руля, сила нажатия на педаль газа - мощности, подаваемой на ведущие колеса. Программа для управления написана на языке Python и выполняется на компьютере, который по каналу bluetooth передает сигналы управления на робота и опрашивает его датчики. Интересное в этой модели также то, что ведущими являются передние колеса (независимый привод) и это не мешает ими выполнять повороты.

программа


воскресенье, 25 октября 2015 г.

Автобот

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


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