KKM: ARDUINO ETHERNET SHIELD S W5100

Početnik si s Dasduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM! Kako Koristiti Module (KKM) je serija blog tutorijala tvrtke soldered na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Dasduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.
UVOD
U ovome tutorijalu, pokazat’ ćemo kako se koristi Ethernet Shield baziran na W5100 integriranom krugu. Taj integrirani krug je mozak cijelog ovog modula te je on zaslužan za svu komunikaciju s Internetom, slanje i primanje podataka, odnosno, pakiranje i raspakivanje paketa koji odakle ili dolaze od njega. Ovaj modul se može koristiti ukoliko žičano želimo povezati naš Dasduino na Internet pri tome dohvaćati neke podatke poput temperature zraka u našem gradu ili postavljati neka naša mjerenja (temperatura zraka, vlaga zraka, tlak zraka, brzina vjetra, itd.) na neku Web stranicu (npr. ThingSpeak servis) ili pak želimo napraviti neku vrstu kućne automatizacije, pa želimo neke parametre namještati putem naše lokalne mreže (npr. podešavati temperaturu centralnog grijanja tako da pristupimo Dasduinu preko našeg mobitela koji je spojen na isti router na koji je spojen Dasduino). No, na početak idemo se pobliže upoznati s našim modulom.
KAKO MODUL RADI
Karakteristike modula:
• Napon napajanja: 5V i 3.3V
• Struja: max 183 mA
• Podržane brzine rada Ethernet veze: 10Base-T (10 Mbit/s) i 100Base-Tx (100 Mbit/s)
• Vrsta komunikacije s Dasduinom: SPI (samo preko ICSP headera i koristi se za SD karticu i W5100)
• W5100 CS pin: Digitalni pin 10
• SD Card CS pin: Digitalni pin 4
Za početak idemo se upoznati s osnovnim pojmovima kao što su Ethernet, IP i MAC adrese, TCP i UDP protokol, HTTP i HTML.
Ethernet je tehnologija komunikacija u mrežama koja je vrlo dobro prihvaćena radi svoje robusnosti, jednostavnosti i brzine. Prve verzije Ethernet tehnologije nisu koristile Ethernet kabel kakav danas poznajemo (a to je UTP – Unshielded Twisted Pair, neoklopljena upletena parica i STP – Shielded Twisted Pair, oklopljena upletena parica, pa čak i optika), već se koristio koaksijalni kabel, kakav se danas koristi za povezivanje antene i radio uređaja. Radi velikog gušenja signala na većim udaljenostima, ograničene brzine prijenosa signala, komunikacije samo u jednom smjeru u jednom trenutku, vrlo brzo je odbačen, te se razvio Ethernet kabel kakvog danas svi poznajemo. (Na slici je prikazan današnji Ethernet kabel [gore] i koakcijalni Ethernet kabel [dolje])
Ethernet tehnologija koristi CSMA/CD protokol za prijenos podataka, a jedna od važnih karakteristika tog protokola je da može detektirati koliziju (kada dva uređaja pokušaju slati podatke u istom trenutku na istoj liniji).
Nakon što smo saznali nešto o samome fizičkom mediju preko kojeg se šalju podaci, možemo krenuti dalje, a to su IP adrese. IP adresa je adresa sačinjena od 4 broja koja su razdvojena točkama. Jedna od najpoznatijih je popularna 192.168.1.1 s kojom možete pristupiti vašem kućnom routeru. Adresa ima svrhu usmjeravanja paketa kroz mrežu, odnosno svaki čvor u mreži ima neku svoju adresu i da bi se znalo gdje se treba paket podataka dostaviti potrebno je znati upravo tu IP adresu odredišta. Također, potrebno je znati i adresu izvorišta da bi se, ukoliko bi došlo do neuspješne dostave paketa, moglo dojaviti izvoru. Upravo taj zadatak radi TCP protokol. TCP (Transmission Control Protocol) je vrsta protokola koja se koristi u mrežama, a zadatak mu je veliki paket razbiti u manje dijelove (jer nije baš prikladno paket od nekoliko Giga bytea poslati od jednom), svaki paket numerirati, svakom paketu dodijeliti odredišnu adresu i na kraju, na odredištu, vratiti nazad kako je sve bilo, a ukoliko dođe do gubitka paketa, javiti izvoru da ponovno pošalje taj paket. Ovaj način slanja paketa se zove slanje paketa s potvrdom ili pouzdano slanje paketa. Postoji i druga metoda gdje se samo paket dijeli na manje dijelove i šalje se kroz mrežu, bez da se provjerava da li je paket stigao. Taj protokol koji to izvodi zove se UDP (User Datagram Protocol).
Što se tiče MAC adresi (Media Access Control), ona se sastoji od 6 brojeva odvojenih dvotočkom i najčešće su zapisani u heksadekadskom zapisu. Onda točno definira uređaj (hadrware) s kojim se želi napraviti komunikacija, pošto na jednoj IP adresi može biti više uređaja potrebno je znati kojem uređaju proslijediti primljeni podatak. Prva tri broja označavaju proizvođača, dok druga tri broja sami uređaj.
Sada kada znamo kako primati, usmjeravati i slati pakete, pozabavit’ ćemo se kako to sve iskoristiti da bi otvorili Web stranicu. Da bi smo prvo otvorili Web stranicu, potrebno je napraviti zahtjev za datotekom (koja je u suštini naša Web stranica), a to se izvodi pomoću HTTP (Hyper Text Transfer Protocol) protokola. On je sačinjen od zahtjeva i odgovora na zahtjev, pa tako kada se spojimo na određenu Web adresu i želimo pristupiti Web stranici, radimo zahtjev GET nakon čega ide poveznica što točno želimo (ili ako samo želimo početnu stranicu te adrese napišemo /, te na kraju ide verzija HTTP-a (HTTP 1.0 ili HTTP 1.1). Ako je to server primio on nam odgovara s 200 OK što znači da je naš zahtjev primio i ako je ispravan, on nam šalje ono što smo tražili. Ako pak to ne postoji javlja nam popularnu grešku 404 Not found.
Sada kada smo primili podatke (Web stranicu u našem primjeru) potrebno je znati kako je ona sastavljena i u kojem jeziku je pisana. Za Web stranice, najčešći korišteni jezik je HTML (HyperText Markup Language) što je ustvari više neka vrsta opisnog jezika nego što je to tipični programski jezik poput C-a. HTML kod uvijek počinje s <html>, a završava </html> i između toga se piše sam HTML kod. Ponekad sam HTML nije dovoljan da bi se napravila neka interaktivna Web stranica, stoga se koristi kombinacija HTML-a s JavaScriptom i CSSom ili pak PHP). Mi ćemo se ovdje orijentirati na HTML, te ćemo u jednom primjeru pokazati kako koristiti CSS s HTML-om da se napravi nešto kompleksnija stranica s jednostavnim grafičkim prikazom.
KAKO POVEZATI
Povezivanje Dasduino-a i Ethernet Shielda je jednostavno, no ipak treba obratiti pažnju na neke stvari. Iako su pinovi 10, 11, 12 i 13 na Dasduino pinovi za SPI komunikaciju, na ovom Shieldu nisu, već je SPI komunikacija izvedena preko ICSP headera na Shieldu. Pinovi na Shieldu za SPI su 5V tolerantni, što znači da se Dasduino i Shield spajanju bez level konvertera.
Za drugi primjer koda potrebne su LED-ice, a za treći i zadnji DHT11, odnosno DHT22 senzor, ovisno o tome što trenutno imate, samo treba imati na umu da ako ćete koristiti DHT22, to treba postaviti i u programskom kodu.
ARDUINO KOD
U ovom dijelu tutorijala, pokazat’ ćemo neke primjere koda kako da modul dohvati neku Web stranicu (HTML datoteku Web stranice), kako da modul glumi Web server pomoću kojeg možemo npr. paliti i gasiti LEDice, te kako pomoću servisa ThingSpeak možemo poslati podatke na našu stranicu kao i napraviti zahtjev za parsiranjem Web stranice (parsirarnje je postupak kojim se iz cijele Web stranice izdvaja točno određeni dio koji nas zanima, npr. neki tekst.
Za ove primjere nije primjere nije potrebno instalirati biblioteku za Ethernet Shield jer je ona već instalirana zajedno s Arduino IDE-om, već je samo potrebno provjeriti da li je instalirana najnovija verzija biblioteke, tako što se iz gornjeg izbornika u Arduino IDE-u odabere Sketch->Include Library->Manage Libraries, pronađete Arduino Ethernet biblioteku i vidite da li imate ponuđeno Update. Za DHT senzor ćete morati instalirati biblioteku koju možete naći ovdje. Ako ne znate kako instalirati biblioteku, pročitajte naš tutorijal.
Prvi primjer je kako dohvatiti Web stranicu (u ovom slučaju vremensku prognozu s stranica Državnog Hidrometeorološkog Zavoda – DHMZ). Treba imati na umu da će biti prikazana HTML datoteka zadane Web stranice.
#include "SPI.h" //Prilozi biblioteku za SPI komunikaciju (pomocu koje komuniciraju W5100 Ethernet i Croduino)
#include "Ethernet.h" //Prilozi biblioteku za upravljanje s W5100 Ethernet Shielda koja sadrzi sve bitne funkcije vezane za otvaranje WEb stranice, spajanje na internet, slanje zahtjeva, itd.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//MAC Adresa Ethernet Shielda (poneki Shieldovi imaju naljepnicu s ispisanom MAC adresom, tu adresu napisati umjesto ove.
IPAddress ip(192, 168, 0, 177);
//Postavi staticnu IP adresu ukoliko DHCP ne uspije
IPAddress myDns(192, 168, 0, 1);
EthernetClient client;
//Inicijalizacija biblioteke koja izvršava sve funkcije vezane za spajanje na Web stranicu, Internet, slanje i primanje podataka, itd.
void
setup
() {
Serial.begin(115200);
//Inicijalizacija serijske komunikacije izmedju Croduina i racunala (115200 Bauda).
Ethernet.init(10);
//Definiranje CS (Chip Select) pina našeg W5100 Etherneta na Croduinu. U našem slucaju to je pin 10.
Serial.println(F(
"Inicijalizacija Etherneta pomocu DHCPa..."
));
if
(Ethernet.begin(mac) == 0) {
Serial.println(F(
"Neuspjesno podesavanje Etherneta pomocu DHCPa."
));
if
(Ethernet.hardwareStatus() == EthernetNoHardware) {
Serial.println(F(
"W5100 Ethernet nije pronadjen. Provjeri da li je W5100 Ethernet dobro spojen."
));
do
{
//Beskonacna petlja, ne vrijedi ici dalje s programom ako nije pronadjen W5100 Ethernet.
}
while
(
true
);
}
if
(Ethernet.linkStatus() == LinkOFF) {
Serial.println(F(
"Ethernet kabel nije prikljucen! Spoji Ethernet kabel na W5100 Ehternet i restartiraj ga."
));
do
{
//Beskonacna petlja, ne vrijedi ici dalje s programom ako Ethernet nije spojen s nicime.
}
while
(
true
);
}
Ethernet.begin(mac, ip, myDns);
//Ako je sve prošlo ok, no nije moguce dodijeliti DHCP, radi s statickom IP adresom.
}
else
{
Serial.print(F(
"Uspjesno dodjeljena dinamicka IP adresa pomocu DHCPa: "
));
//Ako je moguce, dodijeli dinamicku IP adresu preko DHCPa i ispisi ju.
Serial.println(Ethernet.localIP());
}
delay
(1000);
//Pricekaj malo da se Ethernet inicijalizira na novu IP adresu.
//Pokusajmo otvoriti neku Web stranicu, na primjer vremensku prognozu s www.meteo.hr
Serial.println(F(
"Pokusaj spajanja na www.meteo.hr ..."
));
if
(client.connect(
"www.meteo.hr"
, 80)) {
//Pokusajmo se spojiti na meteo.hr, posto zelimo Web stranicu (koja je http), u tom slucaju trazimo port 80 (moze biti i 88, 8080 ili 8008)
client.println(F(
"GET /index.php?tab=prognoza&it=sutra HTTP/1.1"
));
//Posto zelimo otvoriti WEB stranicu, napravit cemo GET zahtjev da ju dohvatimo i zelimo da verzija HTTPa bude 1.1
client.println(F(
"Host: www.meteo.hr"
));
//Potrebno je reci tko je posluzitelj
client.println(F(
"Connection: close"
));
//I nakon sto nam posluzitelj posalje Web stranicu, prekini vezu.
client.println();
}
else
{
Serial.println(F(
"Neuspjesno spajanje na www.meteo.hr :("
));
//Ukoliko se nismo mogli spojiti na zeljenu web stranicu, obavijesti korisnika.
}
while
(client.connected()) {
//Sve dok je posluzitelj (odnosno server na kojoj se nalazi Web stranica) spojen s nama, spremaj i ispisuj sto nam on salje
while
(client.available()) {
//Sve dok ima podataka, spremi ih u privremeni spremnik
uint8_t buf[100];
//Posto Croduino ima malu RAM memoriju, ne mozemo sve podatke koje nam server salje (u ovom slucaju HTML stranica) spremiti od jednom, nego moramo dio po dio
int
n = client.available();
//Pregledavamo koliko je znakova/podataka jos ostalo da primimo
if
(n>100) n = 100;
//Ukoliko je to vise od velicine naseg spremnika, ogranici na ono koliko je nas spremnik velik (u ovom slucaju 100 znakova)
client.read(buf, 100);
//Spremi podatke/znakove u nas spremnik
Serial.write(buf, 100);
//Ispisi to na Serial Monitoru
}
}
client.stop();
//Nakon sto se sve primljeno, raskini vezu s serverom / posluziteljom Web stranice
}
void
loop
() {
// put your main code here, to run repeatedly:
}
Drugi primjer nam pokazuje kako se Dasduino pomoću Ethernet Shielda može koristiti kao mali Web server kojem možemo pristupati unutar lokalne mreže. Potrebno je, nakon spajanja Ethernet Sheilda na mrežu, na računalu ili mobitelu koji su spojeni na istu mrežu kao i Dasduino, otvoriti Web preglednik i upisati IP adresu koja se nalazi u primjeru koda. Trebala bi se otvoriti Web stranica koja omogućava da se pale i gase LEDice koje su spojene na Dasduino.
Korišteni proizvodi
