W5100 arduino примеры

● Проект 29: Работа с Интернетом на примере Arduino Ethernet shield W5100

В этом эксперименте мы покажем, как нашей плате Arduino получить доступ к сети Интернет с помощью модуля Ethernet shield W5100.
Необходимые компоненты:
• контроллер Arduino UNO R3;
• плата для прототипирования;
• модуль Ethernet shield W5100;
• светодиод – 2 шт.;
• резистор 220 Ом – 2 шт.;
• провода папа-папа.
Ethernet Shield позволяет легко подключить вашу плату Arduino к локальной сети или сети Интернет. Он предоставляет возможность Arduino отправлять и принимать данные из любой точки мира с помощью интернет-соединения. Например, можно реализовать удаленное управление вашими исполнительными устройствами, подключенными к реле, через веб-сайт или создать устройство, которое с помощью звукового сигнала оповестит вас о новом электронном письме.
В первой части эксперимента рассмотрим использование платы Arduino с подключенным Ethernet Shield в качестве сервера, выдающего клиенту (браузеру) веб-страницу и позволяющего запросами с браузера изменять состояния подключенного к Arduino светодиода.
Подключаем к плате Arduino Ethernet shield, а к выводам D7, D8 – светодиоды через резистор 220 Ом (см. рис. 29.1).

Рис. 29.1. Схема подключения модуля Ethernet shield и светодиодов
При написании скетча используем встроенную в Arduino IDE библиотеку Ethernet.
Содержимое скетча показано в листинге 29.1.
#include <SPI.h> #include <Ethernet2.h> // mac-адрес платы и ip-адрес сервера byte mac = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1,7); // Initialize the Ethernet server library // with the IP address and port you want to use // (port 80 is default for HTTP): EthernetServer server(80); int pins = { 7, 8}; // Пины для светодиодов int pinState = {0, 0}; // Состояние пинов String getData=»»; boolean startGet=false; void setup() { Serial.begin(9600); for(int i=0;i<2;i++) { pinMode(pins,OUTPUT); // контакты подключения светодиодов digitalWrite(i,LOW); // выключить светодиоды } // инициализации библиотеки Ethernet server Ethernet.begin(mac, ip); server.begin(); } void loop() { // ожидание подключения клиентов EthernetClient client = server.available(); if (client) { boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); if(startGet==true) // данные после ‘?’ getData+=c; if(c == ‘?’) // начало сбора данных после ‘?’ startGet=true; if (c == ‘\n’ && currentLineIsBlank) // окончание получения { if(getData.length()<1) // запрос без get-данных { pinState=0; pinState=0; } else { pinState=int(getData)-48; pinState=int(getData)-48; } // отправка заголовков клиенту client.println(«HTTP/1.1 200 OK»); client.println(«Content-Type: text/html»); client.println(«Connection: close»); client.println(); // формирование страницы ответа client.println(«<!DOCTYPE HTML>»); client.println(«<html>»); client.println(«<h3>Ethernet shield + LEDS</h3>»); client.println(«<form method=’get’>»); // светодиод 1 client.print(«<div>»); client.print(«led1 off<input type=’radio’ name=’led1′ value=0 onclick=’document.getElementById(\»submit\»).click();’ «); if (pinState == 0) client.print(«checked»); client.println(«>»); client.print(«<input type=’radio’ name=’led1′ value=1 onclick=’document.getElementById(\»submit\»).click();’ «); if (pinState == 1) client.print(«checked»); client.println(«> on»); client.println(«</div>»); // светодиод 2 client.print(«<div>»); client.print(«led2 off<input type=’radio’ name=’led2′ value=0 onclick=’document.getElementById(\»submit\»).click();’ «); if (pinState == 0) client.print(«checked»); client.println(«>»); client.print(«<input type=’radio’ name=’led2′ value=1 onclick=’document.getElementById(\»submit\»).click();’ «); if (pinState == 1) client.print(«checked»); client.println(«> on»); client.println(«</div>»); client.println(«<input type=’submit’ id=’submit’ style=’visibility:hidden;’ value=’Refresh’>»); client.println(«</form>»); client.println(«</html>»); break; } if (c == ‘\n’) {currentLineIsBlank = true;} else if (c != ‘\r’) {currentLineIsBlank = false;} } } } // задержка для получения клиентом данных delay(1); // закрыть соединение client.stop(); for(int i=0;i<2;i++) // светодиоды включить или выключить {digitalWrite(pins,pinState);} startGet=false; getData=»»; }

Как управлять системой на базе ардуино на расстоянии? Рано или поздно вы можете столкнуться с проектом, к которому нужен удалённый доступ. Для этой задачи разработан ряд arduino ethernet shield’ов. Давайте рассмотрим, какие они бывают и что можно построить с их участием, а также узнаем о различиях, преимуществах и недостатках.

Веб сервер на Ардуино

Как уже понятно, для связи Ардуино по LAN сети нужна специальная плата расширения. Так выглядит шилд ethernet shield w5100:

Работа с этим сетевым шилдом проще всего осуществляется с платы Arduino UNO R3. Безусловно, вы можете использовать её и с другими платами, на фото изображено подключение на примере самой распространённой версии. При использовании с другими вариантами, например, Nano нужно соединить соответствующие выводы на плате и шилде с помощью перемычек.

Ардуино выступает в роли сервера, поэтому нужно обеспечить подключение к сети, для этого используется Ethernet кабель. Сразу стоит отметить, что при подключении витой пары, кабеля RJ-45, непосредственно к плате, а не через роутер, вы должны использовать вариант обжимки «Crossover».

Работает плата расширения на скоростях 10 или 100 мбит/с, при работе на высшей скорости вы можете видеть уведомление – об этом сигнализирует светодиод «100M». Он расположен ниже сетевого разъёма.

На шилде расположен слот для SD-карты – вы можете получить доступ к данным через сеть. Таким образом, вы получите домашнее облако на Arduino. С картой памяти микроконтроллер работает по той же SPI шине, что и с шилдом. Определите, какие выводы на вашей плате работают с этим интерфейсом, и не забудьте о том, что их нельзя задействовать при разработке вашей умной системы. Для платы Arduino mega – выводы 50, 51, 52, duemilanove – 12, 12, 13, например.

Модуль может вызывать прерывания в ардуино. Это нужно для уведомления микроконтроллера о разного рода событиях, что очень полезно.

Миниатюрные системы для сетевого доступа и беспроводной доступ по GSM

Шилд W5100 довольно громоздкий, и в связке с миниатюрными pro mini и nano выглядит нелепо, да и далеко не всегда нужна на шилде карта памяти. Вы можете обратить свое внимание на модель arduino Ethernet модуля W5500, тоже на базе чипа WIZnet, как и предыдущий вариант.

Связь с микроконтроллером осуществляется по тому же SPI интерфейсу, а сам чип построен на Cortex M0. Чип W5500 меньше греется и имеет большую мощность, нежели у W5100 (значительно сильнее грелся). В отличие от младших чипов, добавлен режим параллельной 8 битной шины. Но и ток потребления 160 мА при работе на полной скорости – 100 м/бит.

Другой вариант миниатюрного шилда – это arduino enc28j60. Главное его преимущество – это то, что он дешевле в 2-3 раза, чем W5500, например. Я сделал акцент на том, что это главное преимущество, потому что в целом, если есть возможность, лучше использовать W5500, т. к. на них в сети больше информации по работе и настройке, а также есть различные проекты.

28J60 отлично подойдёт для интернета, для простейших мелких задач, типа Ethernet термометра. Микросхема произведена компанией Microchip, работает по тому же SPI интерфейсу, что и предыдущие. Библиотеки для работы с ней отлично подходят для ардуин на 168/328й атмеге, в их числе UNO, nano, pro mini… Для Mega нужно правильно назначить пины.

Но еще более интересный вопрос – это беспроводная связь с ардуино. Это стало возможно благодаря GSM модулям, а с помощью w5500 вы можете осуществлять связь только по сети. В шилд или модуль для ардуино вставляешь sim карту, и вы можете управлять своей автоматизацией с помощью SMS или вызова.

Рассмотрим модуль Neoway M590E, рассчитанный на два диапазона (900/1800 мГц) – голосовую связь он не поддерживает. Работает в сети GPRS с максимальной скоростью в 48 кбит/с, способен принимать и передавать SMS сообщения. Модуль стоит около 1-2х долларов. Для своей цены он более чем универсален.

Этого набора функций достаточно как для мониторинга чего-либо, так и для управления умным домом на расстоянии, но о сферах применения будет расписано позже.

Питание M590E может осуществляться от li-ion аккумулятора или любого другого источника на 3,3 — 4,8 В с током порядка 1 ампера (номинальным 0.6 А).

Сфера применения и проекты с сетевыми шилдами

Ардуино – одна из самых дешевых основ для проекта умного дома. Кроме домашнего облака и доступа к файлам можно реализовать удаленное управление исполнительными механизмами любых типов. К таким проектам можно отнести и другую автоматизацию, например, управление поливом, освещением и проветриванием в теплице. Одно дело, когда вы находитесь в непосредственной близости к управляемой системе, но что делать, если ваша теплица находится на участке загородного дома? Если есть интернет связь за городом – Ethernet технологии придут на помощь, на фото ниже вы видите окно HTML страницы, находящейся на сервере на базе W5500.

В таком виде представлено управление группой из 4-х реле с отслеживанием их активности, по нажатию кнопки refresh.

А подключается всё по такой схеме:

Это на примере модуля w5500. Схема не сложная, но функциональная – вы можете сделать вот такую мульти задачную реле-станцию.

Только использовать вместо MEGA младшие ардуины.

Что касается мобильной передачи данных, то M590E предназначен для так называемых M2M приложений.

С ардуино он может взаимодействовать и передавать как сообщения от неё в виде SMS, так и команды к микроконтроллеру после принятия сообщения от вас. Команды очень просты, например, «AT+CMGS=»+79123456789″;» – отправит СМС на указанный номер, точка с запятой обязательны.

Это незаменимо в проектировании охранных комплексов и устройств.

Технические характеристики Ethernet шилда

Ethernet Shield основан на чипе W51000, который имеет внутренний буфер на 16К. Скорость подключения достигает 10/100Мб. Это не самое быстрое соединение, но этого вполне достаточно, поверьте.

Шилд работает с использованием библиотеки Arduino Ethernet library, которая по умолчанию интегрирована в оболочку Arduino IDE.

На Ethernet шилде есть слод для установки micro SD карты, с помощью которой можно хранить большие массивы информации и загружать веб-сайты непосредственно с Arduino. Не забудьте, что в этом случае надо использовать дополнительную библиотеку. Более детально про: использование SD карты.

Кроме того, можно запитывать Arduino с помощью Ethernet соединения. Для этого надо использовать Power over Ethernet (PoE) модуль, место для установки есть на Ethernet шилде.

Сводный список технических характеристик Ethernet шилда:

  • Для работы необходима плата Arduino
  • Рабочее питание – 5 В (питается от платы Arduino)
  • Ethernet контроллер: W5100 с буфером 16Kб
  • Скорость подключения: 10/100Мб
  • Подключается к Arduino через SPI порт

Сервер

Можно использовать Arduino Ethernet shield в качестве веб-сервера для загрузки HTML страницы или функции. Можно отслеживать (парсить) запросы, которые отсылаются клиентом через веб-браузер. В следующих двух примерах показано как использовать наш «пирог» для обслуживания HTML страниц и парсинга URL строк.

Важно помнить: надо внести IP адрес вашей платы Arduino, чтобы приведенные ниже примеры корректно отрабатывали.

Приведенный ниже код изменяет содержимое веб страницы при нажатии кнопки:

/*

Web Server с использованием Ethernet шилда — пример

Простой пример веб-сервера, который изменяет страницу после нажатия кнопки.

Схема подключения

* Ethernet shield подключен к пинам 10, 11, 12, 13

* кнопка подключается между пинами D2 and 5V

* резистор на 10 КОм подключается между пином D2 и землей

*/

#include &ltSPI.h&gt

#include &ltEthernet.h&gt

// ниже необходимо ввести MAC адрес и IP адрес вашего контроллера.

// IP адрес будет зависеть от вашей локальной сети:

byte mac = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };

IPAddress ip(191,11,1,1); //

// Инициализация библиотеки Ethernet server

// с указанием IP адреса и порта, который вы хотите использовать

// (порт 80 является портом по умолчанию для HTTP):

EthernetServer server(80);

int buttonPress = 1;

void setup()

{

pinMode(2, INPUT);

// запускаем Ethernet подключение и сервер:

Ethernet.begin(mac, ip);

server.begin();

}

void loop()

{

buttonPress = digitalRead(2);

// отслеживаем входящего клиента

EthernetClient client = server.available();

if (client) {

// запрос http заканчивается пустой строкой

boolean currentLineIsBlank = true;

while (client.connected()) {

if (client.available()) {

char c = client.read();

// если вы добрались до конца строки (получили символ для новой строки)

// и строка пустая, http запрос заканчивается.

// Соответственно, вы отсылаете ответ:

if (c == ‘\n’ && currentLineIsBlank) {

// отсылаем стандартный http ответ

client.println(«HTTP/1.1 200 OK»);

client.println(«Content-Type: text/html»);

client.println();

// обслуживает другую версию веб-сайта в зависимости от состояния кнопки (нажата или нет),

// которая подключена к пину 2

if (buttonPress == 1) {

client.println(«&ltcke:html&gt&ltcke:body bgcolor=#FFFFFF>LIGHT!&lt/cke:body&gt&lt/cke:html&gt»);

}

else if (buttonPress == 0){

client.println(«&ltcke:html&gt&ltcke:body bgcolor=#000000 text=#FFFFFF>DARK!&lt/cke:body&gt&lt/cke:html&gt»);

}

}

if (c == ‘\n’) {

// начинаем с новой строки

currentLineIsBlank = true;

}

else if (c != ‘\r’) {

// если получен символ на данной строке

currentLineIsBlank = false;

}

}

}

// даем браузеру время для получения данных

delay(1);

// закрываем соединение:

client.stop();

}

}

Для того, чтобы скетч работал, подключите кнопку между пинами D2 и 5V. Резистор на 10 КОм между землей и пином D2.. После этого укажите IP адрес вашей Arduino в браузере. Должна загрузится страница с черным фоном. Нажмите и удерживайте кнопку, после этого перезагрузите страницу браузера. После этого страница должна загрузится с белым фоном.

Код, который приведен ниже, включает светодиод в зависимости от URL адреса, который отсылается на Arduino:

/*

Web Server — пример

Дает возможность включать и выключать светодиод при вводе разных URL адресов в браузере

Для того, чтобы включить:

http://ВАШ_IP_АДРЕС/$1

Для того, чтобы выключить:

http://ВАШ_IP_АДРЕС/$2

Схема подключения:

* Ethernet shield подключается к пинам 10, 11, 12, 13

* Подключите светодиод к пину D2, а вторую ногу к земле через резистор 220 Ом

*/

#include &ltSPI.h&gt

#include &ltEthernet.h&gt

boolean incoming = 0;

// ниже необходимо ввести MAC адрес и IP адрес вашего контроллера.

// IP адрес будет зависеть от вашей локальной сети:

byte mac = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };

IPAddress ip(191,11,1,1); //

// Инициализация библиотеки Ethernet server library

// с использованием IP адреса и порта, который вы указали

// (по умолчанию HTTP порт устанавливается на 80):

EthernetServer server(80);

void setup()

{

pinMode(2, OUTPUT);

// запуск Ethernet подключения и сервера:

Ethernet.begin(mac, ip);

server.begin();

Serial.begin(9600);

}

void loop()

{

// получаем данные от клиента:

EthernetClient client = server.available();

if (client) {

// HHTP запрос оканчивается пустой строкой

boolean currentLineIsBlank = true;

while (client.connected()) {

if (client.available()) {

char c = client.read();

// если вы дошли до конца строки и следующая строка пустая,

// http запрос заканчивается и можно вывести ответ

//считывает строку URL от $ до первого пробела

if(incoming && c == ‘ ‘){

incoming = 0;

}

if(c == ‘$’){

incoming = 1;

}

// проверка строки URL. В ней присутствует $1 или $2

if(incoming == 1){

Serial.println(c);

if(c == ‘1’){

Serial.println(«ON»);

digitalWrite(2, HIGH);

}

if(c == ‘2’){

Serial.println(«OFF»);

digitalWrite(2, LOW);

}

}

if (c == ‘\n’) {

// начинаем новую строку

currentLineIsBlank = true;

}

else if (c != ‘\r’) {

// получаем символ на текущей строке

currentLineIsBlank = false;

}

}

}

// даем веб-браузеру время для получения данных

delay(1);

// закрываем соединение:

client.stop();

}

Для корректной работы приведенного примера, подключите позитивную ногу светодиода к пину D2, а негативную к земле через резистор 220 Ом.

Для того, чтобы включить светодиод, введите в строку браузера:

Для того, чтобы выключить светодиод, введите в строку браузера:

Обратите внимание: Надо заменить строку вашим IP адресом.

Клиент

Можно использовать Ethernet Shield для отрабатывания на стороне клиента. Другими словами, Arduino с шилдом используются для считывания информации с веб-сайта по принципу веб-браузера.

На веб-сайтах большое количество текста. Причем текст может быть как видимым так и невидимым. Так что программирование на стороне клиента превращается в интересную задачу. Считывание информации с веб-сайта сводится к парсингу большого количества строк.

На данный момент в сети валяется куча примеров для считывания сообщений и Твиттера. В нашем случае стандартный пример будет несколько модифицирован. В результате мы сможем включить светодиод при считывании определенного сообщения.

Для работы вам надо подключить позитивную ногу светодиода к пину D2, а негативную — к земле через резистор на 220 Ом.

Не забудьте ввести ваш индивидуальный IP адрес в код ниже или скетч не отработает.

Скетч приведен ниже:

/*

Twitter клиент

Эта программа дает возможность подключится к Twitter с использованием Ethernet шилда. Мы парсим XML

И ищем lgttext&gtтут_ваш_твитlgttext&gt

Можно использовать Ethernet шилд от Arduino, от компании Adafruit, да и большинство китайских тоже подойдут, так как на них установлен модуль Wiznet Ethernet.

В примере используются процедуры DHCP в библиотеке Ethernet library, которая входит в состав Arduino IDE начиная с версии 1.0 beta 1

В примере используется библиотека String library, которая входит в состав Arduino IDE с версии 0019.

Схема подключения:

* Ethernet шилд подключается через пины 10, 11, 12, 13

*/

#include &ltSPI.h&gt

#include &ltEthernet.h&gt

// ниже необходимо ввести MAC адрес и IP адрес вашего контроллера.

// IP адрес будет зависеть от вашей локальной сети:

byte mac = {

0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 };

IPAddress ip(191,11,1,1); //

// Инициализация библиотеки

EthernetClient client;

const int requestInterval = 60000; // задержка между запросами

char serverName = «api.twitter.com»; // URL твиттера

boolean requested; // сделали вы запрос после соединения

long lastAttemptTime = 0; // последний раз, когда вы подключались к серверу в миллисекундах

String currentLine = «»; // строка для хранения текста с сервера

String tweet = «»; // строка для хранения твита

boolean readingTweet = false; // если вы читаете твит в данный момент

void setup() {

pinMode(2, OUTPUT);

// резервируем место для строк:

currentLine.reserve(256);

tweet.reserve(150);

// инициализация серийного протокола:

Serial.begin(9600);

// попытка DHCP подключения:

if (!Ethernet.begin(mac)) {

// если DHCP подключение не удалось, начинаем с адреса:

Ethernet.begin(mac, ip);

}

// подключаемся к Twitter:

connectToServer();

}

void loop()

{

if (client.connected()) {

if (client.available()) {

// read incoming bytes:

char inChar = client.read();

// добавляем входящий байт в конце строки:

currentLine += inChar;

// если мы переходим на новую строку, очищаем:

if (inChar == ‘\n’) {

currentLine = «»;

}

// если текущая строка заканчивается на lgttext&gt, за ней

// последует твит:

if ( currentLine.endsWith(«lgttext&gt»)) {

// твит начинается. Очищаем строку твита:

readingTweet = true;

tweet = «»;

}

// если вы на данный момент считываете байты из твита,

// добавляем их в строку tweet:

if (readingTweet) {

if (inChar != ‘

tweet += inChar;

}

else {

// если вы пропарсили до символа »

// вы достигли конца твита:

readingTweet = false;

Serial.println(tweet);

if(tweet == «>Hello Cruel World»){

digitalWrite(2, HIGH);

Serial.println(«LED ON!»);

}

if(tweet != «>Hello Cruel World»){

digitalWrite(2, LOW);

Serial.println(«LED OFF!»);

}

// close the connection to the server:

client.stop();

}

}

}

}

else if (millis() — lastAttemptTime > requestInterval) {

// если вы не подключены и с момента последнего подключения прошло

// две минуты, пытаемся подключится вновь:

connectToServer();

}

}

void connectToServer() {

// пытаемся подключится и ждем миллисекунду:

Serial.println(«connecting to server…»);

if (client.connect(serverName, 80)) {

Serial.println(«making HTTP request…»);

// делаем HTTP GET запрос к twitter:

client.println(«GET /1/statuses/user_timeline.xml?screen_name=RandyMcTester&count=1 HTTP/1.1»);

client.println(«HOST: api.twitter.com»);

client.println();

}

// отмечаем время попытки этого подключения:

lastAttemptTime = millis();

}

Вероятно, вам захочется считать какие-данные, которые не имеют отношения к последнему посту в Твиттере.

Для того, чтобы считать другие посты из Твиттера, внесите следующие изменения в программу:

client.println(«GET /1/statuses/user_timeline.xml?screen_name=&count=1 HTTP/1.1»);

Поздравляем! Вы ознакомились с базовыми принципами работы Ethernet шилда и его возможностями. Упомянутых в статье функций более чем достаточно для покорения интернет пространства в компании с Arduino.