Utiliser une librairie Arduino sur carte Pi

Cet article est la suite de l’article Utiliser Hmi4DinBox sur carte Pi. Il faudra donc avoir effectuer les manipulations prévues dans cet article : installation ou mise à jour de piduino, connexion et test de l’interface Hmi4DinBox sur le Nano Pi.

Comme nous l’avons dans un article précédent la librairie piduino permet de compiler un croquis Arduino sur une carte Pi (Nano, Raspberry, Orange …). La librairie piduino peut compiler tous les croquis faisant appel aux fonctions de calcul de base (UC), aux broches d’entrées-sorties numériques (GPIO) ainsi qu’aux liaisons série, I2C et SPI. Il faut préciser que, même si cela peut paraître évident, piduino ne peut pas émuler accéder à des ressources non disponibles sur la carte Pi, comme l’ADC par exemple, mais il dispose aussi de la fonction analogWrite() qui permet de générer un signal PWM sur n’importe quelle broche GPIO…

A certaines conditions, il est possible d’envisager l’utilisation de librairie Arduino sur carte Pi. Posons le problème sous forme de questions réponses :

  • Est-il possible d’utiliser une librairie conçue pour Arduino sur une carte Pi grâce à piduino ?
    En fait, cela dépend de la librairie, si celle-ci ne fait pas d’accès direct aux ressources matérielles du microcontrôleur, cela devrait fonctionner.
  • Comment savoir si une librairie fait un appel direct aux ressources matérielles du microcontrôleur ? Il faut regarder dans les fichiers du code source de la librairie (.cpp), si un ou plusieurs fichiers contient des instructions #include suivies d’un nom de fichier d’entête commençant par <avr/ cela ne sera pas possible (en tout cas pas sans modification du code source de la librairie).

Le but de cet article est de montrer comment utiliser une librairie Arduino, qui répond à la condition précédente, sur une carte Pi. Pour l’utilisation d’une librairie “normale” prévue pour être utiliser sur carte Pi, on se reportera à l’article Utiliser facilement les librairies avec CodeLite.

Nous allons utiliser le Codelite pour créer un espace de travail (un workspace) et un projet piduino, ensuite nous ajouterons les fichiers source de la librairie Hmi4DinBox avant de compiler et exécuter le programme. Cela suppose que vous savez utiliser Codelite dans ses fonctions de base, comme expliqué dans l’article Utilisation de CodeLite.

Création de l’espace de travail

Nous allons créer un espace de travail pour notre tutoriel dans ~/src que nous appellerons hmi-tuto.

Connectez-vous en ssh au Nano Pi à partir d’un PC sous GNU/Linux, on n’oubliera pas l’option -X car nous avons besoin de XWindow 😉

ssh pi@n12.btssn.lan -X

Créer un dossier ~/src s’il n’existe pas :

pi@nanopineocore2:~$ mkdir -p src

Lancer Codelite en tâche de fond (&):

pi@nanopineocore2:~$ codelite &
[1] 9882

Utiliser le menu Workspace > New Workspace... pour créer notre espace de travail.

Sélectionner le dossier /home/pi/src comme chemin et le nom choisi hmi-tuto.

L’espace de travail est créé, nous pouvons le voir dans le panneau latéral de Codelite.

Clonage de la librairie Hmi4DinBox

Il nous faut maintenant le code source de la librairie Hmi4DinBox que nous allons récupérer avec git. Nous mettrons le dossier de la librairie dans /home/pi/src/hmi-tuto :

pi@nanopineocore2:~$ cd src/hmi-tuto/
pi@nanopineocore2:~/src/hmi-tuto$ git clone https://github.com/epsilonrt/Hmi4DinBox.git
Clonage dans 'Hmi4DinBox'...
remote: Enumerating objects: 374, done.
remote: Counting objects: 100% (374/374), done.
remote: Compressing objects: 100% (208/208), done.
remote: Total 374 (delta 178), reused 340 (delta 144), pack-reused 0
Réception d'objets: 100% (374/374), 29.81 MiB | 1.04 MiB/s, fait.
Résolution des deltas: 100% (178/178), fait.

Nous avons maintenant un dossier Hmi4DinBox dans /home/pi/src/hmi-tuto. Le dossier Hmi4DinBox/src contient le code source de la librairie :

pi@nanopineocore2:~/src/hmi-tuto$ ls Hmi4DinBox/src
Hmi4DinBox.cpp  Hmi4DinBox.h  version.h  WireHmi.cpp  WireHmi.h  WireLcd.cpp  WireLcd.h

Création du projet

Nous allons maintenant créé le projet HelloWorld en partant du croquis du même nom fourni dans le dossier Hmi4DinBox/examples/HelloWorld. Ce programme affiche un message sur le LCD de Hmi4DinBox ainsi qu’un comptage.

Faites un clic-droit sur le workspace dans le panneau latéral de Codelite et sélectionner le menu New > New Project....

Dérouler l’item Console, puis choisir le modèle Simple executable (C++ piduino) et cliquer sur Next.

Taper le nom HelloWorld puis cliquer sur Next et Finish :

Le nouveau projet apparaît dans le workspace dans le panneau latéral, vous pouvez voir sa structure, pour l’instant composé d’un “dossier” src contenant le fichier main.cpp . Le fichier main.cpp contient un code source d’exemple (blink) dont nous n’avons pas besoin, supprimer-le en cliquant-droit dessus dans le panneau latéral, puis Remove. Confirmer la suppression du fichier du projet et du disque.

Ouvrir le fichier croquis hmi-tuto/Hmi4DinBox/examples/HelloWorld/HelloWorld.ino à l’aide du menu File > Open > Open File....

Enregistrer ce fichier dans hmi-tuto/HelloWorld/HelloWorld.cpp à l’aide du menu File > Save As.... Attention à bien modifier l’extension en .cpp !! c’est important.

Il ne reste plus qu’à ajouter notre fichier HelloWorld.cpp dans le “dossier” src de notre projet en faisant un clic-droit sur src dans le panneau latéral, puis Add an Existing File.

Vous devriez avoir une fenêtre Codelite qui ressemble à ça :

Avant de passer à la suite, il faut modifier la ligne if (!hmi.begin (24, false)) { dans la fonction setup(). En effet le paramètre 24 correspond au contraste et le false indique que le booster du LCD ne doit pas être activé. Ces paramètres sont corrects quand on alimente l’interface en 5V mais lorsqu’on l’alimente en 3,3V, il faut augmenter le contraste et surtout activer le booster. On modifiera donc cette ligne en conséquence, le programme modifié ressemble à cela :

// Hmi4DinBox Class: LCD Helloworld Example
// by epsilonrt <https://github.com/epsilonrt>

// How to control the LCD ?

// Created 18 may 2018

// This example code is in the public domain.
#ifdef __unix__
#include <Piduino.h>  // All the magic is here ;-)
#else
// Defines the serial port as the console on the Arduino platform
#define Console Serial
#endif

#include <Hmi4DinBox.h>

Hmi4DinBox hmi;

void setup() {

  pinMode ()

  Console.begin (115200);
  if (!hmi.begin (34, true)) {

    Console.println("hmi.begin() failed !");
    exit (1); // HMI failed to start !
  }
}

void loop() {
  static int counter = 0;

  // Write a piece of text on the first line...
  hmi.lcd.setCursor (0, 0); //LINE 1, ADDRESS 0
  hmi.lcd.print ("Hello World");

  // Write the counter on the second line...
  hmi.lcd.setCursor (1, 0);
  hmi.lcd.print (counter / 10, DEC);
  hmi.lcd.write ('.');
  hmi.lcd.print (counter % 10, DEC);
  hmi.lcd.write (' ');
  counter++;
  delay (500);
}

Ajout de la librairie Hmi4DinBox dans le projet

Si nous essayons de compiler notre programme grâce au menu Build > Build Project, nous avons une erreur de compilation :

/home/pi/src/hmi-tuto/HelloWorld/HelloWorld.cpp:16:24: fatal error: Hmi4DinBox.h: No such file or directory

Nous devons paramétrer notre projet pour qu’il trouve le fichier Hmi4DinBox.h.

Faites un clic-droit sur le projet HelloWorld dans le panneau latéral, puis cliquer sur le menu Settings. Dans la fenêtre qui s’ouvre choisir Global Settings, tout en bas, puis cliquer sur les trois petits points à droite de la ligne Additional Include Paths.

Ajouter le dossier ../Hmi4DinBox/src sans supprimer le point de la première ligne, puis valider.

Une nouvelle tentative de compilation nous montre que l’erreur concernant le fichier Hmi4DinBox.h mais plusieurs nouvelle erreurs apparaissent, donc la première est :

/home/pi/src/hmi-tuto/HelloWorld/HelloWorld.cpp:23: undefined reference to `Hmi4DinBox::begin(int, bool)'

Ce n’est pas une erreur de compilation mais une erreur d’édition de liens qui indique que le code exécutable de la fonction Hmi4DinBox::begin(int, bool) n’a pas été trouvé. C’est normal car le code source de cette fonction se trouve dans le fichier Hmi4DinBox.cpp qui n’est pas dans notre projet ! Il faut l’ajouter…

Nous allons commencer par créer un nouveau “dossier virtuel” dans notre projet afin d’y ranger les fichiers source de Hmi4DinBox. Faites un clic-droit sur le projet HelloWorld puis New Virtual Folder. On le nommera très logiquement Hmi4DinBox. Attention à bien décocher la case Create the folder on the file system as well.

Il faut maintenant ajouter les fichiers source dans la dossier virtuel. Faites un clic-droit sur le dossier virtuel Hmi4DinBox, puis Add an Existing File. Allez dans le dossier hmi-tuto/Hmi4DinBox/src, faites un CTRL+A pour sélectionner tous les fichiers, valider par Open.

Vous devriez avoir une fenêtre Codelite qui ressemble à ça :

Compilation du projet

Une nouvelle tentative de compilation grâce au menu Build > Build Project, nous informe :

====0 errors, 0 warnings====

que nous avons compiler notre “croquis” Arduino HelloWorld avec succès ! 😀

Exécution du projet

Nous pouvons lancer l’exécution de notre programme grâce au menu Debugger > Start/Continue Debugger. Si nous le faisons une fenêtre de terminal s’ouvre mais rien ne s’affiche sur le LCD !

Que se passe-t-il ?

En fait, pour accéder au bus I2C sur un système Armbian (accès au module i2cdev), l’utilisateur doit faire partie du groupe i2c. Si ce n’est pas le cas, l’accès est refusé, bizarrement, le système n’affiche pas d’erreur ! (c’est sûrement un bug…).

Nous allons ajouter l’utilisateur pi au groupe i2c après avoir quitter Codelite, puis nous quittons notre session :

pi@nanopineocore2:~$ sudo adduser pi i2c
pi@nanopineocore2:~$ exit

Après s’être reconnecté, nous relançons Codelite :

ssh pi@n12.btssn.lan -X
pi@nanopineocore2:~$ codelite &

On peut alors lancer lancer l’exécution de notre programme grâce au menu Debugger > Start/Continue Debugger, voilà le résultat :

Pour aller plus loin

Pour aller plus loin, vous pouvez évidement répéter cette procédure avec les différents croquis disponibles dans hmi-tuto/Hmi4DinBox/examples en commençant par KeyboardDemo.

ATTENTION, pour tous les programmes utilisant le bouton de navigation et donc la broche HIRQ, il faudra lancer Codelite en sudo conformément à l’explication de l’article Utiliser CodeLite en sudo.