Ça fait pas mal de temps que je n’avais pas posté, c’est vrai. Il y’a eu pas mal de petites choses dont je parlerai sur un billet qui ne tardera pas trop. Mais je reviens vers vous pour la suite de la série sur le petit robot. La dernière fois je vous avais fait une petite présentation et vous avais montré un schéma qui montrait un peu la composition du robot. Cette fois si je vais vous parler de comment j’ai fait pour faire communiquer la carte Arduino et le Raspery. Si vous avez pris le temps de regarder vous avez deviné quel bus de communication j’allais utiliser : le RS-232.

Présentation du bus.

Je ne vais pas trop m’attarder sur le sujet, internet regorge d’articles présentants le bus mieux que ce que je ferais. Mais pour faire simple c’est un protocole de communication série point à point en représentant des états logiques 0 et 1 sur un état électrique négatif et positif. Si vous voulez en savoir plus je vous invite à vous rendre sur le site http://namselectro.free.fr/Cours5.htm qui explique bien comment il fonctionne.

Comment le mettre en œuvre ?

Pour le mettre en œuvre j’ai utilisé les UART, L’UART et un circuit embarqué qui permet de manipuler le bus de communication. Sous Raspian UART est connu sous le doux nom de ttyAMA0. Mais avant de pouvoir vous en servir il faut effectuer quelques petits changements. Par défaut le noyau utilise l’UART pour en faire un terminal, pour désactiver cette option au démarrage il faut donc modifier le fichier /boot/cmdline.txt et enlever console=ttyAMA0, 115200 kgdboc=ttyAMA0,115200 ; et ensuite commenter une ligne dans /etc/inittab qui permet d’activer le terminal sur l’UART: TO:23:respawn:/sbin/getty –L ttyAMA0 115200 vt100.

Voilà après ce petit paramétrage je vais pouvoir vous expliquer comment l’utiliser, (enfin tenter d’expliquer).  Tout d’abord j’ai créé une classe ArduinoCom, cette classe a plusieurs méthodes mais on n’en retiendra que 3 : initialiseCom(), sendData(char data[],int taille) et receiveData(). Commençons par la première qui est obligatoire afin d’avoir accès au bus.

InitialiseCom()

Comme nous sommes sur linux les périphériques correspondent à des fichiers sur lesquels on lit et où on écrit. L’UART n’en est pas exempt et donc il va falloir commencer par l’ouvrir:

Int fileHandle = -1;

fileHandle = open(« /dev/ttyAMA0 », O_RDWR | O_NOCTTY | O_NDELAY);

L’option O_RDWR: on ouvre le fichier en mode lecture/écriture

                 O_NOCTTY : le périphérique ne deviendra pas le terminal contrôlant le processus.

                 O_NDELAY: le fichier est ouvert en mode non bloquant. Ni la fonction open ni aucune autre opération ultérieure sur ce fichier ne laissera le processus appelant en attente.

struct termios options;

tcgetattr(fileHandle, &options);

options.c_cflag = B9600 | CS8 | CLOCAL | CREAD;                           // initialise la vitesse du bus

options.c_iflag = IGNPAR;

options.c_oflag = 0;

options.c_lflag = 0;

tcflush(fileHandle, TCIFLUSH);

tcsetattr(fileHandle, TCSANOW, &options);

Les lignes ci-dessus permettent de configurer l’UART.

Voilà pour la première méthode. Vous avez à présent un bus prêt pour transmettre des données, voyons maintenant comment écrire dessus.

sendData()

Comme je l’ai dit plus tôt, sur linux on écrit sur un « fichier », on peut donc tout bêtement utiliser les fonctions de bases pour écrire et lire ce même fichier.

int count = write(fileHandle, &tx_buffer[0],(p_tx_buffer – &tx-buffer[]));

Le premier paramètre est donc le flux de données (le fichier), le deuxième les données a envoyer et le troisième le nombre d’octets à envoyer.

receiveData()

Pour lire vous avez certainement deviné: on utilise la fonction read() :

Int rx_length = read(fileHandle, (void*)receiveBuf,255);

Le premier paramètre est le flux de données, le deuxième le buffer d’octets dans lequel sera stocké les données, et enfin le nombre d’octets a lire.

Voilà qui conclut la petite présentation sur la communication que j’ai mise en place entre les deux cartes. Si vous avez besoin de quelques précisions, notez-les dans les commentaires et je serais ravi de vous répondre, de même si vous voyez des coquilles. Le prochain article sera consacré à l’algo qui permet l’utilisation des moteurs.

Le code => ArduinoCom

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.