Arduino : utilisation du contrôleur ENC28J60 shield ethernet

Donner du réseau à sa carte Arduino est chose simple lorsque l’on passe par les chemins balisés comme avec le shield ethernet officiel.

Ayant un besoin de miniaturisation, je cherchais une carte Arduino petite sur laquelle brancher un mini shield ethernet. Bien sur, il y avait le prototype microduino, mais ce projet est arrivé trop tard par rapport à mon besoin.

microduino ethernet
Microduino Ethernet

Je suis donc parti sur une solution arduino Nano v3.0 et un shield ethernet à base de controleur ENC28J60 non officiel.

arduino_nanov3
Arduino Nano v3.0
shield_ethernet_nano
Shield Ethernet pour arduino Nano

Evidemment, il n’y a pas de jolie librairie officielle fournie par l’editeur. Commence donc la valse de tests de différentes librairies, plus ou moins à jour, plus ou moins récentes, et donc plus ou moins fonctionnelles …

Je vous épargne une recherche fastidieuse, il y a de forte chance que vous trouviez votre bonheur dans la librairie EtherCard sur github. Contentez vous de la telecharger au format zip depuis github. (Je stocke également sur mon serveur la version de ce jour 19/10/13: ethercard-master) Il vous faudra alors renommer le dossier en etherCard et le placer dans votre dossier librairies d’installation de l’IDE arduino.

Pour une raison que je ne comprenais pas sur le moment, les codes exemples fournis bloquaient tous sur la l’instruction suivante :

ether.begin(sizeof Ethernet::buffer, mymac)

Apres plusieurs heures de recherches, j’ai fini par trouver sur le blog arduinodiy la raison de ce blocage: le controleur ethernet utilise les connecteurs SPI ainsi qu’un pin de CS (ChipSelect). Celui ci permet de choisir si l’on veut bavarder avec la carte SD ou avec le RJ45 (hé oui, le shield ethernet officiel dispose d’un port de stockage carte SD …) Et par défaut, ce port est en D8 alors que sur ma carte il est en D10 !

Le développeur de la librairie a pensé à cette possibilité et a surchargé la fonction begin, il est possible d’ajouter en 3eme opérande le numéro du port CS qui est par défaut à 8.

ether.begin(sizeof Ethernet::buffer, mymac, 10)

Une fois cette petite modification effectuée, la librairie fonctionne bien.

Il est notamment possible de pouvoir se servir du shield comme client http (et non pas uniquement comme serveur comme c’est le cas sur certaines librairies).

Voici le code exemple getStaticIP :

// This demo does web requests to a fixed IP address, using a fixed gateway.
// 2010-11-27 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

#include <EtherCard.h>

#define REQUEST_RATE 5000 // milliseconds

// ethernet interface mac address
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
// ethernet interface ip address
static byte myip[] = { 192,168,1,203 };
// gateway ip address
static byte gwip[] = { 192,168,1,1 };
// remote website ip address and port
static byte hisip[] = { 74,125,79,99 };
// remote website name
char website[] PROGMEM = "google.com";

byte Ethernet::buffer[300];   // a very small tcp/ip buffer is enough here
static long timer;

// called when the client request is complete
static void my_result_cb (byte status, word off, word len) {
  Serial.print("<<< reply ");
  Serial.print(millis() - timer);
  Serial.println(" ms");
  Serial.println((const char*) Ethernet::buffer + off);
}

void setup () {
  Serial.begin(57600);
  Serial.println("\n[getStaticIP]");

  if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) 
    Serial.println( "Failed to access Ethernet controller");

  ether.staticSetup(myip, gwip);

  ether.copyIp(ether.hisip, hisip);
  ether.printIp("Server: ", ether.hisip);

  while (ether.clientWaitingGw())
    ether.packetLoop(ether.packetReceive());
  Serial.println("Gateway found");

  timer = - REQUEST_RATE; // start timing out right away
}

void loop () {
  ether.packetLoop(ether.packetReceive());

  if (millis() > timer + REQUEST_RATE) {
    timer = millis();
    Serial.println("\n>>> REQ");
    ether.browseUrl(PSTR("/foo/"), "bar", website, my_result_cb);
  }
}

 

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *