Содержание
Ethernet shield (рис. 1) – это плата для подключения Arduino к сети. Плата основана на чипе Wiznet W5100.
Рисунок 1.
Технические характеристики
- Напряжение питания — 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-карты, одновременно может быть активно только одно устройство.
Рисунок 2.
Для подключения платы Arduino к сети, необходимо необходимо загрузить скетч для получения ip-адреса. Что такое ip-адрес? Каждое устройство локальной сети должно иметь свой уникальный адрес, его можно назначить вручную или получить автоматически от устройства (обычно это роутер), на котором выполняется специальная программа – DHCP-сервер.
Для программирования сетевого взаимодействия используется библиотека Ethernet из стандартного дистрибутива. При использовании библиотеки Ethernet необходимо указывать MAC-адрес платы (уникальный идентификатор любого сетевого устройства). В новых версиях MAC-адрес можно увидеть на плате Ethernet shield на наклейке. Если наклейки нет, то можно использовать любую комбинацию цифр, главное чтобы в вашей сети не было устройств с совпадающими MAC-адресами.
Скетч для получения IP-адреса по DHCP представлен в листинге 1.
Листинг 1
#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() {;}
После загрузки скетча открываем монитор последовательного порта (рис. 3).
Рисунок 3.
Скетч для назначения статического адреса IP-адреса представлен в листинге 2. Вам необходимо внести свои параметры шлюза, маски сети и сервера dns.
Листинг 2
#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() {;}
После загрузки скетча открываем монитор последовательного порта (рис. 4).
Рисунок 4.
Чтобы проверить, что плата Arduino подключена к сети и имеет связь с компьютером по локальной сети, на компьютере запускаем командную строку (Пуск à Все программы à Стандартные à Командная строка) и набираем команду:
ping <ip-адрес> -t
где <ip-адрес> - ip-адрес, полученный платой Arduino
В командной строке должны приходить ответы от платы Arduino (рис. 5).
Рисунок 5.
Пример использования
Создадим проект использования платы Arduino с Ethernet shield в качестве сервера, который формирует при обращении к нему страницу с показаниями, подключенных к нему датчиков. Для проекта нам понадобятся:
- Плата Arduino – 1 шт;
- Плата прототипирования – 1 шт;
- Ethernet shield – 1 шт;
- Датчик BMP280 – 1 шт;
- Провода.
Схема соединений нашего проекта показана на рис. 6.
Рисунок 6.
Приступим к написанию скетча. Запускаем на плате Arduino + Ethernet shield сервер. При обращении к серверу (например из браузера) плата Arduino опрашивает датчик BMP280 и выдает браузеру страницу с данными температуры и атмосферного давления.
Скетч в листинге 3.
Листинг 3.
// подключение библиотек #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 (рис. 7). Обновление страницы происходит каждые 10 секунд.
Рисунок 7.
Рисунок 8. Схема в сборе
Часто задаваемые вопросы
1. Плата Arduino+Ethernet shield не получает ip-адрес по DHCP.- Проверьте исправность сетевого кабеля.
- Проверьте наличие в сети сервера DHCP.
- Возможно в сети есть устройство с таким MAC-адресом. Попробуйте ввести другой MAC-адрес.
- Проверьте исправность сетевого кабеля.
- Проверьте правильность сетевых настроек (ip, gateway, subnet).
- Возможно в сети есть устройство с таким MAC-адресом. Попробуйте ввести другой MAC-адрес.