Arduino i Ethernet shield WP5100

Jakiś czas temu emocjonowałem się ESP8266 a tu proszę – cały shield do podłączenia do Ethernetu jak na zawołanie:)

Ethernet Shield dla Arduino
Ethernet Shield dla Arduino
Nienormalnie długie piny mają odsunąć gniazdo Ethernetowe od USB
Nienormalnie długie piny mają odsunąć gniazdo Ethernetowe od USB
Arduino i Ethernet Shield
Arduino i Ethernet Shield

Postanowiłem kontynuować temat IOT (Internet Of Things – Internet Rzeczy) i zobaczyć co można z tym modułem zrobić.

Instalacja

Nie ma tu żadnej filozofii. Moduł nakłada się na Arduino i jest gotowy do pracy.  Dopinamy kabel Ethernetowy z routera i zasilanie. W tym momencie na module powinno zabłysnąć kilka diod:

  • PWR: zasilanie
  • LINK: istnieje połączenie i jest ono poprawne
  • 100M: wykryto sieć 100Mb/s (Fast Ethernet)
  • FULLD: pełny dupleks (równoczesna wymiana danych w górę i w dół)

Oczywiście powyższe diody świadczą jedynie o tym, że urządzenie jest w stanie dogadać się z siecią na poziomie fizycznym. Wcale nie przesądzają o możliwości transferu danych.

Teraz:

  • Otwórzcie Arduino IDE
  • Wybierzcie: 'Plik-Przykłady-Ethernet-WebClient'
  • Załadujcie przykład na Arduino i obserwujcie wyjście z monitora portu szeregowego (wciśnijcie [CTRL]+[Shift]+[M]); powinno być na nim coś jak:
    Connecting...
    connected
    HTTP/1.1 302 Found
    Location: http://www.google.pl/search?q=arduino&gws_rd=cr&ei=YHoZVcDYHoGgUN61gMgH
    Cache-Control: private
    Content-Type: text/html; charset=UTF-8
    ...
  • Jeżeli widzicie to co powyżej – moduł działa poprawnie.

W przypadku kłopotów:

  • Jeżeli na ekranie zobaczycie wydruk:
    Failed to configure Ethernet using DHCP
    …oznacza to, że moduł nie dostał adresu IP z routera (DHCP) i próbował ustawić go sobie sam (tzw. statyczny). Upewnijcie się, że w linijce 29 przykładu adres
    IPAddress ip(192, 168, 0, 177);
    …pochodzi z puli serwowanej przez Wasz router. Domyślnie jest to 192.168.0.171. Moja sieć domowa pracuje z adresacją 192.168.1.* – na wszelki wypadek zmieniłem więc ten wpis na '192.168.1.171′.
  • Upewnijcie się również, że adres podany w zmiennej ip jest unikalny tzn. żadne inne urządzenie w Waszej sieci domowej go nie używa. najłatwiej sprawdzić to w konfiguracji Waszego routera. Ponieważ jednak każdy router jest inny – muszę odesłać Was do odpowiedniej instrukcji obsługi.

Uwaga: co to jest adres MAC?

Czasami zdarza się Wam słyszeć o adresie MAC. Adres MAC to nic innego jak taki rodzaj identyfikatora numerycznego przyporządkowany każdemu urządzeniu sieciowemu (ograniczamy się do popularnych protokołów). Zazwyczaj wypala się go gdzieś głęboko w czipie, nie można go zmienić i jest unikalny, tzn. dwa urządzenia sieciowe (np. karty sieciowe) na świecie nie mogą mieć takiego samego MAC’a. Składa się z 48 bitów i zwyczajowo zapisuje się go w postaci sześciu liczb szesnastkowych (hex, 0-F):
DE:AD:BE:EF:FE:EF
Pierwsze 3 liczby to kod producenta a pozostałe to kod urządzenia. Przedstawiany Ethernet shield nie ma takiego numeru przyporządkowanego na stałe – ustawia się go programowo. Dla oryginalnych produktów, MAC adres powinien być na pudełku lub przyklejony na płytce. Dla pozostałych – trzeba sobie jakiś wybrać, unikalny w obrębie Waszej sieci. W kodzie Arduino IDE deklaracja adresu MAC może wyglądać tak:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF };

Adres ten musi być podany do rozpoczęcia połączenia (zob. linijka 44 przykładu WebClient):
// start the Ethernet connection:
if (Ethernet.begin(mac) == 0) {...

Zastosowanie: czas z NTP

Powoli przygotowuję się do projektu Inteligentnego Lustra, postanowiłem popisać sobie trochę kodu. Na pierwszy ogień poszło pobieranie godziny. Arduino nie jest wyposażone w zegar czasu rzeczywistego (ang. Real Time Clock; podobnie zresztą jak Raspberry). Można do niego takie małe rozszerzenie podłączyć – ale skoro mamy już Sieć… W skrócie: w Internecie istnieje cały zespół urządzeń zajmujących się odmierzaniem i podawaniem czasu (tzw. serwery STRATUM). Aktualny czas można uzyskać za pomocą NTP (ang. Network Time Protocol).
Na szybko znalazłem kod autorstwa Francesco Potortì i trochę go podszlifowałem (kod pociąłem, usunąłem komentarze na potrzeby przykładu, konwersja na gmt na podstawie tego przykładu):

#include <SPI.h>;
#include <Ethernet.h>;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
EthernetUDP udp;
void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac);
  udp.begin(123);
}
void loop(){
  unsigned long unixTime = ntpUnixTime(udp);
  Serial.print("Czas Unix:");
  Serial.println(unixTime);
  Serial.print("Czas GMT:");
  Serial.print((unixTime % 86400L) / 3600); // godzina
  Serial.print(':');
  Serial.println((unixTime % 3600) / 60); // minuta
  delay(3000);
}
/*
* © Francesco Potortì 2013 - GPLv3 - Revision: 1.13
...
*/
unsigned long inline ntpUnixTime (UDP &amp;udp){
  //[am] to zakomentujcie
  //static int udpInited = udp.begin(123); // open socket on arbitrary port
  ...
  //[am] To zakomentujcie
  // Fail if WiFiUdp.begin() could not init a socket
  //if (! udpInited)
  // return 0;
  ...
}

Zmiksujcie z procedurą Francesco i na ekranie powinniście zobaczyć:

Czas Unix:1427736481
Czas GMT:17:28
Czas Unix:1427736484
Czas GMT:17:28
Czas Unix:1427736488
Czas GMT:17:28
...

Gdy tylko uruchomicie kod, nowe urządzenie sieciowe pojawi się na routerze:

Arduino z Ethernet Shield widoczne na routerze
Arduino z Ethernet Shield widoczne na routerze

Zastosowania: pogoda w openweather

Serwis OpenWeather wydał mi się całkiem sympatyczny jak na początek. Wystarczy wywołać odpowiedni adres a w informacji zwrotnej dostaje się informację pogodową w wybranym formacie – np. json lub xml. Spróbujcie w przeglądarce wywołać adres:
http://api.openweathermap.org/data/2.5/weather?q=wroclaw&mode=xml&units=metric.
Otrzymacie dane w formie XML, trzeba je więc po stronie Arduino sformatować. Można do tego użyć biblioteki TinyXML.

Podsumowanie

Moduł jest bardzo praktyczny i łatwy w obsłudze. jego konfiguracja nie sprawi żadnych problemów, o ile Wasza sieć domowa jest standardowa (router z dhcp). Na pewno wykorzystam go w wielu projektach.
Do pełni szczęścia brakuje mi tylko modułu PowerOverEthernet, ale te są okrutnie drogie.

2 myśli w temacie “Arduino i Ethernet shield WP5100”

Dodaj komentarz