С каждым годом платы 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. Но немного практики и использование соответствующих библиотек даст вам желаемый результат!
Добрый день!
Статья понравилась, наконец-то запустил этот модуль с ардуино нано. Хочу сделать управление 8 канальным модулем реле через сеть, но что-то не получается (при добавлении строк не хватает динамической памяти нано). Может поделитесь рабочим примером? Спасибо.
Какие пины arduino nano задействуются при подключении этого шилда?
Используется интерфейс SPI