RS-232

De Wiki_du_Réseau_des_Electroniciens_du_CNRS
Aller à la navigationAller à la recherche

Revenir au sommaire du RasberryPi

Choix et identification du port série

RaspberryPI (ttyAMA0)

Pour pouvoir utiliser le port série disponible sur les broches 13 (GND) 14 (TxD) et 15 (RxD), nous allons suivre les étapes suivantes (basées sur une installation propre wheezy-raspbian)

0. Ouvrons un terminal sur le Raspberry, ou connectons nous au Raspberry Pi par SSH.

1. une copie de sauvegarde de notre fichier /boot/cmdline.txt pour pouvoir revenir si besoin à la configuration d'origine.

 sudo cp /boot/cmdline.txt /boot/cmdline_backup.txt

2. Editons ce fichier /boot/cmdline.txt file :

 sudo nano /boot/cmdline.txt

Ce fichier contient:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Nous devons supprimer les paramètres référençant le port UART série (ttyAMA0), ce qui nous donne:

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Rappel pour quitter nano et sauvegarder : CTRL+X et on répond aux questions.

3. Nous Commentons la ligne suivante dans /etc/inittab:

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

4. Reboot du Raspberry Pi

 sudo reboot

interface RS232 par USB

votre interface se connectera toute seule, il vous suffira de faire alors un

 dmesg | grep tty

vous avez de visible ttyUSBxx représente le numéro de votre interface (ttyUSB0)

Configuration

Pour connaitre la configuration actuelle :

 stty -F /dev/ttyUSB0

qui nous reponds :

speed 9600 baud; line = 0;
-brkint -imaxbel

Communication

Communiquer vers le périphérique par le shell est aisée :

echo "hello world" > /dev/ttyAMA0
# ou
echo "hello world" > /dev/ttyUSB0

Ecriture RS232 via le shell

créons un fichier nommé rs232.sh et éditons le !

 cd ~/www             # plaçons nous dans notre home/pi/www
 geany rs232.sh       # editons le fichier rs232.sh

plaçons y le code

 #!/bin/bash
 #---------------------------------------------------------------------
 stty -F /dev/ttyAMA0 115200 cs8 -cstopb -parenb -cooked min 1 time 1
 #---------------------------------------------------------------------
 # -e     interpréter les caractères déspécifiés par une contre-oblique
 # \r = retour chariot
 # \n = nouvelle ligne
 #---------------------------------------------------------------------
 echo -e "hello \r\n" > /dev/ttyUSB0
 # ou echo -e "hello \r\n" > /dev/ttyAMA0
 #---------------------------------------------------------------------

________ POUR ttyAMA0 (RS232 sur la carrte raspberryPI uniquement) ________

Le problème principal de ce code est qu'il faut être root pour le lancer, l'utilisateur pi n'est pas autorisé à jouer avec :

La méthode consiste à chercher qui gère les droits !

 sudo grep tty /lib/udev/* -iRH

nous donne le résultat suivant

/lib/udev/rules.d/91-permissions.rules:SUBSYSTEM=="tty",                                GROUP="dialout"
/lib/udev/rules.d/91-permissions.rules:# vc devices (all members of the tty subsystem)
/lib/udev/rules.d/91-permissions.rules:KERNEL=="tty",                   MODE="0666",    GROUP="root"
/lib/udev/rules.d/91-permissions.rules:KERNEL=="tty[0-9]*",                             GROUP="root"
/lib/udev/rules.d/91-permissions.rules:KERNEL=="pty*",                  MODE="0666",    GROUP="tty"
/lib/udev/rules.d/91-permissions.rules:KERNEL=="iseries/vtty*",                 GROUP="root"

notre idée est donc d'autoriser notre utilisateur pi ( puis www-data ) pour utiliser les interfaces

 sudo addgroup pi dialout
 sudo addgroup www-data dialout

donner des droits root peut s'averer dangereux et n'est jamais recommander, nous allons donc descendre les tty dans un groupe moins élevé

 sudo nano /lib/udev/rules.d/91-permissions.rules # et nous modifions les lignes
/lib/udev/rules.d/91-permissions.rules:SUBSYSTEM=="tty",                                GROUP="dialout"
/lib/udev/rules.d/91-permissions.rules:# vc devices (all members of the tty subsystem)
/lib/udev/rules.d/91-permissions.rules:KERNEL=="tty",                   MODE="0666",    GROUP="dialout"
/lib/udev/rules.d/91-permissions.rules:KERNEL=="tty[0-9]*",                             GROUP="dialout"
/lib/udev/rules.d/91-permissions.rules:KERNEL=="pty*",                  MODE="0666",    GROUP="tty"
/lib/udev/rules.d/91-permissions.rules:KERNEL=="iseries/vtty*",                 GROUP="dialout"

Maintenant le script peut être lancé sans le sudo