Arduino:Знакомство с Arduino/Знакомство с Arduino WiFi Shield

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Знакомство с Arduino WiFi Shield[1]

Модуль Arduino WiFI Shield позволяет плате Arduino подключаться к интернету при помощи библиотеки WiFi, а также считывать и записывать данные на SD-карту при помощи библиотеки SD.

Библиотека WiFI включена в самую последнюю версию IDE Arduino. В версии IDE Arduino 1.0.4 прошивка WiFi-модуля поменялась, и мы настоятельно рекомендуем установить этот апдейт.

Соответствующее руководство можно найти по этой ссылке.

Библиотека WiFi очень похожа на библиотеку Ethernet – многие их функции даже называются одинаково.

Подключение Shield

Wifi shield3.png

Чтобы использовать модуль, подключите его к верхней части платы Arduino (например, Uno). Чтобы загрузить скетч на плату, подключите ее к компьютеру как обычно – при помощи USB-кабеля. Когда скетч будет загружен, плату можно отключать от компьютера и питать от внешнего источника питания.

7-ой цифровой контакт используется для синхронизации между WiFi-модулем и Arduino, поэтому для других целей его использовать не следует.

Использование WiFi-модуля на старых платах

Если вы используете WiFi-модуль на Arduino, которая вышла раньше Uno rev3, вам нужно сделать так, как показано на фото ниже. WiFi-модулю необходимо «знать» об опорном напряжении на I/O контактах платы, к которой он подсоединен, и на новых версиях Arduino (Uno rev3, Mega2560 rev3 и новее) для этого используется контакт IOREF. Но если вы используете старую Arduino, вам нужно будет самостоятельно подключить IOREF-контакт WiFi-модуля к 3,3-вольтовому контакту. Это можно сделать двумя способами – либо кинув между этими контактами провод-перемычку, либо припаяв перемычку на контактных площадках IOREF, находящихся в нижней части модуля. Оба варианта показаны на фото ниже.

Внимание! Если вы делаете перемычку припоем, не подключайте WiFi-модуль к платам версии rev3 и новее. Лучше вообще снимите IOREF-контакт с модуля. В противном случае вы закоротите плату через этот контакт.

Провод-перемычка от 3,3 вольт к IOREF-контакту (рекомендуемый вариант).

Wifi jump2.png

Припаянная перемычка от 3,3 вольт к IOREF-контакту.

Wifi rear1.png

Порты на WiFi Shield

WiFiAdditionalPorts v2.png

На WiFi-модуле имеется встроенный коннектор micro-USB. Он используется не для программирования подключенной к модулю платы Arduino, а для обновления процессора ATmega 32UC3, использующего протокол Atmel DFU. Перемычка, через которую разрешается программирование ATmega 32UC3, расположена рядом с шиной питания и аналоговыми контактами. При обычном использовании WiFi-модуля эта перемычка должна оставаться в выключенном состоянии – она нужна только для DFU-программирования.

Через FTDI-соединение осуществляется последовательная коммуникация с 32UC3 – для диагностических целей. Список доступных команд можно найти тут.

Сетевые настройки

WiFi-модуль умеет подключаться к открытым сетям, а также к сетям с шифрованием с WEP и WPA Personal. К сожалению, к сетям с шифрованием WPA2 Enterprise он подключаться не может.

Для того чтобы WiFI-модуль мог подключиться к сети, роутер должен транслировать SSID, т.е. название этой сети.

А зависимости от конфигурации вашего беспроводного роутера, вам может понадобиться следующая информация:

  • Для открытых (незашифрованных) сетей – SSID.
  • Для сетей, использующих шифрование WPA или WPA2 Personal – SSID и пароль.
  • Пароли к сетям с WEP-шифрованием – это шестнадцатеричные строки, которые называют «ключами». WEP-сеть может иметь до четырех разных ключей, причем каждому ключу присвоен собственный индекс. Соответственно, для сетей с WEP-шифрованием вам понадобятся SSID, ключ и номер ключа.

Поиск доступных сетей

Скетч ниже отлично подойдет для тех случаев, когда вы начинаете пользоваться платой в каком-то новом месте. Он не будет подключаться к сети, но покажет какие сети видны WiFi-модулю в данный момент времени. Ваш WiFi-модуль, вероятно, будет видеть не так много сетей, как компьютер, т.к. оснащен более слабой WiFi-антенной. Загрузив скетч на Arduino, откройте последовательный порт – там будут отображаться все доступные WiFi-сети.

 1 #include <SPI.h>
 2 #include <WiFi.h>
 3 
 4 void setup() {
 5   // инициализируем последовательное соединение и ждем открытия порта:
 6   Serial.begin(9600);
 7   while(!Serial) ;
 8 
 9   // пытаемся подключиться при помощи WEP-шифрования:
10   Serial.println("Initializing Wifi...");  //  "Иницализируем WiFi..."
11   printMacAddress();
12 
13   // Сканируем существующие сети:
14   Serial.println("Scanning available networks...");  //  "Сканируем доступные сети..."
15   listNetworks();
16 }
17 
18 void loop() {
19   delay(10000);
20   // Сканируем существующие сети:
21   Serial.println("Scanning available networks...");  //  "Сканируем доступные сети..."
22   listNetworks();
23 }
24 
25 void printMacAddress() {
26   // MAC-адрес WiFi-модуля:
27   byte mac[6];                     
28 
29   // показываем MAC-адрес:
30   WiFi.macAddress(mac);
31   Serial.print("MAC: ");
32   Serial.print(mac[5],HEX);
33   Serial.print(":");
34   Serial.print(mac[4],HEX);
35   Serial.print(":");
36   Serial.print(mac[3],HEX);
37   Serial.print(":");
38   Serial.print(mac[2],HEX);
39   Serial.print(":");
40   Serial.print(mac[1],HEX);
41   Serial.print(":");
42   Serial.println(mac[0],HEX);
43 }
44 
45 void listNetworks() {
46   // сканируем близлежащие сети:
47   Serial.println("** Scan Networks **");  //  "** Сканирование сетей **"
48   byte numSsid = WiFi.scanNetworks();
49 
50   // показываем список найденных сетей:
51   Serial.print("number of available networks:");    //  "количество доступных сетей:"
52   Serial.println(numSsid);
53 
54   // отображаем номер и название каждой найденной сети:
55   for (int thisNet = 0; thisNet<numSsid; thisNet++) {
56     Serial.print(thisNet);
57     Serial.print(") ");
58     Serial.print(WiFi.SSID(thisNet));
59     Serial.print("\tSignal: ");  //  "\tСигнал: "
60     Serial.print(WiFi.RSSI(thisNet));
61     Serial.print(" dBm");
62     Serial.print("\tEncryption: ");  //  "\tШифрование: "
63     Serial.println(WiFi.encryptionType(thisNet));
64   }
65 }

Подключение к открытой сети

Скетч ниже показывает, как инициировать подключение к открытой сети под названием «yourNetwork».

 1 #include <WiFi.h>
 2 
 3 char ssid[] = "yourNetwork";     // название сети
 4 int status = WL_IDLE_STATUS;     // статус WiFi-соединения
 5 
 6 void setup() {
 7   // инициализируем последовательную коммуникацию:
 8   Serial.begin(9600);
 9 
10   // пробуем подключиться к открытой сети:
11   Serial.println("Attempting to connect to open network...");  //  "Попытка подключиться к открытой сети..."
12   status = WiFi.begin(ssid);
13 
14   // если подключиться не удалось, останавливаем работу скетча:
15   if ( status != WL_CONNECTED) { 
16     Serial.println("Couldn't get a wifi connection");  //  "WiFi-соединение выполнить не удалось"
17     while(true);
18   } 
19   // если подключиться удалось:
20   else {
21       Serial.print("Connected to the network");  //  "Подключение выполнено успешно"
22   }
23 }
24 
25 void loop() {
26   // ничего не делаем
27 }

Подключение к сети с WPA-шифрованием

Скетч ниже показывает, как подключиться к открытой сети с шифрованием WPA или WPA2 Personal. Название сети – «yourNetwork», пароль – «12345678».

 1 #include <WiFi.h>
 2 
 3 char ssid[] = "yourNetwork";     //  SSID (название) сети
 4 char pass[] = "12345678";    //  пароль сети
 5 int status = WL_IDLE_STATUS;     // статус WiFi-соединения
 6 
 7 void setup() {
 8   // инициализируем последовательную коммуникацию:
 9   Serial.begin(9600);
10 
11   // пытаемся подключиться при помощи WPA2-шифрования:
12   Serial.println("Attempting to connect to WPA network...");  //  "Попытка подключиться к WPA-сети..."
13   status = WiFi.begin(ssid, pass);
14 
15   // если подключиться не удалось, останавливаем работу скетча:
16   if ( status != WL_CONNECTED) { 
17     Serial.println("Couldn't get a wifi connection");  //  "WiFi-соединение выполнить не удалось"
18     while(true);
19   } 
20   // если подключились, сообщаем об этом:
21   else {
22     Serial.println("Connected to network");  //  "Подключение выполнено успешно"
23   }
24 }
25 
26 void loop() {
27   // ничего не делаем
28 }

Подключение к сети с WEP-шифрованием

Настройки вашего роутера для генерации WEP-ключа, основанного на кодовой фразе, должны выглядеть примерно так:

WiFiRouterWEPSetup.png

Если у вас нет доступа к административным настройкам роутера, проконсультируйтесь с системным администратором.

Длина WEP-ключа может составлять 10 или 26 шестнадцатеричных символов – 40 и 128 бит, соответственно. Кроме того, в паре с каждым ключом будет идти индекс ключа. К примеру, 40-битным ключом может быть «ABBADEAF01», однако ключи «ABBADEAF» и «ABBAISDEAF» работать не будут – первый слишком короткий, а во втором есть несовместимые с шестнадцатеричным форматом символы «I» и «S». Примером 128-битного ключа может служить «D0D0DEADF00DABBADEAFBEADED» – в нем 26 символов, и все они в диапазонах «0-9» и «A-F».

Примечание: В основе WEP лежит довольно примитивный шифровальный механизм. Поэтому, если вам нужна более надежная защита, мы рекомендуем использовать WPA.

Скетч ниже демонстрирует, как подключиться к WEP-зашифрованной сети. Название сети – «yourNetwork», ключ – «ABBADEAF01», индекс ключа – «0».

 1 #include <WiFi.h>
 2 
 3 char ssid[] = "yourNetwork";     //  SSID (название) сети
 4 char key[] = "ABBADEAF01";    //  ключ сети
 5 int keyIndex = 0;            //  индекс ключа
 6 int status = WL_IDLE_STATUS;     //  статус WiFi-соединения
 7 
 8 void setup() {
 9   // инициализируем последовательную коммуникацию:
10   Serial.begin(9600);
11 
12   // пробуем подключиться с использованием данных для WEP-шифрования:
13   Serial.println("Attempting to connect to WEP network...");  //  "Попытка подключиться к WEP-сети..."
14   status = WiFi.begin(ssid, keyIndex, key);
15 
16   // если подключиться не удалось, останавливаем работу скетча:
17   if ( status != WL_CONNECTED) {
18     Serial.println("Couldn't get a wifi connection");  //  "WiFi-соединение выполнить не удалось"
19     while(true);
20   } 
21   // если подключились, сообщаем об этом:
22   else {
23     Serial.println("Connected to network");  //  "Подключение выполнено успешно"
24   }
25 }
26 
27 void loop() {
28   // ничего не делаем
29 }

SD-карта и SPI

В WiFi-модуле, помимо прочего, имеется слот micro-SD, с которым можно работать через библиотеку SD. SS-контактом для SD-карты является контакт номер 4.

Коммуникация между Arduino и WiFi-модулем осуществляется через SPI-шину. На Uno она находится на 11-ом, 12-ом и 13-ом контактах, а на Mega – на 50-ом, 51-ом и 52-ом контактах. На обеих платах в качестве SS-контакта используется 10-ый контакт. На Mega аппаратным SS-контактом является 53-ий контакт, однако его нужно держать выходным и не использовать ни для каких целей, иначе SPI-интерфейс не будет работать.

Обновление прошивки WiFi-модуля

Об обновлении прошивки модуля Arduino WiFi Shield читайте тут.

Что дальше

Дополнительную информацию о функционале WiFi-модуля читайте на странице о библиотеке WiFi, а также в этих скетчах-примерах.

См.также

Внешние ссылки