View  Edit  Attributes  History  Attach  Print  Search

ACCUEIL | ARDUINO > S'INSTALLER > DEBUTER > APPROFONDIR | PROCESSING | MECATRONIQUE | MATERIEL | OUTILS | TESTS | Plus...|
Python > Shell > ATELIERS Python + Qt > PyQt apps > PyQt+Arduino | Mes Robots | RepRap | Mes lib'Arduino | Mes shields Arduino | Mes distros | Les Mini-PC |
ATELIERS ARDUINO| VIDEOS | COMPRENDRE | REFERENCES | CODER | TECHNIQUE | GNU/LINUX | LIENS | Rien à voir |

Ethernet en mode serveur : Afficher la requête reçue du navigateur

ARDUINO - EXPERT - ETHERNET
Par X. HINAULT - Créé le 02/10/2010

1.  Présentation

Ce programme très simple consiste à configurer la carte Arduino couplée au module Ethernet en serveur HTTP et à afficher dans une fenêtre Terminal sur le PC l'intégralité de la requête HTTP envoyée par le navigateur client au serveur.

Ce qui est intéressant ici, c'est de mettre en évidence la partie "cachée" de ce qui se passe lorsque l'on saisit une adresse depuis son navigateur. Si par exemple, on saisit l'adresse IP de la carte Arduino dans le navigateur Firefox, le navigateur va envoyer une requête appelée GET au serveur en lui donnant au passage une série d'informations.

Le point important ici : constater que toute requête reçue va se terminer par une ligne blanche, c'est-à-dire 2 sauts de lignes successifs sans autre caractère. Ceci sera utilisé dans les programmes que nous écrirons pour détecter que la requête reçue du client a été reçue en intégralité et est terminée. Le serveur pourra alors envoyer sa réponse... mais ceci sera l'objet d'un prochain programme.

Pour plus de détails sur le protocole HTTP, voir : http://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol

2.  Matériel Nécessaire

2.1  L'espace de développement Arduino

  • ... pour éditer, compiler le programme et programmer la carte Arduino.

2.2  Le matériel suivant pour réaliser le montage associé

  • un module Arduino Ethernet

3.  Etapes préparatoires

On va créer ici un réseau local entre le PC et la carte Arduino. La première chose à faire est de connaître l'adresse IP de l'ordinateur avec lequel on va créer le réseau ainsi que le masque du sous-réseau en vigueur.

Sous Ubuntu, dans une console, on obtient cette information avec la commande ifconfig

Dans notre cas, on a donc :

  • adresse IP du PC : 169.254.10.1
  • masque du sous-réseau : 255.255.255.0

Pour créer un réseau local entre la carte Arduino et le PC, on utilisera donc pour la carte Arduino :

  • une adresse IP de la forme : 169.254.10.x (sauf 169.254.10.1 )
  • et le même masque de sous-réseau : 255.255.255.0

Pour info : le masque de sous-réseau indique quelle partie de l'adresse IP correspond au réseau et quelle partie au sous-réseau. Ici, la partie 169.254.10 correspond au numéro du réseau et .x correspond au sous-réseau.

Voir ici pour configurer l'attribution d'adresse en mode statique sous Ubuntu

4.  Instructions de montage

  • Le montage à réaliser est très simple : il suffit d'enficher le module Arduino Ethernet sur la carte Arduino UNO ou Duemilanove.
  • Ensuite, on connecte la carte Arduino au port USB
  • On connecte également le module Arduino au PC à l'aide d'un câble Ethernet.

5.  Le circuit du montage


Le schéma du montage à réaliser

6.  Explication du programme

  • Ce programme va tester la présence d'un client connecté au serveur.
  • Une fois le client détecté, les caractères reçus vont être affichés dans le Terminal série.

7.  Fonctionnement

7.1  Réinitialiser et tester la connexion réseau

  • Une fois la carte programmée, appuyer sur le BP reset pour que le module ethernet prenne en compte la nouvelle configuration.
  • Ensuite, on peut refaire un "ping" vers la carte Arduino depuis le PC. Sous Ubuntu, ceci se fait dans une console à l'aide de la commande ping associée à l'adresse IP de l'ordinateur à tester. Ici, nous ferons :

$ ping -c 5 169.254.10.2

ce qui donne :

Comme on peut le voir ici, la carte Arduino répond bien au ping : cool ! C'est tout bête, mais au moins, on sait que çà marche...

7.2  Préparation du Terminal côté PC dans le logiciel Arduino

  • Côté PC, il faut ouvrir la fenêtre terminal de l'IDE Arduino : pour ce faire, un simple clic sur le bouton « Sérial Monitor ».
  • La fenêtre « Terminal » s'ouvre alors :
  • Il faut alors régler le débit de communication sur la même valeur que celle utilisée par le programme avec lequel nous allons programmer la carte Arduino :

7.3  Ouvrir le navigateur et taper l'adresse IP de la carte Arduino :

  • Ensuite, il faut ouvrir un navigateur, Firefox bien sûr!, et taper dans la barre d'adresse l'adresse IP de la carte Arduino : 169.254.10.2 dans notre cas.
  • A présent, la requête reçue s'affiche alors dans la fenêtre Terminal série :

8.  Le programme complet en langage Arduino :

A copier/coller directement dans l'éditeur Arduino


// --- Programme Arduino ---
// Copyright X. HINAULT - Créé le 02/10/2010
// www.mon-club-elec.fr 

//  Code sous licence GNU GPL : 
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License,
//  or any later version.
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
//  

// --- Que fait ce programme ? ---
/* Ce programme configure le module Ethernet
couplé à la carte Arduino en serveur HTTP
On crée un réseau local avec le PC.

Ce programme affiche dans un Terminal série
la requete reçue depuis le navigateur du PC

*/

// --- Fonctionnalités utilisées ---

// --- Circuit à réaliser ---

//**************** Entête déclarative *******
// A ce niveau sont déclarées les librairies incluses, les constantes, les variables...

// --- Inclusion des librairies utilisées ---
#include <SPI.h>
#include <Ethernet.h>
#include <Server.h>
#include <Client.h>


// --- Déclaration des constantes ---

// --- constantes des broches ---

// --- Déclaration des variables globales ---

//--- déclaration du tableau d'adresse MAC ---
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

//---- tableau de l'adresse IP de la carte Arduino
byte ip[] = { 169,254,10,2 }; // le PC a pour IP : 169.254.10.1

//----- tableau de l'adresse de la passerelle --- 
byte passerelle[] = { 169, 254, 10, 1 }; // l'adresse du PC de connexion

//----- tableau du masque de sous réseau 
byte masque[] = { 255, 255, 255, 0 }; // idem masque sous-réseau du PC : 255.255.255.0


// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---

//--- création de l'objet serveur ----
Server serveurHTTP(80); // crée un objet serveur utilisant le port 80 = port HTTP

//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter au démarrage --- 

//---- initialise la connexion Ethernet avec l'adresse MAC, l'adresse IP et le masque
Ethernet.begin(mac, ip, passerelle, masque); 

//---- initialise le serveur ----
serveurHTTP.begin(); 

//----initialise connexion série 
Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission 

} // fin de la fonction setup()
// ********************************************************************************

//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// --- ici instructions à exécuter par le programme principal --- 

// crée un objet client basé sur le client connecté au serveur
  Client client = serveurHTTP.available();

  if (client) { // si l'objet client n'est pas vide
   // le test est VRAI si le client existe 


    // message d'accueil dans le Terminal Série
      Serial.println ("Client present !"); 
      Serial.println ("Voici la requete du client:"); 
      Serial.println (); // saut de ligne

    // affichage des caractères de la requete envoyés par le client 
    while (client.connected()) { // tant que le client est connecté

      if (client.available()) { // si des octets sont disponibles en lecture
      // le test est vrai si il y a au moins 1 octet disponible

        char c = client.read(); // l'octet suivant reçu du client est mis dans la variable c

        Serial.print(c); // affiche le caractère reçu dans le Terminal Série


      } // --- fin client.available

      else { // si pas de caractères disponibles

        Serial.println ("Reception requete terminee"); 
        Serial.println ("La derniere ligne est une ligne vide"); 
        while(1); // stoppe ici 
      }

    } // --- fin tant que client connected

  } //---- fin if client ---- 


} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

//*************** Autres Fonctions du programme *************

// --- Fin programme ---