W5500 Ethernet, tutaj rozmiar nie ma znaczenia!

Układy do obsługi sieci firmy Wiznet od kilku lat przodują jeśli chodzi o rozmiar i możliwości,  przewagę tą zauważyło nawet sama firma Arduino, ponieważ układy te są montowane do autoryzowanych Ethernet Shieldów. My dzisiaj zajmiemy się nie Ethernet Shieldem, a modułem Ethernet opartym na układzie Wiznet W5500. Sam moduł jest bardzo mały, niewiele większy niż gniazdo Ethernet, przez co możemy go używać nawet w mniejszych projektach.

Przewaga układów Wiznet nad układami ENC

Moduły na układach Wiznet są nieco droższe od modułów na układach ENC, ale nie jest to wcale bezpodstawne. Układy Wiznet w przeciwieństwie do układów ENC większość protokołów i operacji przetwarzają sprzętowo, dzięki temu operacje obciążają układ modułu, a nie nasz mikrokontroler, pozwala to na szybkie i wygodne operowanie w sieci nawet układom 8-bitowym. Oprócz tego układy Wiznet pozwalają na korzystanie ze swojej pamięci RAM, co jest kolejnym bonusem. Ostatnim, ale równie ważnym argumentem do korzystania z układów Wiznet jest oficjalne wsparcie Arduino, dzięki dużo lepiej opracowanym biblioteką możemy szybciej nauczyć się programowania tego modułu, program również będzie lżejszy.

Podłączenie układu do Arduino

Podłączenie modułu do Arduino nie jest szczególnie trudne, moduł wyposażony jest w 12 pinów, a komunikuje się z Arduino za pomocą magistrali SPI, więc używać będziemy tylko 6 pinów. Warto pamiętać, że moduł pracuje na napięciu 3.3V i VCC podłączamy do pinu 3.3V w naszej płytce, a nie 5V. Cały układ musimy zmontować według schematu poniżej.

Pierwsze oprogramowanie dla modułu Wiznet

Gdy mamy już zbudowany układ możemy przejść do programowania, zaczniemy od przykładu “WebServer”. Oczywiście nie musimy pobierać żadnej biblioteki, ponieważ jak wspomniałem na początku układ jest wspierany przez Arduino i IDE jest wyposażone w bibliotekę o nazwie Ethernet, która obsługuje ten i jeszcze kilka układów Wiznet(obsługuje też wiele innych chipów, ale nam wystarczy znajomość konfigurowania jej pod W5500). Jeśli IDE pobieraliśmy dawno to warto bibliotekę zaktualizować do wersji 2.0.0 za pomocą managera bibliotek. Jeśli chodzi o adresowanie MAC i IP temat został dostatecznie wyjaśniony w artykule na temat ENC28J60 i w tym momencie odsyłam do tego artykułu, gdy wiedzę mamy opanowaną możemy przejść dalej. Modułowi nadałem adres IP 192.168.1.177. Oprócz ustawienie adresu IP warto zajrzeć do sekcji setup i dodać/odkomentować linijkę.

Ethernet.init(10);

Linijka ta mówi o tym gdzie podłączony jest pin CS modułu, w naszym układzie CS podłączony jest do pinu 10, jednak możemy go podłączyć do innych pinów, wtedy musimy zmienić wartość wpisaną między nawiasy. Nasz kod powinien wyglądać jak poniżej.

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);
EthernetServer server(80);
void setup() {
  Ethernet.init(10);
  Serial.begin(9600);
  while (!Serial) {
  }
  Serial.println("Ethernet WebServer Example");
  Ethernet.begin(mac, ip);
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}
void loop() {
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        } else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
    Serial.println("client disconnected");
  }
}

Gdy wgramy program do naszego mikrokontrolera możemy podłączyć przewód RJ45 do modułu, a w przeglądarce wpisać adres IP, czyli 192.168.1.177, naszym oczom powinien ukazać się taki obraz.

Nasza strona w sieci lokalnej

Gdy nasz przykład działa możemy przejść do napisania prostego programu który będzie wyświetlał kilka linijek tekstu, wyświetli stan jednego pinu analogowego oraz pozwoli na włączanie i wyłączanie diody LED podpiętej do Arduino za pomocą przycisku na stronie. Aby w pełni zrozumieć działanie programu który zaraz napiszemy niezbędne mogą okazać się podstawy HTML, nie jest to język trudny, jednak jeśli zamierzamy częściej korzystać z modułów Ethernet warto się go nauczyć. Jeśli chodzi o budowę układu, to jedyna zmiana polega na podłączeniu diody LED, którą wpinamy do płytki stykowej, katoda zostaje podłączona do GND, a anoda przez rezystor 180Ohm zostaje podłączona do pinu cyfrowego 2 w naszym Arduino. Kod który musimy wgrać do płytki prezentuje się następująco.

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; //Określenie adresu MAC
byte ip[] = {192, 168, 1, 177}; //Określenie adresu IP
EthernetServer server(80); //Określenie portu
String readString;

void setup() {
  Ethernet.init(10);
  pinMode(2, OUTPUT); //pin do którego podłączona jest dioda LED
  Ethernet.begin(mac, ip); //uruchomienie modułu
}

void loop() {
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (readString.length() < 100) {
          readString += c;
        }
        if (c == '\n') {
          Serial.println(readString);
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<hmtl>");
          client.println("<head>");
          client.println("Lokalna strona");
          client.println("</head>");
          client.println("<title>");
          client.println("Lokalna strona"); //tutuł strony
          client.println("</title>");
          client.println("<body bgcolor=black>"); //kolor tła
          client.println("<font color=white>"); //kolor czcionki
          client.println("<meta http-equiv=\"refresh\" content=\"5\">"); //inna metoda na ustawienie czasu odświeżania
          client.println("<center>"); //ustawienie wyśrodkowania
          client.println("<b>");
          client.println("Czesc! Witaj na lokalnej stronie zbudowanej na bazie Arduino oraz modulu Ethernet W5500");//tekst
          client.println("</br>");
          client.println("Stworzenie takiej strony jest niezwykle proste, wystarczy znajomosc HTML");
          client.println("</br>");
          client.println("Mozesz tutaj odczytac stan pinu analogowego A0 oraz sterowac LEDem");
          client.println("</b>");
          client.println("<p>");
          client.println("<table border=0 width=200>");
          client.println("<tr>");
          client.println("<td align=center>");
          client.println("<font color=white>");
          client.println("Stan pinu A0 wynosi");
          client.println("</td>");
          client.println("</tr>");
          client.println("<tr>");
          client.println("<td align=center>");
          client.println("<font color = white size=10>");
          int pinA = analogRead(0);//zmienna
          client.println(pinA);//wyswietlenie stanu pinu A0
          client.println("</td>");
          client.println("</tr>");
          client.println("</table>");
          client.println("<p>");
          client.println("<FORM>");
          client.println("<INPUT type=button value=LED-ON onClick=window.location='/?lighton1\'>");//przyciski do diody
          client.println("<INPUT type=button value=LED-OFF onClick=window.location='/?lightoff1\'>");
          client.println("</FORM>");
          client.println("</center>");
          client.println("</font>");
          client.println("</body>");
          client.println("</html>");

          delay(1);
          if (readString.indexOf("?lighton") > 0) //czytanie stanu przycisku
          {
            digitalWrite(2, HIGH);
          }
          else {
            if (readString.indexOf("?lightoff") > 0)
            {
              digitalWrite(2, LOW);
            }
            readString = "";
            client.stop();            // End of session.
          }
        }
      }
    }
  }
}

Po wgraniu programu znowu podłączamy moduł do sieci i wpisujemy adres IP w przeglądarce, naszym oczom powinna ukazać się taka strona.

Jak po raz kolejny widzimy praca z modułami Ethernet nie jest tak trudna jak mogłoby się wydawać, na sam koniec mogę dodać, że kolejnym atutem modułu od Wiznet jest szybsze ładowanie stron, ale wybór i tak należy do was!

Produkty użyte w poradniku:

Arduino Uno

Moduł Ethernet W5500