La carte Velleman K8055 / VM110

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Cet article traite de l’utilisation d’une carte d’entrée / sortie Velleman K8055 sous Linux (Ubuntu). Voici un résumé de ses fonctionnalités :

  • 2 entrées analogiques 8 bits 0-5 Volts
  • 5 entrées digitales à contact N.O. (normalement ouvert), dont 2 possèdent un compteur réinitialisable.
  • 2 sorties analogiques (utilisables aussi en PWM)
  • 8 sorties digitales

Carte Velleman k8055/VM110La carte est reliée en USB à un ordinateur, alimentée par ce dernier, et jusqu’à 4 cartes peuvent êtres contrôlées par un même ordinateur. Deux cavaliers permettent de définir le port de chaque carte afin de les différencier. En plus des borniers à vis servant à relier les utilisations externes, chaque entrée et sortie dispose d’un circuit de test et d’une isolation afin de la protéger. Les entrées digitales ont un micro-poussoir et des Darlingtons, les entrées analogiques un potentiomètre et un AOP rail-to-rail. Les sorties sont équipées de LEDs de contrôle et des mêmes protections que les entrées.

Pour de plus amples informations sur la carte on peut se référer au manuel de montage, téléchargeable sur le site du fabriquant. Le manuel contient le schéma de la carte.

Comme beaucoup de produits de ce type, la carte est fournie avec un logiciel de test et un kit de développement sous Windows, sous forme de DLL.

La référence K8055 correspond à la carte en kit (car Velleman est un fabricant de kits à l’origine). La référence VM110 correspond à la carte montée par le fabricant.

Configuration

Sous Linux, il existe à ma connaissance deux solutions pour faire fonctionner la carte. Utiliser COMEDI, mais je ne suis pas encore arrivé à grand chose avec; ou utiliser libk8055, qui semble mieux fonctionner. Les deux projets peuvent fonctionner avec les langages C et Python.

Une bonne piste à suivre serait celle de la communauté Ubuntu francophone, mais elle a été écrite pour une Kubuntu 9 et nécessite quelques ajustements pour les versions plus récentes (Ubuntu 10, Ubuntu 11). Ce que je ferais dans cet article.

Le créateur du projet libk8055 a recréé une bibliothèque (libk8055.so) en rétro-ingénierant la DLL de chez Velleman. Elle dispose donc des mêmes fonctions et des mêmes arguments. L’approche est intéressante puisque de fait on peut utiliser la documentation de la DLL Windows pour s’en servir. La version Python regroupe ces fonctions dans une classe.

Pour vérifier et mettre au propre la procédure d’installation et de configuration, j’ai utilisé une machine virtuelle avec une installation brute d’Ubuntu 10.10, puis j’ai recommencé avec une Ubuntu 11.04.

Edit: Cerise sur le MacDo, je découvre que la dernière version de VirtualBox OSE gère le passage des ports USB vers le système invité, alors qu’avant seule la version non open source le faisait. J’ai donc pu pousser le test jusqu’au bout.

Contrairement à la procédure que l’on trouve sur Ubuntu-fr, je ne vais pas partir du postulat que vous souhaitiez tout installer (libk8055, les bindings Python, l’interface graphique). Je vais donc y aller par étape pour ceux qui ne voudraient que la lib, par exemple.

Bibliothèque et programme de test

Comme toujours, on vérifie que l’on est bien à jour :

La première commande met à jour la liste des paquets, la seconde met à jour tout les paquets qui ne le sont pas.

Ensuite on télécharge les sources :

Note: Dans la mesure ou le projet est susceptible d’évoluer, je vous invite a aller vérifier qu’il s’agit toujours de la dernière version du fichier avant de le télécharger (ici).

Pour compiler la bibliothèque et le programme de test, nous aurons besoin de satisfaire à quelques dépendances :

Note du 10/08/2012 : Sous Ubuntu 12.04, vous devrez aussi installer le paquet make.

Le fichier MakeFile doit être personnalisé avant usage. Pour ma part, je me contente de retirer le ? de la ligne 7:

Ensuite on lance la compilation :

La première ligne va compiler la bibliothèque et le programme de test. La seconde va installer la bibliothèque dans /usr/local/lib, et le programme dans /usr/local/bin.

A ce stade, vous devriez pouvoir utiliser le programme de test en tant que root (uniquement) :

La première commande doit allumer les 8 LEDs de sorties digitales, alors que la seconde les éteint.

Pour pouvoir développer en C avec la bilbiothèque libk8055.so, on met à jour la liste des bibliothèques disponibles sur le système, ça ne mange pas de pain :

Pour pouvoir utiliser la carte sans obligatoirement être root, on va pousser un peu plus loin la configuration :

Ce fichier (mis à jour pour les version 10, 11 et 12 d’Ubuntu) indique au système que si on lui branche une carte K8055, elle devra être montée en mode 0660 et appartenir au groupe “k8055”. Il contient 4 lignes car selon son adresse, la carte s’identifiera comme produit 5500, 5501, 5502 ou 5503.

Ensuite on crée ce groupe, et on s’y ajoute :

En n’oubliant pas de remplacer toto par votre nom d’utilisateur. Les appartenances aux groupes n’agissent qu’a l’ouverture de session. Donc on ferme la session et on en ouvre une nouvelle (Je me demande s’il n’y a pas besoin d’un redémarrage de service pour que la règle soit prise en compte par udev).

A ce stade, on doit être capable d’utiliser le programme de test et de développer des programmes en C qui utilisent la bibliothèque libk8055.so.

Pour tester, on configure la carte (débranchée) pour qu’elle ait l’adresse 0 (SK5 et SK6 fermés), on la branche, et on tape, par exemple :

La première commande doit allumer les 8 LEDs de sorties digitales, alors que la seconde les éteint.

Si ce n’est pas le cas, voici quelques pistes à exploiter :

La première chose à faire est de brancher la carte sur une machine Windows et de la tester avec les logiciels d’origine du fabricant. Dans ce cas, si elle ne fonctionne pas il y a fort à parier qu’elle ait été mal monté ou qu’un composant ait lâché.

Sous Linux, la commande lsusb doit vous sortir une ligne ressemblant à :

Le Bus et le Device changent à chaque branchement. La première partie de l’ID (10cf) est sensé être identique à tous les produits Velleman. La seconde partie (5500) Signifie qu’il s’agit d’une carte 8055 configurée en adresse 0. D’ailleurs il vous le rapelle à la fin de l’intitulé.

On peut restreindre la recherche en fixant le fabricant :

La commande lsusb -t doit pouvoir vous afficher plus de détails sur la carte (ici le Bus 5, Device 3, d’après la commande ci dessus) :

La bibliothèque n’étant pas un pilote, la carte est vue par le système comme un périphérque HID (périphérique d’entrée sortie divers, telle qu’une souris ou un clavier).

Bindings Python

Cette étape est bien plus simple que la précédente puisqu’elle s’appuie sur des choses qu’on y a fait.

Les bindings Python sont créés grâce à Swig. Pour les compiler, il nous faut Swig et les entêtes Python :

Ensuite on compile et on installe depuis le dossier src où nous avions décompressé l’archive et compilé les versions C :

A ce stade, on doit être capable d’utiliser la version Python du programme de test et de développer des programmes en Python qui utilisent la bibliothèque pyk8055.

Développement

Voici l’utilisation du programme de test :

L’utilisation la plus simple que l’on puisse faire de cette carte serait de l’utiliser comme datalogger. Rien de plus simple, une seule commande suffit dans votre crontab, du type :

En planifiant cette commande toutes les minutes, on obtiendra un fichier au format :

Là dessus, un petit script (Python, PHP, etc) analyse le fichier log du jour et trace un graph sur une page web et vous avez votre application de base.

J’ai souhaité comparer la vitesse de fonctionnement des deux langages pour interfacer la carte. Comme on l’a vu pendant l’installation, les deux candidats sont le C et Python. Pour ce faire, j’ai développé un petit logiciel de pilotage de moteurs pas à pas via les 8 sorties digitales de la carte, utilisées à la façon d’un port parallèle.

Attention: On ne peut pas brancher n’importe quoi en sortie directe de la carte. J’ai utilisé des moteurs pas à pas qui consomment moins de 500 mA par phase. Pour piloter des moteurs plus puissants il faut se fabriquer un étage de sortie avec des transistors de puissance. Sinon les Darlington ULN2803 vont finir en pop-corn !

J’ai commencé par développer le logiciel en C, puis j’ai fait un copier-coller du code dans un nouveau fichier, que j’ai transcodé en Python afin de conserver une structure la plus proche possible (mêmes boucles, mêmes traitements).

Voici les options de mon programme (identiques dans les deux langages) :

Je les mettrais très bientôt en accès publique, le temps de les mettre au propre.

Benchmark avec le programme en C :

Benchmark avec le programme en Python :

Comme on peut le voir, il n’y a aucune différence entre les deux langages en matière de temps d’exécution (on parle en millisecondes). J’en déduis donc que sur ma machine, la différence entre les deux langages est inférieure au temps de traitement de la carte elle même. On peut donc utiliser l’un ou l’autre des langages pour développer des logiciels en ligne de commande visant à exploiter cette carte.

Il me reste à refaire le même test avec une interface graphique (très probablement Qt) …

Note du 2/12/2012 : Cette procédure a aussi été testé avec succès sur Raspbian, l’une des distros du Raspberry Pi.

Liens

Votre carte fonctionne sur le plan logiciel ? Vous pouvez consulter mon article sur la partie électronique !

Facebooktwittergoogle_plusredditpinterestlinkedinmail

21 commentaires

  1. Merci pour cet article ! Vous m’avez tellement donné envie que j’ai acheté la carte bien décidé que je suis à faire tourner, bouger et lire des trucs sur le PC.

    Pouvez-vous me dire à quoi sert SWIG ? …. Est-ce que ces procédures de mise en place de librairie sont expliquées dans la documentation de la carte ?

    Merci pour votre retour (J’ai plein d’autres questions !)

     

    1. Bonjour, et merci 🙂 La documentation de la carte ne prend en compte que Windaube, tout comme les logiciels d’origine, malheureusement. Vous n’y trouverez donc aucune information sur son installation sur un système d’exploitation 🙂

      Swig est un système de mapping de fonctions C bas niveau pour les langages scriptés. Il permet, dans ces langages, de descendre assez bas dans les couches du système et d’appeler des fonctions C sans forcément savoir développer une extension du langage, comme on ferait par exemple en PHP.

  2. OUah ! Vous avez vu ma bouteille à la mer ! … Merci bien…

    Je n’en sais pas assez pour comprendre ce qu’est un mapping de fonction C bas niveau ! …. Le seul truc que je sais, c’est que je ne comprends pas grand chose et que je voudrais bien savoir faire plein de chose…

    J’ai mis le disk Vellemann dans le PC et dès là j’étais bloqué …

    Restons sous Windows (XP) … Est-ce que je vais pouvoir aller plus loin en installant ce qu’il y a sur le disk fourni avec la carte ? Est-ce que ce sont des DLL ? est-ce que je dois toutes les installer et où ?

    D’abord, je vais me limiter à des choses simples (qui semblent simples) comme piloter les sorties numériques. Le peu que je sache faire, c’est avec Python et je voudrai ensuite donner des signaux à une carte pour piloter un moteur pas à pas.

    Je sais bien comment fonctionne les moteurs pas à pas, mais avant ça, il faut que je comprenne comment agir sur cette carte.

    Est-ce qu’il y a qqchose à faire et apprendre pour ça ?

    Toute lumière sera très profitable …. Stéphane

     

     

    1. « Restons sous Windows (XP) » : Désolé, ce n’est pas le bon site pour ça. Ici on traite de vrais système d’exploitation 🙂 Tous les trucs qui finissent en X (LinuX, UniX, osX à la rigueur).

      Plus sérieusement, du coup vous ne trouverez rien d’intéressant ici parce que sous Windaube, il n’y a pas Udev, ni Swig. Et inversement, sur un vrai système d’exploitation il n’y a pas de DLL.

      1. Alors, si je comprends….. Il ne me reste plus qu’à me mettre sous LINUX sérieusement ?….. C’est peut-être ça le meilleur conseil ?

        1. Pas forcément, même si tout en moi me pousse à vous dire que oui. Si l’objectif est juste de faire fonctionner la carte rapidement, il faut faire avec ce que vous avez sous la main et avec vos compétences. Linux est un système puissant, mais complexe, ça va souvent ensemble. La solution la plus simple consisterait à faire tourner le logiciel d’origine sous le système pour lequel il est prévu.

          Ce que je propose ici est un tutoriel avancé pour faire fonctionner cette carte sur un système pour lequel elle n’est pas du tout prévue. Apprendre Linux sera forcément positif, mais l’attaquer par un angle compliqué, comme la gestion de pilotes, n’est pas forcément la meilleure approche. Cela risquerait fort de vous en dégoûter.

  3. les $ en tête de ligne … Où les retrouvent-on ? c’est ….le DOS ?….

    1
    2

    $ make pylib
    $ sudo make pyinstall

    Là … Je réalise que je ne sais rien de rien … Mais bon : Je vais apprendre …

    1. Et non, c’est le terminal Linux. Cet article ne parle pas du tout de l’utilisation sous Windaube. En fait tout le site ne parle grosso modo que de Linux.

      De ce que j’ai pu voir sur le net, sous Windaube, il suffit d’installer le logiciel et de brancher la carte. Rien à faire de spécial.

      1. encore solliciter votre expertise (et je vois que vous traiter aussi d’impression 3D, ce qui assez voisin de mon projet): la librairie ezdxf pour python, ça vous parle ?….L’avez-vous déjà utilisée ?

  4. Bonjour David,

    Merci de partager avec la communauté.

    J’ai testé la carte avec un raspberry pi3 et cela fonctionne. Toutefois, ne maitrisant pas python, je souhaiterais utiliser Java. Et la, impossible de la faire fonctionné sur mon raspberry. Auriez-vous un lien vers une documentation expliquant comment faire ?

    D’avance merci de votre aide.

     

    1. Bonjour, je n’ai pas connaissance d’un portage Java de la lib. Cela dit, j’ai vu que vous utilisez C et C++ sous win32. Peut-être que partir du source C Linux vous aiderait d’une meilleure manière ? Vous me faites d’ailleurs remarquer qu’il serait peut-être temps que je déplace ces vieilles archives Google Code chez Github 🙂

  5. Bonjour,

     

    merci de partager avec la communauté.

    Je souhaiterais recompiler la dll pour l’utiliser sous Windows 10 iot sur mon raspberry. Existerait-il une source de la DLL exploitable sous c ou c++ ?

    D’avance merci.

    1. Bonjour, navré, mais je suis Windowphobe. Tous les articles de mon site traitent exclusivement de Linux. Je n’ai donc fait aucune recherche sur cette configuration, et j’ai même été extrêmement déçu par son annonce.

  6. Bonjour,

    J’ai relié une les sorties digitales d’une carte Wellman 8055 (reliée en USB au Raspberry)  aux entrées d’un MCP23017 (relié à un arduino via i2c tools).

    Malheureusement, je n’obtiens rien en lecture sur arduino lorsque je lance: k8055 -d:0

    Ai-je fait une erreur?

    Merci d’avance pour vos répones.

     

    1. Bonjour, Difficile à dire d’après les informations. l’argument « -d:0 » va passer toutes les sorties de la k8055 à l’état bas. Donc si le mcp23017 n’a pas de pull-ups, qui forceraient ses entrées à l’état haut, on ne voit effectivement rien arriver. Ensuite le mcp23017 peut être configuré en entrée ou en sorties, donc il faut aussi savoir si la broche digitale en question est configurée en entrée ou en sortie.

  7. Bonjour, merci pour vos réponses.

    J’ai configuré le MCP en entrée avec un pull-up (j’ai suivi le tuto suivant:  http://wiki.mchobby.be/index.php?title=MCP23017-Brancher-Entr%C3%A9e) . J’ai relié la masse de la carte VM110 à la masse du MCP 23017, la sortie digitale 1 du 8055 à l’entrée GPA0 du MCP 23017, etc… Lorsque que lorsque le lance d:0, GPA0 reste à 1. Peut-être faut-il rajouter une résistance de 200 Ohms entre chaque sortie de la carte 8055 et le clamp.

    Encore Merci d’avance pour vos conseils.

Laisser un commentaire

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