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
# Le 13 mai 2014 à 21:19, par tuxun En réponse à : Communication série avec Java sur puce ARM
dommage la video ne s’ouvre pas sur un rpi avec midori sinon merci pour les instructions, j’essaie de repliquer http://wiki.labomedia.org/index.php/Processing_vs_Arduino_vs_Minitel sur un rpi
Répondre à ce message
# Le 27 juillet 2012 à 22:09, par Valentin En réponse à : Communication série avec Java sur puce ARM
Bonjour,
J’essaye de controller une station météo avec une raspberry pi et une carte arduino uno, c’est pour cela que votre article m’interesse beaucoup. Je suis totalement novice sur Linux, et la compilation java sous linux arm, c’est pourquoi j’aimerai beaucoup si vous pouvez detailer un peu plus votre article qui est très bien (commande pour compiler, sources). Tout ceci m’aiderai vraiment, merci d’avance.
Valentin
# Le 28 juillet 2012 à 09:54, par Julien H. En réponse à : Communication série avec Java sur puce ARM
Aucun problème, je vais rajouter le programme Processing et le programme Arduino.
# Le 28 juillet 2012 à 22:56, par ? En réponse à : Communication série avec Java sur puce ARM
Bonjour,
Merci beaucoup pour cette réponse rapide !
Valentin
# Le 29 juillet 2012 à 00:33, par Julien H. En réponse à : Communication série avec Java sur puce ARM
Le code source de l’application Processing (Java simplifié) est disponible dans l’article "Contrôle de Nono avec Firmata", où l’on explique comment piloter l’Arduino depuis une applet Java.
Répondre à ce message