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

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

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


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

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

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

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

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

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

Чтобы использовать модуль, подключите его к верхней части платы 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-контакту (рекомендуемый вариант).

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

Порты на WiFi Shield

На 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-сети.

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

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

  // пытаемся подключиться при помощи WEP-шифрования:
  Serial.println("Initializing Wifi...");  //  "Иницализируем 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: ");  //  "\tСигнал: "
    Serial.print(WiFi.RSSI(thisNet));
    Serial.print(" dBm");
    Serial.print("\tEncryption: ");  //  "\tШифрование: "
    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");  //  "WiFi-соединение выполнить не удалось"
    while(true);
  } 
  // если подключиться удалось:
  else {
      Serial.print("Connected to the network");  //  "Подключение выполнено успешно"
  }
}

void loop() {
  // ничего не делаем
}

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

Скетч ниже показывает, как подключиться к открытой сети с шифрованием WPA или WPA2 Personal. Название сети – «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...");  //  "Попытка подключиться к WPA-сети..."
  status = WiFi.begin(ssid, pass);

  // если подключиться не удалось, останавливаем работу скетча:
  if ( status != WL_CONNECTED) { 
    Serial.println("Couldn't get a wifi connection");  //  "WiFi-соединение выполнить не удалось"
    while(true);
  } 
  // если подключились, сообщаем об этом:
  else {
    Serial.println("Connected to network");  //  "Подключение выполнено успешно"
  }
}

void loop() {
  // ничего не делаем
}

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

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

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

Длина WEP-ключа может составлять 10 или 26 шестнадцатеричных символов – 40 и 128 бит, соответственно. Кроме того, в паре с каждым ключом будет идти индекс ключа. К примеру, 40-битным ключом может быть «ABBADEAF01», однако ключи «ABBADEAF» и «ABBAISDEAF» работать не будут – первый слишком короткий, а во втором есть несовместимые с шестнадцатеричным форматом символы «I» и «S». Примером 128-битного ключа может служить «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...");  //  "Попытка подключиться к WEP-сети..."
  status = WiFi.begin(ssid, keyIndex, key);

  // если подключиться не удалось, останавливаем работу скетча:
  if ( status != WL_CONNECTED) {
    Serial.println("Couldn't get a wifi connection");  //  "WiFi-соединение выполнить не удалось"
    while(true);
  } 
  // если подключились, сообщаем об этом:
  else {
    Serial.println("Connected to network");  //  "Подключение выполнено успешно"
  }
}

void loop() {
  // ничего не делаем
}

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, а также в этих скетчах-примерах.

См.также

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