В настоящее время большинство устройств интернета вещей (Internet of Things, IoT) подключаются к сети Интернет с помощью технологии Wi-Fi. Однако в ряде случаев для стационарных устройств целесообразно подключение к сети Интернет с помощью Ethernet кабеля поскольку такое соединение более стабильно чем Wi-Fi и обеспечивает более высокую скорость передачи данных.
Ранее на нашем сайте мы уже рассматривали подключение платы Arduino к сети Интернет с помощью модулей ESP8266 (удаленный мониторинг здоровья пациента, управление сервомотором, удаленный мониторинг температуры и влажности, передача данных на веб-страницу и другие). В этой же статье мы рассмотрим подключение платы Arduino к сети интернет с помощью Ethernet модуля W5100. Таким образом, плата Arduino будет подключена к компьютеру с помощью локальной вычислительной сети (LAN). С помощью установленного интернет соединения мы будем управлять светодиодом, подключенным к плате Arduino.
Для реализации данного проекта необходимы базовые знания основ построения локальных вычислительных сетей, принципов работы хабов/роутеров, разъемов RJ45, IP и MAC адресации.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress) или Nano (купить на AliExpress).
- Ethernet модуль W5100 (купить на AliExpress).
- Светодиод (купить на AliExpress).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Ethernet модуль W5100
Ethernet модуль W5100 позволяет устанавливать полнофункциональное интернет соединение. С его помощью можно подключать плату Arduino к сети интернет без поддержки операционной системы компьютера. Модуль поддерживает различные протоколы стека TCP/IP: TCP, PPPoE, Ethernet, UDP, ICMP, IPv4 и другие. Модуль W5100 способен работать в дуплексном и полудуплексном режимах работы. Также он имеет поддержку ADSL соединений (до 4-х соединений одновременно).
Для подключения Ethernet модуля W5100 мы будем использовать библиотеку Arduino Ethernet library, которая поддерживает все версии плат Arduino: UNO, NANO, mega 1280, mega 2560 и другие. Функциональность Ethernet модуля W5100 такая же, как и у шилда (shield) Arduino Ethernet, а стоит модуль в два раза дешевле чем данный шилд.
Схема проекта
Схема подключения Ethernet модуля W5100 к плате Arduino Nano представлена на следующем рисунке.
В схеме необходимо подключить контакты 5V и GND платы Arduino Nano к контактам +5 и G Ethernet модуля соответственно – это обеспечит подачу питания на модуль.
Также необходимо подключить контакты 9, 10, 11, 12 и 13 платы Arduino к контактам to R, SS, MO, MI, CK Ethernet модуля соответственно – это обеспечит взаимодействие между платой Arduino и Ethernet модулем по интерфейсу SPI.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе подключим библиотеку для работы по интерфейсу SPI.
1 |
#include <SPI.h> |
Затем подключим библиотеку для работы с Ethernet модулем.
1 |
#include <Ethernet.h> |
Далее установим для Ethernet модуля Mac адрес.
1 |
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; |
Затем установим IP адрес 192.168.0.12. В этом адресе “0” зависит от хоста (шлюза по умолчанию) сети, к которой вы подключены. Его можно определить с помощью команды ipconfig в командной строке компьютера.
1 2 3 |
byte ip[] = { 192, 168, 0, 12 }; byte gateway[] = { 192, 168, 0, 12 }; byte subnet[] = { 255, 255, 255, 0 }; |
На следующем рисунке показан пример шлюза по умолчания для других сетей.
Далее в программе создадим локальный сервер на порту 80, к которому позже будут получать доступ клиенты.
1 |
EthernetServer server(80); |
Затем объявим строковую переменную, в которую будем сохранять ответ от клиента когда он будет пытаться получить доступ к веб-серверу.
1 |
String readString; |
Далее дадим название контакту, к которому будем подключать светодиод, и зададим режим его работы (на вывод данных). После этого инициализируем Ethernet модуль с заданными параметрами (Mac адрес, IP адрес, шлюз, маска подсети) и запустим сервер с помощью команды “server.begin()”.
1 2 3 4 5 6 |
int ledPin = 2; void setup(){ pinMode(ledPin, OUTPUT); Ethernet.begin(mac, ip, gateway, subnet); server.begin(); } |
В функции loop мы создадим клиентское соединение и будем проверять пытается ли кто-нибудь получить доступ к назначенному IP адресу через браузер.
1 2 3 4 5 |
void loop(){ EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { |
Если соединение установлено мы будем проверять передает ли клиент какое-либо сообщение серверу.
1 |
char c = client.read(); |
После этого мы будем считывать символы этого HTTP ответа и добавлять их по одному к строке readString, которую мы инициализировали ранее в программе.
1 2 3 |
if (readString.length() < 100) { readString += c; } |
Если код принятого символа равен 0x0D, то в коде ASCII это будет символ \n, что обозначает возврат каретки (завершение передачи).
1 |
if (c == 0x0D) { |
Как только мы получили символ завершения передачи (OK response) мы начнем отображать веб-страницу с помощью следующего HTML кода.
1 2 3 4 5 6 7 8 9 10 11 12 |
client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<HTML>"); client.println("<HEAD>"); client.println("<TITLE> ARDUINO ETHERNET</TITLE>"); client.println("</HEAD>"); client.println("<BODY>"); client.println("<hr>"); client.println("<H1 style=\"color:green;text-align:center\">ARDUINO ETHERNET LED CONTROL</H1>"); client.println("<hr>"); client.println("<br>"); |
Когда пользователь будет нажимать на ссылку TURN ON LED на сформированной нами веб-странице он будет перенаправляться на URL адрес (URL \?LEDON), с помощью которого далее будет включаться светодиод.
1 |
client.println("<H2 style=\"text-align:center\"><a href=\"/?LEDON\"\">Turn On LED</a><br></H2>"); |
Аналогичным образом будет происходить и перенаправление на URL для выключения светодиода (“TURN OFF LED”).
1 |
client.println("<H2 style=\"text-align:center\"><a href=\"/?LEDOFF\"\">Turn Off LED</a><br></H2>"); |
Оставшаяся часть HTML кода:
1 2 3 4 5 |
client.println("<br>"); client.println("</BODY>"); client.println("</HTML>"); delay(10); client.stop(); |
Далее в зависимости от адреса URL, на который был перенаправлен пользователь, мы будем включать/выключать светодиод.
1 2 3 4 5 6 7 8 9 10 |
if(readString.indexOf("?LEDON") > -1) { digitalWrite(ledPin, HIGH); } else{ if(readString.indexOf("?LEDOFF") > -1) { digitalWrite(ledPin, LOW); } } |
И, наконец, очищаем строку для ее последующего использования.
1 2 3 4 5 6 |
readString=""; } } } } } |
Подключение Arduino к компьютеру или Ethernet порту роутера
Чтобы подключить плату Arduino к компьютеру нам будет нужен подходящий кабель, например, категории CAT-6. При этом если Ethernet порт компьютера не может автоматически определять направление передачи (auto-direction sensing), то вам понадобится CAT-6 crossover cable (кроссовер, перекрестный кабель). Если же Ethernet порт компьютера может автоматически определять направление передачи, то вам подойдет обычный Ethernet кабель.
В этом перекрестном кабеле контакты TX+/TX- и RX+/RX- должны соответствующим образом перекрещиваться.
Если же на вашем компьютере нет Ethernet порта или же вы не хотите покупать подобный перекрестный кабель, то вы можете просто подключить Ethernet модуль к LAN порту роутера (маршрутизатора).
Тестирование работы проекта
После осуществления описанных выше соединений подключитесь к роутеру с помощью компьютера или смартфона. Откройте любой веб-браузер и введите в нем URL http://192.168.0.12 (если в программе вы использовали другой Ethernet IP адрес, то вы должны использовать его в URL, который вводите в адресе). После этого вы сможете управлять включением/выключением светодиода с открывшейся веб-страницы.
Если на данной веб-странице вы будете нажимать на ссылку “Turn On LED”, то светодиод будет включаться, а если на ссылку Turn OFF LED” – светодиод будет выключаться.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
#include <SPI.h> //библиотека для работы с протоколом SPI #include <Ethernet.h> //библиотека чтобы запустить веб-клиент/веб-сервер с помощью ethernet byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //физический mac адрес установленный на ethernet 0 /*the number 0 in the IP address depends on the host of the network you are connected to, check that by doing ipconfig on command prompt*/ byte ip[] = { 192, 168, 0, 12 }; // IP адрес в LAN к которой вы подключены – его необходимо изменить в соответствии с вашим сетевым адресом byte gateway[] = { 192, 168, 0, 12 }; // доступ к интернету через роутер byte subnet[] = { 255, 255, 255, 0 }; //subnet mask (маска подсети) EthernetServer server(80); // порт, на котором мы будем получать доступ к серверу String readString; // в этой строке мы будем сохранять сообщение от клиента (пользователя) int ledPin = 2; // светодиод подключен к контакту 2 void setup(){ pinMode(ledPin, OUTPUT); //режим работы контакта на вывод данных //start Ethernet Ethernet.begin(mac, ip, gateway, subnet); //инициализируем Ethernet модуль server.begin(); // начинаем работу сервера } void loop(){ // Create a client connection (создаем клиентское соединение) EthernetClient client = server.available(); // проверяем если кто то пытается получить доступ к назначенному IP адресу из браузера if (client) { //if connected, continue checking if client is sending some message back to the server while (client.connected()) { if (client.available()) { char c = client.read(); //read char by char HTTP request (считываем символ за символом) if (readString.length() < 100) { //store characters to string (сохраняем считываемые символы в строку) readString += c; } //if HTTP request has ended– 0x0D is Carriage Return \n ASCII (если передача завершена) if (c == 0x0D) { //display the webpage (отображаем веб-страницу) client.println("HTTP/1.1 200 OK"); //send new page client.println("Content-Type: text/html"); client.println(); client.println("<HTML>"); client.println("<HEAD>"); client.println("<TITLE> ARDUINO ETHERNET</TITLE>"); client.println("</HEAD>"); client.println("<BODY>"); client.println("<hr>"); client.println("<H1 style=\"color:green;text-align:center\">ARDUINO ETHERNET LED CONTROL</H1>"); client.println("<hr>"); client.println("<br>"); //creating a link to redirect the user to turn on the light (создаем ссылку для включения светодиода) client.println("<H2 style=\"text-align:center\"><a href=\"/?LEDON\"\">Turn On LED</a><br></H2>"); //creating a link to redirect the user to turn off the light (создаем ссылку для выключения светодиода) client.println("<H2 style=\"text-align:center\"><a href=\"/?LEDOFF\"\">Turn Off LED</a><br></H2>"); client.println("<br>"); client.println("</BODY>"); client.println("</HTML>"); delay(10); //stopping client (останавливаем клиент) client.stop(); // control arduino pin with URL if(readString.indexOf("?LEDON") > -1) //checks for LEDON { digitalWrite(ledPin, HIGH); // set pin high } else{ if(readString.indexOf("?LEDOFF") > -1) //checks for LEDOFF { digitalWrite(ledPin, LOW); // set pin low } } //очищаем строку для последующего использования readString=""; } } } } } |