Мечтали ли вы когда-нибудь, чтобы две Arduino "поболтали" друг с другом по сети, словно старые добрые друзья, но без лишних церемоний? Сегодня мы расскажем, как именно это сделать! Погрузимся в мир Ethernet Shield, протоколов TCP и UDP, библиотек и даже познакомимся с сервисом iocontrol, который поможет превратить ваши Arduino в настоящих сетевых магов.

Начнём с главного: что нам понадобится?

Чтобы две Arduino обменивались данными через Ethernet, нужен "мост" — Ethernet Shield. Наиболее популярные модели:

Модуль Особенности
ENC28J60 Программная реализация TCP/IP стека, дешевле, но требует усилий в программировании
W5100 / W5500 Аппаратный TCP/IP стек, стабильнее и проще в использовании

Из опыта многих энтузиастов, модуль W5100 или его современный собрат W5500 — надежный выбор, если хочется поменьше шаманства с сетевыми протоколами.

Клиент и сервер: кто есть кто?

В сетевых разговорах принято иметь ведущего (сервер) и слушателя (клиента). В нашем случае, одна Arduino будет сервером — она ждёт команды или данные, а вторая — клиентом, который их отправляет.

Но как организовать этот диалог? Есть два варианта:

  • TCP (Transmission Control Protocol) — как телефонный звонок, гарантирует доставку и порядок сообщений.
  • UDP (User Datagram Protocol) — как открытка по почте, может потерять часть сообщений, зато быстрее и проще.

В одном из популярных проектов для передачи простых "истина/ложь" (например, замкнута кнопка или нет), использовали UDP, потому что не нужно ждать подтверждения, а скорость — главное.

Пример простого скетча для Arduino с Ethernet Shield W5100

Для сервера (принимающего Arduino):

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,101);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
EthernetServer server(23); // Порт 23 для Telnet

void setup() {
  Serial.begin(115200);
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("Server IP: ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  EthernetClient client = server.available();
  if (client) {
    client.print("hello");
    client.println(" world");
  }
}

Для клиента (отправляющего Arduino):

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,102);
IPAddress gateway(192,168,1,1);
IPAddress server(192,168,1,101);
EthernetClient client;

void setup() {
  Serial.begin(115200);
  Ethernet.begin(mac, ip, gateway, subnet);
  delay(1000);
  Serial.println("Connecting...");
  if (client.connect(server, 23)) {
    Serial.println("Connected to server");
  } else {
    Serial.println("Connection failed");
  }
}

void loop() {
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  if (!client.connected()) {
    Serial.println("\nDisconnecting.");
    client.stop();
    delay(1000);
  }
}

Если после запуска у вас появляется надпись "Disconnecting", не отчаивайтесь — это частая ситуация, которую можно исправить настройками и проверкой кода.

Чем может помочь сервис iocontrol?

Если хотите это ещё и иметь удобный онлайн интерфейс — iocontrol.ru к вашим услугам. Этот сервис позволяет создать "панель управления", где вы можете создавать переменные, назначать им типы (например, кнопка или светодиод) и управлять устройствами удалённо через интернет.

Что нужно сделать?

  1. Создать панель и задать уникальное имя.
  2. Добавить переменную, например, myButton — тип "кнопка".
  3. На Arduino установить Ethernet Shield W5500 и библиотеку iocontrol.
  4. Сгенерировать скетч с сайта, указать параметры: MAC, IP, панель, переменные.
  5. Дописать код для работы с кнопкой или светодиодом.

Пример кода для кнопки:

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

#define BUT 2

const char* myPanelName = "myNewPanel";
const char* VarName_myButton = "myButton";

EthernetClient client;
iocontrol mypanel(myPanelName, client);

byte mac[] = { 0xDE, 0xAD, 0xDE, 0xAD, 0xFA, 0xCE };
bool button = false;
int status;

void setup() {
  Serial.begin(9600);
  Ethernet.init(10);
  Ethernet.begin(mac);
  status = mypanel.begin();
  Serial.println("Status mypanel.begin = " + String(status));
}

void loop() {
  status = mypanel.readUpdate();
  if (status == OK) {
    Serial.println("------- Read OK -------");
  }

  if (digitalRead(BUT)) {
    delay(100);
    if (digitalRead(BUT)) button = !button;
  }

  mypanel.write(VarName_myButton, button);
  status = mypanel.writeUpdate();

  if (status == OK) {
    Serial.println("------- Write OK -------");
  }
}

А для светодиода — аналогично, только он будет реагировать на изменение myButton из сервиса.

Особенности и подводные камни Ethernet модулей

Модуль Особенности Совет
ENC28J60 Стек TCP/IP реализован программно Требует хороших библиотек, может быть нестабилен
W5100/W5500 Аппаратная реализация стека Более стабильный и простой в настройке

Если у вас стоит ENC28J60, не переживайте — с помощью библиотеки arduino_uip можно добиться приличной работы. Главное — выбрать правильные примеры и быть готовым к экспериментам.

Немного про IP, MAC и шлюзы

Каждое устройство в сети должно иметь уникальный MAC-адрес и IP-адрес. MAC — это как паспорт, IP — как домашний адрес.

При настройке Arduino важно:

  • Уникально задать MAC (например, { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED } и { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE } для двух плат).
  • Установить IP из вашей подсети (например, 192.168.1.x).
  • Настроить шлюз (gateway) — обычно это адрес вашего роутера, например, 192.168.1.1.

Советы для успешного соединения Arduino по Ethernet

  • Проверяйте, что кабели и роутеры работают исправно.
  • Используйте статические IP, если DHCP не работает или возникают сложности.
  • Начинайте с простых примеров из библиотек.
  • Если используете UDP, будьте готовы к потере пакетов — не ждите подтверждения.
  • Обращайте внимание на совместимость библиотек с вашим Shield.
  • Следите за состоянием подключения и реализуйте повторные попытки соединения.

FAQ

В: Можно ли соединить Arduino напрямую, без роутера?
О: Да, если использовать кроссовый кабель Ethernet и настроить IP вручную.

В: Как узнать MAC-адрес моего Ethernet Shield?
О: Обычно он указан на этикетке или задаётся в скетче вручную.

В: Что делать, если пакеты не доходят?
О: Проверить настройки IP, MAC, убедиться, что устройства в одной подсети, проверить кабели.

В: Можно ли использовать Wi-Fi вместо Ethernet?
О: Да, но это другая история и другой набор модулей.


Чек-лист для настройки связи Arduino по Ethernet

  • [ ] Выбрана подходящая плата и Ethernet Shield (рекомендуется W5100/W5500)
  • [ ] Уникальные MAC-адреса для каждого устройства
  • [ ] IP-адреса находятся в одной подсети и правильно настроен шлюз
  • [ ] Библиотеки Ethernet и iocontrol установлены и протестированы
  • [ ] Настроен клиент-серверный обмен данными (TCP или UDP)
  • [ ] Проведена проверка связи через Serial монитор
  • [ ] Оптимизирована логика обработки данных и повторных попыток
  • [ ] Рассмотрено использование сервиса iocontrol для удобного управления

Дружить по сети — это как танцевать парный танец: нужно выучить шаги, слушать друг друга и не наступать на ноги. Теперь, вооружившись знаниями и примерами, ваши Arduino готовы к этому танцу!