Ethernet shield – это плата для подключения Arduino к сети. Плата основана на чипе Wiznet W5100.
Технические характеристики
- Напряжение питания — 5 В;
- Контроллер — W5100;
- Поддержка до 4-х соединений;
- Скорость подключения — 10 и 100 Мбит/с;
- Разъем для карт памяти — micro-SD;
- Протокол обмена данными — SPI;
- Габариты — 74х54х27 мм.
Подключение к плате Arduino
Ethernet shield выпускается в формате шилда, т.е. устанавливается поверх платы Arduino (рис. 2). На плате присутствует разъем для подключения microSD карт. Плата Arduino взаимодействует как с W5100, так и с SD-картой, по протоколу SPI. Вывод 10 используется для выбора W5100 и вывод 4 для выбора SD-карты, одновременно может быть активно только одно устройство.
Для подключения платы Arduino к сети, необходимо необходимо загрузить скетч для получения ip-адреса. Что такое ip-адрес? Каждое устройство локальной сети должно иметь свой уникальный адрес, его можно назначить вручную или получить автоматически от устройства (обычно это роутер), на котором выполняется специальная программа – DHCP-сервер.
Для программирования сетевого взаимодействия используется библиотека Ethernet из стандартного дистрибутива. При использовании библиотеки Ethernet необходимо указывать MAC-адрес платы (уникальный идентификатор любого сетевого устройства). В новых версиях MAC-адрес можно увидеть на плате Ethernet shield на наклейке. Если наклейки нет, то можно использовать любую комбинацию цифр, главное чтобы в вашей сети не было устройств с совпадающими MAC-адресами.
Скетч для получения IP-адреса по DHCP:
#include <Ethernet.h>
#include <SPI.h>
#define UART Serial
#define ETH Ethernet
byte mac[]={0x33, 0x33, 0x33, 0x33, 0x33, 0x33};
void setup() {
UART.begin(9600);
}
//
if (ETH.begin(mac) == 0) {
UART.println("Failed!");
}
else {
UART.print("ip=");
for (int k = 0; k < 4; k++) {
UART.print(ETH.localIP()[k], DEC);
UART.print(".");
}
UART.println();
}
}
void loop() {;}
После загрузки скетча открываем монитор последовательного порта.
Скетч для назначения статического адреса IP-адреса представлен ниже. Вам необходимо внести свои параметры шлюза, маски сети и сервера dns.
#include <Ethernet.h>
#include <SPI.h>
#define UART Serial
#define ETH Ethernet
byte mac[]={0x33, 0x33, 0x33, 0x33, 0x33, 0x33};
byte ip[]={***,***,***,***};
byte dns[]={***,***,***,***};
byte gtway[]={***,***,***,***};
byte subnet[]={***,***,***,***};
void setup() {
UART.begin(9600);
ETH.begin(mac, ip, dns, gtway, subnet);
delay(1000);
UART.println(ETH.localIP());
}
void loop() {;}
После загрузки скетча открываем монитор последовательного порта
Чтобы проверить, что плата Arduino подключена к сети и имеет связь с компьютером по локальной сети, на компьютере запускаем командную строку (Пуск à Все программы à Стандартные à Командная строка) и набираем команду:
ping <ip-адрес> -t</ip-адрес>
где <ip-адрес> - ip-адрес, полученный платой Arduino</ip-адрес>
В командной строке должны приходить ответы от платы Arduino.
Пример использования
Создадим проект использования платы Arduino с Ethernet shield в качестве сервера, который формирует при обращении к нему страницу с показаниями, подключенных к нему датчиков. Для проекта нам понадобятся:
- Плата Arduino – 1 шт;
- Плата прототипирования – 1 шт;
- Ethernet shield – 1 шт;
- Датчик BMP280 – 1 шт;
- Провода.
Схема соединений проекта:
Приступим к написанию скетча. Запускаем на плате Arduino + Ethernet shield сервер. При обращении к серверу (например из браузера) плата Arduino опрашивает датчик BMP280 и выдает браузеру страницу с данными температуры и атмосферного давления:
// подключение библиотек
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#define UART Serial
#define ETH Ethernet
byte mac[]={0x33, 0x33, 0x33, 0x33, 0x33, 0x33};
byte ip[]={***,***,***,***};
byte dns[]={***,***,***,***};
byte gtway[]={***,***,***,***};
byte subnet[]={***,***,***,***};
// сервер
EthernetServer srv (80);
// создание экземпляра датчика
Adafruit_BMP280 sensor; // I2C
void setup() {
UART.begin(9600);
ETH.begin(mac, ip, dns, gtway, subnet);
delay(1000);
srv.begin();
UART.println(ETH.localIP());
bmp.begin();
}
void loop() {
EthernetClient W5100 = server.available();
if (W5100) {
int blank = 1;
while (W5100.connected()) {
if (W5100.available()) {
char s = W5100.read();
UART.write(s);
if (s == '\n' && blank==1) {
W5100.println("HTTP/1.1 200 OK");
W5100.println("Content-Type: text/html");
W5100.println("Connection: close");
W5100.println("Refresh: 10"); // обновление каждые 10 сек
W5100.println();
W5100.println("");
W5100.println("");
W5100.print("Sensor BMP280");
W5100.print("T = ");
W5100.print(bmp.readTemperature());
W5100.print(" *C");
W5100.print("P = ");
W5100.print(bmp.readPressure()/133.3224);
W5100.print(" mm hg st");
W5100.println("");
break;
}
if (s == '\n') {
blank = 1;
} else if (s != '\r') {
blank = 0;
}
}
}
delay(1);
W5100.stop();
}
}
Загружаем скетч на плату Arduino. Теперь набираем в браузере ip-адрес нашего сервера и видим страницу с показаниями температуры и атмосферного давления, полученными с датчика BMP280. Обновление страницы происходит каждые 10 секунд.
Часто задаваемые вопросы
1. Плата Arduino+Ethernet shield не получает ip-адрес по DHCP.
- Проверьте исправность сетевого кабеля.
- Проверьте наличие в сети сервера DHCP.
- Возможно в сети есть устройство с таким MAC-адресом. Попробуйте ввести другой MAC-адрес.
2. Отсутствует соединение по сети при назначении статического адреса.
- Проверьте исправность сетевого кабеля.
- Проверьте правильность сетевых настроек (ip, gateway, subnet).
- Возможно в сети есть устройство с таким MAC-адресом. Попробуйте ввести другой MAC-адрес.