Введение
Сейчас на рынке 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.
Код для сервера
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 сделать приятную такую систему. А вот и сам Одноглазый Билли:
Правда тут еще видео висит, но на счет этого в интернете есть материал.
ссылка на оригинал статьи http://habrahabr.ru/post/225671/
Добавить комментарий