Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Programmation > Snippets > Communication série avec Java sur puce ARM

Communication série avec Java sur puce ARM

dimanche 8 juillet 2012, par Julien H.

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

Vos commentaires

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.