- PVSM.RU - https://www.pvsm.ru -

Управление двигателями через 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 [1]. Скачиваем все и закидываем в 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 [2] — библиотека

Если скачали, то можно прошивать. Если вы в первой имеете дело с 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 [3] — проект в VStudio 2010

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

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

Заключение

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

image

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

Автор: proglyk

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/diy/61924

Ссылки в тексте:

[1] www.seeedstudio.com/wiki/index.php?title=Wifi_Bee: http://www.seeedstudio.com/wiki/index.php?title=Wifi_Bee

[2] vk.com/doc84426434_305884673: http://vk.com/doc84426434_305884673

[3] vk.com/doc84426434_305893777: http://vk.com/doc84426434_305893777

[4] vk.com/doc84426434_306833267: http://vk.com/doc84426434_306833267

[5] Источник: http://habrahabr.ru/post/225671/