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

New software XEvil 4.0 bypass more than 8400 type of CAPTCHAs

Perfect update of captcha regignizing software "XEvil 4.0":
captcha solution of Google (ReCaptcha-2 and ReCaptcha-3), Facebook, BitFinex, Bing, Hotmail, SolveMedia, Yandex,
and more than 8400 another subtypes of captchas,
with highest precision (80..100%) and highest speed (100 img per second).
You can use XEvil 4.0 with any most popular SEO/SMM software: iMacros, XRumer, GSA SER, ZennoPoster, Srapebox, Senuke, and more than 100 of other software.

Interested? You can find a lot of demo videos about XEvil in YouTube.

FREE DEMO AVAILABLE!

See you later!


XEvil.net

Datum
Vložil
Titulek

asian lesson milf

Hello! How can I contact Admin?
fbnty55fe4

Datum
Vložil
Titulek

One Piece VOSTFR

L'histoire de One Piece se déroule dans un monde fictif dominé par les océans, où les pirates aspirent à une ère de liberté et d'aventure connue comme « l'âge d'or de la piraterie ». Cette époque fut inaugurée suite aux derniers mots prononcés par le roi des pirates, Gol D. Roger avant son exécution.

Datum
Vložil
Titulek

Москитные материалы

Интернет - магазин "Авалор" предоставляет услуги как обычным гражданам, так и владельцам различных заведений, ведь у нас можно найти множество качественных приспособлений для ремонта и монтажа окон. Наша компания реализует детские замки на окна, использование которых гарантируют безопасность ребёнка во многоэтажном помещении. Подобные системы рекомендуется устанавливать даже в одноэтажных домах, чтобы предоставить надежную защиту Вашему ребенку.

Довольно часто детский замок может стать достойной альтернативой традиционным оконным решёткам.Мошенники не смогут открыть такое окно и пробраться в квартиру или финансовое учреждение - в этом Вы можете быть целиком и полностью уверены.

Блокиратор, в большинстве случаев, закрепляется на нижнюю створку окна и не даёт ребёнку открывать створки нараспашку.В том случае, если Вам нужно будет открыть окно, к примеру, для того, чтобы полить цветы, Вы сможете воспользоваться специальным ключом.

На сайте нашего интернет - магазина Вы найдете замки, которые крепятся на пластиковые или металлические окна.Благодаря большому разнообразию цветов, Вы легко сможете подобрать именно то изделие, которое Вам больше всего подойдет.Среди большого ассортимента товаров у нас Вы можете заказать замки серого, коричневого, золотого цвета и т.д.Мы реализуем продукцию проверенных и известных брендов, в числе которых:BabySafeLock BSL, Roto и другие.

В интернет - магазине "Авалор" Вы сможете приобрести замки определенного принципа действия.Наши блокираторы могут быть: врезными, с тросиком, с цилиндром, с поворотной лапкой.

Хотите разобраться в разнообразии изделий и выбрать наиболее оптимальный вариант именно для Вашей квартиры?Звоните нашим специалистам, чтобы получить подробную консультацию по интересующему Вам вопросу.Мы в телефонном режиме совершенно бесплатно поможем определиться с выбором и оформим заказ. При этом, заявки на покупку изделия можно оставлять самостоятельно на нашем сайте.

Сделав заказ на <a href=avalor.ru/domvent>вентиляция домвент</a>, доставка осуществляется по всей территории Российской Федерации, при этом мы предлагаем несколько способов оплаты.Вы можете перевести средства:

- на банковский счет нашей компании;
- через электронные платёжные системы Яндекс.Деньги или Qiwi;
- при использовании услуг логистической компании, которая доставляет заказ. Если Вы хотите использовать наложенный платеж, то стоимость услуг транспортной компании немного возрастет.

Переходите на сайт Интернет-магазина Avalor прямо сейчас, чтобы в считанные секунды оформить заказ, и обезопасить детей от рисков.

Datum
Vložil
Titulek

Производственная СВ компания "Триада" предлагает

Производствосветодиодных табло для спорта, бегущих строк, табло для АЗС

Datum
Vložil
Titulek

benign site Jarle Thorsen

blooming website Jarle Thorsen Unaico Reviews

Datum
Vložil
Titulek

рыкерыфкряап

Спасибо! Интересно написано !

Datum
Vložil
Titulek

select website Jarle Thorsen SiteTalk

select website Jarle Thorsen SiteTalk

Datum
Vložil
Titulek

донченко сергей иванович отзывы

донченко сергей иванович отзывы

Datum
Vložil
Titulek

Please help for African people

Need money for the hospital, please help
BTC: 181i2nawNFmSwM12ihWzjFKt5w2tiRKKU2
ETH: 0x532B9BF5C070136D278D1712b451073682927D53
BCH: qpqr6ffh26nyg7jf2n7pyaaemehgemrtyv6v9z4935
Thanks to all, good and peace to everyone

1 | 2 | 3 | 4 | 5 >>

© 2015 Všechna práva vyhrazena.

www.hwkitchen.com