WiFi модуль

Плата Arduino WiFi

Wi-Fi Shield - плата розширення для Arduino, яка надає можливість здійснити бездротове з'єднання за стандартом 802.11 b/g (Wi-Fi) для спілкування з іншими пристроями або вихід в інтернет(за допомогою бібліотеки WiFi), а також зчитувати і записувати дані на SD-карту пам'яті (за допомогою бібліотеки SD).

Характеристики

  • Для роботи потрібний основний пристрій Ардуіно (не входить в комплект)
  • Робоча напруга - 5В (подається від плати Ардуіно)
  • Підключення через: 802.11b/g мережі
  • Типи шифрування: WEP і WPA2 Personal
  • Взаємодія з Ардуіно здійснюється через інтерфейс SPI
  • Вбудований роз'єм для microSD-карти пам'яті
  • Роз'єми ICSP
  • Роз'єм підключення FTDI-кабелю для налагодження роботи WiFi-плати по послідовному інтерфейсу
  • Роз'єм Mini-USB для оновлення прошивки плати розширення
СЕП Arduino WiFi

Опис

Підключення плати Arduino WiFi

Плата розширення Arduino WiFi побудована на базі модуля HDG104, що представляє собою систему на кристалі, яка забезпечує підключення Ардуіно до мережі Інтернет по бездротовому інтерфейсу LAN 802.11b/g (WiFi). Мікроконтролер ATmega32UC3 підтримує стек мережевих протоколів (IP) і дозволяє працювати як з TCP, так і з UDP-протоколами. Для написання програм, які працюють з глобальною мережею через плату розширення, рекомендується використовувати бібліотеку WiFi. Для підключення плати розширення до Ардуіно передбачений спеціальний роз'єм, який представляє собою металеві виводи: ("тато") з одного боку плати та гнізда ("мама") - з іншого боку. Така конструкція дозволяє підключити до Ардуіно відразу кілька плат розширення, розмістивши їх одну над іншою.

Плата Розширення WiFi підтримує роботу з бездротовими мережами стандарту 802.11b і 802.11g.

На платі передбачений роз'єм для підключення мікро-SD карти пам'яті, який може використовуватися для зберігання файлів і організації мережевого доступу до них. Пристрій сумісний з Arduino Uno і Mega. Для роботи з вбудованим MicroSD-кардрідером служить бібліотека SD. Для активізації кардридера за допомогою цієї бібліотеки в якості виводу СС слід вказувати вивід 4.

Ардуіно взаємодіє з модулем Wi-Fi плати розширення і з SD-картою пам'яті по одній SPI-шині (через роз'єм ICSP). На Arduino Uno SPI-шина займає цифрові виводи 11, 12 і 13, а на Ардуіно Мега - 50, 51 і 52. При цьому на обох платах в якості виводів для активізації мікросхеми HDG104 або SD-карти пам'яті використовуються виводи 10 і 4 відповідно. Тому дані виводи не можна використовувати в якості виводів загального призначення для виконання будь-яких інших функцій. Слід також пам'ятати, що для коректної роботи SPI-інтерфейсу апаратний вивід СС Ардуіно Мега (53) повинен бути завжди налаштований як вихід, незважаючи на те, що він не взаємодіє ні з HDG104, ні з SD-картою пам'яті. Цифровий вивід 7 на платі використовується для ідентифікації підключення WiFi-плати розширення до Ардуіно (даний вивід на малюнку позначений як "Handshake").

ArduinoWiFiShieldPinUseDescribed 2.jpg


Оскільки, обидва пристрої, HDG104 і SD-карта пам'яті, підключені до однієї SPI-шини, то в кожен момент часу активним може бути тільки один з них. При використанні в проекті обох пристроїв, розподіл доступу до шини контролюється відповідними бібліотеками. У тому випадку, якщо один з пристроїв в проекті не використовується - необхідно його явно деактивувати. Для цього вивід, що відповідає за активізацію відповідного пристрою (4 - для SD-карти, 10 - для HDG104), необхідно налаштувати як вихід і подати на нього високий рівень сигналу.

Плата розширення може підключатися як до відкритих мереж, так і до мереж, що використовують методи шифрування WPA2 Personal або WEP.

Для успішного підключення пристрою до бездротової мережі, її ім'я-ідентифікатор SSID має бути загальнодоступним.

Роз'єми і інтерфейси

Кнопка скидання, яка розташована на платі розширення, здійснює скидання Ардуіно разом з модулем HDG104.

WiFiAdditionalPorts 2.jpg

Вбудований роз'єм Mini-USB призначений для оновлення прошивки мікроконтролера ATmega32U по протоколу Atmel DFU. Даний роз'єм не призначений для програмування Ардуіно. Щоб прошити мікроконтролер в режимі DFU необхідно замкнути джампер, розташований на платі біля аналогових входів і роз'єму живлення. У звичайному режимі роботи цей джампер повинен бути розімкнений.

Роз'єм для підключення FTDI-кабелю дозволяє з'єднати пристрій з комп'ютером по послідовному інтерфейсу з метою налагодження програм мікроконтролера ATmega32U.

Світлодіодні індикатори

На платі розширення розташовано декілька світлодіодних індикаторів:

  • L9 (жовтий): підключений до цифрового виводу 9
  • LINK (зелений): світиться, коли встановлено з'єднання з мережею
  • ERROR (червоний): інформує про виникнення помилок зв'язку
  • DATA (синій): блимає в процесі отримання чи відправки даних

Сумісність

Інші плати розширення, що працюють через SPI, можуть працювати спільно з Wi-Fi Shield за винятком випадків, коли вони також використовують ті ж чіп-селектори або 7-й пін. Сама по собі плата працює від напруги в 5 В. Однак на ній розташований перетворювач рівнів сигналів, який робить Wi-Fi Shield сумісним з платами, які працюють на 3,3 В. Такі як, наприклад, Arduino Due.

Програмування

Для роботи через Wi-Fi-плату з програми є можливість використовувати стандартну бібліотеку Wi-Fi. Для налагодження і перепрошивки модуля на платі виведений FTDI-сумісний роз'єм. Можна використовувати USB-Serial адаптер і цей роз'єм для підключення через USB. Для прошивки бортовий ATmega в режимі DFU на платі розширення доступний роз'єм міні-USB і джампер, що переводить плату в DFU. Інструкція з налагодження і перепрошивка доступна на офіційному сайті.

Приклади програм

Пошук доступних мереж

Приклад програми, наведений нижче, найбільш доречний при першому включенні плати розширення WiFi в новій зоні. Ця програма не може підключитися до конкретної мережі, а показує список мереж, доступних до підключення. При цьому плата розширення WiFi може побачити меншу кількість мереж, ніж комп'ютер, оскільки вона, як правило, має меншу антену. Після прошивки програми в Ардуіно, необхідно відкрити послідовний порт, щоб побачити список доступних мереж.


#include <SPI.h>
#include <WiFi.h>

void setup() {
 // ініціалізуєм послідовний інтерфейс та очікуєм відкриття порту:
 Serial.begin(9600);
 while(!Serial) ;

 // намагаєся підключитись з використанням WEP-шифрування:
 Serial.println("Initializing Wifi...");
 printMacAddress();

 // скануєм існуючі мережі:
 Serial.println("Scanning available networks...");
 listNetworks();
}

void loop() {
 delay(10000);
 // скануєм існуючі мережі:
 Serial.println("Scanning available networks...");
 listNetworks();
}

void printMacAddress() {
 // MAC-адреса вашой плати розширення Wifi
 byte mac[6];                     

 // виводим вашу MAC-адресу:
 WiFi.macAddress(mac);
 Serial.print("MAC: ");
 Serial.print(mac[5],HEX);
 Serial.print(":");
 Serial.print(mac[4],HEX);
 Serial.print(":");
 Serial.print(mac[3],HEX);
 Serial.print(":");
 Serial.print(mac[2],HEX);
 Serial.print(":");
 Serial.print(mac[1],HEX);
 Serial.print(":");
 Serial.println(mac[0],HEX);
}

void listNetworks() {
 // скануєм прилеглі мережі:
 Serial.println("** Scan Networks **");
 byte numSsid = WiFi.scanNetworks();

 // виводим список виявлених мереж:
 Serial.print("number of available networks:");
 Serial.println(numSsid);

 // для кожної знайденої мережі виводимо її ім'я і порядковий номер:
 for (int thisNet = 0; thisNet<numSsid; thisNet++) {
   Serial.print(thisNet);
   Serial.print(") ");
   Serial.print(WiFi.SSID(thisNet));
   Serial.print("\tSignal: ");
   Serial.print(WiFi.RSSI(thisNet));
   Serial.print(" dBm");
   Serial.print("\tEncryption: ");
   Serial.println(WiFi.encryptionType(thisNet));
 }
}

Підключення до відкритої мережі

Нижче показаний приклад програми, що демонструє, як підключитися до відкритої мережі під ім'ям "yourNetwork".


#include <WiFi.h>

char ssid[] = "yourNetwork";     // ім'я вашої мережі
int status = WL_IDLE_STATUS;     // статус радіопередавача Wifi

void setup() {
 //ініціалізуєм послідовний інтерфейс:
 Serial.begin(9600);

 // намагаємся підключитися до відкритої мережі:
 Serial.println("Attempting to connect to open network...");
 status = WiFi.begin(ssid);

 // якщо не вийшло - завершуємо подальше виконання програми:
 if ( status != WL_CONNECTED) { 
   Serial.println("Couldn't get a wifi connection");
   while(true);
 } 
 // якщо підключилось:
 else {
     Serial.print("Connected to the network");
  }
}

void loop() {
 // нічого не робим
}

Підключення до WPA-мережі

Приклад програми, наведений нижче, показує, як підключитися до мережі з шифруванням WPA/WPA2 Peronal з ім'ям "yourNetwork" і паролем "12345678".


#include <WiFi.h>

char ssid[] = "yourNetwork";     // SSID ім'я вашої мережі
char pass[] = "12345678";    // пароль від вашої мережі
int status = WL_IDLE_STATUS;     // статус радіопередавача Wifi

void setup() {
 // ініціалізуєм послідовний порт:
 Serial.begin(9600);

 // намагаємся підключитися до мережі з шифруванням WPA2:
 Serial.println("Attempting to connect to WPA network...");
 status = WiFi.begin(ssid, pass);

 // якщо підключитися не вдалося - припиняємо програму:
 if ( status != WL_CONNECTED) { 
   Serial.println("Couldn't get a wifi connection");
   while(true);
 } 
 // якщо підключилися - виводимо інформацію про з'єднання:
 else {
   Serial.println("Connected to network");
  }
}

void loop() {
 // нічого не робим
}

Підключення до WEP-мережі

В налаштуваннях роутера вікно для генерування WEP-ключа по кодової фразі з ASCII-символів буде виглядати приблизно так:

WiFiRouterWEPSetup.png


Якщо немає доступу до налаштувань роутера, потрбно звернутись до системного адміністратора.

Кожен ключ довжина від 10 до 26 шістнадцяткових цифри (від 40 до 128 Біт) відповідає певному номеру. Наприклад, 40-бітний ключ, ABBADEAF01 буде коректним, а ABBADEAF - некоректний (тому що він занадто короткий), так само, як і ключ ABBAISDEAF (символи I і S не є шістнадцятковими символами). Для 128-бітного ключа необхідний рядок довжиною в 26 символів. У цьому випадку буде коректним ключ D0D0DEADF00DABBADEAFBEADED, оскільки його довжина становить 26 символів, і всі символи лежать в діапазоні 0-9, A-F.

WEP - це базовий механізм шифрування і він може бути зламаний. Якщо потрібна висока ступінь захисту, рекомендується використовувати WPA.

Приклад програми, наведений нижче, показує, як підключитися до мережі з шифруванням WEP з ім'ям "yourNetwork", шістнадцятковий ключ "ABBADEAF01" і індекс ключ 0.

#include <WiFi.h>

char ssid[] = "yourNetwork";     //  SSID ім'я вашої мережі
char key[] = "ABBADEAF01";    // ключ вашой мережі
int keyIndex = 0;            //індекс ключа
int status = WL_IDLE_STATUS;     // статус Wifi передавача

void setup() {
 // ініціалізуєм послідовний порт:
 Serial.begin(9600);

 // намагаємся підключитися до мережі з шифруванням  WEP:
 Serial.println("Attempting to connect to WEP network...");
 status = WiFi.begin(ssid, keyIndex, key);

 // якщо підключитися не вдалося - припиняємо програму:
 if ( status != WL_CONNECTED) { 
   Serial.println("Couldn't get a wifi connection");
   while(true);
 } 
 // якщо підключення вдалось - виводим інформацію про поточне з'єднання:
 else {
   Serial.println("Connected to network");
 }
}

void loop() {
 // нічого не робим
}

Перелік літератури


1. https://www.arduino.cc/
2. Arduino, датчики і мережі для зв'язку пристроїв, 2-е вид.Том Іго
3. Arduino Workshop John Boxall
4. zelectro.cc