Arduino W5100 OSI3
Introduction
Il faut prendre connaissance du module W5100 avant de continuez.
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 où 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 positionnée 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...