Для создания Web-сервера требуются следующие компоненты:
Плата Arduino;
Ethernet Shield;
Сетевой кабель с прямым обжимом для соединения Ethernet Shield и роутера;
USB кабель для питания и программирования платы Arduino.
Перед началом работы необходимо подключить Ethernet Shield к плате Arduino, запустить и протестировать работу сети.
Один конец обжатого прямо сетевого кабеля подключается к шилду, второй к роутеру. Затем нужно определить IP адрес сети и модифицировать тестовый скетч для использования с другим IP адресом, но находящимся в той же сети, что и компьютер. После загрузки скетча на Arduino, в адресную строку браузера вводится IP адрес, использованный в скетче, и браузер соединяется с Web-сервером на Arduino. На экран выводятся данные о пинах на плате Arduino. Эти данные обновляются каждые 5 секунд.
Подробнее о каждом шаге.
Шаг 1. Определение IP адреса. Используемый компьютером диапазон адресов должен быть определен. Это нужно для того, чтобы назначить Arduino адрес в пределах этого диапазона. Этот адрес будет использоваться для создания соединения с Web сервером на Arduino.
На Windows 7 это можно сделать следующим образом:
нажать на иконку доступа к интернету в нижнем правом углу панели управления;
Выбрать «Центр управления сетями и общим доступом»;
Далее «Подключение по локальной сети» и «Свойства» в диалоговом окне;
В окне «Сведения о подключении к сети» IP адрес находится в разделе «IPv4».
Шаг 2. Соединение с сервером Arduino. Допустим, IP адрес компьютера 10.0.0.6. Это значит, что необходимо выбрать IP адрес, значение которого будет 10.0.0.х, где х это номер, отличный от номера в адресе компьютера. Например, 10.0.0.12.
В Arduino IDE нужно открыть тестовый скетч. Сделать это можно выбрав File – Examples – Ethernet – WebServer.
Теперь нужно изменить IP адрес в скетче на адрес, который был определен для Web-сервера (листинг 1):
Листинг 1. Изменение IP адреса
IPAddress ip(10,0,0,12); |
Также нужно изменить MAC адрес в скетче на адрес, указанный на Ethernet Shield. В коде это выглядит так (листинг 2):
Листинг 2. Изменение MAC адреса
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; |
Шаг 3. Теперь нужно загрузить скетч на Arduino. На компьютерах под управлением Windows может потребоваться нажать кнопку reset на Ethernet Shield после загрузки скетча.
Шаг 4. Теперь можно открыть браузер и ввести IP адрес сервера в адресную строку (возможно, потребуется ввод в формате http://10.0.0.12 вместо 10.0.0.12). Браузер должен успешно соединиться с сервером и вывести на экран значения аналоговых пинов.
В листинге 3 ниже приведен пример кода, позволяющего Arduino с Ethernet Shield обслуживать веб-страницу, доступную для просмотра в веб-браузере.
Листинг 3. Запуск сервера на Ethernet Shield
#include #include // MAC адрес Ethernet Shield byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(10, 0, 0, 12); // IP адрес будущего сервера EthernetServer server(80); // создание сервера на порте 80 void setup() { Ethernet.begin(mac, ip); // Инициализация Ethernet девайса server.begin(); // запуск сервера (прослушивание клиента) } void loop() { EthernetClient client = server.available(); // попытка получения клиента if (client) { // клиент получен? boolean currentLineIsBlank = true; //переменная типа Boolean для проверки пустоты строки while (client.connected()) { if (client.available()) { // если клиент доступен char c = client.read(); // чтение 1 байта (символа) от клиента // последняя строка запроса клиента пустая и заканчивается на n // ответ клиенту отправляется только после получения последней строки if (c == 'n' && currentLineIsBlank) { // отправка стандартного заголовка ответа http client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); // отправка web-страницы client.println(""); client.println(""); client.println(""); client.println("Arduino Web Page"); client.println(""); client.println(""); client.println("Hello from Arduino!"); client.println(" A web page from the Arduino server ");
client.println(""); client.println(""); break; } // каждая строка текста, полученная от клиента, оканчивается на rn if (c == 'n') { // последний символ строки полученного // начало новой строки со следующего прочитанного символа currentLineIsBlank = true; } else if (c != 'r') { // от клиента получен текстовый символ currentLineIsBlank = false; } } // конец if (client.available()) } // конец while (client.connected()) delay(1); // задержка для того чтобы браузер успел принять данные client.stop(); // закрытие соединения } // конец if (client) } |
Если в слоте для SD карты Ethernet Shield находится неинициализированная SD карта, то это может вызвать проблему с кодом в скетче, который имеет доступ к Ethernet чипу. Код может начать работать неправильно. Например, запускаться один или два раза, а затем прекращать работу. Это происходит потому, что Ethernet Shield и SD карта использутся Arduino через один и тот же SPI. Если SD карта не используется, следует либо извлечь ее из слота, либо отключить программно. Делается это при помощи следующего кода (листинг 4):
Листинг 4. Отключение SD карты
void setup() { // отключение карты SD путем подачи питания на 4 пин // карта SD не используется в этой программе, но если она осталась в разъеме, // это может вызвать проблему доступа к Ethernet чипу до тех пор, пока она не будет отключена pinMode(4, OUTPUT); digitalWrite(4, HIGH); // прочий код инициализации } |
В результате страница будет выглядеть так (Рис. 10):
Рис. 10. Внешний вид web-страницы
Когда производится доступ к IP адресу сервера Arduino, браузер (клиент) отправляет на сервер запросы, похожие на тот, что указан ниже (листинг 5):
Листинг 5. Вид запроса клиент-сервер
GET / HTTP/1.1rn Host: 10.0.0.20rn User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0rn Accept: text/html,application/xhtml+xml,application /xml;q=0.9,*/*;q=0.8rn Accept-Language: en-ZA,en-GB;q=0.8,en-US;q=0.5,en;q=0.3rn Accept-Encoding: gzip, deflatern Connection: keep-alivern rn |
Информация в запросе может отличаться, в зависимости от браузера и операционной системы, с которой был отправлен запрос. Символы rn в конце каждой строки это управляющие символы. r – это символ возврата каретки и n – это символ перевода строки. Последняя строка запроса — это просто rn без какого-либо текста. Это пустая строка, которую и проверяет скетч Arduino перед тем как отправить ответ браузеру клиента.
После того, как запрос страницы получен от клиента, сервер сначала посылает стандартный HTTP ответ, а затем саму Web-страницу. Ответ, отправляемый Arduino, выглядит следующим образом (листинг 6):
Листинг 6. Вид ответа сервер-клиент
HTTP/1.1 200 OKrn Content-Type: text/htmlrn Connection: closern rn |
В ответе так же используются управляющие символы rn. Функция println() в скетче автоматически добавляет символы rn в конец каждой строки. Пустая функция println() в конце HTTP ответа добавляет символы rn без дополнительного текста перед ними.
Список литературы
Иго, Т. Arduino, датчики и сети для связи устройств. – 2-е изд. – СПб: БХВ-Петербург, 2015. – 544 c.
O'Sullivan, D. Physical Computing: Sensing and controlling the physical world with computers / D. O'Sullivan, T. Igoe. – Thomson, 2004. – 496 p.