...

вторник, 10 июня 2014 г.

[Из песочницы] Управление двигателями через Wifi Bee от DFRobot

Введение



Сейчас на рынке wifi-diy-устройств сложилась такая ситуация, что большинство людей покупают модули XBee, нежели Wifi Bee, и, соответственно, примеров каких-то проектов в интернете для XBee тоже больше. Я бы сказал даже, что инфо по Wifi Bee вообще почти нет и знакомиться с ним приходилось по комментариям разработчиков в файлах прошивки. Использовал этот модуль версии 1.1 в управлении 6wd машиной и, в общем, мощная махина получилась. Теперь вот хочу с вами поделиться тем, что имеется. Надеюсь, вам поможет как-то в ваших проектах. Коды по ссылкам полностью рабочие.



Исходный состав таков:


  • Arduino Due/Uno который принимает байты команд по Serial от Bee и выдает ШИМ с разной скважностью

  • драйверы двигателей на L298

  • Wireless Proto Shield как гнездо для Bee и его же прошивальщик

  • сам Wifi Bee как клиент uIP

  • ну и нетбук как сервер TCP/IP


Скетч для Bee



Итак, как вы знаете, на сайте производителя имеется небольшое описание устройства, библиотека WiShield для Arduino и пара примеров http://ift.tt/1my7KS7. Скачиваем все и закидываем в libraries. В итоге у нас папка WiShield получается. (По ссылке на GitHub можно скачать сборку WiShield-user, в ней больше скетчей)

В examples у нас готовые сборки. Если хочешь что-то делать, то бери их за основу. Я взял SimpleClient, так как он как раз подходит. Тогда нужно указать, что работать будет именно SimpleClient — изменяем apps-conf.h:



//#define APP_WEBSERVER
//#define APP_WEBCLIENT
//#define APP_SOCKAPP
//#define APP_UDPAPP
#define APP_WISERVER




Дальше изменяем SimpleClient.pde под наши нужды — меняем IP, шлюз, порт и т.п. Вот код. То, что в loop вообще трогать не надо, заголовочных файлов много и в них сложно разобраться. Для нас важна функция getWeather.setReturnFunc(printData).

#include <WiServer.h>

unsigned char local_ip[] = {192,168,1,210};
unsigned char gateway_ip[] = {192,168,1,1};
unsigned char subnet_mask[] = {255,255,255,0};
char ssid[] = {"openwrt"};
unsigned char security_type = 0; // 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2
const prog_char security_passphrase[] PROGMEM = {"12345678"};
prog_uchar wep_keys[] PROGMEM = {
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
#define WIRELESS_MODE_INFRA 1
#define WIRELESS_MODE_ADHOC 2
unsigned char wireless_mode = WIRELESS_MODE_INFRA;
unsigned char ssid_len;
unsigned char security_passphrase_len;

void printData(char* data, int len){
Serial.println(*(data++));
}
uint8 ip[] = {192,168,1,199};

void setup(){
WiServer.init(NULL);
Serial.begin(57600);
WiServer.enableVerboseMode(true);
getWeather.setReturnFunc(printData);
}
long updateTime = 100;

void loop(){
if (millis() >= updateTime) {
getWeather.submit();
updateTime += 100;
}
WiServer.server_task();
delay(10);
}




Обратите внимание на:

uint8 ip[] = {192,168,1,199};




Это ip моего нетбука в данный момент. Измените его или под свой, или на 127.0.0.1

Надо знать, что здесь фунция printData(x,x) как раз и отправляет в Serial полученные данные. Делает она это как только выполнится условие, прописанное в WiShield/Wiserver.cpp:



if (uip_newdata()){
setRXPin(HIGH);
if ((req->returnFunc) && (uip_datalen() > 0)){
req->returnFunc((char*)uip_appdata, uip_datalen());
}
}




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

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

http://ift.tt/1pdoNPF — библиотека


Если скачали, то можно прошивать. Если вы в первой имеете дело с Bee и через Proto Shield хотите прошить, а не сторонний типа Groove, то обязательно соедините 5 pin Shielda к RESET и не забудьте переключиться на USB.

image


Код для сервера



Bee использует протокол uIP, значит сервер тоже должен работать по TCP/IP. Я написал свой простенький сервер на VB.NET и, конечно, прикрепил ниже (нужен NET Framework 4,5). Основные вопросы были с управлением, кусок с запуском взят с сайта Microsoft.

http://ift.tt/1my7NgL — проект в VStudio 2010

Коротко о работе: запрос на прослушивание начинается в Form1_Load и поэтому пока Bee не подключится, ничего на экране не появится. Если Bee подключился, то появится надпись “Жми кнопки”. Жать можно 4 кнопки W,S,A,D (ну как в игре) и NumLock1 … NumLock5 (коробка передач). Так как сервер простой, то он не умеет перезапустить себя, если оборвалась связь с Bee; надо учитывать это.


В зависимости от нажатой кнопки, прога пересылает определенный символ на Bee, и тот отправляет его в Serial, а что делать в ответ на этот символ решает Arduino. Скетч для Arduino прост и не нуждается в комментарии и прикреплен он ниже вместе со скетчем на Bee.

http://ift.tt/1pdoMeu — скетчи


Заключение



Таким образом я попытался показать как на модуле Wifi Bee сделать приятную такую систему. А вот и сам Одноглазый Билли:

image


Правда тут еще видео висит, но на счет этого в интернете есть материал.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


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

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