Как подключить ethernet ENC28J60 Arduino

При проектировании автономных механизмов или создании системы «Умный дом» у многих может возникнуть необходимость подключить платформу Arduino к ENC28J60 Ethernet LAN / Network Module. Это даст возможность управлять Arduino по локальной сети через компьютер или мобильное устройство (если есть точка доступа Wi-Fi). Рассмотрим в этой статье подключение HR911105A к Arduino Uno.

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

Чтобы справиться с этой задачей мы подготовили пошаговую инструкцию по подключению Arduino Uno к модулю HR911105A 15/10. Вы узнаете к каким разъемам подключается порт и увидите видео с работающей схемой Ethernet модуля HanRun HR911105A и Arduino Uno. Итак, нам необходимо для занятия нам необходима плата Arduino, Ethernet порт HanRun и Wi-Fi роутер для организации локальной сети.

Подключение модуля HR911105A к Arduino
Необходимые детали для подключения модуля HR911105A к Arduino

Следуйте пошаговой инструкции и вы сможете управлять включением светодиодов по локальной сети через компьютер. А если у роутера есть возможность создать точку доступа Wi-Fi, то управление может быть доступно через любое мобильное устройство (телефон или планшет). Схема подключения LAN модуля HanRun HR911105A и Arduino, а также работающий скетч управления Ардуино через Wi-Fi представлены ниже.

Подключение модуля HR911105A к Arduino Uno

Для этого занятия потребуется:

  • Arduino Uno / Arduino Nano / Arduino Mega;
  • Ethernet порт HanRun HR911105A 15/10;
  • макетная плата;
  • провода «папа-папа» и «папа-мама»;
  • 3 светодиода;
  • 3 резистора на 10 кОм;
  • роутер и LAN-кабель.

Соедините плату Arduino Uno и HR911105A, как на фото ниже. Обратите внимание, что 10 контактный модуль Ethernet ENC28J60 Enternet HR911105A питается от разъема 3,3 V, а 12 контактный модуль от 5V. Кроме того, обозначения разъемов на HanRun HR911105A могут быть изменены производителем, например, ST — вместо SO. Соединение проводов с контактами должно быть качественным.

Схема подключения HR911105A к Ардуино
Схема подключения HR911105A к Ардуино Уно
ENC28J60 Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
5V / 3.3V 5V / 3.3V 5V / 3.3V 5V / 3.3V
SCK 13 (SCK) 13 (SCK) 52 (SCK)
SO 12 (MISO) 12 (MISO) 50 (MISO)
ST 11(MOSI) 11 (MOSI) 51 (MOSI)
CS 10 (SS) 10 (SS) 53 (SS)

Далее собираем на макетной плате схему из трех светодиодов и резисторов. Светодиоды соединяются с разъемами 3, 4, 5 на плате Ардуино. При желании вы можете подключить RGB-светодиод к Ардуино или увеличить количество светодиодов, сделав при этом необходимые изменения в скетче для управления Ардуино через wifi.

Собираем схему для управления Ардуино
Не забывайте про полярность (длинная ножка светодиода — плюс)

После сборки электрической схемы необходимо загрузить библиотеку для работы с HanRun HR911105A. Библиотеки служат для облегчения кода. Это могут быть драйвера к дополнительному оборудованию или часто используемые функции. В программе Arduino IDE уже есть набор стандартных библиотек, которые часто используются. Но в нашем случае требуется загрузить новые библиотеки (скачать архив) с Google Диск.

Распаковываем архив библиотеки Ардуино
Распакуйте архив с библиотекой в папку C:\Program Files\Arduino\libraries

Откройте программу Arduino IDE и проверьте установку библиотеки. Заходите в меню «Файл — Образцы», после стандартных библиотек должна появиться библиотека «ethercard». Очень часто библиотеки содержат в себе несколько готовых скетчей.

Загружаем библиотеку для работы с HanRun
Проверьте установку библиотеки после открытия программы Arduino IDE

Из-за большого объема кода приведем лишь небольшой отрывок скетча. Для оформления интернет страницы в программе используются HTML тэги. Скачайте готовый скетч здесь и загрузите программу в микроконтроллер.

Счетч для Arduino и модуля HR911105A


#include "EtherCard.h"

static byte mymac[] = {0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A }; // MAC Address
static byte myip[] = {192, 168, 1, 55 }; // IP адрес страницы
byte Ethernet::buffer[1200]; BufferFiller bfill;

int LedPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
boolean PinStatus[] = {1, 2, 3, 4, 5, 6, 7, 8};

const char http_OK[] PROGMEM =
  "HTTP/1.0 200 OK\r\n"
  "Content-Type: text/html\r\n"
  "Pragma: no-cache\r\n\r\n";

const char http_Found[] PROGMEM =
  "HTTP/1.0 302 Found\r\n"
  "Location: /\r\n\r\n";

const char http_Unauthorized[] PROGMEM =
  "HTTP/1.0 401 Unauthorized\r\n"
  "Content-Type: text/html\r\n\r\n"
  "<h1>401 Unauthorized</h1>";

// оформление Web страницы
void homePage() {
  bfill.emit_p(PSTR("$F"
  "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>"
  "<meta name='viewport' content='width=device-width, initial-scale=1.0'>"
  "<title>Управление Ардуино УНО</title>"
  "<h1 style='color:#0ea6f2'>Управление Ардуино</h1>"
  "<font size='3em'>"
  "<font style='display:none;'>Светодиод 0: <a href='?ArduinoPIN1=$F'>$F</a></font>"
  "Светодиод 1: <a href='?ArduinoPIN2=$F'>$F</a><br /><br />"
  "Светодиод 2: <a href='?ArduinoPIN3=$F'>$F</a><br /><br />"
  "Светодиод 3: <a href='?ArduinoPIN4=$F'>$F</a><br /><br />"
  "</font>"),

  http_OK,
  PinStatus[1] ? PSTR("off") : PSTR("on"),
  PinStatus[1] ? PSTR("<font color='green'>ON</font>") : PSTR("<font color='red'>OFF</font>"),
  PinStatus[2] ? PSTR("off") : PSTR("on"),
  PinStatus[2] ? PSTR("<font color='green'>ON</font>") : PSTR("<font color='red'>OFF</font>"),
  PinStatus[3] ? PSTR("off") : PSTR("on"),
  PinStatus[3] ? PSTR("<font color='green'>ON</font>") : PSTR("<font color='red'>OFF</font>"),
  PinStatus[4] ? PSTR("off") : PSTR("on"),
  PinStatus[4] ? PSTR("<font color='green'>ON</font>") : PSTR("<font color='red'>OFF</font>"));
}

void setup() {
  Serial.begin(9600);

  if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0);
  if (!ether.dhcpSetup());
  // выводим на монитор порта IP, который присвоил роутер для Ардуино
  ether.printIp("My Router IP: ", ether.myip);
  // подменяем динамический IP на постоянный
  ether.staticSetup(myip);
  // выводим на монитор порта новый статический IP 
  ether.printIp("My SET IP: ", ether.myip);

  for (int i = 2; i <= 5; i++) {
    pinMode(LedPins[i], OUTPUT);
    PinStatus[i] = false;
  }
}

void loop() {
  delay(1);
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);

  if (pos) {
    bfill = ether.tcpOffset();
    char *data = (char *) Ethernet::buffer + pos;
    if (strncmp("GET /", data, 5) != 0) {
      bfill.emit_p(http_Unauthorized);
    }
    else {

      data += 5;
      if (data[0] == ' ') {
        homePage(); // если обнаружены изменения на станице, запускаем функцию
        for (int i = 2; i <= 5; i++) { digitalWrite(LedPins[i], PinStatus[i + 1]); }
      }

      // "16" = количество символов в строке "?ArduinoPIN1=on "

      else if (strncmp("?ArduinoPIN1=on ", data, 16) == 0) {
        PinStatus[1] = true;
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN2=on ", data, 16) == 0) {
        PinStatus[2] = true;
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN3=on ", data, 16) == 0) {
        PinStatus[3] = true;
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN4=on ", data, 16) == 0) {
        PinStatus[4] = true;
        bfill.emit_p(http_Found);
      }

      // "17" = количество символов в строке "?ArduinoPIN1=off "

      else if (strncmp("?ArduinoPIN1=off ", data, 17) == 0) {
        PinStatus[1] = false;
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN2=off ", data, 17) == 0) {
        PinStatus[2] = false;
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN3=off ", data, 17) == 0) {
        PinStatus[3] = false;
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN4=off ", data, 17) == 0) {
        PinStatus[4] = false;
        bfill.emit_p(http_Found);
      }

      else { bfill.emit_p(http_Unauthorized); }
    }
    ether.httpServerReply(bfill.position());
  }
}

Пояснения к коду:

  1. этой строчкой byte Ethernet::buffer[1200]; мы освободили память в микроконтроллере для буфера обмена. При увеличении данных на Web странице необходимо увеличить буфер, чтобы не происходило «зависания»;
  2. включение/выключение светодиодов происходит в зависимости от количества символов в строке «Светодиод 1: OFF» ArduinoPIN4=on или ArduinoPIN1=off;
  3. стиль и оформление web-страницы выполнено с помощью HTML тэгов.



Зайдите через компьютер по IP адресу
Зайдите через любой браузер на компьютере по IP адресу 192.168.1.55

Заключение. IP платы Arduino прописан в коде. Все основные функции в скетче прокомментированы, поэтому проблем в настройках программы возникнуть не должно. Зайдите через компьютер или телефон по IP адресу 192.168.1.55 — у вас должна открыться страница, как на фото. Если не удалось сделать подключение HanRun HR911105A 15/10, то следует проверить настройки Wi-Fi роутера.



6 Replies to “Как подключить ethernet модуль ENC28J60 Arduino”

  1. Приветствую! сделал всё как тут описано, вот что получилось. При запуске ардуино светодиоды сразу загораются, хотя на сайте стоит OFF и на оборот, когда нажимаешь выключить, кнопочка превращается в ON и светодиод гаснет, второй светодиод управляет 4-ым пином а третий управляет 5-м пином, не пойму почему светодиоды сразу зажигаются?

    1. Поменяйте местами ON/OFF и цвета переместите green/red в строчках:
      PinStatus[1]?PSTR(«<font color=’green’><b>ON</b></font>»):PSTR(«<font color=’red’>OFF</font>»),

      OFF — это не статус выключенных светодиодов, а требуемое значение при нажатии на кнопку. Т.е. при нажатии на OFF светодиоды выключаются.

  2. Здравствуйте, а можно ли управлять, с помощью этого модуля, двигателями через l293d?

  3. Здравствуйте! Помогите , пожалуйста, скачать готовый скетч для Arduino Uno и модуля HR911105A.

  4. HR911105A это название только (!) самого разъема RJ45 10/100, а не всего модуля

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.