====== Ethernet Shield ======
[[amp>product/arduino-ethernet-shield?utm_source=man&utm_campaign=ethernet-shield&utm_medium=wiki|Ethernet Shield]] — это плата расширения, позволяющая [[amp>collection/arduino?utm_source=man&utm_campaign=ethernet-shield&utm_medium=wiki|Arduino]] или [[amp>collection/iskra?utm_source=man&utm_campaign=ethernet-shield&utm_medium=wiki|Iskra]] работать в локальных вычислительных сетях для приёма и передачи данных в сети Интернет.
На платы с разъёмом USB-B шилд может встать не ровно. Контакты разъёма ethernet прижимаются к металлическому разъёму микроконтроллера. Чтобы всё работало стабильно приклейте кусочек изоленты на разъём между шилдом и микроконтроллером или используйте специальные [[https://amperka.ru/product/stackable-pin-headers-with-icsp|проставки]]
{{ :продукты:ethernet-shield:arduino-ethernet-shield-v2.5.jpg?direct |}}
Шилд Ethernet позволит управлять удалёнными объектами через web-браузер со своего компьютера, планшета или телефона.
===== Подключение и настройка =====
- Установите Ethernet Shield на управляющую платформу, например [[amp>collection/arduino?utm_source=man&utm_campaign=trafficlight&utm_medium=wiki|Arduino]], [[amp>product/iskra-neo?utm_source=man&utm_campaign=trafficlight&utm_medium=wiki|Iskra Neo]] или [[amp>product/iskra-js?utm_source=man&utm_campaign=trafficlight&utm_medium=wiki|Iskra JS.]]
Убедитесь в наличии и правильности соединения [[amp>product/jumper_pins_x10?utm_source=man&utm_campaign=trafficlight&utm_medium=wiki|джамперов]] SPI-интерфейса на плате Ethernet Shield.
- Подключите кабель Ethernet в разъём RJ45S.
===== Примеры работы для Iskra JS =====
Для общения Ethernet Shield с платой Iskra JS воспользуемся библиотекой [[http://www.espruino.com/WIZnet|WIZnet]]. Она скрывает в себе все тонкости протокола, предоставляя простые и понятные функции.
- GET-запрос по URL-адресу в Интернете.
// Настраиваем соединение с Ethernet Shield по протоколу SPI.
SPI2.setup({baud: 3200000, mosi: B15, miso: B14, sck: B13});
var eth = require('WIZnet').connect(SPI2, P10);
// Подключаем модуль http.
var http = require('http');
// Получаем и выводим IP-адрес от DHCP-сервера
eth.setIP();
print(eth.getIP());
// Производим запрос к сайту
http.get('http://amperka.ru', function(res) {
res.on('data', function(data) {
print(data);
});
});
\\
- HTTP-сервер на порту 8080.
// Настраиваем соединение с Ethernet Shield по протоколу SPI.
SPI2.setup({baud: 3200000, mosi: B15, miso: B14, sck: B13});
var eth = require('WIZnet').connect(SPI2, P10);
// Получаем и выводим IP-адрес от DHCP-сервера
eth.setIP();
print(eth.getIP());
require("http").createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello World');
res.end();
}).listen(8080);
===== Примеры работы для Arduino =====
Для общения Ethernet Shield с платами Arduino воспользуемся библиотекой {{:продукты:ethernet-shield:ethernet2.zip|Ethernet 2}}. Она скрывает в себе все тонкости протокола, предоставляя простые и понятные функции.
==== Пример WebClient ====
GET-запрос по URL-адресу в Интернете.
// библиотека для работы с SPI
#include
// библиотека для работы с Ethernet Shield
#include
// MAC-адрес контроллера
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// адрес запрашиваемого сервера
char server[] = "amperka.ru";
// задаем статический IP-адрес
// на тот случай, если у DHCP выдать IP-адрес не получится
IPAddress ip(192, 168, 0, 177);
// создаём клиента, который будет подключаться
// к необходимому для нас серверу и порту
// портом по умолчанию для HTTP является 80
EthernetClient client;
void setup()
{
// открываем последовательный порт
Serial.begin(9600);
// ждём, пока не откроется монитор последовательного порта
// для того, чтобы отследить все события в программе
while (!Serial) {
}
Serial.print("Serial init OK\r\n");
// запускаем Ethernet-соединение:
if (Ethernet.begin(mac) == 0) {
// если не удалось сконфигурировать Ethernet при помощи DHCP
Serial.println("Failed to configure Ethernet using DHCP");
// продолжать дальше смысла нет, поэтому вместо DHCP
// попытаемся сделать это при помощи IP-адреса:
Ethernet.begin(mac, ip);
}
// получаем и выводим локальный IP адрес
Serial.print("My IP address: ");
Serial.println(Ethernet.localIP());
// даем Ethernet 1 секунду на инициализацию
delay(1000);
Serial.println("connecting...");
// если подключение установлено, сообщаем об этом на Serial-порт:
if (client.connect(server, 80)) {
Serial.println("connected");
// формируем HTTP-запрос
client.println("GET / HTTP/1.1");
client.println("Host: amperka.ru");
client.println("Connection: close");
client.println();
} else {
// если соединения с сервером нет, пишем об этом на Serial-порт:
Serial.println("connection failed");
}
}
void loop()
{
// если есть непрочитанные байты
// принятые клиентом от удаленного сервера, с которым установлено соединение
if (client.available()) {
// считываем данные и печатаем в Serial-порт
char c = client.read();
Serial.print(c);
}
// если сервер отключился
if (!client.connected()) {
// печатаем об этом в Serial-порт
Serial.println();
Serial.println("disconnecting.");
// останавливаем работу клиента
client.stop();
// останавливаем программу в бесконечном цикле
while (1) {
}
}
}
==== Пример WebServer ====
Создадим HTTP-сервер на порту 80, на который будем передавать значения всех аналоговых портов с ''A0''-''A5''.
// библиотека для работы с SPI
#include
// библиотека для работы с Ethernet Shield
#include
// MAC-адрес контроллера
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// задаем статический IP-адрес
IPAddress ip(192, 168, 88, 177);
// инициализируем библиотеку Ethernet Server
// с необходимыми вам IP-адресом и портом
// порт 80 используется для HTTP по умолчанию
EthernetServer server(80);
void setup()
{
// открываем последовательный порт
Serial.begin(9600);
// ждём, пока не откроется монитор последовательного порта
// для того, чтобы отследить все события в программе
while (!Serial) {
}
Serial.print("Serial init OK\r\n");
// запускаем Ethernet-соединение:
if (Ethernet.begin(mac) == 0) {
// если не удалось сконфигурировать Ethernet при помощи DHCP
Serial.println("Failed to configure Ethernet using DHCP");
// продолжать дальше смысла нет, поэтому вместо DHCP
// попытаемся сделать это при помощи IP-адреса:
Ethernet.begin(mac, ip);
}
// запускаем сервер и выводим локальный IP адрес
server.begin();
Serial.print("Server is at ");
Serial.println(Ethernet.localIP());
}
void loop()
{
// слушаем подключающихся клиентов
EthernetClient client = server.available();
if (client) {
// выводим сообщение о новом клиенте
Serial.println("new client");
// HTTP-запрос заканчивается пустой линией
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// если добрались до конца строки (т.е. получили символ новой строки),
// и эта строка – пустая, это значит, что это конец HTTP-запроса.
// то есть, можно приступать к отправке ответа:
if (c == '\n' && currentLineIsBlank) {
// отсылаем стандартный заголовок для HTTP-ответа:
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
// после выполнения ответа соединение будет разорвано
client.println("Connection: close");
// автоматически обновляем страницу каждые 5 секунд
client.println("Refresh: 5");
client.println();
client.println("");
client.println("");
// выводим значения ото всех входных аналоговых контактов:
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("Analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
client.println("
");
}
client.println("");
break;
}
if (c == '\n') {
// начинаем новую строку
currentLineIsBlank = true;
} else if (c != '\r') {
// в текущей строке есть символ:
currentLineIsBlank = false;
}
}
}
// даем браузеру время, чтобы получить данные
delay(1);
// закрываем соединение
client.stop();
// клиент отключился
Serial.println("Client disconnected");
}
}
===== Элементы платы =====
{{ :продукты:ethernet-shield:ethernet_annotations.png?nolink&500 |}}
==== Микросхема Wiznet 5500 ====
Чип {{:продукты:ethernet-shield:w5500_datasheet.pdf|wiznet 5500}} — аппаратный контроллер TCP/IP, позволяющий легко подключиться к Интернету.
==== Светодиодная индикация ====
^ Имя светодиода ^ Назначение ^
| ON |Информационный светодиод о наличии питания|
====Разъём RJ45S====
Стандартный разъём для подключения Ethernet-кабеля.
====Джамперы SPI====
Коммутируют пины интерфейса SPI на Ethernet Shield и управляющей плате. Пины можно изменить, сняв джамперы и припаяв свободные металлические контакты к другим пинам с помощью проводков.
===== Принципиальная и монтажная схемы =====
{{:продукты:ethernet-shield:arduino-ethernet-shield-v2_schematic.png?direct&250 |}}
{{:продукты:ethernet-shield:arduino-ethernet-shield-v2_layout.png?direct&420 |}}
===== Характеристики =====
* Поддерживаемые протоколы: TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE
* Количество сокетов: 8
* Интерфейс управления: SPI
* Величина внутреннего буфера RX/TX: 32 кБ
* Напряжение питания: 3.3…5 В
* Скорость соединения: 10/100 Мбит
* Занимаемые пины: SPI (MISO, MOSI, SCK), 10
* Габариты: 69×53 мм (RJ45 выступает на несколько мм)
===== Ресурсы =====
* [[amp>product/arduino-ethernet-shield?utm_source=man&utm_campaign=arduino-ethernet-shield-v2&utm_medium=wiki|Ethernet Shield]] в магазине
* [[https://github.com/amperka/hardware-drawings/blob/master/arduino-ethernet-shield-v2.svg|Векторное изображение шилда]]
* {{:продукты:ethernet-shield:w5500_datasheet.pdf|Datasheet на Wiznet5500}}
* [[http://wiki.amperka.ru/projects:trafficlight|Ethernet Shield в проекте «Виджет-светофор»]]
* [[http://wiki.amperka.ru/projects:maze|Ethernet Shield в проекте «Интерактивный лабиринт»]]