Communication série avec Java sur puce ARM

publicité
Communication série avec Java sur puce ARM
Extrait du PoBot
http://www.pobot.org
Communication série avec
Java sur puce ARM
- L'association - Nos réalisations - Logiciels -
Date de mise en ligne : dimanche 8 juillet 2012
PoBot
Copyright © PoBot
Page 1/5
Communication série avec Java sur puce ARM
Sommaire
• Le programme
• La solution
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.
Copyright © PoBot
Page 2/5
Communication série avec Java sur puce ARM
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
librxtxRaw-2.2pre1.so
librxtxParallel.so
librxtxSerial.la
libjava-access-bridge-jni.so.0
librxtxRaw.la
librxtxI2C.so
librxtxRS485-2.2pre1.so
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 !
Copyright © PoBot
Page 3/5
Communication série avec Java sur puce ARM
pi@raspberrypi:~/NonoLeds/lib$ cd ..
pi@raspberrypi:~/NonoLeds$ ./NonoLeds
Stable Library
=========================================
Native lib Version = RXTX-2.2pre2
Java lib Version
WARNING:
= RXTX-2.1-7
RXTX Version mismatch
Jar version = RXTX-2.1-7
native lib Version = RXTX-2.2pre2
[0] "/dev/ttyACM0"
Copyright © PoBot
Page 4/5
Communication série avec Java sur puce ARM
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...
[http://www.dailymotion.com/video/xs1nd3_le-robot-nono-fonctionne-avec-arduino-firmata-processing_tech] par
JulienPobot [http://www.dailymotion.com/JulienPobot]
Copyright © PoBot
Page 5/5
Téléchargement