La Raspberry Pi est équipée d’un processeur ARM. Bien que l’essentiel des fonctionnalités demandées à un micro-ordinateur soient supportées, il y a quelques cas particuliers.
C’est le cas de la communication série depuis une application Java. Le langage Java sait parler avec un port série (USB, etc..) grâce à des bibliothèques (RXTXcomm.jar par exemple). Mais derrière, il délègue le travail au système d’exploitation, avec des bibliothèques systèmes (DLL sous Windows, shared objects ou SO sous Linux).
Donc même si vous avez écrit un programme Java très simple, et que vous emmenez avec vous sur votre carte à base d’ARM toutes les bibliothèques (jar Java et SO Linux), il faut que le système que vous utilisez soit compatible. Par exemple la bibliothèque librxtxSerial.so est fournie pour Linux 32 bits ou Linux 64 bits, mais ne fonctionne pas sur ARM.
Le programme
On a écrit un programme pour contrôler une Arduino depuis une application Processing. Le programme (code source dans l’article cité) est écrit en Java et l’éditeur de programmes Processing permet de compiler le programme et de l’exporter sous forme d’une application Java.
Avec un PC et une Arduino connectée en USB, on fait simplement :
atelier@pobot:~$ cd /source/Processing/NonoLeds
atelier@pobot:NonoLeds$ cd NonoLeds
atelier@pobot:NonoLeds$ ./NonoLeds
Cela revient à appeler le programme Java :
java -Djava.library.path="./lib" -cp "./lib/NonoLeds.jar:./lib/core.jar" NonoLeds
Si on essaie sur la Raspberry Pi (ou toute autre carte Linux à base de processeur ARM), on obtient une erreur sur la librairie RXTX.
La solution
On va installer sur notre RPi encore de nouveaux paquets issus des stocks de programmes pour ARM (repositories GNU/Linux), en l’occurence librxtx-java :
pi@raspberrypi:~$ sudo apt-get install librxtx-java
...
Get:1 http://ftp.uk.debian.org/debian/ squeeze/main librxtx-java armel 2.2pre2-2 [179 kB]
...
On peut lire au milieu du long message d’installation qu’il a téléchargé une version "debian squeeze armel", donc compatible avec notre carte et le système d’exploitation Debian qu’on a installé.
Cette installation a posé dans l’arborescence des bibliothèques différentes versions de .so compatibles Linux. On peut afficher la liste du répertoire JNI (pour Java Native Interface, la médiation entre la machine virtuelle Java et la machine réelle Raspberry Pi) :
pi@raspberrypi:~$ ls /usr/lib/jni
libjava-access-bridge-jni.so librxtxI2C.la librxtxParallel.so librxtxRaw-2.2pre1.so librxtxSerial.la
libjava-access-bridge-jni.so.0 librxtxI2C.so librxtxRS485-2.2pre1.so librxtxRaw.la librxtxSerial.so
libjava-access-bridge-jni.so.0.0.0 librxtxParallel-2.2pre1.so librxtxRS485.la librxtxRaw.so
librxtxI2C-2.2pre1.so librxtxParallel.la librxtxRS485.so librxtxSerial-2.2pre1.so
Si on se place maintenant dans le répertoire des bibliothèques de notre application Java Processing, on identifie le .so à modifier :
pi@raspberrypi:~$ cd NonoLeds/lib/
pi@raspberrypi:~/NonoLeds/lib$ ls
NonoLeds.jar RXTXcomm.jar arduino.jar core.jar librxtxSerial.so serial.jar
pi@raspberrypi:~/NonoLeds/lib$ mv librxtxSerial.so librxtxSerial.x86
pi@raspberrypi:~/NonoLeds/lib$ cp /usr/lib/jni/librxtxSerial.so .
pi@raspberrypi:~/NonoLeds/lib$ ls
NonoLeds.jar RXTXcomm.jar arduino.jar core.jar librxtxSerial.so librxtxSerial.x86 serial.jar
pi@raspberrypi:~/NonoLeds/lib$
On remonte et c’est parti !
pi@raspberrypi:~/NonoLeds/lib$ cd ..
pi@raspberrypi:~/NonoLeds$ ./NonoLeds
Stable Library
=========================================
Native lib Version = RXTX-2.2pre2
Java lib Version = RXTX-2.1-7
WARNING: RXTX Version mismatch
Jar version = RXTX-2.1-7
native lib Version = RXTX-2.2pre2
[0] "/dev/ttyACM0"
OH JE KIFFE !!! Moins de deux heures pour :
– télécharger Firmata dans l’Arduino de Nono
– écrire le programme Processing et l’exporter vers la RPi
– empêcher le démarrage du serveur X et utiliser un framebuffer virtuel
– remplacer la bibliothèque JNI du port série pour ARM
– documenter le tout pour servir aux prochains utilisateurs de la Raspberry Pi
Une petite vidéo pour fêter ça :
Le robot Nono fonctionne avec Arduino / Firmata... par JulienPobot