8 (800) 350-30-16

Приложение для управления через bluetooth

Дата: / Категория: Связь / Автор: DOC_tr

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

И так, чем же меня так заинтересовало приложение DK Gadget по сравнению с аналогичными приложениями, о которых вы слышали в прошлых статьях?

Раньше я пользовался в основном джойстиком, но он меня не очень устраивал, так как нельзя было сделать, например, чтобы правые кнопки работали на удержание, а не просто реагировали один раз на нажатие. Это собственно была главная причина моего недовольства.

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

В этот момент я как раз в очередной раз разочаровался в джойстике и решил посмотреть что это вообще такое.

  

 Первый экран с новостями сразу скажем лишний, да и шапка (с надписью DK Gadget Controller) все время торчит на экране, и на моем маленьком ZTE занимает слишком много места. Но ладно - идем дальше.

 

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

 Окей, попробуем создать элемент. Начнем, пожалуй, с простой кнопки.

 

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

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

Думаю вполне очевидно, что для каждого элемента нужны уникальные кнопки. Во всяком случае мне так показалось, хотя это не так. У разных элементов могут быть одинаковые символы, но об этом позже.

 После сохранения мы сможем перетаскивать и редактировать элементы.

 

Кстати, по поводу редактирования - когда я добавил джойстик и 2 ползунка они у меня не поместились на экране, и, даже, не было возможности поменять местами нижний с верхними. Но тут нужно грешить на огромный header в приложении, и на маленький экран моего мобильника.

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

Теперь немного про программирование.

Для управления требуется библиотека DkParse, а примеры я буду брать из статьи, в которой уже использовал данное приложение.

Для начала подключаем библиотеку и создаем массив команд.

#include <DKParser.h>

// Команды от мобильного
Command inputCommands[] = {
Command(1, "q", "w", false)
};
DKParser parser(inputCommands, 1);

Тут требуется пояснение. Массив inputCommands состоит из объектов Command, которые в конструкторе содержат следующие данные

  • 1 - Номер команды
  • "q" - Команда при нажатии кнопки
  • "w" - Команда при отпускании кнопки
  • false - Тип данных (HEX - true / ASCII - false)

У класса Command конструкторы перегружены (есть несколько конструкторов с разным набором входных параметров) и данный конструктор указан для сложных элементов (кнопка, джойстик)

Для простых элементов он принимает 3 аргумента - команда при отпускании кнопки отсутствует (переключатель, ползунок).

Теперь перейдем к считыванию команд. Возьму кусок кода из прошлой статьи.

 Command command = parser.commandAvailable();
switch (command.getId()) {
case 1:{
// Данные приходят вида ([0-9]+),([0-9]+)
// Первое число - градус, второе - удаление джойстика от центра (100 у самого края, 0 джойстик не двигается)
int angle = getValue(command.getValue(), ',', 0).toInt();
int sped_j = getValue(command.getValue(), ',', 1).toInt();
// если джойстик не двигается, то не идем вне зависимости от угла
if(sped_j <= 10){
move = 0;
break;
}
if(angle >=45 && angle < 135){ // вперед
move = 1;
} if(angle >= 135 && angle < 225){ // влево
move = 2;
} if(angle >= 225 && angle < 315){ // назад
move = 3;
} if(angle >= 315 || angle < 45){ // вправо
move = 4;
}
break;
}case 2:{
// устанавливаем скорость в зависимости от ползунка
spd = map(command.getValue().toInt(), 0, 100, 30, 3);
break;
}
}

В первой строке мы получаем пришедшую команду, и выбираем ее по ИД (первый аргумент в нашем массиве команд). После получаем значение пришедшей команды в качестве строки.

Как видите, буквы, которые мы вводили, нужны только для внутреннего разбора строки, и нам с ними не приходится иметь дела. Так что по поводу них можно не волноваться, и писать туда что угодно, лишь бы данные на мобильнике, совпадали с данными в массиве команд.

В первой команде (в данном случае у меня джойстик) данные приходят в виде ([0-9]+),([0-9]+) (например "10,100"), и их, пока, приходится разбирать вручную. Разработчики, правда, заверили меня, что в ближайшее время они сделают для джойстика отдельные методы. Ну чтож - ждем.

А вторая команда - ползунок. И мы просто мапим его данные для получения необходимой скорости.

Отдельный момент по поводу джойстика - в данном приложении он реализован не так как во всех остальных. В подавляющей части приложений на google play при зажатии стрелочек/джойстиков они начинают с определенным интервалом передавать на Arduino заданные данные, что является небольшой проблемой. Так как если прошлый сигнал еще не обработан по причине delay, а устройство получило новый, оно будет ждать и обработает новый после dealy. В связи с чем, после отпускания джойстика мой робот двигался еще некоторое время.

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

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

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

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

Теги: #Bluetooth, #HC-05

Ваша оценка:

Рейтинг: 10.0 (Оценок: 3)

Комментарий:

Copyright © RobOM.ru 2016 г. Все права защищены