Сетевые системы от Wiznet уже несколько лет занимают лидирующие позиции, касающиеся габаритов и возможностей. Даже сама Arduino отметила это преимущество, оснащая ими свои Ethernet Shield.
Сегодня мы не будем заниматься Ethernet Shield, а рассмотрим Ethernet модуль на базе чипа Wiznet W5500. Сам модуль очень маленький — не намного больше разъема Ethernet, благодаря чему его можно использовать даже в небольших проектах.
Преимущество сетевых модулей Wiznet над ENC
Модули на чипах от Wiznet немного дороже модулей на чипах ENC, но это отнюдь не безосновательно. Микросхемы Wiznet, в отличие от ENC, обрабатывают большинство протоколов и операций аппаратно, благодаря этому основная работа выполняется микросхемой модуля, а не нашим микроконтроллером.
Кроме того, чипы Wiznet позволяют использовать их оперативную память, что является еще одним бонусом. Последний, но не менее важный аргумент в пользу использования чипов Wiznet — это официальная поддержка Arduino. Благодаря гораздо более развитой библиотеке мы можем быстро и легко научиться работать с Wiznet модулями.
Подключение сетевого модуля W5500 к Arduino
Подключить модуль W5500 к Arduino не представляет особой сложности. Модуль оснащен 12 контактами и связывается с Arduino через шину SPI, поэтому мы будем использовать только 6 контактов.
Стоит помнить, что модуль работает от 3,3 В, поэтому VCC необходимо подключить к выводу 3,3 В на нашей плате Ардуино Uno, а не 5 В. Всю систему необходимо собрать по следующей схеме:
Первая программа для модуля Wiznet
После того, как мы собрали схему, мы можем перейти к программированию. Начнем с примера «WebServer». Конечно, нам не нужно загружать какую-либо библиотеку, потому что, как уже упоминалось в начале, чип поддерживается Arduino и программа IDE оснащена библиотекой под названием Ethernet. Если у вас старая версия IDE, стоит обновить библиотеку до версии 2.0.0 с помощью диспетчера библиотек.
Что касается MAC- и IP-адресации, то эта тема была подробно объяснена в статье о ENC28J60.
Итак, модулю мы присвоили IP-адрес 192.168.1.177. Помимо настройки IP-адреса, стоит заглянуть в раздел настройки и добавить/раскомментировать следующую строку:
Ethernet.init (10);
Эта строка указывает к какому выводу подключен вывод CS модуля. В нашем случае это вывод 10. Мы можем подключить его и к другим выводам, тогда мы должны изменить значение в скобках.
Наш код должен выглядеть так:
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192, 168, 1, 177); EthernetServer server(80); void setup() { Ethernet.init(10); Serial.begin(9600); while (!Serial) { } Serial.println("Ethernet WebServer Example"); Ethernet.begin(mac, ip); if (Ethernet.hardwareStatus() == EthernetNoHardware) { Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :("); while (true) { delay(1); // ничего не делать, нет смысла работать без оборудования Ethernet } } if (Ethernet.linkStatus() == LinkOFF) { Serial.println("Ethernet cable is not connected."); } server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); } void loop() { EthernetClient client = server.available(); if (client) { Serial.println("new client"); boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); if (c == '\n' && currentLineIsBlank) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // соединение будет закрыто после завершения ответа client.println("Refresh: 5"); // автоматически обновлять страницу каждые 5 секунд client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); for (int analogChannel = 0; analogChannel < 6; analogChannel++) { int sensorReading = analogRead(analogChannel); client.print("analog input "); client.print(analogChannel); client.print(" is "); client.print(sensorReading); client.println("<br />"); } client.println("</html>"); break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } delay(1); client.stop(); Serial.println("client disconnected"); } }
Когда скетч будет загружен в Ардуино, мы можем подключить к модулю кабель RJ45, в браузере ввести IP-адрес, т. е. 192.168.1.177, и нашим глазам должна предстать такая картина:
Наш сайт в локальной сети
Теперь мы можем приступить к написанию простой программы, которая будет отображать несколько строк текста, отображать состояние одного аналогового вывода и позволять включать/выключать светодиод, подключенный к Arduino, с помощью кнопки на странице.
Чтобы полностью понять работу программы, которую мы собираемся написать, может потребоваться владение основами HTML. Это несложный язык, но если вы собираетесь часто использовать модули Ethernet, вам следует изучить его.
Что касается схемы, единственное изменение заключается в подключении светодиода. Его необходимо подключить к макетной плате — катод к GND, а анод через резистор 180 Ом к цифровому выводу 2 Arduino.
Скетч, который мы должны загрузить, выглядит следующим образом:
#include <SPI.h> #include <Ethernet.h> byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // Указываем MAC-адреса byte ip[] = {192, 168, 1, 177}; // Указываем IP-адрес EthernetServer server(80); // Определение порта String readString; void setup() { Ethernet.init(10); pinMode(2, OUTPUT); // вывод, к которому подключен светодиод Ethernet.begin(mac, ip); // запускаем модуль } void loop() { EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); if (readString.length() < 100) { readString += c; } if (c == '\n') { Serial.println(readString); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<hmtl>"); client.println("<head>"); client.println("Lokalna strona"); client.println("</head>"); client.println("<title>"); client.println("Локальный сайт"); // заголовок страницы client.println("</title>"); client.println("<body bgcolor=black>"); // цвет фона client.println("<font color=white>"); // цвет шрифта client.println("<meta http-equiv=\"refresh\" content=\"5\">"); // метод установки времени обновления client.println("<center>"); //Устанавливаем в центр client.println("<b>"); client.println("Здравствуйте! Добро пожаловать на локальный сайт, построенный на базе Arduino и модуля W5500 Ethernet "); client.println("</br>"); client.println("Создать такой сайт очень просто, все, что вам нужно, это знание HTML "); client.println("</br>"); client.println("Здесь вы можете прочитать состояние аналогового вывода A0 и управлять светодиодом "); client.println("</b>"); client.println("<p>"); client.println("<table border=0 width=200>"); client.println("<tr>"); client.println("<td align=center>"); client.println("<font color=white>"); client.println("Состояние контакта A0 равно "); client.println("</td>"); client.println("</tr>"); client.println("<tr>"); client.println("<td align=center>"); client.println("<font color = white size=10>"); int pinA = analogRead(0);//переменная client.println(pinA);// отображаем состояние пина A0 client.println("</td>"); client.println("</tr>"); client.println("</table>"); client.println("<p>"); client.println("<FORM>"); client.println("<INPUT type=button value=LED-ON onClick=window.location='/?lighton1\'>");// кнопки для LED client.println("<INPUT type=button value=LED-OFF onClick=window.location='/?lightoff1\'>"); client.println("</FORM>"); client.println("</center>"); client.println("</font>"); client.println("</body>"); client.println("</html>"); delay(1); if (readString.indexOf("?lighton") > 0) // считываем состояние кнопки { digitalWrite(2, HIGH); } else { if (readString.indexOf("?lightoff") > 0) { digitalWrite(2, LOW); } readString = ""; client.stop(); // Конец сеанса } } } } } }
После загрузки программы снова подключите модуль к сети и введите IP-адрес в браузере. Вы должны увидеть такую страницу:
Как мы еще раз убедились, работа с модулями Ethernet не так сложна, как может показаться. И в завершении можем добавить, что еще одним преимуществом модуля Wiznet является более быстрая загрузка страниц, но выбор все равно остается за вами!
Добрый день. Скажите, а как сделать, что бы один скетч мог и принимать запрос как сервер и сам делал запрос, например на сайт с точным временем? и еще есть вопрос — как проверить есть ли вообще соединение с локальной сетью?