Catégorie : Embarqué     Tags :      

    Retrouvez cet article dans : Linux Magazine Hors série 23

    Développer ses propres montages est souvent intéressant mais, lorsque la complexité du cahier des charges augmente, on bascule facilement dans des modules préfabriqués et adaptables. C’est le cas du module présenté ici.

    Comment disposer de plusieurs entrées ou sorties numériques accessibles au travers d’un réseau Ethernet ? Plusieurs solutions répondent pleinement à cette question. L’usage d’un PC ou d’un système embarqué peut être une solution. Cependant, la première est souvent un gouffre en termes de consommation électrique et la seconde relativement onéreuse. Dans les deux cas, la solution est disproportionnée.
    Une autre solution consiste à utiliser un microcontrôleur auquel on ajoute un module Ethernet comme le Sollae Systems EZL-50. Le microcontrôleur reçoit et envoie les données de manière sérielle et le module s’occupe de la conversion, à la charge de l’utilisateur de développer le code pour le microcontrôleur choisi.
    Enfin, une dernière solution consiste à utiliser un module dédié. Le fabricant Elexol, par exemple, déjà connu pour ses modules USB/série ou USB/parallèle propose au détail un produit sous la désignation « Ether I/O 24 ». Celui-ci dispose de 24 entrées/sorties réparties en trois ports. Il se pilote via UDP et peut être configuré de manière à obtenir une adresse via DHCP ou une adresse fixe stockée en EEPROM.
    Les caractéristiques du module sont les suivantes :

    • E/S haute vitesse. Le module offre des temps de latence très réduits permettant quelques 250000 lectures et/ou 500000 écritures à la seconde.
    • Détection de changement d’état en entrée. Le module est capable de contacter l’hôte maître sans être interrogé. Ce type de fonctionnalités permettra, par exemple, de connecter en Ethernet deux modules sans intervention d’un PC serveur.
    • Etat de mise sous tension programmable. Il est possible de programmer l’état des ports du module lors de sa mise en route. Inutile ensuite de recourir à un hôte pour le reconfigurer.
    • Isolation électrique. Les E/S sont électriquement isolées entre elles afin de protéger à la fois le montage auquel est raccordé le module et le réseau.

    /img-articles/lmhs/23/art-15/fig-1.jpg

    • Contrôle des résistances de pull-up. Configurées en entrée, les lignes du module peuvent utiliser ou non des résistances de pull-up internet. La configuration se fait par logiciel via UDP comme le reste du contrôle du module.

    Protocole

    Dans sa configuration par défaut, le module tentera d’obtenir une adresse IP via DHCP. L’installation d’un serveur DHCP est donc indispensable. On attribuera son adresse au module de préférence en fonction de son adresse MAC. Dès lors, communiquer avec le module Elexol est un jeu d’enfant. Les commandes permettant le contrôle sont alphanumériques et envoyées via UDP.
    On commencera par définir la direction du ou des ports utilisés en envoyant 0x21 (caractère « ! ») suivi d’une valeur identifiant le port A, B ou C (0x41, 0x42 ou 0x43) puis du masque de direction sur 8 bits, 0 pour une sortie et 1 pour une entrée. Ensuite, il suffit d’écrire le numéro du port 0x41, 0x42 ou 0x43 pour « A », « B » et « C » puis l’octet à écrire, pour activer ou désactiver une sortie. Si nous souhaitons ne changer qu’une seule ligne d’un port, il nous faudra, soit stocker dans notre programme l’état du port, soit le lire puis réécrire l’octet modifié.
    La lecture n’est pas plus difficile. Il suffit en effet d’envoyer au module le nom du port en minuscule avec 0x61, 0x62 ou 0x63, respectivement « a », « b » ou « c ». On attend ensuite la réponse du module sur deux octets.
    Le premier est le nom du port en majuscule (0x41, 0x42 ou 0x43) et le second la valeur lue.
    Si les résistances de pull-up sont activées via l’envoi de 0x40, du nom du port et d’un masque d’activation (1 non active et 0 active), la lecture d’un port sans aucune connexion donnera 0xFF. Toutes les lignes qui ne sont pas reliées à la masse sont ramenées au +5 V par les résistances.

    Le code

    Pour changer du reste du hors-série, le langage utilisé ici sera Perl et non C. Il faut également avouer que ce langage est particulièrement bien adapté aux communications réseau.
    On commence par ouvrir un socket :

    #!/usr/bin/perl
    
    use IO::Socket::INET;
    use Fcntl;
    
    MySocket=new IO::Socket::INET->new(
      PeerPort=>2424,
      Proto=>’udp’,
      PeerAddr=>’192.168.0.51’)
      or die “Pas de Socket ! \n”;

    Nous pouvons ensuite dialoguer avec le module en passant, tout d’abord, la totalité du port B en sortie :

    $msg=chr(0x21).chr(0x42).chr(0x00);
    $MySocket->send($msg)
    	or die “Pas de Send ! \n”;
    print(“port B output\n”);

    Nous pouvons ensuite envoyer une donnée sur le port :

    $msg=chr(0x42).chr(0x01);
    $MySocket->send($msg)
    	or die “Pas de Send ! \n”;
    print(“port B 0xFF\n”);

    Pour lire le port A, nous procédons de même :

    $msg=chr(0x21).chr(0x41).chr(0xFF);
    $MySocket->send($msg)
    	or die “Pas de Send ! \n”;
    print(“port A input\n”);
    $msg=chr(0x61);
    $MySocket->send($msg)
    	or die “Pas de Send ! \n”;
    print(“lecture port A\n”);
    $MySocket->recv($text,2)
    	or die “Pas de Recv ! \n”;
    @bytes = split(//, $text);
    printf «%c %02x\n», ord($bytes[0]),ord($bytes[1]);

    /img-articles/lmhs/23/art-15/fig-2.jpg

    Si nous souhaitons activer les résistances de pull-up sur le port A, il nous suffit d’ajouter le code suivant :

    $msg=chr(0x40).chr(0x41).chr(0xFF);
    $MySocket->send($msg)
    	or die “Pas de Send ! \n”;
    print(“pull-up port A\n”);

    Un module pour le module

    En recherchant des exemples concrets d’utilisation du module Elexol, j’ai découvert qu’un développeur Perl avait créé un module spécifique au matériel en question. Chris Luke a écrit Net::Elexol::EtherIO24 qui pourra être téléchargé sur http://www.flirble.org/chrisy/elexol/. Que les utilisateurs Debian se réjouissent, car il leur suffira d’utiliser les commandes suivantes :

    % cd /tmp
    % dh-make-perl --build \
      --cpan Net::Elexol::EtherIO24
    % sudo dpkg -i \
      libnet-elexol-etherio24-perl_0.01-1_all.deb

    Le code permettant d’accéder au module Elexol s’en trouve grandement simplifié :

    #!/usr/bin/perl
    use Net::Elexol::EtherIO24;
    my $addr = «192.168.0.51»;
    my $eio = Net::Elexol::EtherIO24->new(target_addr=>$addr)
      or die «Pas de Socket ! \n»;
    $eio->set_line_dir(8,0);
    $eio->set_line(8,1);

    Conclusion

    Le module Ether I/O 24 est relativement coûteux au regard des fonctionnalités offertes. Il vous en coûtera quelques 120 euros TTC, montant auquel il faut ajouter un système d’alimentation (le module accepte de 8 à 35 Volts pour 1.1 Watts) et toute la connectique nécessaire pour les ports d’E/S.
    Il faut cependant prendre en compte qu’à ce prix on achète également une solution de facilité. Le temps et l’énergie ainsi gagnés pourront être utilisés pour l’électronique gravitant autour du module. C’est un choix personnel qu’il faudra faire en fonction des besoins du moment.

    Retrouvez cet article dans : Linux Magazine Hors série 23

    Posté par Denis Bodor (Lefinnois) | Signature : Denis Bodor | Article paru dans

    Laissez une réponse

    Vous devez avoir ouvert une session pour écrire un commentaire.

    • Il y a actuellement

    • 861 articles/billets en ligne.