Enc28j60 ethernet модуль - опис, підключення, схема, бібліотеки

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

Характеристики
живлення
напруга 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

Вихід переривання при прийомі пакету

2 або відключено

SPI MISO вихід даних

SPI SCK вхід тактирования

Clock output вихід тактирования

SPI MOSI вхід даних


При підключенні до Ардуіно використовуються контакти інтерфейсу SPI, скидання і харчування. Контакт скидання може з'єднуватися з цифровим контактом введення-виведення Ардуіно якщо в програмі передбачена подача сигналу скидання з цифрового контакту. Харчування модуля 3,3 В можна взяти від Ардуіно.

Найпростіший спосіб познайомитися з ENC28J60 - використовувати апаратні і програмні засоби Arduino, так як пакет програмування Arduino IDE містить бібліотеки для ENC28J60. Спробуємо покерувати через інтернет 8-канальним релейним модулем переключающим навантаження 220 В. Уявімо, стоїть завдання комутації ліній освітлення вулиць, доріг, мостів.


Управління через інтернет двома реле.


Управління через інтернет чотирма реле.

Для початку необхідно завантажити та встановити бібліотеку ethercard в Arduino IDE.

З'єднаємо модулі ENC28J60 і Arduino UNO, керуючись маркуванням. З'єднання контактів:

GND - GND під контактом 5V,

Перевіримо підключення. В Arduino IDE в розділі приклади знайдемо бібліотеку ethercard, там виберемо пункт rbbb_server. За замовчуванням бібліотека ethercard використовує для сигналу CS інтерфейсу SPI контакт 8 Arduino. Якщо підключення виконано до іншого контакту, наприклад 10 як в нашому випадку, то потрібно внести зміну в текст прикладу rbbb_server. На початку програми rbbb_server є такі рядки.

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)

ПРОГРАМА ДЛЯ УПРАВЛІННЯ вісім РЕЛЕ

// Чим більше даних на 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"
"

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 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);

static byte mymac [] = 0x7b, 0x6c, 0x4d, 0x3e, 0x2f, 0x10>;

СПІЛЬНА РОБОТА МОДУЛІВ ENC28J60

Якщо наші експерименти проходять успішно, то в нашій локальній мережі розгортаємо на другому модулі ENC28J60 ще один веб-сервер, додаємо третій і четвертий модулі в ту ж локальну мережу. Це дає розширення системи або дублювання, резервування для підвищення надійності. У цьому випадку одного порту 80 мало. Для вирішення проблеми кожного наступного веб-сервера присвоюємо унікальний порт, роблячи спеціальну запис в програмі. У розділі void setup () вводимо рядок:

Модуль використовує Microchip ENC28J60. Плата підключається до контролера зі стандартним інтерфейсом SPI зі швидкістю передачі до 20 МГц.

Характеристики:
ENC28J60 Ethernet SOP28
SPI інтерфейс
Напруга живлення: 3.3 V
Частота роботи 25МГц
Габарити: 55x36 мм