LINX 3.0 – Ou comment programmer un Raspberry Pi avec LabVIEW

Depuis peu, un toolkit permet à LabVIEW, l’environnement de développement graphique, de programmer certaines cibles informatiques ARMv7. On y trouve actuellement les Raspberry Pi 2 et 3 ainsi que les BeagleBone.

Ce toolkit permet donc de développer une application avec LabVIEW, de la compiler et de la télécharger dans la cible pour lui permettre de fonctionner de manière autonome!

LabVIEW Physical Computing kit for Raspberry Pi 2
LabVIEW Physical Computing kit for Raspberry Pi 2

Le Contexte

National Instruments, la société qui développe et maintient l’environnement LabVIEW, a récemment choisi une distribution Linux RT (Real Time) pour animer ses systèmes embarqués (cDAQ, cRIO, PXI…). Elle supporte actuellement les plateformes Zynq de Xillinx (ARMv7) et Intel Atom (x86). Or il se trouve que les Raspberry Pi 2 et 3 ainsi que la BeagleBone ont un jeu d’instruction ARMv7… Partant de ce postula, un portage du noyau d’exécution LabVIEW (Run-Time Engine) sur ces plateforme n’était qu’une question de temps.

C’est maintenant chose faite ! Une chose manque cependant à l’appel: le support du serveur graphique.

En effet, depuis l’arrivée des cRIO 903x, NI propose l’utilisation d’un serveur XFCE pour ajouter une interface graphique aux applications embarquées. Ceci n’est à ce jour pas encore supporté par LINX.

ATTENTION: Le Raspberry Pi N’EST PAS A CE JOUR UNE CIBLE LabVIEW TEMPS RÉEL!

LINX: Le toolkit LabVIEW

Digilent, une société acquise par National Instruments, a développé LINX, une solutions permettant le fonctionnement d’application LabVIEW sur certaines cibles telles que les Arduino ou Raspberry Pi.

Depuis la version 3.0 de LINX, la cible (Raspberry Pi ou Beagle Board) devient autonome!

L’idée de Digilent est brillante de simplicité: installer le Run-Time LabVIEW RT dans un environnement chroot à l’intérieur de l’OS d’origine. Sur le Raspberry Pi, Digilent recommande l’utilisation de Raspbian Jessy.

Configuré pour booter en mode console sans environnement graphique, l’application développée avec LINX 3.0 démarre en quelques dizaines de secondes à partir de la mise sous tension; les performances sont donc au rendez-vous!

En mode autonome, le code source est compilé et téléchargé sur la cible.
En mode autonome, le code source est compilé et téléchargé sur la cible.

Les premières versions fonctionnaient en mode supervisé:  un daemon installé sur la cible recevait des commandes d’un PC qui exécutait le VI LabVIEW. Une perte de communication entre les deux et le programme se plantait.

Mode supervisé: le PC se connecte par liaison série ou TCP
Mode supervisé: le PC se connecte par liaison série ou TCP

Mise en place de l’environnement

Le première chose à faire est d’installer LabVIEW 2014 SP1 32bits. Une licence Home Bundle est disponible aux alentour de 50€ à destination des makers et autres amateurs. Digilent propose également des packs LabVIEW Physical Computing à moins de 100€ incluant la licence et la cible. Je vous recommande particulièrement d’installer la version anglaise de LabVIEW, l’essentiel des communautés d’utilisateurs faisant usage du jargon anglophone. Prévoir quelques Go d’espace disque, LabVIEW est relativement volumineux (mon installation fait plus de 4Go sans compter les modules additionnels), ainsi qu’une connexion Internet pour l’activation.

Une fois LabVIEW correctement installé et activé, il faut lui ajouter LINX 3.0. Pour cela, rien de plus facile: VIPM est là pour ça!

Mais qu’est donc? VIPM (VI Package Manager) est un outils développé par JKI pour donner accès à une bibliothèque de toolkits et plugins pour LabVIEW. Certains sont gratuits, voir Open Source (tels que l’OpenG ou encore LINX), d’autres sont soumis à licence. Du coup, pour installer LINX, il suffit de lancer VIPM, chercher LINX dans la liste des modules et cliquer sur Installer…

VI Package Manager
VI Package Manager

Pour vérifier la bonne installation de LINX, lancer LabVIEW et ouvrir le menu Outils. Vérifier la présence d’un sous menu MakerHub:

Le menu Outils de LabVIEW
Le menu Outils de LabVIEW

Installation de la cible

Je vais détailler ici l’installation de LINX 3.0 sur Raspberry Pi 2 ou 3, n’ayant pas de BeagleBone sous le coude… Pour ces dernières, je vous propose de regarder les tutoriaux vidéos de Digilent.

Commençons par installer Raspbian Jessy Lite sur la carte SD du Raspberry. Un petit coup de dd sous Linux ou de Win32DiskImager sous Windows et le tour est joué. Pour configurer le Raspberry, un petit sudo raspi-config. Il est utile d’activer l’UART, le SPI et L’I2C ainsi que d’étendre la partition système à toute la carte SD. Pour continuer, il va également falloir configurer le réseau: Ethernet pour le Pi 2, possiblement le WiFi pour le Pi 3. Notez bien l’adresse IP du Raspberry, nous en aurons besoin.

Retour sous LabVIEW. Aller dans le menu Outils > MakerHub > LINX > LINX Target Configuration…

Connecter LINX sur la cible
Connecter LINX sur la cible

Renseigner les champs comme suit:

Hostname or IP : xxx.xxx.xxx.xxx (l’adresse IP du Raspberry Pi sur le LAN)

Username: pi

Password: raspberry

Et cliquer sur Connect puis sur l’onglet Install Software.

Installer le Run-Time sur la cible
Installer le Run-Time sur la cible

Un simple appuie sur le bouton Install et le tour est joué. L’utilitaire d’installation se connecte sur les dépôts d’installation de NI pour récupérer le Run-Time et l’installer dans l’environnement chroot.

Programmer la cible avec LabVIEW

Pour attaquer une cible embarquée avec LabVIEW, il faut commencer par créer un projet. Pour l’exemple, je vais créer un projet vide, mais rien n’empêche de partir d’un modèle de projet. Pour ajouter le Raspberry au projet, faire un clic droit sur la racine du projet (et non sur My Computer, comme souvent commis par erreur…) et ajouter une nouvelle cible:

new_target
Ajouter une cible au projet
new_target
Spécifier l’adresse IP de la cible et son type

Spécifier l’adresse IP de la cible et choisir son type: LINX > Raspberry Pi / BeagleBone. Une nouvelle cible est ajoutée au projet. Tout les VI placés dans cette cible s’exécuteront sur celle-ci et non sur l’ordinateur.

Le projet LabVIEW.
Le projet LabVIEW

Quand on édite un VI, on peut savoir sur quelle cible il s’exécute lorsque l’on clique sur la flèche d’exécution. Il suffit pour cela de regarder en bas à gauche de la fenêtre (face avant ou diagramme): un  champ texte précise le nom de la cible et permet de modifier ponctuellement celle-ci.

Par exemple, on développe un algorithme de calcul sur le Raspberry et l’on aimerait le tester rapidement: rien de plus simple! Un clic droit sur le champ texte et on choisi My Computer. LabVIEW va alors exécuter le code sur le PC plutôt que sur le Raspberry. Les conditions d’exécution sont différentes, mais on économise la phase de compilation et de déploiement qui peut prendre un peu de temps.

Il est possible de voir la cible d'exécution en bas à gauche
Il est possible de voir la cible d’exécution en bas à gauche
On peu la changer par un clic droit, tant depuis la face avant que depuis le diagramme
On peu la changer par un clic droit, tant depuis la face avant que depuis le diagramme

Les fonctions spécifiques au module LINX sont accessibles par la palette MakerHub. On y retrouve toute l’API: accès aux E/S tout ou rien, aux modules UART/SPI/I2C ainsi que tout un tas de drivers pour capteurs et afficheurs. On y trouve également une Toolbox qui propose des fonctions de support utiles.

La palette LINX 3.0
La palette LINX 3.0

L’accès à l’API LINX s’effectue de la manière suivante:

  1. Ouverture d’une référence en mode Local I/O
  2. Initialisation des différents sous modules (typiquement le SPI)
  3. Accès aux E/S, fonctionnement nominal de l’application
  4. Fermeture des sous modules
  5. Fermeture de la référence principale

Voici un exemple de communication sur bus SPI.

Exemple d'une communication SPI
Exemple d’une communication SPI

 

  • Le premier VI ouvre une référence vers l’API LINX. Elle est nécessaire à l’accès aux ressources de la cible.
  • Le deuxième VI initialise le module SPI 0
  • Le troisième VI configure le module SPI: vitesse de communication, ordre des bits, mode de fonctionnement de l’horloge…
  • Le quatrième VI écrit et lit des trames sur le bus
  • Le cinquième VI ferme et détruit la référence à l’API LINX.

Il n’est pas nécessaire de fermer l’accès au module SPI.

Lancement du programme

Pour exécuter le programme, il y a deux méthode:

  • En source
  • En exécutable

La première solution est à privilégier pour la phase de développement. Il suffit simplement de cliquer sur la flèche d’exécution. LabVIEW compile le programme, le télécharge sur la cible et connecte la face avant restée sur le PC sur le Run-Time de la cible. Ainsi, on peut interagir avec le programme, utiliser les outils de debug usuels (sondes, loupiote, points d’arrêts…).

Cette solution est très pratique, mais gourmande en ressources sur la cible. En effet, une communication réseau permanente est établie entre la cible et le PC. en outre, le programme ne peut être lancé qu’à partir de LabVIEW. Cela signifie qu’il faut rouvrir les sources du programme, compiler, télécharger et exécuter celui-ci à partir de LabVIEW à chaque mise sous tension de la cible.

Conclusion

LINX 3.0 représente une petite révolution dans le monde National Instruments. Il devient en effet possible pour tout un chacun de développer une application embarquée avec LabVIEW pour un budget accessible. En effet, la licence Home Bundle est à 50€ et les Raspberry Pi oscillent entre 30 et 40€. Tout le monde a désormais accès à l’ergonomie du langage G et à la puissance de l’environnement LabVIEW.

A bientôt pour de plus amples informations sur le déploiement d’une application LabVIEW sur le Raspberry Pi.

Lancez-vous !

[EDIT du 03/12/2017] – Problème lié au déploiement de LINX sur le Raspberry Pi

Lors de l’installation du LINX sur un Raspberry Pi, il se peut que l’une des étapes ne se déroule pas complètement, probablement à cause de certains droits d’accès qui auraient changés dans la dernière version de Raspbian (Stretch au moment où j’écris ces lignes).

Le symptôme est le suivant: au déploiement d’un programme faisant appel à la bibliothèque LINX, un message d’erreur survient:

« LMH-LINX.lvlib:Local IO.lvlib:Load Device Channels.vi loaded with errors on the target and was closed. »

Erreur au lancement d’une application

La cause probable est la suivante :

LINX installe une bibliothèque sur le Raspberry Pi : /usr/lib/liblinxdevice_rpi2.so

Cependant, pour assurer la compatibilité avec les BeagleBone Black, une deuxième bibliothèque est installée : /usr/lib/liblinxdevice_bbb.so

Le choix de la bonne bibliothèque est fait grâce à la création d’un lien symbolique: liblinxdevice.so -> ./liblinxdevice_rpi2.so. La coutume est courante sous Linux, mais dans notre cas précis le lien peut ne pas exister.

Pour s’assurer de la bonne installation de la bibliothèque, commencez par ouvrir un terminal SSH (soit dit en passant, Windows 10 est nativement doté d’un shell Linux…).

Ouvrir ensuite un accès à l’environnement chroot d’exécution LabVIEW: $ sudo schroot --run-session -c lv

Naviguer dans le dossier /usr/lib : # cd /usr/lib

Lister le contenu du dossier : # ls -l | grep linx

S’il n’y a que deux fichiers (le bbb et le rpi2), le problème de déploient du code viens de là.

Pour corriger le problème, il suffit de recréer le lien symbolique : # ln -s ./liblinxdevice_rpi2.so ./liblinxdevice.so

J’ai trouvé cette solution en parcourant le forum LabVIEW MakerHub (page d’origine). Nous la devons à Kryptman. Je me suis contenté de la tester et de la traduire en Français. Merci à lui.

10 thoughts on “LINX 3.0 – Ou comment programmer un Raspberry Pi avec LabVIEW”

  1. Bonjour,
    j’essai de me connecter a un raspberry PI3 et je rencontre quelque problèmes.
    Il me met le message « Device interrogation failed : unable to connect the target » .
    En faisant un ping à l’adresse du raspberry il le trouve bien.
    Je suis sous Labview 2015, cela pose t’il problème ?
    Faut il télécharger une autre version de linx ?
    Merci

    1. Bonjour Jean-Noël,

      J’ai essayé une fois de faire marcher LINX avec LabVIEW 2015 et un Raspberry Pi, sans succès. Digilent met LabVIEW 2014 32 bits dans ses prérequis et il semble bien que ce soit là seule version de LabVIEW capable de compiler pour le Raspberry.
      Je vous invite donc à repasser sur la version 2014 SP1. Par contre, les différentes versions de LabVIEW ne cohabitent pas forcément bien sur une même machine. En outre, il faut prendre soin de les installer dans l’ordre, de la plus ancienne vers la plus récente.
      Une machine virtuelle peut éventuellement faire l’affaire.

      Cordialement,

      Amaury LAURENT.

    1. Bonjour,

      Il semblerait que DIGILENT n’ai pas testé LINX sur une autre version de LabVIEW que la 2014. Pour ma part, je n’ai pas encore testé sur les versions ultérieures. Je testerais rapidement en 2015, mais je n’ai pas encore installé la 2016 (j’attends le Service Pack).

      Cordialement, Amaury.

  2. Bonjour,
    J’ai un problème au niveau de l’installation, j’ai une fenêtre qui m’indique:

    « The target’s Linux partition is only using 0GB of the available 4GB. It is recommended that you expand the Linux partition before continuing to install LabVIEW.

    Click the ‘Expand Partition’ button below to expand the Linux partition. »

    Et quand je clique sur expand partition le raspberry reboot et je continue l’installation.
    Mais quand je fais clique droit sur la racine du projet et « new », je n’ai pas « targets and devices »
    Merci

    1. Bonjour,

      J’ai l’impression que la lecture de l’espace disponible sur le Raspberry n’est pas optimale: il m’a annoncé des tailles de partitions incorrectes. Par contre, il est peut-être intéressant d’étendre la partition avec raspi-config avant d’installer LINX. Il y a peut-être un vrai problème d’espace disque.

      Par contre, si LabVIEW ne voit pas la cible, les problèmes peuvent venir d’ailleurs: mauvaise configuration réseau, conflict de version entre LINX et LabVIEW, pare-feu windows, …
      Quelle version de LabVIEW utilisez-vous?
      Avez-vous le modules RT?
      Comment connectez-vous le Raspberry sur votre réseau?

      Je vous invite a revérifier toute la configuration de votre environnement. Si le problème persiste, il faut se tourner vers le support Digilent.

      Cordialement, Amaury.

Laisser un commentaire