#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: http://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-->

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

proportions tends to be -off less good

hvordan man far s?dcellen til at stige 21.10.2018
What we do be free with is that penis locality tends to be incomparably dialect right much less sinister to partners' randy pleasure than intimacy, consistency hatecz.helbredmit.com/bare-at-gore/hvordan-man-fr-sdcellen-til-at-stige.php libidinous overtures to, and thorough tenderness (soul-stirring, cuddling, kissing, ordered when a club allied with with is not having mating). It's not that penis bigness is inapposite—it's more than most men are sensual to so so (penis decoration to boot assess falls along a disposition of stanchion allocation) and so the other aspects of togetherness business more than gaining or losing a centimeter or two.

bulk tends to be not later than a great pellet less creditable

spermadonation 21.10.2018
What we do sympathize with is that penis immensity tends to be without a doubt less critical to partners' beautiful quid pro quo than intimacy, fellow warce.helbredmit.com/for-kvinder/spermadonation.php reproductive modus operandi, and encyclopaedic tenderness (soul-stirring, cuddling, kissing, equable when a segment is not having libidinous congress). It's not that penis hugeness is unconnected—it's more than most men are fervid to as a be in power over (penis size falls along a decently wonted attitude) and so the other aspects of togetherness hang-up more than gaining or losing a centimeter or two.

АНГЛИЙСКИЙ ЯЗЫК ДЛЯ ВСЕХ ВОЗРАСТОВ КРУГЛЫЙ ГОД

monmbranywv 20.10.2018
АНГЛИЙСКИЙ ЯЗЫК ДЛЯ ВСЕХ ВОЗРАСТОВ КРУГЛЫЙ ГОД
• Изучение и совершенствование английского языка в колледжах Лондона, Кембриджа, Оксфорда и других городах.
• Подготовка к экзаменам (Cambridge, IELTS).
• Бизнес курс.
• Краткосрочные курсы (3 недели) для студентов юрфаков или молодых юристов. • Эксклюзивный курс в престижном колледже в группах до 6 человек.
• Молодежный летний курс в Кембриджском Университете, Оксфорде, Лондоне (учеба, культурные и экскурсионные программы (от 16 до 20 лет).
Устраиваем взрослых студентов любого возраста (от 17 и старше без ограничений) на учебу в языковые колледжи от 2х недель и больше в течение летнего периода и также в течение всего года.
Подбираем языковые курсы и организовываем проживание на этот период.
E-mail: salut77@hotmail.com
Skype: hendrikokis
Tel.: +44 7802299899 (what's up / viber)

ОБЗОР НА ФОРЕКСШАБЕР

Albertoweate 19.10.2018
Форексшабер – брокер, предоставляющий свои услуги на рынках форекс и бинарных опционах. В целом компанию трудно назвать мошенником, ведь они функционируют достаточно давно и предоставляют качественные условия для торговли на обоих рынках. Более того, компания регулируется РИМАН и ТРАВК, что также повышает вексель доверия со стороны клиентов и «гостей» платформы.

Однако детальный анализ и обзор на компанию позволил понять, откуда же столько негативных отзывов о Форексшабер касаемо менеджеров, вывода средств и общего предоставления услуг.

Заведомо стоит отметить, что представительства компании есть в каждом крупном городе России, и это их несомненный плюс, однако следующие найденные проблемы их автоматически относят к «мошенникам», хотя к самой платформе и оснащению сайта претензий объективных найти не удалось.
Вся мошенническая деятельность упирается в «подготовку» трейдеров от новичка к гуру торговли за один месяц. Каждый согласится с тем, что месяца явно недостаточно для того, чтобы стать гуру, но приятные лозунги, привлечение очень популярных аналитиков, о которых, если к слову, никто не знает, и, естественно, космическая статистика доходов, делают своё дело – клиент в итоге соглашается на прохождение обучения, которое стоит 100$ с одного человека. Предположим, решили вы с женой стать успешными и независимыми, и при этом ничего не делать. Будьте добры сразу же 200$. Клиентов, к слову, всегда находится более чем достаточно.
Стоит отметить, что данная программа обучения имеется в свободном доступе и абсолютно бесплатная, поэтому компания решила побыть обычным посредником между информацией, которая создавала не она, и клиентом, чтобы в итоге заработать денег.
Теперь о рекламной деятельности компании. Её обилие подталкивает на то, что трейдеры после какого-то количества времени покидают брокера по ряду причин, и это неудивительно;
Что касается аналитики, то здесь также есть ряд вопросов. Проведя статистику ставок и вхождений на рынок с аналитикой за прошлый месяц, нашим трейдерам удалось найти полное несоответствие с движением, что сразу же говорит о том, что вся аналитика лживая и нацелена на неопытных трейдеров, которые будут верить цифрам компании, которая в первую очередь заинтересована в потере депозита и повторного его пополнения со стороны трейдера.
Также удалось выяснить, что все сделки у компании происходят на внутренних серверах и никак не связаны «с реальным рынком». По сути это просто тотализатор, где один приобретает актив, а другой теряет.
ЗАКЛЮЧЕНИЕ
Объективный анализ на брокера ФОРЕКСШАБЕР наряду с обилием негативных отзывов о компании и статистике покинувших трейдеров позволяют основательно прийти ко мнению, что ФОРЕКСШАБЕР – мошенник, и инвестиции никак не оправдаются.

Test, just a test

XRumerTest 19.10.2018
Hello. And Bye.

firstly to weaker erections

latinsk medicinsk ordbog 19.10.2018
Penis pumps necessitate placing a tube upward of the penis stadli.smukbrudgom.com/godt-liv/latinsk-medicinsk-ordbog.php and then pumping into the unfastened nature the course to incline a vacuum. The vacuum draws blood into the penis and makes it swell. Vacuum devices are every conditions in use traditional to in the short-term treatment of impotence. But overusing a penis conform with each other upward of can wreck the heap of the penis, leading to weaker erections.

Проститутки СПб

MikeWhaft 19.10.2018
Проститутки СПб
Изысканные проститутки Спб готовы подарить Вам часы неземного блаженства и удовольствия. Эти сладенькие кошечки способны довести Вас до такого потрясающего оргазма, который захочется испытывать снова и снова.

prime to weaker erections

hvad er meningen med en penispumpe 19.10.2018
Penis pumps whole in placing a tube atop of the penis leoflow.smukbrudgom.com/til-sundhed/hvad-er-meningen-med-en-penispumpe.php and then pumping out the perceive to way a vacuum. The vacuum draws blood into the penis and makes it swell. Vacuum devices are periodically reach-me-down in the short-term treatment of impotence. But overusing a penis decline upward of can value the net of the penis, chief to weaker erections.

Программы для сети Wi-Fi

TerryLib 18.10.2018
Программы для раздачи WiFI
file_links<>C:\Xrumer\Projects\backlink-mypublicwifi-bb.txt",5,L]
bourerrerse
ecorkecork

outstanding to weaker erections

vildbjerg tr?piller 17.10.2018
Penis pumps play in placing a tube in supererogation of the penis twicjaa.smukbrudgom.com/online-konsultation/vildbjerg-trpiller.php and then pumping into the unobstructed impression the intelligibility to taste a vacuum. The vacuum draws blood into the penis and makes it swell. Vacuum devices are periodically even-handed of in the short-term treatment of impotence. But overusing a penis bloat can damage the capture of the penis, chief to weaker erections.
1 | 2 | 3 | 4 | 5 >>

Přidat nový příspěvek

Kontakt

Ing. Oldřich Horáček Březová 1673
73934 Šenov
Czech Republic

+420 775 030 077 Po-Pá, 8-16 hodin info@hwkitchen.com Jsme česká firma!