Vyhledávání

#15 - Arduino a Ethernet shield

08.06.2014 20:00

Arduino a Ethernet shield

V dnešním článku si ukážeme, jak pracovat s Ethernet shieldem, což je zajímavé rozšíření pro Arduino, které nám přináší nové možnosti interakce Arduina se sítí i internetem.


Ethernet Shield

Ethernet shield si (stejně jako celé Arduino) prošel poměrně dlouhým vývojem, proto se setkáme hned s několika jeho verzemi. My budeme pracovat s jeho nejnovější verzí Arduino Ethernet Rev3 WITH PoE.

Ethernet shield
Obr. 1: Ethernet shield

Dominantním prvkem desky je RJ45 konektor pro připojení Ethernet kabelu. Mimo něj ale na shieldu nalezneme i slot na SD kartu, jejíž používání jsme si popsali v minulém dílu. Ovládání čipu (W5100) i SD karty probíhá přes SPI rozhraní. Rychlost síťové komunikace 10/100 MB není v dnešní době zrovna strhující, ale pro naše účely je zcela dostačující. Než shield připojíme k Arduinu, otočíme jej.

MAC adresa
Obr. 2: MAC adresa

Na jeho spodní straně nalezneme nálepku s MAC adresou (unikátní identifikační číslo síťového zařízení). Tu si někam poznamenáme pro pozdější použití. Když máme MAC adresu zapsanou, můžeme shield připojit na Arduino (v našem případě Arduino Mega).

Arduino Mega s Ethernet shieldem
Obr. 3: Arduino Mega s Ethernet shieldem

 


Funkce

Pro programování Ethernet shieldu se používá hned několik tříd. Třída Ethernet slouží k základnímu nastavení.

Název Zápis Funkce
Ethernet.begin(mac) Ethernet.begin(mac)
Ethernet.begin(mac, ip)
Ethernet.begin(mac, ip, dns)
Ethernet.begin(mac, ip, dns, gateway)
Ethernet.begin(mac, ip, dns, gateway, subnet)
Slouží k zahájení komunikace shieldu s okolím (většinou router či switch). Vlevo vidíte použití různých parametrů. Nejčastěji se používají pouze mac a ip. Když parametr ip nepoužijeme, je IP adresa přidělena automaticky DHCP serverem.
Ethernet.localIP() - Vrátí IP adresu shieldu. Tato funkce se nepoužívá, pokud IP adresu přiřazujeme manuálně, ale když ji necháme přes DHCP přidělit automaticky.
Ethernet.maintain() - Pokud má shield přiřazenou adresu automaticky, může touto funkcí požádat o její obnovení. Přidělená adresa může být v závislosti na nastavení routeru stejná i nová.

Jakousi pomocnou třídou je třída IPAddress. Ta slouží k uchování IP adresy.

Název Zápis Funkce
IPAddress() IPAddress jmeno(a,b,c,d) Tato funkce uloží IP adresu. Zápis adresy ve tvaru a.b.c.d (např. 10.0.0.1) se jménem mojeIP se provede vytvořením objektu IPAddress mojeIP(a,b,c,d).

Třída Server slouží k odesílání a přijímání dat mezi shieldem a připojenými klienty (programy na jiných zařízeních, které se připojují k serveru).

Název Zápis Funkce
Server() EthernetServer mujSvr = EthernetServer(port) Vytvoří server, který naslouchá příchozím připojením na vybraném portu (80 pro HTTP, 23 pro telnet...).
mujSvr.begin() - Spustí vybraný server.
mujSvr.available() EthernetClient client = server.available() Vrátí objekt Client, který je připojen k našemu serveru a odesílá data ke čtení.
mujSvr.write() mujSvr.write(val)
mujSvr.write(buf, len)
Pošle data všem klientům připojeným k serveru. Data mohou být typu char, byte, nebo pole těchto typů (buf je poté délka tohoto pole).
mujSvr.print() mujSvr.print(data)
mujSvr.print(data, BASE)
Stejné jako .write(), jen data převádí na text. Parametr BASE může nabývat hodnot: BIN (dvojková soustava), OCT (osmičková soustava), DEC (dekadická soustava), HEX (šestnáctková soustava).
mujSvr.println() mujSvr.println(data)
mujSvr.println(data, BASE)
Stejné jako .print(), jen na konec přidá zalomení řádku.

Ke zpracování dat ze serveru slouží třída Client. Tato třída vytvoří ze shieldu klienta, který se může připojit k jiným serverům.

Název Zápis Funkce
EthernetClient ja - Vytvoří klienta s názvem ja.
ja while(!ja){delay(1)} Počká, dokud není klient připojen.
ja.connected() - Vrátí true, pokud klient odesílá data (v dobu zpracování už nemusí být přítomen, ale musí být od něj přijaty data).
ja.connect() ja.connect(ip, port)
ja.connect(URL, port)
Připojí se k vybrané ip, nebo URL přes zadaný port.
ja.write() ja.write(val)
ja.write(buf, len)
Pošle data serveru, ke kterému je shield připojen.
ja.print() ja.print(data)
ja.print(data, BASE)
Pošle data serveru jako text.
ja.println() ja.println(data)
ja.println(data, BASE)
Pošle data serveru jako text končící zalomením řádku.
ja.available() - Vrátí počet bytů přijatých klientem od serveru.
ja.read() - Přečte a vrátí hodnotu přijatého bytu.
ja.flush() - Vyprázdní frontu přijatých a nepřečtených dat.
ja.stop() - Odpojí se od serveru.

Poslední třída EthernetUDP slouží k přijímání a odesílání UDP zpráv. My se jí však nebudeme zabývat. Pro více informací navštivte dokumentaci.

 


Použití

Když už jsme si popsali všechny potřebné funkce, můžeme se pustit do programování.


Vytváříme server

Na úvod si naprogramujeme jednoduchý server. Než ale začneme, musíme pochopit, jak spolu komunikuje server s klientem. Komunikace zde probíhá na principu dotaz-odpověď. Tyto dotazy a odpovědi mají formát pouhého textu. Jakým způsobem musí být text zapsán, definuje HTTP protokol. Nejjednodušší bude si vše předvést na ukázce komunikace. Když se chce klient připojit na server, zašle mu požadavek přibližně v tomto tvaru:

GET / HTTP/1.1
Host: 10.0.0.15
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml, application/xml;q=0.9, image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Referer: https://10.0.0.15/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: cs,en;q=0.8,de;q=0.6,sk;q=0.4

Tato zpráva obsahuje vše potřebné pro server pro odeslání vodných dat klientovi. Obsahuje informaci o tom, s jakou verzí HTTP pracujeme, jaký je pro klienta přijatelný formát, o jakého klienta se jedná, jaké kódování používá a jaký jazyk očekává. Prázdný desátý řádek zde není z nepozornosti. Tímto způsobem se označuje, že je požadavek ukončen.

Server poté musí požadavek zpracovat a odeslat zpět odpověď v HTML tvaru s vhodnou HTTP hlavičkou. Hlavička obsahuje informace o verzi HTTP, o stavu připojení po ukončení přenosu, nebo o automatickém obnovování. Tyto informace nám nyní stačí. Existuje ale samozřejmě celá řada dalších HTTP příkazů, jejichž seznam nalezneme například na wikipedii. Hlavička odpovědi tedy vypadá takto (opět s volným řádkem).

HTTP/1.1 200 OK
Content-Type: text/html
Connection: close
Refresh: 1

Po hlavičce a volném řádku následuje kód stránky ve formátu HTML. Představme si nyní základní strukturu stránky.

<!DOCTYPE HTML> - říkáme prohlížeči, že pracujeme s HTML
<html>
	<head>
		mezi značky head se píší základní informace o stránce (kódování, CSS styly...)
		<title>Titulek stránky </title> - zobrazí se v záložce
	</head>
	<body>
		sem patří obsah stránky (ten, který vidíme v prohlížeči)
	</body>
</html>

Se všemi získanými informacemi už můžeme poskládat program jednoduchého serveru, který bude měnit barvu pozadí pomocí css stylů podle toho, jestli je nebo není stisknuto tlačítko připojené k Arduinu na pinu 45. Tlačítko budeme kontrolovat každou vteřinu. Mimo tlačítka budeme potřebovat ještě 10k resistor a několik vodičů.

V programu použijeme také jednoduché css stylování. My budeme chtít, aby pozadí celé stránky bylo zelené nebo červené. To se v html provede tak, že se k elementu <body> připojí style="background: red/green". Dvojité uvozovky by ale program Arduina mohly mást, proto se používá tzv. escapování, kdy se před vybraný znak dá zpětné lomítko. Ten se poté projeví až při zpracování prohlížečem. Výsledný element body tedy bude vypadat třeba takto: <body style=\"background: green\">

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x9C, 0xB7 };
IPAddress ip(10,0,0,15); //ip serveru je 10.0.0.15

EthernetServer mujSvr(80); //vytvoříme server na portu 80

void setup(){
    Ethernet.begin(mac);

    mujSvr.begin(); //spustíme server

    pinMode(45, INPUT);
}


void loop(){
    EthernetClient client = mujSvr.available();
    if (client){
        boolean prazdnyRadek = true;
        while (client.connected() && client.available()){ 
            //dokud klient něco odesílá (HTTP požadavek)
            char c = client.read(); //přečti byte od klienta
            
            if(c == '\n' && prazdnyRadek){
                client.println("HTTP/1.1 200 OK");
                client.println("Content-Type: text/html");
                client.println("Connection: close");
                client.println("Refresh: 1");
                client.println();
                client.println("<!DOCTYPE HTML>");
                client.println("<html>");
                client.println("<head>");    
                client.println("<title>Zkoumame HTML a HTTP</title>");
                client.println("</head>");
                
                if(digitalRead(45) == HIGH){
                    client.println("<body style=\"background:green\">");
                }
                else{
                    client.println("<body style=\"background:red\">");
                }

                client.println("</body>");
                client.println("</html>");
            }
            
            if(c == '\n'){
                prazdnyRadek = true;
            } 
            else if(c != '\r'){
                prazdnyRadek = false;
                /*dokud klient nepošle dvakrát za sebou \r a \n
				znamená to, že stále odesílá data*/
            }
        }
        delay(1); //dáme klientovi čas na zpracování
        client.stop(); //komunikace je u konce
    }
}
Zapojení
Obr. 4: Zapojení

 


Sosáme data

V druhém příkladu se připojíme k serveru a budeme po něm požadovat nějaká data, která si vypíšeme po sériové lince. Konkrétně to bude server ahwk.ic.cz, po kterém budeme chtít soubor ahoj.txt. Ten je uložen v kořenovém adresáři serveru, tedy přímo na adrese ahwk.ic.cz/ahoj.txt. Na začátek si sestavíme HTTP požadavek.

GET /ahoj.txt HTTP/1.1
Host: ahwk.ic.cz
Connection: close

Slovy: Dej mi soubor ahoj.txt přes protokol HTTP verze 1.1 z ahwk.ic.cz a potom ukonči spojení.

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x9C, 0xB7};

char server[] = "ahwk.ic.cz"; //server, kam se připojujeme

EthernetClient client;

void setup(){
    Serial.begin(9600);
    Ethernet.begin(mac);
    delay(1000);

    Serial.println("Spojuji...");

    if(client.connect(server, 80)){ //připojí se k serveru
        Serial.println("Pripojeno!");
        
        client.println("GET /ahoj.txt HTTP/1.1");
        client.println("Host: ahwk.ic.cz");
        client.println("Connection: close");
        client.println();
    } 
    else {
        Serial.println("Spojeni se nepovedlo.");
    }
}

void loop(){
    if(client.available()) {
        char c = client.read();
        Serial.print(c); //vypíše přijatá data
    }

    if(!client.connected()) {
        Serial.println();
        Serial.println("Odpojuji.");
        client.stop();
        while(true){} //zastaví činnost shieldu
    }
}

 


Ovládání přes síť

V posledním příkladu si ukážeme, jak Arduino ovládat pomocí prohlížeče, či jiného síťového zařízení. Budeme ovládat čtyři LED připojené na pinech 3, 4, 5 a 6. Informaci o tom, která LED bude svítit, předáme shieldu pomocí parametru v URL (to co píšeme do adresního řádku). Parametr se píše za ?. My tedy budeme v HTTP požadavku klienta hledat ? a poté čísla za ním následující. Náš program poté rozsvítí postupně LED diody daných čísel. Pokud napíšeme do prohlížeče: 10.0.0.15/?3456, HTTP požadavek odeslaný na server vypadá nějak takto.

GET /?3456 HTTP/1.1
Host: 10.0.0.15
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml, application/xml;q=0.9, image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: cs,en;q=0.8,de;q=0.6,sk;q=0.4

Jediná věc, která nás teď zajímá je první řádek, a to až za otazníkem. Poté už nás další informace nezajímají. Data, která chceme, tedy začínají otazníkem a končí mezerou. Pozor na to, že jsou tu i číslice kódovány jako ASCII.

#include <Ethernet.h>
#include <SPI.h>

boolean zacatekCteni = false;

byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x9C, 0xB7 };
IPAddress ip(10,0,0,15);

EthernetServer mujSvr = EthernetServer(80);

void setup(){
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);

  Ethernet.begin(mac, ip);

  mujSvr.begin();
}

void loop(){
    EthernetClient client = mujSvr.available();
    
    if(client){
        boolean prazdnyRadek = true;
        boolean hlavickaPoslana = false;
        
        while(client.connected() && client.available()){
            if(!hlavickaPoslana){ //jednou pošleme hlavičku
                client.println("HTTP/1.1 200 OK");
                client.println("Content-Type: text/html");
                client.println();
                hlavickaPoslana = true;
            }
            
            char c = client.read();
            
            if(zacatekCteni && c == ' '){ //ukončí čtení
                zacatekCteni = false;
            }
            
            if(c == '?'){ //začne čtení
                zacatekCteni = true;
            }
            
            if(zacatekCteni){                
                if(c == '3'){
                    blikni(3, client);
                }
                else if(c == '4'){
                    blikni(4, client);
                }
                else if(c == '5'){
                    blikni(5, client);
                }
                else if(c == '6'){
                    blikni(6, client);
                }
            }
            
            if (c == '\n') {
                prazdnyRadek = true;
            }
            
            else if (c != '\r'){
                prazdnyRadek = false;
            }
        }
        delay(1);
        client.stop();
    } 
}

void blikni(int pin, EthernetClient client){
    client.print("Sviti LED na pinu ");
    client.print(pin);
    client.print("<br>"); //zalomení řádku
    
    digitalWrite(pin, HIGH);
    delay(250);
    digitalWrite(pin, LOW);
    delay(250);
}
Ovládáme LED po síti
Obr. 5: Ovládáme LED po síti

Tímto jsme získali základní přehled o tom, co Ethernet shield umí. To ale samozřejmě není vše. Můžeme ho například naučit komunikovat s Twitterem, zjišťovat čas podle atomových hodin a další. Několik zajímavých příkladů nalezneme v oficiální dokumentaci.

 


V případě jakýchkoliv dotazů či nejasností se na mě neváhejte obrátit v komentářích.

 

Kam pokračovat?


<-- #14 - ARDUINO PROJEKT: 2048||#16 - Náš první klon Arduina-->
Zpět

Diskusní téma: #15 - Arduino a Ethernet shield

Datum
Vložil
Titulek

Ошибка часточного преобразователя

Добрый вечер.
Происходит авария w71 на приводе FR-Z240-15K-UL. Похожие устройства ATV61EXC5C11N, CIMR-E7Z40P41, SJ100-007NFU установленные на экструдерах без аварий.
Подсказку нашел в яндексе по запросу "buk653r3-30c" prom-electric.ru/media/BUK653R3-30C.pdf . Был неисправен экран.
Всего наилучшего!

Datum
Vložil
Titulek

ccleaner free download 78308251

ccleaner free download

Datum
Vložil
Titulek

Storect

I am new to this forum.

Please excuse my humble question: does anyone know where to buy <b>Storect</b>?

Datum
Vložil
Titulek

﨨

﨡
xlccl20180402er

Datum
Vložil
Titulek

Пробив информации по РФ и СНГ

Пробив информации по абсолютно любым госсударственным базам, банкам и мобильным операторам.

Достанем для вас информацию из баз МВД, ГИБДД, ФССП, ФМС, Налоговой, ЕГРП, Пенсионному фонду
А так же достанем паспортные данные, сделаем детализацию, определим местоположение абонента таких сетей как МТС, Билайн, Мегафон, Теле2 и достанем информацию из любых российских банков.

Так же имеем много возможностей достать информацию из баз Украины, Беларуси, Казахстана и других стран ближнего зарубежья.

Оплата в большинстве случаев после выполнения заказа, никакого обмана, не требуем предоплат!!!
Не стесняйтесь, пишите, спрашивайте, поможем, ответим на все вопросы.

Цены на пробивы от 500 руб!

контакты:

+79180589706 Алексей (телефон, viber, whatsapp, skype)
Telegram @alekseydetectiv

Datum
Vložil
Titulek

Звонки с любого номера с подменой голоса!

Вы сможете звонить абсолютно с любого номера, друга, жены или +77777777777

Предлагаю абсолютно анонимный сервис для звонков со всего мира и по всему миру.
Наши плюсы:
1) Неограниченая бесплатная подмена номера, хоть 1000 раз в день
2) Подмена голоса 6 режимов
3) Абсолютная анонимность, невозможность прослушки и определения местонахождения звонящего.
4) Детализация звонков выдает тот номер, который вы использовали для подмены.
5) Возможность работать через приложение или через специальную сим карту, которую мы вам доставим.
6) Наша сим карта работает по всему миру без роуминга
7) Тарифы на звонки по всему миру от 2 до 20 рублей за минуту
8) Работает на всех платформах и телефонах (Windows, Linux, android, iphone, простая звонилка типа nokia 1100)
На любой компьютерной ос или смартфоне/планшете можно настроить наш сервис через приложение.
На любом аппарате, где есть слот под sim карту можно пользоваться сервисом с помощью нее.

Цены: Настройка, установка, подключение - 2500 руб
Сим карта - 3000 руб + доставка
Звонки 2-20 руб/мин

Пройдем любые проверки, сделаем Вам тестовые звонки. Согласны на оплату через гаранта любого авторитетного форума.

Контакты:
+79182789923 (Телефон, вайбер, ватсапп, скайп)
Телеграм - @Vip_Security
Icq - 723882584
Время работы: 10:00-23:00 по МСК

Datum
Vložil
Titulek

Услуги грузчиков

Частное лицо предоставляет людей по следующим видам услуг:

- Погрузка/разгрузка грузовых машин от газели до вагона

- Квартирные/офисные переезды

- Упаковка вещей, товара
- Поднятиестроительного материала

- Любая другая физическая работа

-----------------------------

В перечень услуг разнорабочих входит:

- Демонтаж

- Складские работы

- Вынос мусора, с дальнейшейпогрузкой

- Уборка строительных обьектов после ремонта, демонтажа

- Уборка площадей

Полнота предоставляемых услуг (доставка от двери до двери или полный цикл погрузки и выгрузки с последующим распространением и расстановкой грузов по складу, квартире или офису).
Качество выполняемойработы гарантируется.

Стоимость услуг 180 рублей/час

Номер 8-951-366-71-17

Новосибирск

Работаем круглосуточно, без выходных.

Datum
Vložil
Titulek

Качественный алкоголь в 5 литровых канистрах по РФ

Качественный алкоголь в 5 литровых канистрах с доставкой по России

Предлагаю вашему вниманию качественный алкоголь по демократичным ценам.
Доставка по всей России от 1 коробки (3 канистры по 5л)

В наличии:
Водка (Де люкс) 600руб\5л
Водка со вкусами (Виноград, вишня, грейпфрут, дыня, клюква, лимон, мята, черная смородина) 600руб\5л
Коньяк (обычный 5 звезд, шоколадный, вишневый, миндальный, карамельный, барбарис, мускат, абрикос) 600 руб\5л
Ром Баккарди (белый, черный) 650руб\5л
Текила Olmeca (золотая, серебряная) 650руб\5л
Виски Grants 650руб\5л
Наливка спотыкач (вишня с черносливом, 60% сахара) 650руб\5л
Амаретто (миндаль, вишня) 600руб\5л
Джин "Бифитер" 900 руб\5л
Абсент "Ксента" 900руб\5л
Самбука "Молинари" 900руб\5л
Ментоловая водка "Минта" Финская водка 900руб\5л
"Куантро" апельсиновый ликер 900 руб\5л
Мартини (вермут) 900руб\5л
Вино крепленое 18% (Малиновое, изабелла, вишневое) 600 руб\5л
Спирт "Люкс" 96 градусов 850руб\5л

Весь алкоголь отличного качества и постоянно проходит контроль качества.
Доставка по территории России транспортными компаниями занимает от 2ух до 15 дней.

Контакты для связи:
+7 988 3208922 Алексей (Телефон, viber, whatsapp, skype)
@Alkogolru - telegram

Datum
Vložil
Titulek

XEvil 4.0 can solve 99% types of captchas

This message is posted here using XRumer + XEvil 4.0

XEvil 4.0 is a revolutionary application that can bypass any antibot CAPTCHA's.
Captcha Solution Google (ReCaptcha-1, ReCaptcha-2), Facebook, BING, Hotmail, Yahoo,
Yandex, VKontakte, Captcha Com - and over 8400 other types!

You read this - it means it works! ;)
Details on the official website of XEvil, there is a free demo version.

Check YouTube video "XEvil ReCaptcha2"

Datum
Vložil
Titulek

Пробив информации

Пробив информации по абсолютно любым госсударственным базам, а так же банкам и сотовым сетям.

Достанем для вас информацию из баз МВД, ГИБДД, ФССП, ФМС, Налоговой, ЕГРП, Пенсионному фонду
А так же достанем паспортные данные, сделаем детализацию, определим местоположение абонента таких сетей как МТС, Билайн, Мегафон, Теле2 и достанем информацию из любых российских банков.

Так же имеем много возможностей достать информацию из баз Украины, Беларуси, Казахстана и других стран ближнего зарубежья.

Оплата в большинстве случаев после выполнения заказа, никакого обмана, не требуем предоплат!!!
Не стесняйтесь, пишите, спрашивайте, поможем, ответим на все вопросы.

Цены на пробивы от 500 руб!

контакты:

+79180589706 Алексей (телефон, viber, whatsapp, skype)
Telegram @alekseydetectiv
почта alekseydetectiv@gmail.com

1 | 2 | 3 | 4 | 5 >>

© 2015 Všechna práva vyhrazena.

www.hwkitchen.com