Управление двигателями через 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 и пара примеров www.seeedstudio.com/wiki/index.php?title=Wifi_Bee. Скачиваем все и закидываем в 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 он будет длинные тексты нам не нужные. Поэтому качайте скорее по ссылке отшлифованную версию:
vk.com/doc84426434_305884673 — библиотека

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

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

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

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

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

Заключение

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

image

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

ссылка на оригинал статьи http://habrahabr.ru/post/225671/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *