Shield Ethernet W5100 pour Arduino, client serveur internet

Utilisation de capteurs et composants électroniques avec Arduino.
Une fiche de tutoriel pour chaque.

Shield Ethernet W5100 pour Arduino, client serveur internet

Messagepar tiptop » Mar 3 Déc 2013 14:10

Shield Ethernet W5100 pour Arduino, client et serveur internet

Image

Matériel utilisé

Principe de fonctionnement
Le shield (carte d'extension) Ethernet W5100 se branche par dessus la carte Arduino et lui rajoute des fonctionnalités internet.
Il transforme votre Arduino en serveur web, pour créer des applications réseau, et contrôler à distance l'Arduino depuis une interface Internet (page web).

Caractéristiques techniques
  • Le module possède une prise Ethernet RJ45 standard, à relier à sa box internet, un bouton de réinitialisation (reset).
  • Le tampon interne est de 16K. la vitesse de connexion: 10/100Mb.
  • Un lecteur de carte mini-SD intégré permet de stocker des données sur la carte.
  • La tension d'alimentation 5V est fournie par l'Arduino.
  • Le module prend en charge jusqu'à 4 connections socket simultanées.

Broches utilisées
Image
  • Arduino communique avec ce module par le bus SPI (pin 11 = MOSI, 12 =MISO, 13 =SCK de la carte Arduino UNO).
  • Pin 10 est utilisée comme SS pour le contrôleur Ethernet.
  • Pin 4 est utilisée comme SS pour la carte SD.
  • On peut empiler un autre shield par dessus et utiliser les pins restantes.

LED témoins
Le bon fonctionnement de la carte s'affiche grâce à des leds témoins:
  • PWR alimentation de la carte.
  • LINK présence d'une connexion (lien de réseau), clignote lors de la réception de données.
  • FULLD si la connexion est full duplex.
  • 100M: indique la présence d'une connexion de réseau 100 Mb / s (au lieu de 10 Mb / s).
  • RX clignote lorsque le module reçoit des données.
  • TX clignote lorsque le module envoie des données.
  • COLL clignote en cas de collisions réseau détectées.

Installer la librairie Ethernet
Téléchargez la librairie Ethernet, qui permet d'utiliser le module comme client ou serveur de données (connexions entrantes et sortantes).
L'installer dans le sous-répertoire libraries/Ethernet et redémarrer l'IDE Arduino pour l'activer.
Image

On l'utilise avec #include <Ethernet.h> au début du code.


=============================================================================================================================

Programmation comme CLIENT
Le principe du WebClient est de faire une requête HTTP. On demande une page internet depuis son Arduino à un serveur Web de son choix.
Le shield crée une demande HTTP GET qui obtient une réponse, à afficher à l'utilisateur.

Ce programme se connecte sur un site internet de son choix à partir de son adresse IP
Par exemple, le site Google.com est à l'adresse IP 173.194.33.104, on lui demande la page GET /search?q=arduino HTTP/1.0

Pour trouver l'adresse IP d'un site web, taper dans la fenêtre MS-DOS la commande PING site_cherche.com
Image
  • Par exemple pour Google.com: on obtient IP = 173.194.40.96
  • Pour notre site tiptopboards.com c'est IP = 212.1.212.10
L'accès au site peut se faire depuis son navigateur (Mozilla, Internet Explorer, Chrome...) en tapant http://adresse_IP à la place du nom du site.

Pour cet exemple, placer une page html ou php sur le serveur de votre choix (free.fr offre de l'espace de stockage gratuit avec PHP, MySQL).
Je crée ici sur le site tiptopboards.com, la page tiptopboards.com/test_arduino.php qui va afficher la date et l'heure :
test Arduino
Monday 2nd of December 2013 12:21:30 PM


Le petit code PHP est très simple
Code: Tout sélectionner
<?php //test_arduino.php
echo" test Arduino<br>";
echo date('l jS \of F Y h:i:s A');
?>

Ce petit fichier .php est placé sur le serveur avec Filezilla par exemple (open source FTP).

Tester avec son navigateur internet l'affichage de cette page :
Image

Brancher le shield Ethernet par un câble Rj45 à votre box internet.

Le code pour Arduino : Client Internet
Code: Tout sélectionner
// ======================================================================
// Exemple de CLIENT internet avec le shield W5100 et une carte Arduino Uno
// tiptopboards.com 02 12 2013
//
// Source: David A. Mellis ( 18 Dec 2009) traduit et modifié CR
// ======================================================================
// On se connecte ici sur le site web http://www.tiptopboards.com
// Le shield ethernet W5100 utilise les pins 10, 11, 12 et 13.

#include <SPI.h>
#include <Ethernet.h>   //Utilise la libraire Ethernet

//Entrer l'adresse MAC (si elle est indiquée sur le shield)
//Par défaut celle ci convient
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress server(212,1,212,10);  // Notre site tiptopboards.com a pour IP = 212.1.212.10

// Initialiser la librairie Ethernet client avec cette adresse IP, port 80 par défaut
EthernetClient client;

void setup() {
  Serial.begin(9600);   //Pour le serial monitor (écran du PC)
  Serial.println("Demo du shield Ethernet W5100");
 
  if (Ethernet.begin(mac) == 0) {  //Démarre la connexion Ethernet
    Serial.println("Echec de configuration Ethernet avec DHCP");
    // plus rien à faire
    for(;;)
      ;
  }
  //Laisser une seconde au shield Ethernet pour s'initialiser
  delay(1000);
  Serial.println("Connexion...");

  if (client.connect(server, 80)) {  //Si ça se connecte
    Serial.println("connexion OK");
    // Faire une requète HTTP:
    Serial.println("Envoi de requete  ...");

   
    client.println("GET /test_arduino.php HTTP/1.0");  //Demander une page précise du site (php)
    //client.println("GET /texte.txt HTTP/1.0");  //Exemple pour lister un fichier texte
    client.println("Host: tiptopboards.com");
    client.println();
  }
  else {
    //Si on ne parvient pas à se connecte au serveur
    Serial.println("Echec de connexion");
  }
}

void loop()
{
  //Lire les octets qui arrivent et les afficher
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // Si le server s'est déconnecté, stop le  client
  if (!client.connected()) {
    Serial.println();
    Serial.println("Deconnexion");
    client.stop();

    // ne rien faire
    for(;;)
      ;
  }
}f


En cas de page non trouvée, le client internet reçoit une réponse de ce type :
HTTP/1.1 404 Not Found
Server:
Date: Mon, 02 Dec 2013 17:24:59 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Vary: Accept-Encoding
X-Powered-By: PHP/5.3.26
X-Pingback: http://www.aa-jyq.com/xmlrpc.php
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
Pragma: no-cache


Si la page est trouvée, le client internet reçoit une réponse de ce type :
Demo du shield Ethernet W5100
Connexion...
connexion OK
Envoi de requete ...
HTTP/1.1 200 OK
Server:
Date: Mon, 02 Dec 2013 17:29:30 GMT
Content-Type: text/html
Content-Length: 56
Connection: close
X-Powered-By: PHP/5.3.26

test Arduino<br>Monday 2nd of December 2013 12:29:30 PM
Deconnexion

L'en tête (200 OK) sert à valider la page internet, le navigateur n'affichera que la partie en bleu.

Image

Codes de réponse les plus courants en HTTP
Source : http://fr.wikipedia.org/wiki/Liste_des_codes_HTTP
  • code 400 : bad request
  • code 404 : page not found
  • code 200 : requête traitée avec succcès
  • code 500 : erreur interne du serveur



=============================================================================================================================

Programmation comme SERVEUR
Le principe du WebServer est d'héberger vos pages HTML ou PHP sur le shield Internet. Il les renvoie aux clients internet qui les demandent.
Dans cet exemple, on affiche sur une page internet personnelle les valeurs de 6 capteurs analogiques branchés sur l'Arduino (pins A0-A5).

Paramétrage de sa Livebox
  • Ouvrir la console d'administration de sa Livebox depuis son navigateur web (avec http://192.168.1.1/pub/router.cgi?page=dhcp)
  • Dans le menu Routeur / DHCP, paramètrer sa livebox pour autoriser une plage d'adresses IP, par exemple de 192.168.1.2 à 192.168.1.137
  • Définir une association de DHCP permanente entre l'adresse MAC de son shield Ethernet et une adresse IP de son choix, par exemple
    DE:AD:BE:EF:FE:ED --> 192.168.1.4
Image

Le code pour Arduino, serveur internet
Code: Tout sélectionner
//===========================================================================
//  Serveur internet avec un shield Ethernet-W5100 et une carte Arduino UNO
//  Tiptopboards.com 02 12 2013
// Adapté d'après David A. Mellis 18 Dec 2009, modifié 4 Sep 2010  Tom Igoe
//
//===========================================================================
// Ce serveur affiche 6 mesures analogiques faites sur l'Arduino sur une page web
//
// Le shield utilise les pins 10, 11, 12 et 13
// Arduino utilise les entrées analogiques A0-A5

#include <SPI.h>
#include <Ethernet.h>   //Inclure la bibliothèque Ethernet


// Adresse MAC du shield (ici choisie par défaut), l'adresse IP dépend de votre réseau local
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  //DE-AD-BE-EF-FF-ED
IPAddress ip(192,168,1,4);   //192.168.1.4  à choisir sur votre réseau local
//L'adresse MAC du shield est associée à une adresse IP dans la livebox (DHCP)

EthernetServer server(80);    //Initialise le serveur Ethernet, port 80 par défaut pour HTTP

void setup()
{
  Ethernet.begin(mac, ip);   //Démarer la connexion Ethernet et le serveur
  server.begin();
  Serial.begin(9600);    //Affichage écran du PC
}

void loop()
{
  // Ecouter les clients entrants
  EthernetClient client = server.available();
  if (client) {
    // Une requète HTTP terminée par une ligne vide
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //Si on recoit un caractère NewLine , la requête HTTP est finie, on peut répondre
        if (c == '\n' && currentLineIsBlank) {
          // Envoyer un header de résponse standard http
          client.println("HTTP/1.1 200 OK");    //C'est OK
          client.println("Content-Type: text/html");
          client.println();

          // Sortir la valeur des 6 lignes analogiques mesurées
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            client.print("Entree analogique ");
            client.print(analogChannel);
            client.print(" = ");
            client.print(analogRead(analogChannel));
            client.println("<br />");
          }
          break;
        }
        if (c == '\n') {
          // On commence une nouvelle ligne
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // On an un charactère sur la ligne courante
          currentLineIsBlank = false;
        }
      }
    }
    // Laisser au navigateur web le temps de recevoir les données
    delay(1);
    // Refermer la connexion:
    client.stop();
  }
}


Lancer le programme Arduino (le shield Ethernet est relié par un câble Rj45 à sa box).
Dans son navigateur web, taper l'adresse de page http://192.168.1.4 pour visualiser la page (en mode serveur local)
Image


Accès depuis l'extérieur à son serveur
En mode serveur distant, il faut ouvrir un port de sa box pour permettre un accès au serveur. Faire une redirection de port :
  • connexion entrante TCP
  • port source 1080 (à choisir)
  • vers port destination 80
  • adresse Accès avec IP 192.168.1.4 (celle qu'on a choisie pour son shield Ethernet W5100)
L'accès distant se sera avec http://mon_ip:mon_port, par exemple http://78.222.112.78:1080

=============================================================================================================================

Références
tiptopboards - admin
Avatar de l’utilisateur
tiptop
Administrateur du site
 
Messages: 93
Inscription: Mar 13 Aoû 2013 20:38
Localisation: 38

Retourner vers Capteurs et composants

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité