Hier et ce matin je me suis occupe de l’ecriture d’un peitt bout de code en C++ pour interagir avec l’Arduino via la connection USB. Si je n’avais eu besoin que de recuperer quelques valeurs pour faire des graphiques ici je me serai probablement contenter de quelque chose comme Processing, mais comme de toute facon j’aurai besoin d’ecrire mes propres fonctions de communications quand je ferai un mebius « deporte » (mebius tournant sur mon pc mais recevant ses entrees et envoyant ses sorties via un arudino connecte au pc) autant resoudre le probleme tout de suite. Ca n’etait pas bien complique mais comme il y a quelques astuces autant les rapporter ici pour que ca serve eventuellement a d’autres.
D’abord j’ai utilise la librairie libserial. J’ai telecharge les fichiers, decompresse dans un sous repertoire de mon projet et compile … et bien sur ca n’a pas compile. Apres avoir cherche un peu il semble que le probleme vienne d’une modification des parametres de compilation de g++ dans ma version de Ubuntu. J’ai resolu le probleme en rajoutant
#include <stdlib.h>
#include <string.h>
la ou c’etait necessaire cf les messages d’erreur de compilation. Pour utiliser cette librairie dans mon programme, j’ai rajoute dans le makefile le path vers les headers
-I./libserial-0.5.2/src/
et le link vers la librairie
-lserial
Le programme en C++ pour communiquer avec l’Arduino ressemble a ca :
D’abord j’inclus la libriaire avec
#include « SerialStream.h »
Ensuite je definis l’adresse du port USB. La il y a un truc a savoir. A priori on ne peux pas savoir sur quel TTY l’arduino sera connecte, ca change a chaque fois qu’on le connecte. Mais il y a un nom logique dans /dev/serial/by-path/ qui lui a priori est toujours le meme pour une meme prise usb sur votre pc (ca reste a confirmer mais chez moi ca marche).
char *serialport= »/dev/serial/by-path/pci-0000:00:1a.0-usb-0:1.3:1.0″;
Je definis un stream.
SerialStream my_serial_stream;
Ensuite il y a aussi un autre probleme au moment d’ouvrir le stream. Vous constaterez peut etre que seul root peut ouvrir un stream sur le TTY. En fait vous pouvez autoriser d’autres utilisateurs en les rajoutant au groupe du TTY. Faites un ls -l sur le TTY pour savoir dans quel groupe il est (a priori dialout) et ensuite ajouter votre user avec la commande sudo useradd -G <nom du groupe> <user> .
my_serial_stream.Open( serialport ) ;
Ensuite je verifie que le stream est bien ouvert
if (my_serial_stream.IsOpen()) {
cout << « Opened » << serialport << « \n »;
} else {
cout << « Failed to open » << serialport << « \n »;
exit(1);
}
Ici nouvelle astuce, quand vous ouvrez un stream sur l’Arduino ca declenche un reset (attention ca varie en fonction de la version de votre Arduino). Il faut donc attendre que le reset soit fini avant que votre programme puisse dialoguer avec l’Arduino. Ici je pause simplement pendant 3 secondes.
sleep(3);
Ensuite je configure le stream comme ca :
my_serial_stream.SetBaudRate( SerialStreamBuf::BAUD_9600 ) ;
my_serial_stream.SetCharSize( SerialStreamBuf::CHAR_SIZE_8 ) ;
my_serial_stream.SetNumOfStopBits(1) ;
my_serial_stream.SetParity( SerialStreamBuf::PARITY_NONE ) ;
my_serial_stream.SetFlowControl( SerialStreamBuf::FLOW_CONTROL_HARD ) ;
Et je suis maintenant pret a dialoguer. Pour envoyer un octet :
char buffer=1;
my_serial_stream.put( buffer );
Pour lire un octet (en mode bloquant, ie le programme attend qu’il y ait un octet a lire) :
my_serial_stream.get( buffer ) ;
Finalement je ferme le stream :
my_serial_stream.Close() ;
Cote arduino, l’ecriture d’un octet se fait par :
Serial.write(val);
La lecture (en mode non bloquant) se fait par :
Serial.readBytes(&val,1);
Vous pouvez utiliser Serial.available() pour verifier qu’il y a quelque chose a lire, et le mettre dans une boucle infini pour simuler une lecture en mode bloquant, ou faire de la synchronisation entre l’Arduino et votre programme.
Avec ca je vais maintenant pouvoir afficher des resultats obtenus par le Mebius sur l’Arduino, ici et dans mon rapport…