L’Ethernet shield

Accueil/L’Ethernet shield
L’Ethernet shield 2016-12-20T11:37:48+00:00
L’Ethernet shield donne, comme son nom l’indique, la possibilité de naviguer sur internet avec votre Arduino. Bien sur vous ne pourrez pas, aller sur votre facebook pour poster des photos mais cela pourrait vous permettre de commander une led avec votre ordinateur, on verra aussi comment afficher une page web avec.

 

Préparation

ethernet shield

Voilà le matériel dont vous aurez besoin pour suivre ce tutoriel :

  • Une Arduino
  • Un routeur ou un port ethernet libre sur votre box
  • Un cable ethernet
  • Une led et une résistance
  • Un bouton et sa résistance
Attention à la compatibilité de votre carte Arduino avec le shield Ethernet certains modèles de shields nécessitent une version 3 ou supérieur. Rendez-vous sur le site officiel Arduino pour plus de précisions.

Les branchements

Tout d’abords, connectez votre shield ethernet à votre carte Arduino. Connectez votre carte Arduino à l’ordinateur via son câble et connectez le shield ethernet avec le câble ethernet à votre router ou box.

Ouvrez ensuite la plateforme de développement Arduino, il est recommander d’avoir une version du logiciel supérieure ou égale à la 1.0 qui simplifie les réglages au niveau de l’Adresse IP. En effet, pour trouver l’adresse IP que le routeur associe à votre shield, il existe un programme tout fait, que vous trouverez dans  : Fichiers –> Exemples –> Ethernet –> DhcpAddressPrinter.

Une fois ouvert, vous allez devoir changer l’adresse MAC écrite dans le programme. Pour cela, recopiez l’adresse présente sur le dos de votre shield, sur un autocollant. Si vous n’en trouvez pas, à vous de créer une adresse mac unique, non utilisée sur votre réseau local.

Après tous ces réglages, uploader le programme sur la carte Arduino, ouvrez le moniteur série et vous devriez voir apparaitre l’adresse IP utilisée par le shield.

 

Les codes de base

Tout d’abord, il vous faut inclure au début de chacun de vos programmes incluant le shield ethernet ces deux lignes afin d’intégrer les bibliothèques nécessaires :

#include <SPI.h>
#include <Ethernet.h>

Ensuite, il vous faut définir votre adresse MAC et l’adresse IP, pour cela on utilise :

byte mac
[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 }; // adresse MAC IPAddress ip(191,11,1,1); // adresse IP

Nous allons ensuite dans ce tutoriel nous concentrer sur le mode server du shield, c’est à dire que c’est lui qui héberge des données comme une page web. C’est le mode le plus utile et vous n’utiliserez que très rarement le mode suivant. Pour utiliser le server, on inclue donc la ligne :

EthernetServer server(80);

Cette ligne définie que nous créons un objet de type EthernetServer s’appelant server. Le serveur est activé sur le port 80, qui est le port de navigation par défaut. Si vous changez ce port, vous devez alors dans votre navigateur : http://votre-ip:1312 pour y accéder,  si vous avez choisit le port 1312.

Puis, dans la fonction setup de votre programme, vous devez ajouter ces deux lignes pour activer votre serveur :

 Ethernet.begin(mac, ip);
 server.begin();

Pour récupérer les nouveaux clients qui viennent se connecter à votre Arduino, on utilise :

EthernetClient client = server.available();
 if (client) {
// s'éxectute si il y a un client
}

Dans le if(client) vous pouvez récupérer les données envoyez par le client tant qu’il y en a de disponible en utilisant :

while (client.connected()) {
 if (client.available()) {
     char c = client.read();
    //analyse du caractère envoyé stocké dans c.
     }
 }
delay(1);
client.stop();

N’oubliez pas les deux dernières lignes de codes qui permettent de couper la connection avec le client lorsque celui ci s’est déconnecté.

Pour envoyer des données, on utilise la fonction :

client.println("Votre texte");

Et formuler ainsi des réponses HTML classiques telles que celle-là :

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("Votre page web");

 

Deux exemples

Ces exemples sont des exemples officiels, si vous ne comprenez pas une partie du code, postez un commentaire.

Ce premier exemple de serveur Arduino va afficher une page web en fonction de l’état d’un bouton, branché sur le pin 2 :

/*
 Web Server Demo
 thrown together by Randy Sarafan
 
 A simple web server that changes the page that is served, triggered by a button press.
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Connect a button between Pin D2 and 5V
 * Connect a 10K resistor between Pin D2 and ground
 
 Based almost entirely upon Web Server by Tom Igoe and David Mellis
 
 Edit history: 
 created 18 Dec 2009
 by David A. Mellis
 modified 4 Sep 2010
 by Tom Igoe
 
 */
#include <SPI.h>
#include <Ethernet.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };
IPAddress ip(191,11,1,1); //<<< ENTER YOUR IP ADDRESS HERE!!!
// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);
int buttonPress = 1;
void setup()
{
 pinMode(2, INPUT);
 // start the Ethernet connection and the server:
 Ethernet.begin(mac, ip);
 server.begin();
}
void loop()
{
 buttonPress = digitalRead(2); 
 // listen for incoming clients
 EthernetClient client = server.available();
 if (client) {
 // an http request ends with a blank line
 boolean currentLineIsBlank = true;
 while (client.connected()) {
 if (client.available()) {
 char c = client.read();
 // if you've gotten to the end of the line (received a newline
 // character) and the line is blank, the http request has ended,
 // so you can send a reply
 if (c == '\n' && currentLineIsBlank) {
 // send a standard http response header
 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println();
 
 //serves a different version of a website depending on whether or not the button
 //connected to pin 2 is pressed.
 if (buttonPress == 1) {
 client.println("<cke:html><cke:body bgcolor=#FFFFFF>LIGHT!</cke:body></cke:html>");
 }
 else if (buttonPress == 0){
 client.println("<cke:html><cke:body bgcolor=#000000 text=#FFFFFF>DARK!</cke:body></cke:html>");
 }
break;
 }
 if (c == '\n') {
 // you're starting a new line
 currentLineIsBlank = true;
 } 
 else if (c != '\r') {
 // you've gotten a character on the current line
 currentLineIsBlank = false;
 }
 }
 }
 // give the web browser time to receive the data
 delay(1);
 // close the connection:
 client.stop();
 }
}

Et celui-ci allume une led branchée sur le pin 2 en fonction de l’url envoyée, http://votre-ip/$1 pour l’allumer et http://votre-ip/$2 pour l’éteindre :

/*
 Web Server Demo
 thrown together by Randy Sarafan
 
 Allows you to turn on and off an LED by entering different urls.
 
 To turn it on:
 http://your-IP-address/$1
 
 To turn it off:
 http://your-IP-address/$2
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Connect an LED to pin D2 and put it in series with a 220 ohm resistor to ground
 
 Based almost entirely upon Web Server by Tom Igoe and David Mellis
 
 Edit history: 
 created 18 Dec 2009
 by David A. Mellis
 modified 4 Sep 2010
 by Tom Igoe
 
 */
#include <SPI.h>
#include <Ethernet.h>
boolean incoming = 0;
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };
IPAddress ip(191,11,1,1); //<<< ENTER YOUR IP ADDRESS HERE!!!
// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);
void setup()
{
 pinMode(2, OUTPUT);
 // start the Ethernet connection and the server:
 Ethernet.begin(mac, ip);
 server.begin();
 Serial.begin(9600);
}
void loop()
{
 // listen for incoming clients
 EthernetClient client = server.available();
 if (client) {
 // an http request ends with a blank line
 boolean currentLineIsBlank = true;
 while (client.connected()) {
 if (client.available()) {
 char c = client.read();
 // if you've gotten to the end of the line (received a newline
 // character) and the line is blank, the http request has ended,
 // so you can send a reply
 
 //reads URL string from $ to first blank space
 if(incoming && c == ' '){ 
 incoming = 0;
 }
 if(c == '$'){ 
 incoming = 1; 
 }
 
 //Checks for the URL string $1 or $2
 if(incoming == 1){
 Serial.println(c);
 
 if(c == '1'){
 Serial.println("ON");
 digitalWrite(2, HIGH);
 }
 if(c == '2'){
 Serial.println("OFF");
 digitalWrite(2, LOW);
 }
 
 }
 if (c == '\n') {
 // you're starting a new line
 currentLineIsBlank = true;
 } 
 else if (c != '\r') {
 // you've gotten a character on the current line
 currentLineIsBlank = false;
 }
 }
 }
 // give the web browser time to receive the data
 delay(1);
 // close the connection:
 client.stop();
 }
}