Différences entre versions de « Arduino W5100 web server »

De The Linux Craftsman
Aller à la navigation Aller à la recherche
Ligne 189 : Ligne 189 :
 
</source>
 
</source>
 
Lorsque vous avez plusieurs possibilités n'hésitez pas à user de la compilation conditionnelle car, la mémoire réduite de l'ATMega ne permet pas d'embarquer beaucoup de code...
 
Lorsque vous avez plusieurs possibilités n'hésitez pas à user de la compilation conditionnelle car, la mémoire réduite de l'ATMega ne permet pas d'embarquer beaucoup de code...
=== Démarrage d'un serveur ===
+
== Utilisation d'un serveur ==
Il est possible de démarrer un serveur qui écoutera sur un port précis. Dans notre cas de figure le serveur utilisera le port '''TCP 80'''.
+
Il est possible de démarrer un serveur qui écoutera sur un port précis. Dans notre cas de figure, le serveur utilisera le port '''TCP 80'''.
 
<source lang="c">
 
<source lang="c">
  

Version du 30 décembre 2016 à 15:00

Partie électronique

Le composant

Le Shiled Ethernet embarque un contrôleur Wiznet 5100 qui est plus fiable que son homologue le contrôleur ENC28J60. Il existe principalement en shield mais peut également se trouver en platine.

W5100 shield uno mega.jpg
W5100 shield nano.jpg
W5100 platine.jpg
Wiznet 5100 version shield pour Mega/Uno Wiznet 5100 version shield pour Nano Wiznet 5100 version platine

Les versions shield sont intéressantes car elles embarquent également un lecteur de carte micro SD qui, dans notre cas de figure, va nous servir à héberger les pages du site Web.

Le montage

Le montage suivant requiert le shield, un câble Ethernet qui le relie à un switch et un ordinateur relié au même switch.

W5100 shield on mega.jpg
W5100 shield on uno.jpg
W5100 shield on nano.jpg
Shield Wiznet 5100 sur un Mega Shield Wiznet 5100 sur un Uno Shield Wiznet 5100 sur un Nano

N'oubliez pas que la communication entre l'Arduino et le shield se fait a travers certaines broches qu'il ne faut donc pas utiliser !

W5100 shield port use.jpg

Comme vous pouvez le constater, le protocole SPI (Serial Port Interface) est utilisé ici pour communiquer avec la carte SD et le contrôleur Ethernet (SPI = pas en simultané).

Partie logicielle

Les librairies

Les librairies utilisées sont déjà inclues de base et sont :

  • SPI.h
  • Ethernet.h
  • SD.h

Utilisation du shield Ethernet

Dans un premier temps, nous allons découvrir comment utiliser le shield Ethernet...

Adressage IP dynamique

Le plus simple, si votre réseau possède un serveur DHCP (normalement votre box est dotée de cette fonctionnalité...), est de demander la configuration OSI de niveau 3. Les seuls paramètres qui nous intéresserons vraiment sont l'adresse IP et le masque. La passerelle ne sera pas utile dans notre cas...

#include <SPI.h>
#include <Ethernet.h>
/**
   Adresse MAC du module, doit être unique sur le réseau !
   Ici 00:01:02:03:04:05
*/
byte mac[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };

void setup() {
  // Démarrage du port série
  Serial.begin(9600);
  Serial.println(F("Requesting ip..."));
  /**
     Démarrage du shield Ethernet sans spécifier d'adresse IP
     Cela oblige le contrôleur Ethernet à demander une configuration OSI 3
  */
  if (Ethernet.begin(mac) == 0) {
    // Si c'est un échec, pas la peine de pousuivre...
    Serial.println(F("DHCP failure !"));
    while (true);
  }
  // Affichage des informations obtenues
  Serial.print(F("IP : "));
  Serial.println(Ethernet.localIP());
  Serial.print(F("Mask : "));
  Serial.println(Ethernet.subnetMask());
  Serial.print(F("Gateway : "));
  Serial.println(Ethernet.gatewayIP());
  Serial.print(F("DNS : "));
  Serial.println(Ethernet.dnsServerIP());
}
void loop() {
}

Si vous avez une réponse de votre serveur DHCP, vous devriez obtenir, dans le terminal série, le résultat suivant:

Requesting ip...
IP : 192.168.1.26
Mask : 255.255.255.0
Gateway : 192.168.1.254
DNS : 192.168.1.254

Adressage IP statique

On peut très bien spécifier une configuration OSI de niveau 3 de manière statique. Deux avantages : pas d'adresse IP qui change et c'est plus rapide !

#include <SPI.h>
#include <Ethernet.h>
// Adresse IP
IPAddress ip = { 192, 168, 1, 26 };
// Masque de sous-réseau
IPAddress mask = { 255, 255, 255, 0 };
// Passerelle
IPAddress gateway = { 192, 168, 1, 254 };
// DNS
IPAddress server_dns = { 192, 168, 1, 254 };
/**
   Adresse MAC du module, doit être unique sur le réseau !
   Ici 00:01:02:03:04:05
*/
byte mac[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };

void setup() {
  // Démarrage du port série
  Serial.begin(9600);
  Serial.println(F("Setting ip..."));
  /**
    Démarrage du shield Ethernet en spécifiant la configuration OSI 3
  */
  Ethernet.begin(mac, ip, server_dns, gateway, mask);
  // Affichage des informations
  Serial.print(F("IP : "));
  Serial.println(Ethernet.localIP());
  Serial.print(F("Mask : "));
  Serial.println(Ethernet.subnetMask());
  Serial.print(F("Gateway : "));
  Serial.println(Ethernet.gatewayIP());
  Serial.print(F("DNS : "));
  Serial.println(Ethernet.dnsServerIP());
}
void loop() {
}

Le même résultat que précédement devrait s'afficher dans le terminal série.

Adressage au choix !

Le must, c'est de pouvoir choisir en fonction du réseau ou on va placer notre montage ! Le code ci-dessous utilise la compilation conditionnelle pour faire cohabiter les deux codes précédents. Le choix se fera en fonction de la variable DHCP positionner au tout début du sketch.

#include <SPI.h>
#include <Ethernet.h>
/**
   Variable permettant de choisir entre une assignation
   fixe ou dynamique du niveau 3 OSI
   '0' --> configuration statique
   '1' --> configuration dynamique
*/
#define DHCP 0
/**
   Adresse MAC du module, doit être unique sur le réseau !
   Ici 00:01:02:03:04:05
*/
byte mac[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
#if DHCP == 0
// Adresse IP
IPAddress ip = { 192, 168, 1, 26 };
// Masque de sous-réseau
IPAddress mask = { 255, 255, 255, 0 };
// Passerelle
IPAddress gateway = { 192, 168, 1, 254 };
// DNS
IPAddress server_dns = { 192, 168, 1, 254 };
#endif

void setup() {
  // Démarrage du port série
  Serial.begin(9600);
  /**
     Démarrage du shield Ethernet sans spécifier d'adresse IP
     Cela oblige le contrôleur Ethernet à demander une configuration OSI 3
  */
#if DHCP == 0
  Serial.println(F("Setting ip..."));
  Ethernet.begin(mac, ip, server_dns, gateway, mask);
#else
  Serial.println(F("Requesting ip..."));
  if (Ethernet.begin(mac) == 0) {
    // Si c'est un échec, pas la peine de pousuivre...
    Serial.println(F("DHCP failure !"));
    while (true);
  }
#endif
  // Affichage des informations obtenues
  Serial.print(F("IP : "));
  Serial.println(Ethernet.localIP());
  Serial.print(F("Mask : "));
  Serial.println(Ethernet.subnetMask());
  Serial.print(F("Gateway : "));
  Serial.println(Ethernet.gatewayIP());
  Serial.print(F("DNS : "));
  Serial.println(Ethernet.dnsServerIP());
}
void loop() {
}

Lorsque vous avez plusieurs possibilités n'hésitez pas à user de la compilation conditionnelle car, la mémoire réduite de l'ATMega ne permet pas d'embarquer beaucoup de code...

Utilisation d'un serveur

Il est possible de démarrer un serveur qui écoutera sur un port précis. Dans notre cas de figure, le serveur utilisera le port TCP 80.

Utilisation de la carte SD

Affichage des paramètres de la carte

Lecture

Écriture

Ajout

Effacement