Share |

La carte Velleman K8055 / VM110

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

La 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 :

sudo apt-get update
sudo apt-get upgrade

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 :

mkdir libk8055
cd libk8055
wget http://prdownloads.sourceforge.net/libk8055/libk8055.0.4.1.tar.gz
tar -xzf libk8055.0.4.1.tar.gz
cd src
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 :

sudo apt-get install libusb-dev

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

PREFIX = /usr/local

Ensuite on lance la compilation :

make
sudo make install

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) :

sudo k8055 -d:255
sudo k8055 -d:0

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 :

sudo ldconfig

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

sudo vim /etc/udev/rules.d/75-velleman-k8055.rules
# velleman.rules a udev rules file for velleman K8055/VM110.
# Put this file in /etc/udev/rules.d
#
# To access the devices under a regular user account, you must
# be in the k8055 group. 
#
# You can add a RUN="..." attribute to run some arbitrary script
# when the device is plugged in.
 
SUBSYSTEM=="usb*", ATTRS{idVendor}=="10cf", ATTRS{idProduct}=="5500", SYMLINK+="k8055_0", MODE="0660", GROUP="k8055"
SUBSYSTEM=="usb*", ATTRS{idVendor}=="10cf", ATTRS{idProduct}=="5501", SYMLINK+="k8055_1", MODE="0660", GROUP="k8055"
SUBSYSTEM=="usb*", ATTRS{idVendor}=="10cf", ATTRS{idProduct}=="5502", SYMLINK+="k8055_2", MODE="0660", GROUP="k8055"
SUBSYSTEM=="usb*", ATTRS{idVendor}=="10cf", ATTRS{idProduct}=="5503", SYMLINK+="k8055_3", MODE="0660", GROUP="k8055"

Ce fichier (mis à jour pour les version 10 et 11 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 :

sudo groupadd k8055
sudo gpasswd -a toto k8055

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 :

k8055 -d:255
k8055 -d:0

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 à :

Bus 005 Device 003: ID 10cf:5500 Velleman Components, Inc. 8055 Experiment Interface Board (address=0)

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 :

lsusb -d 10cf:
Bus 005 Device 003: ID 10cf:5500 Velleman Components, Inc. 8055 Experiment Interface Board (address=0)

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) :

/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
    |__ Port 1: Dev 3, If 0, Class=HID, Driver=vmk80xx, 1.5M

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 :

sudo apt-get install python-dev swig

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

make pylib
sudo make pyinstall

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 :

K8055 version 0.4.1 MrBrain Build
Copyright (C) 2004 by Nicolas Sutre
Copyright (C) 2005 by Bob Dempsey
Copyright (C) 2005 by Julien Etelain and Edward Nys
Copyleft (L) 2005 by Sven Lindberg

Syntax : k8055 [-p:(number)] [-d:(value)] [-a1:(value)] [-a2:(value)]
             [-num:(number) [-delay:(number)] [-dbt1:(value)]
             [-dbt2:(value)] [-reset1] [-reset2] [-debug]
	-p:(number)	Set board number
	-d:(value)	Set digital output value (8 bits in decimal)
	-a1:(value)	Set analog output 1 value (0-255)
	-a2:(value)	Set analog output 2 value (0-255)
	-num:(number)   Set number of measures
	-delay:(number) Set delay between two measure (in msec)
	-dbt1:(value)   Set debounce time for counter 1 (in msec)
	-dbt2:(value)   Set debounce time for counter 2 (in msec)
	-reset1		Reset counter 1
	-reset2		Reset counter 2
	-debug		Activate debug mode
Example : k8055 -p:1 -d:147 -a1:25 -a2:203

Output : (timestamp);(digital);(analog 1);(analog 2);(counter 1);(counter 2)
Note : timestamp is the number of msec when data is read since program start
Example : 499;16;128;230;9;8
499 : Measure done 499 msec after program start

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 :

k8055 >> /chemin/`date +"%Y-%m-%d-"`k8055.log

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

(timestamp);(digital);(analog 1);(analog 2);(counter 1);(counter 2)
(timestamp);(digital);(analog 1);(analog 2);(counter 1);(counter 2)
...

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) :

$ ./libk8055_stepper --help
libk8055_stepper 
   -h, --help: Displays these informations.
   -v, --verbose: Display the orders as they are executed.
   -p, --port: K8055 board address.
      0: SK5 and SK6 are closed on the board (Default).
      1: SK5 is open and SK6 is closed on the board.
      2: SK5 is closed and SK6 is open on the board.
      3: SK5 and SK6 are open on the board.
   -m, --mode: Motor phases activation mode.
      0: Single step mode. Activation of one phase at once. Weaker consumption and couple (Par défaut).
      1: Full step mode. Activation of phases per pair. Consumption and couple doubled.
      2: Half step mode. Mix of the two preceedings. Consumption, couple and precision doubled.
   -1, --motor1: Number of steps for motor 1.
   -2, --motor2: Number of steps for motor 2.
   -b, --both: Number of steps for motor 1, motor 2 will follow the same way.
   -r, --reversed: Number of steps for motor 1, motor 2 will follow the opposite way.

A step count can be positive or negative. In reversed mode, you drive motor 1, motor 2 will be reversed.

The -h, -v, -p and -m switches must be used first and once. But the others can be duplicated.
You cannot drive multiple boards with a single command. But a script can send multiple command lines.
Example: libk8055_stepper --motor1:+50 --motor2:-50 --motor1:-50 --motor2:+50 --both:+100 --both:-100

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

Benchmark avec le programme en C :

$ ./libk8055_stepper -v -m:0 -1:1000 -1:-1000 -2:1000 -2:-1000 -b:1000 -r:1000
[00000] Entering verbose mode.
[00000] Switching to Single step mode.
[00027] Opening the k8055 board (port: 0).
[00027] Motor 1: +1000 steps.
[08027] Motor 1: -1000 steps.
[16027] Motor 2: +1000 steps.
[24027] Motor 2: -1000 steps.
[32027] Motor 1: +1000 steps. Motor 2: +1000 steps.
[40027] Motor 1: +1000 steps. Motor 2: -1000 steps.
[48035] Closing the k8055 board (port: 0).

Benchmark avec le programme en Python :

$ ./stepper_new.py -v -m:0 -1:1000 -1:-1000 -2:1000 -2:-1000 -b:1000 -r:1000
[00000] Entering verbose mode.
[00000] Switching to Single step mode.
[00027] Opening the k8055 board (port: 0).
[00027] Motor 1: +1000 steps.
[08027] Motor 1: -1000 steps.
[16027] Motor 2: +1000 steps.
[24027] Motor 2: -1000 steps.
[32026] Motor 1: +1000 steps. Motor 2: +1000 steps.
[40027] Motor 1: +1000 steps. Motor 2: -1000 steps.
[48035] Closing the k8055 board (port: 0).

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) …

Liens

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

 
systeme/k8055.txt · Dernière modification: 2011/08/15 20:23 par dmeziere
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki