ENC28J60 Ethernet модуль для Ардуино

Код:00620
Артикул:ENC28J60
В наличии:есть
590 руб
1
ENC28J60 Ethernet модуль для Ардуино


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

Модуль работает в локальной сети 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 В. Представим, стоит задача коммутации линий освещения улиц, дорог, мостов.
 

Управление через интернет двумя реле.
 

Управление через интернет четырьмя реле.
 
Для начала необходимо скачать и установить библиотеку ethercard в Arduino IDE.
 
 
СБОРКА СХЕМЫ
 

 
Соединим модули 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};
 
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"
"

401 Unauthorized

";
 
void homePage()
{
bfill.emit_p(PSTR("$F"
" "
"ArduinoPIN 1: $F
"
"ArduinoPIN 2: $F
"
"ArduinoPIN 3: $F
"
"ArduinoPIN 4: $F
"
"ArduinoPIN 5: $F
"
"ArduinoPIN 6: $F
"
"ArduinoPIN 7: $F
"
"ArduinoPIN 8: $F"),
http_OK,
PinStatus[1]?PSTR("off"):PSTR("on"),
PinStatus[1]?PSTR("ON"):PSTR("OFF"),
PinStatus[2]?PSTR("off"):PSTR("on"),
PinStatus[2]?PSTR("ON"):PSTR("OFF"),
PinStatus[3]?PSTR("off"):PSTR("on"),
PinStatus[3]?PSTR("ON"):PSTR("OFF"),
PinStatus[4]?PSTR("off"):PSTR("on"),
PinStatus[4]?PSTR("ON"):PSTR("OFF"),
PinStatus[5]?PSTR("off"):PSTR("on"),
PinStatus[5]?PSTR("ON"):PSTR("OFF"),
PinStatus[6]?PSTR("off"):PSTR("on"),
PinStatus[6]?PSTR("ON"):PSTR("OFF"),
PinStatus[7]?PSTR("off"):PSTR("on"),
PinStatus[7]?PSTR("ON"):PSTR("OFF"),
PinStatus[8]?PSTR("off"):PSTR("on"),
PinStatus[8]?PSTR("ON"):PSTR("OFF"));
}
 
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);
}
 
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);
 
}
 
else if (strncmp("?ArduinoPIN5=on ", data, 16) == 0) {
PinStatus[5] = true;
bfill.emit_p(http_Found);
 
}
 
else if (strncmp("?ArduinoPIN6=on ", data, 16) == 0) {
PinStatus[6] = true;
bfill.emit_p(http_Found);
 
}
 
else if (strncmp("?ArduinoPIN7=on ", data, 16) == 0) {
PinStatus[7] = true;
bfill.emit_p(http_Found);
 
}
 
else if (strncmp("?ArduinoPIN8=on ", data, 16) == 0) {
PinStatus[8] = true;
bfill.emit_p(http_Found);
 
}
 
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 if (strncmp("?ArduinoPIN5=off ", data, 17) == 0) {
PinStatus[5] = false;
bfill.emit_p(http_Found);
 
}
 
else if (strncmp("?ArduinoPIN6=off ", data, 17) == 0) {
PinStatus[6] = false;
bfill.emit_p(http_Found);
 
}
 
else if (strncmp("?ArduinoPIN7=off ", data, 17) == 0) {
PinStatus[7] = false;
bfill.emit_p(http_Found);
 
}
 
else if (strncmp("?ArduinoPIN8=off ", data, 17) == 0) {
PinStatus[8] = false;
bfill.emit_p(http_Found);
 
}
 
else {
//Страница не найдена
bfill.emit_p(http_Unauthorized);
}
}
ether.httpServerReply(bfill.position());
}
}

 
Наш модуль должен иметь уникальный МАС адрес. МАС адрес указан в программе. В начале программы это сделано в следующих строках.
 
static byte mymac[] = {
0x7b,0x6c,0x4d,0x3e,0x2f,0x10 };
 
Придется поэкспериментировать и придумать уникальный – неиспользуемый никем МАС адрес и внести его в программу. Существуют специальные утилиты 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.
 
Техническое описание

Статья о микросхеме ENC28J60 на русском

Подключение к Arduino UNO и MEGA

О программной библиотеке ethercard



 
Модуль использует Microchip ENC28J60. Плата подключается к контроллеру со стандартным интерфейсом SPI со скоростью передачи до 20 МГц.
 
Характеристики:
ENC28J60 Ethernet SOP28
SPI интерфейс
Напряжение питания: 3.3 V
Частота работы 25МГц
Габариты: 55x36 мм
Вверх