RU
ARDUINO - СВЯЗЬ С ИСПОЛЬЗОВАНИЕМ СЕТИ ETHERNET
Вот уже несколько лет, как создание разветвленных компьютерных сетей перестало служить только для соединения компьютеров.

Падение цен и увеличение вычислительной мощности небольших микроконтроллеров положили начало бурному процессу подключения к локальным сетям Ethenet или даже глобальной сети Интернет маломощных устройств, в основном выполняющих функции контроля, управления и измерения. Более того, эти решения стали появляться и в профессиональных промышленных сетях, постепенно вытесняя старые системы на основе RS232 и его производных. Таким образом, в начале XXI века наступила эра так называемого Интернета вещей (англ. Internet of Things – IoT). Хотя в настоящее время на рынке IoT преобладают устройства, коммуницирующие между собой в основном с помощью беспроводных сетей и стандартов Wi-Fi, ZigBee, BLE или Z-Wave, по-прежнему во многих аппаратных решениях (в основном из т.н. сегмента IIoT – Industrial Internet of Things), требующих надежной передачи и безопасности данных, одним из самых популярных решений по-прежнему остается сеть Ethernet. Создатели платформы Arduino не оставили без ответа требование разработчиков устройств IIoT и расширили стандартное предложение модулей Arduino платами расширения типа Ethernet Shield 2, адресованными отдельным пользователям, или Arduino MKR ETH SHIELD для профессиональных решений на базе контроллеров WIZnet W5100/W5200/W5500 и интегральные схемы MAC и PHY в одной интегральной схеме. Это предложение было довольно быстро расширено независимыми производителями новыми и гораздо более дешевыми модулями на основе популярных схем ENC28J60. В этой статье дана краткая характеристика обоим решениям: официальному, основанному на схемах серии W5x00, а также разрабатываемым главным образом сообществом Open Source/Open Hardware решениям на основе модулей ENC28J60.

Связь с использованием модулей WIZnet W5x00 и библиотеки Arduino Ethernet

Несомненным преимуществом официальных модулей на основе схем серии W5x00 (в т.ч. их аппаратных аналогов, например, плат расширения OKYSTAR OKY2102 или DFROBOT DFR0125) является полная программная поддержка в виде библиотеки Ethernet, встроенной в стек Arduino. Тем самым, пользователь может приступить к созданию программы сразу после запуска Arduino IDE, без необходимости устанавливать дополнительные программные пакеты.

Рисунок 1. Модули OKY2102 (слева) и DFR0125 (справа), оснащенные контроллером WIZnet W5100

В зависимости от схемы WIZnet и объема доступной памяти RAM библиотека Ethernet поддерживает максимум четыре (для схемы W5100 и памяти RAM <= 2 кБ) или восемь (схемы W5200 и W5500) параллельных выходящих/входящих соединений. Программный интерфейс библиотеки разделен на пять классов, сгруппированных по отдельным функциональностям. За инициализацию библиотеки и настройку сетевых параметров (включая IP-адрес, адрес подсети или настройки шлюза доступа). Для нужд IP-адресации создан класс IPAddress. Чтобы запустить простое серверное приложение на стороне Arduino, необходимо будет использовать класс EthernetServer, который позволяет чтение и запись данных со всех подключенных устройств. Взаимодополняющим классом является класс EthernetClient, который позволяет с помощью нескольких простых вызовов подготовить функционального сетевого клиента, выполняющего операции записи и чтения данных с сервера. Для связи по протоколу UDP библиотека Ethernet предоставляет класс EthernetUDP. Полное описание классов и методов можно найти по адресу:

Перейти на сайт Arduino

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

Код серверного приложения начинает добавлять файлы заголовков, необходимые для установления связи SPI (модули WIZnet обмениваются данными с микроконтроллером, используя этот протокол), а также файлы заголовков библиотеки Ethernet:

#include <SPI.h>
#include <Ethernet.h>

Следующим шагом является настройка сетевых параметров (MAC-адрес контроллера, IP-адрес шлюза доступа и маски подсети), а также создание сервера для прослушивания порта номер 23 (порт по умолчанию для протокола Telnet):

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

IPAddress ip(192,168,1, 177);
IPAddress gateway(192,168,1, 1);
IPAddress subnet(255, 255, 0, 0);

EthernetServer server(23);

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

void setup() {

  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();

  Serial.begin(9600);
   while (!Serial) {
  }

  Serial.print("Chat server address:");
  Serial.println(Ethernet.localIP());
}

Основной цикл loop() ожидает соединения от клиента и проверяет наличие данных для считывания. При получении данных он отправляет их без изменений клиенту, выполняя таким образом простую функцию echo:

void loop() {

  EthernetClient client = server.available();

  if (client) {
    if (!alreadyConnected) {
      client.flush();    
      Serial.println("We have a new client");
      client.println("Hello, client!"); 
      alreadyConnected = true;
    } 

    if (client.available() > 0) {

      char thisChar = client.read();

      server.write(thisChar);
      Serial.write(thisChar);
    }
  }
}

Правильность работы этого приложения можно протестировать, используя произвольного клиента протокола Telnet (например, программу Putty в системе Windows или команду telnet в системе Linux) или используя еще один комплект Arduino и классы EthernetClient.

Связь с использованием модулей ENC28J60 и внешних библиотек

Альтернативным решением для официально поддерживаемых схем WIZnet W5x00 являются модули на базе контроллера ENC28J60 (например, OKYSTAR OKY3486 или ETH CLICK). Благодаря более низкой цене и простоте ручного монтажа корпуса (в отличие от схем W5x00, содержащихся в 80-контактных корпусах LQFP, контроллер ENC28J60 предлагается в 28-контактных корпусах типа SSOP, SOIC, QFN, а также в предназначенном для сквозного монтажа корпусе SPDIP). Эта схема очень популярна среди электронщиков-любителей.

Рисунок 2. Модули OKY3486 (слева) и ETH CLICK (справа), оснащенные контроллером ENC28J60

Несмотря на отсутствие официальной поддержки со стороны Arduino в распоряжение программистов передано много библиотек типа open source, обеспечивающих быструю интеграцию схем ENC28J60 с программным обеспечением. Особое внимание следует уделить библиотеке UIPEthernet, а также предоставляемой по лицензии GPLv2 библиотеке EtherCard. Несомненным преимуществом первого из упомянутых проектов является совместимость интерфейса API с официальной библиотекой Arduino Ethernet, что позволяет сделать процесс разработки приложений независимым от выборов, сделанных между схемами W5x00 и схемой ENC28J60 на аппаратном уровне. Второй из проектов, EtherCard, реализует независимый программный интерфейс, который, в зависимости от предпочтений программиста, может оказаться интересной альтернативой. Как и в случае с библиотеки Arduino Ethernet, реализация довольно сложной функциональности (например, реализация DHCP-клиента) может быть выполнена в несколько строк кода:

#include <EtherCard.h>

static byte mymac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

byte Ethernet::buffer[700];

void setup () {

  Serial.begin(57600);
  Serial.println(F("
[testDHCP]"));

  if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
    Serial.println(F("Failed to access Ethernet controller"));

  Serial.println(F("Setting up DHCP"));
  if (!ether.dhcpSetup())
    Serial.println(F("DHCP failed"));

  ether.printIp("My IP: ", ether.myip);
  ether.printIp("Netmask: ", ether.netmask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);
}

void loop () {
  ether.packetLoop(ether.packetReceive());
}

 

https://www.tme.eu/ru/news/library-articles/page/43654/Arduino-sviaz-s-ispolzovaniem-seti-Ethernet/

 

 

/ 2021091601 / Ембеддед / Transfer Multisort Elektronik Sp. z o.o. / четверг 16. сентября 2021 / ---

1 > 34539