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