Vous êtes ici : DomotiqueArduinoArduino et enc28j60 : EtherCard ou UIPEthernet

Arduino et enc28j60 : EtherCard ou UIPEthernet

arduino enc28j60 log

Le module enc28j60 permet de connecter son arduino à son réseau local. Peu cher, il repésente une alternative intéressante au module officiel basé sur le contrôleur W5100. Jusqu'à peu, on devait se contenter de la bibliothèque EtherCard pour l'utiliser.

Depuis juillet, une alternative est disponible UIPEthernet ... et plein de bonnes nouvelles avec ...

Un petit comparatif s'impose ...

 

 

Le montage

L'essai va se faire une une Arduino Mega 2560. Les pins utilisée par le SPI sont donc : 50, 51, 52 et 53. Pour mon projet, je vais devoir partagé le SPI entre ma carte SD et le contrôleur Ethernet. Je vais donc utiliser le pin 48 pour la sélection du device au lieu du 53. Ceux qui veulent plus de détails sur SPI peuvent consulter l'article de Wikipédia.

Le module utilisé est classique, acheté sur eBay à moins de 5 Euros:

arduino enc28j60 Module

Le cablage est :

enc28j60 Mega 2560

Comme vous pouvez le constater, le module fonctionne en 3.3V. J'ai donc branché le module sur la sortie 3.3V de la Mega 2560. Cependant, cette sortie ne permet de tirer seulement 50mA et mes recherches sur Google me laisse penser à une consommation du module située entre 100 et 200mA. Dans un montage en "production", il est donc indispensable de passer par une alimentation obtenue à partir du 5V (avec un lm1117 par exemple). Pour les tests, celle de la carte peut suffire mais j'ai remarqué que quelques fois les LED d'activité réseau s'éteignaient et qu'aucune communication n'était plus possible. Une coupure de l'alimentation de l'Arduino permet de résoudre le problème. Selon Google, il pourrait aussi s'agir un problème de surchauffe du enc28j60 ... A suivre donc ...

Dernière chose, les bibliothèques sont hébergées sur github, il est possible de les récupérer simplement en utilisant le lien Download Zip en bas et à droite de la page d'accueil du repository :

arduino enc28j60 github

Il suffit ensuite de décompacter l'archive dans le répertoire "libraries" de l'IDE.

EtherCard

La tenante du titre. Elle est téléchargeable ici.

Elle gère le DHPC, le DNS et l'UDP. En revanche, sa gestion du TCP est plus limitée : point de connexions persistantes, du moins jusqu'à récemment. Il y a maintenant dans le code un moyen de rendre les connexions persistantes mais pas trop de documentation sur le sujet n'est disponible.

J'ai essayé d'implémenter le SMTP avec EtherCard mais je n'y suis point arrivé. Essentiellement car je n'arrivais pas à joindre les ordinateurs de mon réseau local !!! Google et les autres étaient à ma portée mais mon NAS situé à 10 mètres restait inaccessible. Je suis allé jusqu'à modifié le MTU mais rien n'y a fait. En revanche, l'UDP fonctionnait bien car je pouvais récupèrer une adresse IP. Autre chose, la résolution DNS s'avère très lente.

Dernier point, cette librairie n'est pas "compatible" avec la bibliothèque officielle, elle n’implémente pas les mêmes fonctions et classes. Son fonctionnement est même bien différent.

Pour la sélection SPI, il est possible de spécifier le pin utilisé lors de l'initialisation du contrôleur.

Du point de vue de l'occupation mémoire, l'exemple GetDHCPand DNS nous laisse 6159 octets disponible :

arduino ethercard memory use

En commentant la focntion "ether.browseUrl", l'espace libre passe à 6400 octets.

UIPEthernet

Le challenger, disponible ici.

Et la que des bonnes nouvelles : DHCP, DNS, connexions TCP persistantes, UDP (serveur et client) ... et surtout une compatibilité avec la lib officielle !!!

En revanche, l'utilisation du pin 48 pour la sélection SPI nécessite la modification des sources de la bibliothèque et en particulier le fichier utility/Enc28J60Network.h :

#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__)
#define ENC28J60_CONTROL_CS     48
#define SPI_MOSI        51
#define SPI_MISO        50
#define SPI_SCK         52
#else;
#define ENC28J60_CONTROL_CS     10
#define SPI_MOSI        11
#define SPI_MISO        12
#define SPI_SCK         13
#endif;

L'exemple TCP client m'a servi de test pour l'utilisation mémoire :

arduino uipethernet memory use

6202 octets disponibles.

Et comme vous pouvez le constater, j'arrive à me connecter à mon serveur SMTP :)

Conclusion

Pour moi la conclusion est simple : UipEthernet !!!

Même avec une occupation mémoire un peu supérieure (mais pas trop gênante sur la Mega 2560) et une modification obligatoire des fichiers d'entête, elle permet de disposer d'une vraie pile TCP/IP et d'une compatibilité des exemples avec le module officiel.

Depuis les test ci-dessus, le développeur a beaucoup travaillé sur l'occupation mémoire de la librairie. D'après ses commits, il aurait économisé plus de 700 octets ... De quoi conforté mon choix.

Et maintenant ? On peut envoyer des emails et implémenter un serveur telnet avec son arduino et le module enc28j60. Ces articles utilisent la librairie FullIP.

 

Commentaires   

 
0 #5 Pef 26-03-2015 23:25
Bonjour,

Je viens de faire quelques tests avec la librairie UIPEthernet, une carte Velleman VMA04 et le code exemple UdpClient. Le code semble bien s'exécuter, les packets UDP semblent être envoyés mais je ne reçois rien en face (serveur UDP en Java). Je n'arrive pas non plus à pinger mon arduino. La pin CS est bien à 0. Cependant tout fonctionne correctement avec le shield ethernet arduino officiel (module W5100).

Auriez-vous une idée de ce qu'il me manque?

Merci
Citer
 
 
0 #4 bibi21000 08-04-2014 15:33
Citation en provenance du commentaire précédent de sylvain :
Ok merci pour votre réponse, par contre quelle est la différence entre SPI_SS et ENC28J60_CONTROL_CS ?
Dans votre exemple, SPI_SS n'existe pas.
A quoi sert ce signal ?
Ne faut il pas mettre en œuvre également le signal Reset ?

Merci

Pour le SPI, tout est là : http://fr.wikipedia.org/wiki/Serial_Peripheral_Interface
Citer
 
 
0 #3 sylvain 08-04-2014 12:05
Ok merci pour votre réponse, par contre quelle est la différence entre SPI_SS et ENC28J60_CONTRO L_CS ?
Dans votre exemple, SPI_SS n'existe pas.
A quoi sert ce signal ?
Ne faut il pas mettre en œuvre également le signal Reset ?

Merci
Citer
 
 
0 #2 bibi21000 07-04-2014 23:03
Citation en provenance du commentaire précédent de sylvain :
Bonjour,
merci pour votre article.
J'ai un pb pour implanter cette librairie avec ma carte leonardo.
Elle ne dispose pas de PIN CS disponible sur les HE10.
J'ai donc modifier le .h de la librairie :
#define ENC28J60_CONTROL_CS 10
#define SPI_MOSI MOSI
#define SPI_MISO MISO
#define SPI_SCK SCK
#define SPI_SS 10


Mais cela ne fonctionne toujours pas, avec vous une idée ? merci pour votre aide !

Je ne connais pas du tout cette carte mais un coup d'oeil sur http://arduino.cc/en/Main/arduinoBoardLeonardo peut t'aider.
Tu peux essayer de contacter directement le développeur de la lib ici : https://github.com/ntruchsess/arduino_uip/issues?state=open
Citer
 
 
0 #1 sylvain 07-04-2014 22:49
Bonjour,
merci pour votre article.
J'ai un pb pour implanter cette librairie avec ma carte leonardo.
Elle ne dispose pas de PIN CS disponible sur les HE10.
J'ai donc modifier le .h de la librairie :
#define ENC28J60_CONTRO L_CS 10
#define SPI_MOSI MOSI
#define SPI_MISO MISO
#define SPI_SCK SCK
#define SPI_SS 10


Mais cela ne fonctionne toujours pas, avec vous une idée ? merci pour votre aide !
Citer
 

Ajouter un Commentaire


Code de sécurité
Rafraîchir

Free business joomla templates