Communication serial en Java (RXTX)

Dans le cadre du serveur Java qui remplacera bientôt l’interface graphique python contrôlée par ssh, nous avons dû résoudre le problème de la communication entre l’Arduino et le Raspberry. Puisque ils sont connectés par usb, nous nous sommes intéressés à la librairie RXTX pour java.

Vous pourrez trouver toutes sortes d’informations sur l’installation et l’utilisation de cette librairie ici.

Il est possible que vous ayez déjà cette librairie si vous utilisez l’IDE Arduino.

Nous aimerions partager avec vous la classe « SerialCommunication » basée sur les classes de la librairie RXTX (gnu.io.*). Nous n’avons probablement rien inventé de nouveau et nous nous sommes largement inspirés des exemples proposés par le wiki. Nous trouvons juste que cette classe englobe tous nos besoins et est pratique à utiliser.

Créez un objet SerialCommunication:

SerialCommunication serialCom = new SerialCommunication();

Etablissez une connection sur le port(p.ex.) »/dev/ttyS33″ à la vitesse de 9600 bauds:

SerialCom.connect("/dev/ttyS33", 9600);

Remarque: java RXTX ne cherche que des ports dans « /dev/ttySxx » or l’Arduino se trouvera probablement sur « /dev/ttyACM0 ». Pour résoudre ce problème, créez un symlink entre « /dev/ttyACM0 » et un port inexistant dans les « /dev/ttySxx » (p.ex. /dev/ttyS33):

#sudo ln -s /dev/ttyACM0 /dev/ttyS33

Ce lien disparait chaque fois que vous éteignez l’ordinateur, donc pensez à le recréer ou écrivez un bash script =).

Conception d’un PCB

pour notre projet, nous aimerions que toute notre électronique soit fixée sur un « PCB » ou « circuit imprimé ». Il y a plusieurs façon de procéder. Dans ce post, nous allons documenter le processus que nous avons suivi pour obtenir un PCB.

Prototypage

Avant de commencer à dessiner la plaque, il est généralement plus judicieux de savoir si les composants choisis fonctionnent correctement comme on les a disposés. Il s’agit ici de créer le circuit sur une plaque de prototypage (breadboard) et le tester.

Design du PCB

Une fois que le prototype est au point, il faut dessiner le circuit à l’ordinateur pour qu’une machine puisse finalement l’imprimer.

Nous proposons deux logiciels qui pourront satisfaire tous les besoins:

  • Eagle CAD, par cadsoft, est un programme professionnel et complet. Il demande un certain apprentissage pour le maitriser, mais vous permettra de réaliser des circuits très satisfaisants. Les seules limitations de la version gratuite sont la taille du PCB et le nombre de couches limitées à 2. Mais, cela ne vous empêchera pas  de créer des shields Arduino p.ex.
    Download: http://www.cadsoftusa.com/download-eagle/
  • Fritzing est un projet qui vise à améliorer la créativité et le partage de l’information dans le domaine Arduino et Processing. Grâce à leur programme intuitif, il est possible de créer des plaques électroniques professionelles. Ils proposent même un service pour les imprimer à des prix assez intéressants. Même si nous avons plutôt opté pour le premier programme, nous vous conseillons vivement d’envisager ce logiciel pour des plaques simples.
    Download: http://fritzing.org/download/

Puisque nous avons utilisé Eagle, les explications qui suivront se concentreront sur ce programme. Par contre, le but n’est pas de donner un tuto exhaustif sur les bases de ce logiciel, car d’autres l’ont très bien fait avant nous. Il est conseillé de lire ces pages avant de continuer avec l’utilisation de Eagle.

Exemple de notre plaque:

Board

Board

Schéma

Schéma

Liste des Achats

Bonjours à tous,

Voici une liste de ce dont vous aurez besoin pour faire ce projet, nous n’avons pas inclus les tournevis, clous, et autres.

  1. Un véhicule roulant miniaturisé. Par exemple une ancienne voiture radiocommandée est parfait, il vous suffit de garder le chassis, le moteur et le servo-moteur.
  2. Un Arduino (un Arduino Uno va très bien, mais si vous avez un diduino ou une variante de l’Arduino, il n’y a pas de problème) Site Arduino
  3. Un Raspberry Pi (avec les accessoires, listés ici:Accessoires Raspberry Pi)
  4. Une batterie externe (nous utilisons ici une Tecknet de 7000mAh, ce qui est largement suffisant)
  5. Un ordinateur portable fonctionnant sous Linux, MacOS ou Windows. (Nous parlerons soit de Windows, soit de Linux)(pour certaines tâches, il est préférable d’avoir Linux, mais vous pouvez créer une machine virtuelle si besoin est).
  6. Une webcam
  7. Un capteur de distance (par exemple un « HC-SR04 »)

Avec tous ce matos, vous pouvez construire un UGV. Le capteur de distance n’est peut être pas indispensable, mais il permet d’éviter certains crashs. Vous pouvez maintenant commencer à construire votre drone en commençant par ici.

Tutoriel: communication Raspberry -> Arduino

Suivez ces indications pour vous lancer rapidement dans la communication Raspberry pi – Arduino. Le langage qu’on va utiliser est Python. Il propose une solution simple à notre problème. Si vous ne connaissez pas bien ce langage, vous l’apprendrez facilement et il vous sera sûrement utile par la suite.

Prérequis:

  • Le module Python « pySerial » doit être installé.
    Vous le trouverez ici et de l’information sur comment l’installer ici.
    Si vous êtes sur raspbian comme il était proposé dans cet article. je vous propose la commande suivante:

    -> sudo apt-get install python-serial

Connectez simplement le Raspberry et l’Arduino au moyen du câble usb que vous utilisez d’habitude avec votre Arduino.
Ouvrez un interprétateur Python ou initiez le à votre ligne de commande. Dans mon cas, j’utilise la ligne de commande. J’initie donc l’interprétateur:

-> python

Vous verrez ensuite une ligne comme ceci:

>>>

Vous allez maintenant importer le module pySerial en tapant:

>>> import serial

Initiez ensuite l’objet « serial » que nous allons appeler « ser ». Assurez vous que votre Arduino est bien connecté à l’ordinateur! :

>>> ser = serial.Serial("/dev/ttyACM0", 9600)
  • « /dev/ttyACM0 » désigne le port sur lequel est branché l’Arduino. Pour trouver ce port, vous pouvez regarder dans l’IDE Arduino ou taper la commande suivante dans le terminal après avoir branché votre Arduino:
    # dmesg

    Elle vous donnera des détails sur les appareils branchés à l’ordinateur, entre autre, le port sur lequel se trouve votre Arduino.

  • « 9600 » précise la vitesse d’échange d’information, i.e 9600 bauds ou bits par seconde. Assurez vous que la communication serial est initiée à la même vitesse du côté Arduino (Serial.begin(9600);).

Vous devriez maintenant pouvoir envoyer un caractère ou encore une chaîne de caractères avec la fonction « write() »:

>>> ser.write("Votre chaine de caractères...")

Si vous vous sentez perdu, voici à quoi ressemble ma ligne de commande:

  • D’abord, un extrait du retour de « dmesg »:
    ...
    [  889.552060] usb 5-2: Product: Arduino Uno
    [  889.552064] usb 5-2: Manufacturer: Arduino (www.arduino.cc)
    [  889.552067] usb 5-2: SerialNumber: 64932343938351312131
    [  889.597681] cdc_acm 5-2:1.0: ttyACM0: USB ACM device
    [  889.600150] usbcore: registered new interface driver cdc_acm
    [  889.600153] cdc_acm: USB Abstract Control Model driver for USB modems and ISD
  • Puis l’interprétateur python à la ligne de commande:
    ebrunner@home2:~> su
    Password: 
    home2:/home/ebrunner # python
    Python 2.7.3 (default, Apr 14 2012, 08:58:41) [GCC] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import serial
    >>> ser = serial.Serial("/dev/ttyACM0", 9600)
    >>> ser.write("1")

    Dans ce cas, j’ai du me mettre en admin pour avoir le droit d’accès au port. Une visite dans le manager de groupes devrait résoudre ce problème.

Pour vérifier nos résultats on veut voir un retour du côté de l’Arduino! Un simple sketch « echo » devrait faire l’affaire. Pas de montage! juste le code que vous trouverez ici.