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-адрес.