Ethernet модуль

Матеріал з Вікі-знання або навчання 2.0 в ТНТУ
Версія від 12:23, 25 травня 2017; Fedchuk (Обговореннявнесок)

(різн.) ← Попередня версія • Поточна версія (різн.) • Новіша версія → (різн.)
Перейти до: навігація, пошук

Зміст

Загальні відомості

Arduino Ethernet Shield W5100 одна з найцікавіших плат розширення дозволяє управляти платою Arduino через локальну мережу або інтернет. Використовується, якщо вам потрібно отримувати якусь інформацію для роботи з мережі, розмістити свій власний веб сайт або керувати Ардуіно по мережі, що і розглядається у даній роботі. На даній платі розширення також є слот для microSD карти пам'яті.

Для управління платою використовується базова бібліотека Arduino IDE - Ethernet library, а для роботи microSD картою - SD library. Для роботи, крім Ардуіно і власне Шилда вам також знадобиться мережевий кабель (Вита пара), причому, якщо підключати плату безпосередньо комп'ютера (а не через роутер), то він повинен бути обжатий за схемою Crossover.

Wiznet W5100 підтримує стек мережевих протоколів IP і дозволяє працювати як з TCP , так і з UDP - протоколами . При цьому мікросхема може обслуговувати до чотирьох одночасно відкритих сокет - з'єднань .


Для підключення плати розширення до Ардуіно передбачений спеціальний роз'єм , який представляє собою металеві висновки ( " папа " ) з одного боку плати та гнізда ( " мама " ) - з іншого боку . Така конструкція дозволяє підключити до Ардуіно відразу кілька плат розширення , розмістивши їх одну над іншою .

Остання версія плати розширення підтримує стандарт терморегулятора 1.0 , прийняту в моделі Arduino UNO R3.

На платі передбачений роз'єм для підключення micro - SD карти пам'яті , що дає можливість зберігання файлів і організації мережевого доступу до них . Пристрій сумісний з Arduino Uno і Mega ( використовується бібліотека Ethernet ) . Для роботи з вбудованим microSD - кардрідером служить бібліотека SD . Для активізації кардридера за допомогою цієї бібліотеки в якості висновку SS слід вказувати висновок 4. Найперша версія плати розширення Ethernet містила повнорозмірний роз'єм для SD - карт , який в даний час не підтримується.

У пристрої також реалізована функція управління скиданням Ethernet - модуля W5100 при подачі живлення . Необхідність в цій функції обумовлена тим , що попередні версії плати розширення були несумісними з Arduino Mega , через що доводилося вручну скидати Ethernet - модуль після кожної подачі живлення .

Поточна версія плати розширення підтримує технологію Power over Ethernet ( PoE ) і може працювати зі спеціальним модулем , що дозволяє отримувати енергію через Ethernet - кабель , який являє собою звичайну виту пару категорії 5 :

  • Модуль сумісний зі стандартом IEEE802.3af.
  • Низький рівень вихідних пульсацій і шуму ( 100 мВ від піку до піку ).
  • Діапазон вхідної напруги від 36В до 57В.
  • Захист від перевантажень і коротких замикань.
  • Вихідна напруга 9В.
  • DC - DC перетворювач з високим ККД : 75 % при 50 % навантаженні.
  • Ізоляція між входом і виходом в 1500 В.

Примітка: оскільки обидва пристрої, W5100 і SD-карта пам'яті, підключені до однієї SPI-шині, то в кожен момент часу активним може бути тільки один з них. При використанні в вашому проекті обох пристроїв, розподіл доступу до шини контролюється відповідними бібліотеками. У платі розширення використовується стандартний мережевий роз'єм RJ45 . Також на платі розширення розташовано декілька світлодіодів - індикаторів :

  • PWR : показує наявність харчування основного пристрою і плати розширення
  • LINK : світиться , якщо є з'єднання з мережею ; блимає під час передачі або отримання даних
  • FULLD : світиться , якщо мережеве з'єднання підтримує повнодуплексний режим роботи
  • 100M : світиться , якщо мережеве з'єднання відноситься до класу 100 Мб / с ( на відміну від мереж 10 Мб / с )
  • RX : блимає в процесі отримання даних
  • TX : блимає в процесі відправки даних
  • COLL : інформує про виявлення мережевих колізій

Плата розширення Arduino Ethernet може генерувати сигнали переривань , які дозволяють повідомляти Ардуіно про різні події , що виникають в модулі W5100 . Для цього на платі передбачена перемичка " INT ".

Характеристика

Ethernet контролер W5100 (апаратна реалізація стека протоколів TCP / IP)

  • Слот для Micro SD карти.
  • Рівень напруги 5 / 3.3В.
  • 10Mb / 100Mb Ethernet з підтримкою PoE.
  • сумісна з Arduino Uno і Arduino Mega.

Мікросхема апаратно реалізує наступні протоколи різних рівнів системи OSI:

  • TCP, UDP, IPv4, ICMP, ARP, IGMP і MAC.
  • Апаратна підтримка протоколу PPPoE (Point-to-point over Ethernet) з PAP / CHAP протоколами аутентифікації.

Клієнт-серверний принцип роботи пристрою

Роль клієнта грає броузер , за допомогою якого ви будете підключатися до сервера . Основне призначення клієнта - це посилати різні запити серверу , наприклад запит на відображення якоїсь інформації ( GET ) або запит про передачу будь-яких даних ( POST ) .

Сервер - це власне ethernet shield . Він працює відповідно до HTTP протоколом . У скетчі повинен бути вказаний ip адресу, за якою ви будете отримувати до нього доступ ( наприклад 192.168.0.1 ).

Основні функції сервера - це відстеження запитів клієнта , виконання різних функцій на підставі отриманих даних і відображення результату у вигляді HTML коду.

Розберемо цикл роботи пристрою для нашого прикладу . Після того , як ви залили скетч і підключили його до комп'ютера за допомогою мережевого кабелю , ethernet shield знаходиться в режимі очікування . Як тільки ви перейдете по заданому ip адресою , на сервер потрапить GET запит , який говорить про те , що необхідно видати сторінку. Сервер формує цю сторінку і віддає назад на клієнта , де броузер перетворює HTML код в відповідний текст і елементи управління , а сервер знову переходить в режим очікування . У нашому випадку формується форма , яка дозволяє включити вибрані реле . Після того , як ви відзначите галочками відповідні реле і натиснете на кнопку " Refresh " , на сервер відправляється POST запит , в якому передаються відповідні дані про реле , які необхідно включити . Далі ці дані виділяються і зберігаються , а потрібні реле включаються . Після цього користувачеві знову видається HTML сторінка , але тепер на ній заздалегідь відзначені галочками реле , які включені на даний момент . Оскільки ми самі формуємо HTML код , то ми можемо видавати інформацію про значеннях будь-яких датчиків , а також отримувати будь-яку потрібну нам інформацію, що управляє .

Мікросхема WIZnet W5100

У якості процесора плати розширення служить Мікросхема WIZnet W5100. Вона являє собою однокристальне Ethernet-рішення з вбудованим стеком TCP-IP. Такий стек часто називають «зашитим». Всі чудові можливості для доступу в Інтернет, які надає W5100, поміщаються в компактному 80-вивідному корпусі LQFP. Крім вбудованого стека TCP-IP, W5100 містить вбудовану IEEE 802.3 10Base-T і 802.3u 100Base-TX сумісну реалізацію MAC і PHY рівнів. Можна очікувати, що раз стек TCP-IP забезпечує все необхідне, то пристрій можна відразу підключити до мережі Ethernet. Стек TCP-IP в W5100 підтримує протоколи TCP, UDP, ICMP і ARP. Цього достатньо для більшості вбудованих мережевих Ethernet-додатків, що розробляються звичайними користувачами. Крім того, пристрій W5100 підтримує PPPoE, що дозволяє використовувати його в додатках ADSL.

Загальні властивості і W5100

  • Апаратна підтримка стека протоколів TCP / IP: TCP, UDP, IPv4, ICMP, ARP, IGMP, MAC
  • Одночасна і незалежна підтримка 4-х з'єднань;
  • Підтримка 10BaseT / 100BaseTX в повнодуплексному режимі;
  • Висока продуктивність до 25Mbps;
  • Інтерфейси підключення до мікроконтролеру: Direct (Clocked), Indirect (Clocked), SPI (режими 0 і 3);
  • Вбудований 16К блок двухпортовой статичної пам'яті для буферів даних TX / RX;
  • Напруга живлення 3,3 В; лінії введення / виводу підтримують рівні сигналів 5,0В;

0,18 мкм CMOS технологія;

  • Відповідність RoHS-стандарту.

Приклад написання програми

Приклад реалізації програми для дистанційного регулювання температурних показників в середовищі із встановленням значення гістерезису

  1. include <SPI.h> // завантажуємо бібліотеку SPI для работи з pin 10,11,12,13
  2. include <Ethernet.h> // завантажуємо бібліотеку для работи з мережею
  3. include <SD.h> // завантажуємо бібліотеку для работи з sd картою
  4. include <EEPROM.h> // завантажуємо бібліотеку для работи з енергонезалежною памятю
  5. include <DHT.h> // завантажуємо бібліотеку для работи з датчиками температури
  6. define REQ_BUF_SZ 30 // розмір буфера використовується для HTTP запиту
  7. define DHTPIN1 2 // Вулиця
  8. define DHTPIN2 3 // Кімната
  9. define DHTTYPE DHT11 // тип датчика DHT

DHT dht1(DHTPIN1, DHTTYPE); DHT dht2(DHTPIN2, DHTTYPE); byte mac[] = { 0xDE, 0xAA, 0xBE, 0xEF, 0xFE, 0xAA }; // MAC адреса Ethernet шилда

// the dns server ip IPAddress dnServer(10, 245, 250, 00); // the router's gateway address: IPAddress gateway(10, 245, 50, 00); // the subnet: IPAddress subnet(255, 255, 255, 000);

IPAddress ip(10, 245, 50, 58); // IP адреса локальної мережі EthernetServer server(80); // порт для роботи з сервером File webFile; char HTTP_req[REQ_BUF_SZ] = {0}; // буферний запит HTTP зберігаються у вигляді нульового рядка char req_index = 0; // індекс в буфері HTTP_req float ts = 0; // температура в будинку

void setup() {

 SD.begin(4);               // пін для карти SD
 pinMode(8, OUTPUT);       // пін реле працює як вихід
 digitalWrite(8, HIGH);    // реле по замовчуванню увімкнене
 Ethernet.begin(mac, ip, gateway, subnet);  // инициализация Ethernet шилда
 server.begin();           // запуск сервера
 dht1.begin();
 dht2.begin();

}

void loop() {

 EthernetClient client = server.available();
 if (client) {
   boolean currentLineIsBlank = true;
   while (client.connected()) {
     if (client.available()) {
       char c = client.read();
       if (req_index < (REQ_BUF_SZ - 1)) {
         HTTP_req[req_index] = c;
         req_index++;
       }
       if (c == '\n' && currentLineIsBlank) {
         if (StrContains(HTTP_req, "GET /")) {
           if (StrContains(HTTP_req, "/ ") || StrContains(HTTP_req, "/index.htm")) {
             sendHtmlFile(client, "index.htm");
           } else if (StrContains(HTTP_req, "/favicon.ico")) {
             sendFile(client, "favicon.ico");
           } 
           else if (StrContains(HTTP_req, "/temp.png")) {
             sendFile(client, "temp.png");
           } 
           else if (StrContains(HTTP_req, "/humid.png")) {
             sendFile(client, "humid.png");
           } 
           else if (StrContains(HTTP_req, "ajax")) {
             sendBaseAnswer(client);
             GetTempState(client);
           } else if (StrContains(HTTP_req, "set?")) {
             String input = HTTP_req;
             int posStart = input.indexOf("temp=");
             int posEnd = input.indexOf(' ', posStart);
             String all = input.substring(posStart + 5, posEnd + 1);
             int tj = all.toInt();
             if (20 <= tj && tj <= 26) { EEPROM.write(0, tj); } // температурний діапазон
             sendBaseAnswer(client);
           }
         }
         req_index = 0;
         StrClear(HTTP_req, REQ_BUF_SZ);
         break;
       }
       if (c == '\n') { currentLineIsBlank = true; }
       else if (c != '\r') { currentLineIsBlank = false; }
     }
   }
   delay(1);
   client.stop();
 }
 if (ts == dht2.readTemperature()) { // порівнюємо два останніх значення температури в кімнаті
   if (ts < EEPROM.read(0) - 0.1) { digitalWrite(8, HIGH); }  // реле увімкнено
   if (ts > EEPROM.read(0) + 0.1) { digitalWrite(8, LOW); } // реле вимкнено
 }
 ts = dht2.readTemperature();

}

void GetTempState(EthernetClient cl) {

 if (digitalRead(8)) { cl.print("0"); }
 else { cl.print("1"); }
 float AllTemp[5] = {
 dht1.readHumidity(), dht1.readTemperature(),
 dht2.readHumidity(), dht2.readTemperature(),
 EEPROM.read(0)};
 for (int i = 0; i < 5; i++) {
   cl.print(",");
   cl.print(AllTemp[i]);
 }

} bool sendHtmlFile(EthernetClient client, char *fileName) {

 webFile = SD.open(fileName);
 sendBaseAnswer(client);
 return sendFile(client, webFile);

} bool sendFile(EthernetClient client, char *fileName) {

 webFile = SD.open(fileName);
 sendHttpOkAnswer(client);
 client.println();
 return sendFile(client, webFile);

} bool sendFile(EthernetClient client, File &webFile) {

 if (webFile) {
   while (webFile.available())
     client.write(webFile.read());
   webFile.close();
   return 1;
 }
 return 0;

} void sendBaseAnswer(EthernetClient client) {

 sendHttpOkAnswer(client);
 client.println(F("Content-Type: text/html"));
 client.println(F("Connection: close"));
 client.println();

} void sendHttpOkAnswer(EthernetClient client) {

 client.println(F("HTTP/1.1 200 OK"));

} void StrClear(char *str, char length) {

 for (int i = 0; i < length; i++) { str[i] = 0; }

} char StrContains(char *str, char *sfind) {

 char found = 0;
 char index = 0;
 char len;
 len = strlen(str);
 if (strlen(sfind) > len) { return 0; }
 while (index < len) {
   if (str[index] == sfind[found]) {
     found++;
     if (strlen(sfind) == found) { return 1; }
   }
   else { found = 0; }
   index++;
 }
 return 0;

}

Перелік посилань

1. Якименко Ю.І. Терещенко Т.О. Сокол Є.І. «Мікропроцернатехніка» // К.:Кондор – 2004. 2. Методичні вказівки щодо виконання курсової роботи. 3. «Мікропроцесори та мікропроцесорні комплекти інтегральних мікросхем», довідник, під ред. В.А. Шахнова, том 2, М., «Радио и связь», 1988. 4. www.arduino.cc 5. Матеріал дистанційного курсу «Електроніка і мікропроцесорна техніка»

Особисті інструменти
Google AdSense
реклама