Предназначен для сборки устройства управления электрическими приборами через интернет и передачи данных от датчиков для отображения на странице сайта. При этом с сайта можно управлять приборами и проверять выполнение команд. Например, можно изготовить управление поворотом видеокамеры с помощью шагового двигателя и с экрана ПК наблюдать за видеосъемкой.
Модуль работает в локальной сети TCP\IP и в сети internet. Используя аппаратные возможности модуля ENC28J60 и программу микроконтроллера создают простой веб-сервер. Модуль связывает МК через интерфейс SPI с сетью TCP\IP. Управление приборами автоматики через internet подключенными к ENC28J60 может производится одновременно или поочередно несколькими операторами с различных персональных компьютеров или мобильных устройств. ENC28J60 Ethernet модуль для Ардуино может служить не только частью прибора автоматики, но и наглядным пособием для изучения сети TCP/IP и методов построения веб-сервера. Ведущий компонент – микросхема ENC28J60. На плате смонтирована розетка для кабеля сети TCP\IP. Розетка содержит трансформатор, обеспечивающий гальваническую развязку модуля от кабеля TCP\IP и 2 светодиода, свечение которых свидетельствует о обмене данными. Имеется кварцевый резонатор частоты 25 МГц. Вилка подключения к МК имеет 10 контактов. Индикатор питания. ENC28J60 Ethernet модуль для Ардуино может работать в составе Raspberry Pi или другого микроконтроллерного устройства. Хорошо согласуется с МК STM3 благодаря напряжению питания одного уровня. От МК требуется только подавать пакеты для отправки и забирать принятые через интерфейс SPI.
Характеристики Питание напряжение 3,14 – 3,45 В ток, мА максимальный 250 номинальный 170 Интегрированный MAC и 10 Base-T PHY Полный и полудуплекс Поддержка одного 10 Base-T порта с автоопределением полярности и коррекцией Автовыравнивание генерации контрольной суммы Автоотброс ошибочных пакетов Программируемая функция повтора передачи при ошибке Программируемые функции Padding и генерирование CRC Программируемая функция фильтрации ошибочных пакетов Тактовая частота SPI до 20 МГц Размеры платы: 55 x 36 мм
Схема модуля ENC28J60
Подключение
Прибор выполняющий функции веб-сервера включает модуль ENC28J60 подключенный к модулю микроконтроллера. Программа микроконтроллера обеспечивает взаимодействие с микросхемой ENC28J60 и работу веб-сервера. В качестве микроконтроллерного модуля может быть использовано центральное устройство Arduino.
Наименования контактов модуля.
Подключение модуля ENC28J60 к Arduino MEGA.
Сигнал
Функция сигнала
Контакты Arduino UNO, Due, Nano, Duemilanove
INT
Выход прерывания при приеме пакета
2 или отключено
SO
SPI MISO выход данных
12
SCK
SPI SCK вход тактирования
13
RESET
Cброс
GND
Общий провод
CLKOUT
Clock output выход тактирования
WOL
Прерывание
SI
SPI MOSI вход данных
11
CS
SPI СS вход выбора микросхемы
10
VCC
Питание
3,3 В
При подключении к Ардуино используются контакты интерфейса SPI, сброса и питания. Контакт сброс может соединяться с цифровым контактом ввода-вывода Ардуино если в программе предусмотрена подача сигнала сброс с цифрового контакта. Питание модуля 3,3 В можно взять от Ардуино.
Итак, приступим!
Самый простой способ познакомиться с ENC28J60 – использовать аппаратные и программные средства Arduino, так как пакет программирования Arduino IDE содержит библиотеки для ENC28J60. Попробуем поуправлять через интернет 8-канальным релейным модулем переключающим нагрузки 220 В. Представим, стоит задача коммутации линий освещения улиц, дорог, мостов.
Соединим модули ENC28J60 и Arduino UNO, руководствуясь маркировкой. Соединение контактов:
GND – GND под контактом 5V,
SCK – 13,
SO – 12,
VCC – 3.3V,
CS – 10,
SI – 11.
Соединим модуль ENC28J60 кабелем TCP\IP с роутером как показано на видео.
ПЕРВОНАЧАЛЬНАЯ ПРОВЕРКА
Проверим подключение. В Arduino IDE в разделе примеры найдем библиотеку ethercard, там выберем пункт rbbb_server. По умолчанию библиотека ethercard использует для сигнала CS интерфейса SPI контакт 8 Arduino. Если подключение выполнено к другому контакту, например 10 как в нашем случае, то нужно внести изменение в текст примера rbbb_server. В начале программы rbbb_server имеются следующие строки.
#include
// ethernet interface mac address, must be unique on the LAN static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; static byte myip[] = { 192,168,1,115 }; //IP адрес
byte Ethernet::buffer[500]; BufferFiller bfill;
void setup () { if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) Serial.println(F("Failed to access Ethernet controller")); ether.staticSetup(myip); }
Изменим программу для использования контакта 10. В четвертую строку снизу в приведенном выше участка текста программы вносим изменение перед закрывающейся скобкой в виде числа 10:
if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0)
Сохраняем изменение в программном примере rbbb_server и загружаем в Arduino UNO. Модуль ENC28J60 подключен к роутеру кабелем, а персональный компьютер соединен с роутером по Wi-Fi или тоже кабелем. Таким образом, они находятся в одной домашней локальной сети. Копируем IP адрес нашего веб-сервера 192,168,1,115 указанный в программе rbbb_server, заменяем запятые на точки 192.168.1.115. Открываем стандартную программу проводник (Windows Explorer), в ней открываем папку Библиотеки/Документы, здесь в верхнюю строку окна вводим http://192.168.1.115/ На экране должны появится показания часов, значит все работает.
ПРОБРОС ПОРТОВ
Обращение из internet к нашему веб-серверу будет происходить по его IP адресу. Роутер присваивает подключенному модулю ENC28J60 динамический IP адрес, т. е. при каждом включении будет присвоен новый IP адрес по случайному выбору. Для работы через internet нужен статический IP адрес. Для закрепления за модулем постоянного IP адреса нужно выполнить ряд действий. Из internet видим роутер, чтобы не было с ним соединено в нашей локальной домашней сети. Когда происходит соединение нашего ПК изнутри наружу в сеть, роутер открывает TCP-соединение, выделяя для этого сетевой порт, и ретранслирует то, что передаем. Здесь речь идет о логических портах. Вспомним, что сетевым портом называют соединение для обмена между программами. Сетевой порт – номер, параметр транспортного протокола TCP и UDP. Это число в пакете данных показывающее для какой программы данные предназначены. Как удаленный компьютер может достучаться до вашего через IP адрес, так и до конкретной программы с помощью указания порта. Программа может открыть порт, это значит заявить "Если придут данные на порт 5577, то это для меня". Закрыть порт – значит взять свои слова обратно. За http-сервером закреплен порт 80. Это означает, что когда пишем http://arduino-kit.ru, то компьютер обращается к серверу arduino-kit.ru (сначала узнает его IP адрес), а потом говорит "Передайте 80-ой программе – хочу сайт смотреть". У нас обратная задача. Нужно соединиться из internet с ENC28J60 находящимся в домашней локальной сети в автоматическом режиме независимо от технических трудностей в виде динамики IP. Для решения этой проблемы нужно связать порт выделенный программе с прибором. Приказываем роутеру: “что пришло из интернета на внешний порт NN, передавай на внутренний порт X”. Это указание часто называют “проброс порта”. Теперь из интернета это будет выглядеть, как будто это прибор подключенный к роутеру c портом X открыл порт NN для обмена данными. Для проброса портов надо выполнить следующие действия. В свойствах роутера в разделе NAT Setting, на странице Virtual Server выполнить переадресацию. Установить входящий порт Port Range значением 80. Браузеры по умолчанию работают через порт 80, а мы будем входить с браузера. В строке локальный IP адрес указать статический IP адрес модуля ENC28J60 из текста программы, на нем у нас развернут веб-сервер. В пункте Lokal port тоже указать 80, так как Arduino библиотека ethercard использует порт 80. Установить протокол ТСР.
ПРОГРАММА ДЛЯ УПРАВЛЕНИЯ ВОСЕМЬЮ РЕЛЕ
Для отработки управления реле в начале макетирования подключим 8 светодиодов через резисторы 470 Ом к контактам 2…9 Arduino UNO. Отрицательные выводы светодиодов соединим с общим проводом, идущим к Arduino UNO. Обращаясь через internet к модулю ENC28J60, мы должны видеть страницу сайта. Содержание этой страницы находится в программе, загружаемой в микроконтроллер. Функция void homePage() описывает страницу открываемую нами в браузере. Загрузим программу управления восемью выходами.
#include
// MAC адрес должен быть уникальным static byte mymac[] = { 0x7b,0x6c,0x4d,0x3e,0x2f,0x10 }; //IP адрес статический static byte myip[] = { 192,168,1,177 };
//Чем больше данных на Web странице, тем объемнее требуется буфер byte Ethernet::buffer[900]; BufferFiller bfill;
//Массив задействованных контактов Arduino, для управления реле int LedPins[] = { 2,3,4,5,6,7,8,9};
//Массив для фиксации изменений boolean PinStatus[] = { 1,2,3,4,5,6,7,8};
void setup() { Serial.begin(9600); //По умолчанию в библиотеке ethercard CS -- контакт 8 //if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) //and change it to: замена (CS-pin) на 10 //if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0); if (!ether.dhcpSetup()); //Выводим в последовательный монитор IP адрес который присвоил роутер ether.printIp("My Router IP: ", ether.myip); //Здесь подменяем динамический IP на статический ether.staticSetup(myip); ether.printIp("My SET IP: ", ether.myip); //Выводим в последовательный монитор статический IP for(int i = 0; i <= 8; i++) { pinMode(LedPins[i],OUTPUT); PinStatus[i]=false; } }
void loop() { delay(1); word len = ether.packetReceive(); //Проверить ethernet пакеты word pos = ether.packetLoop(len); //Проверить TCP пакеты 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 = 0; i <= 7; 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); }
Придется поэкспериментировать и придумать уникальный – неиспользуемый никем МАС адрес и внести его в программу. Существуют специальные утилиты Random MAC Generator. Чтобы увидеть результаты наших стараний после записи программы в микроконтроллер и проброса портов необходимо проверить доступ к модулю ENC28J60 из internet. Для этого выясним IP адрес роутера. Используем поиск информации Google. В поисковой строке Google вводим две буквы: IP. Первая ссылка в выдаче будет “Узнать IP адрес”. Нажимаем на эту ссылку и видим адрес нашего роутера. Пусть это будет ZZZ.ZZZ.Z.ZZZ. В браузере, в строке адреса страниц введем IP адрес роутера, к которому подключен модуль ENC28J60. В окне браузера должна открыться страница веб-сервера, установленного на модуле. Видим станицу управления. Теперь зайдем с мобильного устройства на наш веб-сервер из internet вводя в браузере IP. При нажатии в окне браузера на строки с надписями OFF и ON должно изменяться состояние светодиодов. Отработав схему и программу на светодиодах, можем подключить модуль реле. Применение светодиодов для макетирования дает наибольшее приближение к параметрам модуля реле, на входах которого стоят оптроны.
СОВМЕСТНАЯ РАБОТА МОДУЛЕЙ ENC28J60
Если наши эксперименты проходят успешно, то в нашей локальной сети разворачиваем на втором модуле ENC28J60 еще один веб-сервер, добавляем третий и четвертый модули в ту же локальную сеть. Это дает расширение системы или дублирование, резервирование для повышения надежности. В этом случае одного порта 80 мало. Для решения проблемы каждому следующему веб-серверу присваиваем уникальный порт, делая специальную запись в программе. В разделе void setup() вводим строку:
ether.hisport = 5557;
Здесь 5557 новый порт. В программе второго веб-сервера указываем IP адрес отличный от первого. Теперь запрограммируем роутер для работы с несколькими модулями ENC28J60. В настройках роутера указываем:
Входящий порт Port Range 91 Локальный IP адрес указать статический IP адрес второго веб-сервера В пункте Lokal port указываем 5557
Сохраняем две настройки: старую для входного порта 80 и новую для порта 91. Для обращения к первому веб-серверу из internet вводим в URL строке браузера просто IP адрес роутера http://ZZZ.ZZZ.Z.ZZZ, а для обращения к второму веб-серверу вводим IP и порт http://ZZZ.ZZZ.Z.ZZZ:91.