Главная » Arduino » ENC28J60 NANO SHIELD — удобный способ подключения Arduino к сети

ENC28J60 NANO SHIELD — удобный способ подключения Arduino к сети

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

Сегодня мы более подробно рассмотрим шилд (shield), то есть плату расширение для Arduino Nano. Этот шилд оснащен чипом ENC28J60, который занимается обработкой данных отправляемых в сеть. При правильном использовании он станет настоящим сетевым комбайном, который будет способен предоставлять данные с датчиков или собирать и выполнять пользовательские рекомендации для всех пользователей целевой сети

Подключение модуля ENC28J60 к плате Ардуино и сети

Подключить шилд ENC28J60 к Arduino чрезвычайно просто. Мы должны установить нашу Arduino Nano в разъем шилда. На фото ниже показано правильное подключение модуля ENC28J60 к плате Arduino Nano.

Библиотеки и необходимые материалы

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

Библиотеку можно скачать по этой ссылке. Конечно, скаченную библиотеку в IDE Arduino придется установить вручную.

Поэтому проще будет использовать программу установки. Для этого в Arduino IDE перейдите по пути Эскиз/Include Library/Manage libraries, в поле поиска введите EtherCard и нажмите Install для установки библиотеки.

Мы начнем тестировать модуль с загрузки примера backSoon, измененного под наши требования. Данный пример предназначен для подключения к сети и настройки простого веб-сайта, который будет отображать текст. Скетч представлен ​​ниже:

#include <EtherCard.h>
#define STATIC 1
#if STATIC
static byte myip[] = { 192,168,1,200 };// IP-адрес, мы можем выбрать его произвольно
static byte gwip[] = { 192,168,1,1 };// адрес по умолчанию, в нашем случае маршрутизатор
#endif
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; //indywidualny adres mac płytki
byte Ethernet::buffer[500]; // tcp/ip буфер отправки и приема

const char page[] PROGMEM =
"HTTP/1.0 503 Service Unavailable\r\n"
"Content-Type: text/html\r\n"
"Retry-After: 600\r\n"
"\r\n"
"<html>"
 "<head><title>"
 " Добро пожаловать на вашу первую страницу "
 "</title></head>"
 "<body>"
 "<h3> На основе этой страницы мы можем создать сайт в локальной сети </h3>"
 "<h2> Ввод текста очень прост, достаточно знать основы HTML </h2>"
 "</body>"
"</html>";// здесь мы определяем, какая страница будет отображаться

void setup(){
 Serial.begin(57600);
 Serial.println("\n[backSoon]");
 if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
 Serial.println( "Failed to access Ethernet controller");
#if STATIC
 ether.staticSetup(myip, gwip);
#else
 if (!ether.dhcpSetup())
 Serial.println("DHCP failed");
#endif
 ether.printIp("IP: ", ether.myip);
 ether.printIp("GW: ", ether.gwip);
 ether.printIp("DNS: ", ether.dnsip);
}
void loop(){
 if (ether.packetLoop(ether.packetReceive())) {
 memcpy_P(ether.tcpOffset(), page, sizeof page);
 ether.httpServerReply(sizeof page - 1);
 }
}

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

IP-адрес — это идентификационный номер устройства в сети. IP-адрес используется для правильной связи между другими устройствами. Каждое устройство в сети должно иметь свой индивидуальный IP-адрес, чтобы пересылка пакетов не мешала друг другу.

Если для Вас это совершенно новая тема, то вам нужно сначала определить адреса, используемые в сети. Самый простой способ — подключить компьютер к тому же маршрутизатору, к которому вы подключаете Arduino.

Даже если компьютер подключен к Wi-Fi, домашние маршрутизаторы обычно используют общую адресацию. Поэтому в Windows запустите команду cmd и введите команду ipconfig. Найдите среди результатов IPv4-адрес. Он, как правило, обычно имеет вид 192.168.1.100. Первые три числа обычно представляют собой сетевой адрес, а последнее — адрес устройства.

Мы использовали адрес 192.168.1.200, чтобы получить безопасное расстояние до других устройств в сети, но если у нас есть одно устройство, подключенное к сети, модуль Ethernet может иметь IP 192.168.1.3.

Здесь может возникнуть резонный вопрос, так как в сети всего два устройства, почему бы не дать модулю Ethernet адрес 192.168.1.2?

По одной очень простой причине — адрес 192.168.1.1 является адресом шлюза по умолчанию и назначается маршрутизатору, и этот адрес шлюза по умолчанию отмечен в программе как «gwip».

Последний элемент — это MAC-адрес, помеченный как «mymac», MAC-адрес — это индивидуальный адрес устройства, аналогично IP. Два одинаковых MAC-адреса в сети могут вызвать конфликт пакетов. Так-как у нас в сети только один модуль Ethernet, то нам не о чем беспокоиться.

После загрузки скетча в Arduino, стоит включить Serial Monitor, он будет отображать введенные нами данные. Скорость передачи данных в Serial Monitor должна быть изменена с 9600 на 57600 бод.

Когда модуль настроен в соответствии с предоставленными нами адресами, мы должны подключить кабель с разъемом RJ45 к нашему модулю, а другой разъем — к свободному разъему RJ45 в маршрутизаторе. После подключения подождите несколько секунд, затем вернитесь к компьютеру и введите IP-адрес нашего модуля в строке браузера, затем нажмите Enter. Мы должны увидеть страницу, которая выглядит так, как показано ниже:

 

Отображение показаний датчика DS18B20

Для проверки скорости работы программы подключим датчик температуры DS18B20 к контакту 4, благодаря чему мы сможем проверить, как работает отображение данных с датчиков. Датчик подключается к контакту 4. Не забудьте соединить контакт данных и VCC подтягивающим резистором 4,7 кОм. Макет должен быть построен согласно фото ниже:

После сборки системы мы можем перейти к программной части. Нам понадобятся библиотеки OneWire, DallasTemperature для поддержки датчика DS18B20 и пакет библиотеки ETHER_28J60 для упрощения работы с датчиком на нашем веб-сайте.

Почему мы используем две разные библиотеки? По одной простой причине — не имеет смысла усложнять себе работу. EtherCard гораздо лучше для использования в типичных сетевых приложениях, однако ETHER_28J60 — гораздо более удобный инструмент для записи разных типов данных на страницу, при этом код будет легче и понятнее.

Установив новый пакет библиотек, мы можем перейти к написанию программы, которая должна выглядеть, как показано ниже:

#include "etherShield.h"
#include "ETHER_28J60.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 4 // определяем подключение датчика DS18B20
OneWire oneWire(ONE_WIRE_BUS); // запускаем OneWire
static uint8_t mac[6] = {0x74, 0x69, 0x69, 0x2D, 0x30, 0x31}; //adres MAC
static uint8_t ip[4] = {192, 168, 1, 200}; // адрес шлюза по умолчанию
static uint16_t port = 80; // порт данных, для HTML значение должно быть 80
ETHER_28J60 e;
DallasTemperature sensors(&oneWire); // назначаем датчик DS18B20 OneWire
void setup()
{
 sensors.begin();
 e.setup(mac, ip, port);
}
void loop()
{
 sensors.requestTemperatures(); // получаем данные о температуре от DS18B20
 float temp = sensors.getTempCByIndex(0); // создаем переменные для значений датчика
 if (e.serviceRequest())
 {
 e.print("<H3> Вот ваш первый сетевой датчик температуры! <H3><br/>");
 e.print("Температура ");
 e.print(temp);
 e.print(" *C");
 e.respond();
 }
 delay(100);
}

После загрузки программы мы должны увидеть следующее:

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






3 комментария

  1. Добрый день!
    Статья понравилась, наконец-то запустил этот модуль с ардуино нано. Хочу сделать управление 8 канальным модулем реле через сеть, но что-то не получается (при добавлении строк не хватает динамической памяти нано). Может поделитесь рабочим примером? Спасибо.

    Ответить
  2. Какие пины arduino nano задействуются при подключении этого шилда?

    Ответить
  3. Используется интерфейс SPI

    Ответить

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