Андрей Смирнов
Время чтения: ~23 мин.
Просмотров: 4

Управляем платой на расстоянии с Arduino Ethernet Shield

Модули и шилды Ethernet для Arduino – это один из самых простых способов организовать подключение к интернету в ардуино проекте. В этой статье расскажем о том, как организовать выход в интернет и управление платой Arduino на расстоянии при помощи шилдов Ethernet Shield, опишем основные характеристики модулей на базе w5100 enc28j60. Мы узнаем, как подключиться через SPI, как написать скетч для создания своего сервера на Arduino или отправки данных на удаленный сервер.

Модули Ethernet для Arduino

Подключить плату arduino к интернету можно несколькими способами. Беспроводное подключение прекрасно организуется с использованием платформ ESP8266 или ESP32. Можно использовать Lora модули с соответствующими WiFi-шлюзами. Но самым помехоустойчивым и “традиционным” является старый добрый Ethernet. Используя обычный RJ45 разъем и витую пару вы сможете объединить вашу плату с другим сетевым оборудованием, будь то роутер, маршрутизатор или тот же WiFi модем. Преимущества Ethernet-подключения – скорость, стабильность, бОльшая защищенность от помех. Недостатки очевидны – оборудование привязывается проводом, причем в условиях реальной эксплуатации качество этого провода должно быть высоким.

78925e01b4c698190108f4456523bc486e455c8d.png
Плата расширения Arduino Ethrnet Shield

Наиболее популярные Ethernet модули для ардуино сегодня выпускаются на основе микросхемы wiznet w5100, которая способна поддерживать обмен данными с постоянной скоростью в 100 Мбит/сек. Для устройств на базе w5100 написаны готовые библиотеки, данная архитектура является простой и идеально подойдет начинающим любителям электроники, которые могут использовать как стартовую площадку для последующих проектов.

Ключевые характеристики модулей на базе W5100:

  • Рабочее напряжение – 5 Вольт, подходит питание с платы Arduino.
  • Внутренний буфер  16 Кб.
  • Скорость соединения достигает значения в 10/100 Мбит/сек.
  • Связь с платой ардуино осуществляется посредством порта SPI.
  • W5100 поддерживает TCP и UDP.

Варианты модулей на базе других микросхем:

  • Модуль на базе Wiznet W5500. Имеет меньшие размеры, меньше греется, имеет большую мощность.
  • Модуль на базе enc28j60. Это гораздо более бюджетный вариант, дешевле W5100, но и потенциальных проблем с ним может возникнуть больше.

Шилды Ethernet Shield для Arduino Uno или Nano

Наиболее удобным способом работы с W5100 является использование готовых шилдов Ethernet Shield для Arduino Uno или Nano. На таких модулях уже выполнены все необходимые обвязки, шилд просто вставляется в соответствующие разъемы платы и вам остается только загрузить скетч. Естественно, что при желании к плате могут быть подключены и другие устройства.

37-4.jpg
Arduino Ethernet Shield

Подключение платы расширения происходит через соединение RJ-45. Плата обладает встроенным слотом SD/MicroSD , который используется для хранения файлов, используемых для подключения и передачи по локальной сети. Такой слот совместим со всеми платами Arduino/Genuino, т.е. работать с данными на карте можно с помощью стандартной библиотеки SD Library. На плате расширения также можно найти кнопку перезагрузки . питания. Ранние версии платы расширения не дружили с ардуино мега, там требовался ручной сброс после поступления питания.

Если плата оснащена POE модулем (питание подается по витой паре), то шилд будет соответствовать следующим спецификациям:

  • Совместим со стандартом IEEE3af.
  • Имеет низкие пульсации на выходе.
  • Защищает от явлений перегрузки и короткого замыкания.
  • Эффективно преобразует напряжение.
  • Имеет изоляцию 1500 вольт на точке между «вход-выход»

По умолчанию плата не комплектуется данным модулем, нужно находить соответствующую модель.

Назначение светодиодов Ethernet Shield:

  • PWR показывает наличие питания на плате.
  • LINK светится при наличии сети и мигает при передаче/приеме данных.
  • FULLD обозначает сетевое полнодуплексное соединение.
  • 100M обозначает сетевое соединение со скоростью 10мбит/сек.
  • RX мигает при приеме экраном данных.
  • TX мигает при отправке данных экраном.
  • COLL мигает при обнаружении сетевых конфликтов.

Кроме этих имеются еще пара светодиодов на гнезде rj 45, один из которых при подключенном шнуре светится, а другой мерцает при поступлении данных.

Ehternet для Arduino Nano

Отдельного упоминания заслуживает модуль Arduino Nano Ethernet. Он выполнен в формфакторе, облегчающим подключение к плате Nano v 3.0, но обладает практически такими же возможностями, что и “обычный” вариант для Uno. В основе шилда лежит микросхема ENC28J60.

511GqJ9-ivL._SX425_.jpg
Шилд Ethernet Arduino Nano Shield

Модуль точно так же имеет разъем RJ-45, слот для SD и в некоторых модификациях тоже оснащен PoE контроллером.

Как работает Ethernet

Подразумевается, что для проектов, связанных с подключением Arduino к сети вы должны обладать хотя бы общими знаниями в области сетевых  технологий. Сегодня можно без труда найти соответствующие материалы в интернете. Хотя мы не ставим себе целью написать учебник по Ethernet, но общие сведения могут оказаться полезными.

Сегодня Ethernet – ключевая и наиболее распространенная наряду с WiFi технология организации локальных сетей. В стандартной модели OSI она находится на канальном и физическом уровне, определяя подуровни управления доступом к среде и управления логическим каналом. Создателем Ethernet стала компания Xerox, ее инженер Роберт Метклаф создал технологию как инструмент подключения многих компьютеров к общим ресурсам в локальной сети. Официальным стандартом технология стала в 1982 году после появления спецификации IEEE802.3.

Сегодня существует несколько вариантов и модификаций Ethernet, отличающихся скоростными характеристиками и способом организации физического канала:

  • Ethernet. Скорость до 10Mb/s. Любые типы проводов (коаксиал, витая пара, оптоволокно).
  • Fast Ethernet. Скорость до 100Mb/s. Только витая пара или оптика.
  • Gigabit Ethernet. Скорость до 1Gb/s. . Только витая пара и оптика.
  • 10G Ethernet. Скорость до 10Gb/s. Естественно, тоже без коаксиала.

Существует еще с десяток различных групп и подгрупп стандарта, в этой статье мы не будем рассматривать их все.

Возможная схема Ethernet-сети

С практической точки зрения работа с Ethernet выглядит как возможность соединить определенным образом конечное оборудование с ближайшей точкой, имеющей выход в другие сегменты сети.  Чаще всего это роутер или маршрутизатор с доступом в интернет или к другим ресурсам локальной сети.

Если вы начинаете проект с Ethernet, то вам нужно будет понимать следующие базовые понятия, имеющие отношение к этой технологии:

  • Кабель. Как правило, это витая пара, реже – оптоволокно (ее подключить к арудино простым способом не получится).
  • Разъемом для подключения кабеля – RJ-45. На самом деле, стандарт для штекеров носит совсем другое название (8P8C), но “в народе” принято называть стандартный Ethernet разъем именно как RJ45. Следует отметить, что есть и другие стандарты – RJ-25, RJ-14 и т.п. Для подключения к ардуино через стандартные модули они не подойдут.
  • Сетевой Ethernet MAC-адрес. Это уникальный шестибайтовый идентификатор устройства в сети, который обычно прошивается в само устройство, но в некоторых случаях может быть изменен программно. Всего может быть задано 2 в 48 степени адресов, это триллионы разных вариантов (точнее, 281 474 976 710 656), так что пока их с головой хватает для создания действительно уникальных идентификаторов.

В подавляющем большинстве задач проект с Ардуино будет подключен к уже существующей Ethernet сети через стандартное оборудование. Т.е. вы просто берете модуль Ethernet, подключаете его к Ардуино, а затем вставляете сетевой кабель в этот самый модуль.  Все, что вам понадобится – правильно настроить в своем скетче ваш MAC адрес (его можно менять!) и прописать IP адрес устройств, к которым вы будете подключаться. Мы рассмотрим пример в разделе, посвященным программированию.

Как подключить модуль Ethernet к Arduino

Подключение модулей w5100 к ардуино осуществляется  через SPI. При наличии некоторого опыта работы c платформой никаких трудностей это вызвать не должно. В самом простом случае нужно просто “надеть” плату шилда, вставив в соответствующие разъемы платы Uno или Nano. В случае использования отдельного модуля подключить w5100 к ардуино можно через стандартные SPI-выводы.

Нужно помнить, что в Arduino Uno для SPI выделены пины 11, 12, 13. В Arduino Mega – 50, 51, 52. На шилде для Uno SS сигнал связан с 10 пином. На плате Mega за SS отвечает пин 53, но он не используется. Не смотря на этой, вам нужно обязательно установить его в режим OUTPUT с помощью функции pinMode.

Распиновка шилда с описанием элементов платы для Arduino  Uno представлена на следующем рисунке.

Схема шилда Arduino Ethernet Shield

После подключения внешнего модуля к арудино нужно будет подключить его к уже существующей сетевой инфраструктуре через витую пару с RJ45 разъемом. Причем подключать можно и к WiFi роутеру, что позволяет вашему проекту выходить на связь в беспроводном режиме (провод от ардуино до роутера все равно понадобится).

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

Программирование скетча для Ethernet модуля в Arduino

Создавая программу на ардуино для работы с сетью, вы всегда будете отправлять или получать какие-то данные. В зависимости от целей проекта ваше устройство может выступать и в качестве сервера, и в качестве клиента – все зависит от выбранной вами логики и структуры системы. Можно отправлять данные с датчиков и вашей ардуинки на удаленный сервер и получать указания от него. А можете сделать управляющий сервер, получающий данные от остальных устройств или от человека через Web-браузер, который уже будет выступать в качестве клиента.

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

Нельзя сказать, что библиотека написана безупречно, время от времени в ней находят очень сомнительные фрагменты кода, влияющие на производительность. Но для первых учебный проектов она подходит полностью. Для работы с картой памяти можно использовать встроенную библиотеку SD.

Сервер на Arduino Ethernet

Создаваемый Web-Сервер работает в полном соответствии с  НТТР протоколом. Основные функции сервера заключаются в отслеживании клиентских запросов и выполнении различных функций на основе принятых данных. А затем следует отправка непосредственно самого результата в виде НТМL кода. Пример скетча можно найти в Arduino IDE (Файл-Примеры). Ниже приведем лишь короткие фрагменты и описание ключевых моментов.

Работа с библиотекой разбивается на два этапа. Сначала мы создаем необходимые объекты и производим настройку. В процессе инициализации следует прописать MAC-адрес и IP, по которому пользователь будет получать доступ к серверу.

byte macAddress[] = {  0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF  };  IPAddress ipAddress (192, 168, 1, 10); // IP адрес зависит от ваших сетевых настроек    EthernetServer myServer(80); // Можно выбрать и другой порт    // ...  void setup() {  Serial.begin(9600);  // Подключились к Ethernet    Ethernet.begin(macAddress, ipAddress);  // Запустили сервер    server.begin();    Serial.print("server is at ");    Serial.println(Ethernet.localIP());  }    

Затем мы включаем бесконечный цикл, в котором постоянно проверяем наличие в очереди запросов от клиентов. Если запросы есть, то анализируем их и в зависимости от параметров формируем ответ. В принципе, мы реализуем логику обычного web-сервера, только все задачи по аутентификации, роутингу и генерации ответа приходится реализовывать самостоятельно. Дополнительный неудобства создают весьма скромные возможности встроенных библиотек по работе со строками.

void loop() {    // Проверяем, есть ли запросы    EthernetClient client = server.available();        if (client) {      // Запросы есть      Serial.println("Новый клиент!");      while (client.connected()) {        if (client.available()) {          char c = client.read();          Serial.write(c);          // ... Здесь идет разбор строки и описание логики ответа          client.println("HTTP/1.1 200 OK"); // Это пример кода для отправки клиенту данных.          // ...        }      }      // Запрос       // Даем немного времени на получение данных клиентом      delay(5);      // Закрываем коннект       client.stop();      Serial.println("Клиент отключился");      Ethernet.maintain();    } // if(client)  } // Loop

После того, как пользователь загрузил скетч и подключил его к компьютеру при помощи сетевого кабеля, сервер на ардуино ожидает команд. После того как пользователь перейдет по заданному IP адресу, на сервер попадает get запрос, который информирует о необходимости выдачи интернет-страницы. В задачу сервера входит формирование этой страницы и посыле ее на клиента обратно, после чего браузер сам перерабатывает НТМL код и отображает формы, таблицы и другой контент. Пользователь может выполнить какие-то действия в форме (например, отметив включение необходимых пинов) и они опять отправятся на Arduino-сервер. И так до бесконечности, пока будет работать система и не отвалится сеть.

Arduino Ethernet как клиент. Отправка данных на сервер

Если мы хотим отправлять данные через Ethernet подключение, то нужно использовать методы класса Client стандартной библиотеки Arduino. Процесс инициализации выглядит точно так же – мы указываем IP и МАК-адрес. Но создаем объект клиента, а не сервера.

byte macAddress[] = {  0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF  };  IPAddress ipAddress (192, 168, 1, 10); // IP адрес зависит от ваших сетевых настроек    EthernetClient client;

Следующим этапом является подключение и отправка данных на сервер

void setup() {    Serial.begin(9600);      // Подключаемя через Ethernet:    if (Ethernet.begin(mac) == 0) {      Ethernet.begin(macAddress, ipAddress);    }    delay(1000);    Serial.println("connecting...");      if (client.connect(server, 80)) {      Serial.println("connected");      // Make a HTTP request:      client.println("GET /search?q=arduino HTTP/1.1");      client.println("Host: www.arduinomaster.ru");      client.println("Connection: close");      client.println();    } else {      Serial.println("connection failed");    }  }  

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

void loop() {    if (client.available()) {      char c = client.read();      Serial.print(c);    }      if (!client.connected()) {      Serial.println();      Serial.println("disconnecting.");      client.stop();        while (true);    }  }  

Все приведенные фрагменты скетчей не будут работать по отдельности. Вы можете получить полный работающий код для Ethernet модуля бесплатно в самой среде Arduino IDE. На рисунке показано, где именно это можно сделать.

Примеры скетчей для библиотеки Ethernet в Arduino IDE

Выводы

В данной статье была рассмотрена возможность управления платой Arduino через интернет посредством Etherent модуля на базе w5100. Как мы убедились, подключение модуля и программирование скетча не представляет существенной сложности. Главное, это правильно определиться со структурой проекта, определить, что будет являться сервером, а что клиентом, как будет осуществлено подключение к интернету.

Самый удобный и быстрый способ подключения модуля – использовать готовый Ethernet Shield для Arduino Uno или  Nano. Подключение осуществляется через интерфейс SPI, который есть в любых платах платформы. Взяв за основу уже готовые библиотеки и скетчи из примеров Arduino IDE можно создать приложение любой сложности. Но для этого вам обязательно понадобятся навыки программирования и понимания принципов работы существующих сетевых протоколов. Будем надеяться, что наша статья помогла вам сделать первый шаг.

В этой статье я опишу ситуацию с которой столкнулся во время разработки проекта Arduino Mega Server. Суть дела заключается в том, что существует такая библиотека Arduino Ethernet Library, написанная для поддержки сетевой платы Ethernet Shield на чипе W5100. Это стандартная плата и стандартная библиотека, которая многие годы поставляется в комплекте со средой разработки Arduino. И эта библиотека является основой для всех проектов, использующих обмен информацией по проводной сети. Так вот, оказалось, что эта библиотека попросту профнепригодна. На ней в принципе невозможно построить нормальное сетевое взаимодействие. Можно только «баловаться» одиночными запросами и ответами. Ни о каком построении серверов на базе этой библиотеки речь не может идти. Почему? Потому, что эта библиотека имеет встроенный «баг», который подвешивает неодиночные запросы на время от трёх до десяти секунд и более. Баг именно встроенный и автор библиотеки об этом знал, о чём свидетельствует его пометки в исходниках (но об этом несколько позже). Тут нужно понимать, что библиотека, поставляемая с официальной средой разработки является неким стандартом и если у вас не работает проект, то вы будете искать дефект где угодно, только не в стандартной библиотеке, ведь ей много лет и ею пользуются сотни тысяч, если не миллионы людей. Не могут же они все ошибаться?

Почему в природе не существует серверов на Arduino

Разработка проекта шла своим чередом и дело, наконец, дошло до оптимизации кода и увеличения скорости работы сервера и тут я столкнулся с такой ситуацией: приходящие запросы от браузера принимались и «подвешивались» на время от трёх до десяти секунд, в среднем и до двадцати и более секунд при более интенсивном обмене. Вот скриншот, на котором видно, что аномальная задержка ответов сервера «гуляет» по различным запросам. Когда я стал разбираться, то выяснилось, что серверу ничто не мешает ответить, но, тем не менее, запрос «висит» девять с лишним секунд, а при другой итерации этот же запрос висит уже около трёх секунд. Подобные наблюдения повергли меня в глубокую задумчивость и я перекопал весь код сервера (заодно размялся) но дефектов не обнаружил и вся логика вела к «святая святых» библиотеке Arduino Ethernet Library. Но крамольную мысль, что виновата стандартная библиотека я отбрасывал, как неадекватную. Ведь с библиотекой работают не только пользователи, но и огромное количество профессиональных разработчиков. Не могут же они все не видеть столь очевидных вещей? Забегая вперёд, скажу, что когда выяснилось, что дело именно в стандартной библиотеке, стало понятно почему в природе не существует (нормальных) серверов на Arduino. Потому, что на базе стандартной библиотеки (с которой работает большинство разработчиков) построить сервер в принципе невозможно. Задержка ответа в десять секунд и более выводит сервер из категории собственно серверов и делает его просто (тормозной) игрушкой. Промежуточный вывод. Это не Ардуино не подходит для построения серверов, а сетевая библиотека ставит крест на очень интересном классе устройств.

Анатомия проблемы

Теперь от лирики давайте перейдём к техническому описанию проблемы и её практическому решению. Для тех, кто не в курсе, стандартное место расположения библиотеки (в Windows): arduinolibrariesEthernet И первое, что мы рассмотрим, это функция из файла EthernetServer.cpp

EthernetClient EthernetServer::available() {   accept();    for (int sock = 0; sock < MAX_SOCK_NUM; sock++) {     EthernetClient client(sock);     if (EthernetClass::_server_port[sock] == _port &&         (client.status() == SnSR::ESTABLISHED ||          client.status() == SnSR::CLOSE_WAIT)) {       if (client.available()) {         // XXX: don't always pick the lowest numbered socket.         return client;       }     }   }   return EthernetClient(MAX_SOCK_NUM); }

Когда я преодолел психологический барьер (под давлением логики) и начал искать дефект в Ethernet Library я начал именно с этой функции. Заметил я и странный комментарий автора, но не придал ему значения. Перелопатив всю библиотеку, я опять, но уже через пару дней и сильно продвинувшись в сетевых технологиях, вернулся к этой функции потому, что логика подсказывала, что проблема именно здесь и более внимательно посмотрел на комментарий.

         // XXX: don't always pick the lowest numbered socket.  

Друзья, там всё написано открытым текстом. В вольном переводе это звучит примерно так «это работает, но не всегда». Подождите минуточку, что значит «не всегда»? У нас же не воскресный клуб по игре в лото. А когда не работает, то что? А вот когда «не работает» и начинаются проблемы с задержкой в десять секунд. И автор об этом определённо знал, о чём свидетельствует самооценка его творения — три икса. Без комментариев. Эта библиотека является основой для многих клонов и, внимание, эти три икса кочуют из одного проекта в другой. Если вы разработчик, то не заметить эту проблему можно только не разу не протестировав сетевой обмен. Тоже без комментариев. Для тех, кто плохо разбирается в коде поясню суть проблемы простыми словами. Цикл перебирает сокеты и, как только находит подходящий, возвращает клиента, а остальных просто игнорирует. И они висят по десять секунд, пока «карты благоприятно не лягут».

Решение проблемы

Поняв причину проблемы, мы конечно не остановимся на этом и попробуем её решить. Для начала давайте перепишем функцию таким образом, чтобы получение или не получение сокета не зависело от воли случая и происходило всегда, если есть свободный. Это решит две проблемы:

  • запросы не будут зависать
  • «последовательные» запросы превратятся в «параллельные», что значительно ускорит работу

Итак, код новой функции:

EthernetClient EthernetServer::available_(int sock) {   accept_(sock);   EthernetClient client(sock);   if (EthernetClass::_server_port[sock] == _port &&       (client.status() == SnSR::ESTABLISHED ||        client.status() == SnSR::CLOSE_WAIT)) {     if (client.available()) {       return client;     }   }   return EthernetClient(MAX_SOCK_NUM); } 

Убираем цикл, явным образом указываем сокет и ничего не теряем — если он свободен, то мы гарантированно получаем клиента (если он нам подходит). То же самое «по цепочке» проделываем с кодом функции accept, убираем цикл и явно указываем сокет.

void EthernetServer::accept_(int sock) {   int listening = 0;   EthernetClient client(sock);    if (EthernetClass::_server_port[sock] == _port) {     if (client.status() == SnSR::LISTEN) {       listening = 1;     }      else if (client.status() == SnSR::CLOSE_WAIT && !client.available()) {       client.stop();     }   }     if (!listening) {     //begin();     begin_(sock); // added   } } 

И не забываем поправить файл EthernetServer.h

class EthernetServer :  public Server { private:   uint16_t _port;   //void accept();   void accept_(int sock); public:   EthernetServer(uint16_t);   //EthernetClient available();   EthernetClient available_(int sock);   virtual void begin();   virtual void begin_(int sock);   virtual size_t write(uint8_t);   virtual size_t write(const uint8_t *buf, size_t size);   using Print::write; }; 

Вот, собственно и всё. Мы внесли изменения в стандартную библиотеку и поведение сервера кардинально изменилось. Если раньше всё работало очень медленно, за гранью любых представление о юзабилити, то теперь скорость загрузки страниц значительно возросла и стала вполне приемлемой для нормального использования. Обратите внимание на уменьшение задержки в 3 — 5 раз для разных файлов и совсем другой характер загрузки, что очень заметно при практическом пользовании.Полный код изменённого EthernetServer.cppПолный код изменённого EthernetServer.h

Оставшиеся проблемы

В таком виде сервер из демонстрации идеи переходит в категорию вещей, которыми можно пользоваться в повседневной жизни, но остались некоторые проблемы. Как вы видите на скриншоте ещё присутствует не принципиальная, но неприятная задержка в три секунды, которой не должно быть. Библиотека написана так, что мест, где код работает не так, как нужно, очень много и если вы квалифицированный разработчик, то ваша помощь в установлении причины трёхсекундной задержки будет очень ценной. И для проекта Arduino Mega Server и для всех пользователей Arduino.

Последний момент

Поскольку мы изменили код стандартной библиотеки, то и вызывать её функции нужно несколько иным способом. Здесь я привожу код, который реально работает и который обеспечивал работу AMS на скриншоте выше.

  for (int sock = 0; sock < MAX_SOCK_NUM; sock++) {     EthernetClient sclient = server.available_(sock);     serverWorks2(sclient);   } 

Здесь задача перебора сокетов перенесена на уровень клиентского скетча и, что самое главное, и в чём смысл всего вышесказанного, не происходит «подвисания» запросов. И функция собственно сервера:

void serverWorks2(EthernetClient sclient) { ... } 

С полным кодом сервера вы можете ознакомиться, скачав дистрибутив с официального сайта проекта Arduino Mega Server. А задать возникшие вопросы можно на форуме. Осталось решить последнюю проблему трёхсекундной задержки и у нас будет настоящий, быстро работающий сервер на Ардуино. Кстати, скоро выйдет новая версия AMS со всеми исправлениями и улучшениями в которой решена одна из самых актуальных проблем — автономная работа без поддержки сервера MajorDoMo. И возможным это стало во многом благодаря тем исправлениям стандартной библиотеки Arduino Ethernet Library о которых я вам сейчас рассказал.Дополнение. Открыт канал на Youtube и вот промо ролик Arduino Mega Server, который демонстрирует работу с реальной системой.

Рассмотрим управление устройствами на расстоянии на базе Arduino Ethernet Shield, какие бывают, преимущества и недостатки.

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

Как уже понятно, для связи Ардуино по LAN сети нужна специальная плата расширения.

Так выглядит шилд Ethernet Shield w5100:

image001.jpg

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

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

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

image002-1.jpg

На шилде расположен слот для SD-карты – вы можете получить доступ к данным через сеть. Таким образом, вы получите домашнее облако на Arduino.

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

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

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

Шилд W5100 довольно громоздкий, и в связке с миниатюрными pro mini и nano выглядит нелепо, да и далеко не всегда нужна на шилде карта памяти.

Вы можете обратить свое внимание на модель arduino Ethernet модуля W5500, тоже на базе чипа WIZnet, как и предыдущий вариант.

image003.jpg

Связь с микроконтроллером осуществляется по тому же SPI интерфейсу, а сам чип построен на Cortex M0. Чип W5500 меньше греется и имеет большую мощность, нежели у W5100 (значительно сильнее грелся).

В отличие от младших чипов, добавлен режим параллельной 8 битной шины. Но и ток потребления 160 мА при работе на полной скорости – 100 м/бит.

Другой вариант миниатюрного шилда – это arduino enc28j60. Главное его преимущество – это то, что он дешевле в 2-3 раза, чем W5500, например.

Я сделал акцент на том, что это главное преимущество, потому что в целом, если есть возможность, лучше использовать W5500, т. к. на них в сети больше информации по работе и настройке, а также есть различные проекты.

28J60 отлично подойдёт для интернета, для простейших мелких задач, типа Ethernet термометра. Микросхема произведена компанией Microchip, работает по тому же SPI интерфейсу, что и предыдущие. Библиотеки для работы с ней отлично подходят для Ардуино на 168/328 ATmega, в их числе Uno, Nano, Pro Mini. Для Mega нужно правильно назначить пины.

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

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

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

image005-1.jpg

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

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

Ардуино – одна из самых дешевых основ для проекта умного дома. Кроме домашнего облака и доступа к файлам можно реализовать удаленное управление исполнительными механизмами любых типов.

К таким проектам можно отнести и другую автоматизацию, например, управление поливом, освещением и проветриванием в теплице.

Одно дело, когда вы находитесь в непосредственной близости к управляемой системе, но что делать, если ваша теплица находится на участке загородного дома?

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

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

image006-1.jpg

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

image007-1.jpg

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

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

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

image009.jpg

С Ардуино он может взаимодействовать и передавать как сообщения от неё в виде SMS, так и команды к микроконтроллеру после принятия сообщения от вас. Команды очень просты, например:

AT+CMGS=»+79123456789″;

Команда выше отправит СМС на указанный номер, точка с запятой обязательны.

image010.jpg

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

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

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

Используемые источники:

  • https://arduinomaster.ru/datchiki-arduino/w5100-modul-arduino-ethernet/
  • https://habr.com/post/382565/
  • https://arduinoplus.ru/arduino-ethernet-upravlyaem-platoj-na-rasstoyanii/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации