GameBot : Jeu, robot et chaos…

Hzoxa4d89iru0eikwudr

Difficulté:

Comment parvenir à atteindre la case d’arrivée sans encombre ?…


Avec ce tutoriel, vous apprendrez à utiliser le capteur couleurs TCS34725 sur Raspberry Pi. C’est-à-dire à le configurer et à le programmer en langage C.
L’idée du jeu nécessitait un capteur de ce type : c’est Théo et Julien, élèves à Créajeux, qui ont conçu le gameplay. En début de jeu, des obstacles sont placés sur le plateau : les carrés orange sur la photo. Ensuite, chaque joueur prend le robot à tour de rôle : il le positionne comme il le souhaite sur la ligne de départ et place les pastilles de couleurs rouge et bleu pour orienter le déplacement du robot. Chaque fois que le robot croise une pastille verte, il tourne à droite, et il tourne à gauche s’il passe au-dessus d’une pastille bleue. Il s’agit de faire en sorte que le robot ne dévie pas trop de la trajectoire prévue par le joueur pour parvenir à atteindre la case d’arrivée rouge et s’y arrêter. Sans toutefois traverser l’une des cases oranges !
Ce jeu met en oeuvre l’un des principes de la théorie du chaos (d’où le titre !) : une faible déviation initiale de la trajectoire “idéale” prévue et on passe totalement à côté de la cible rouge…
Le jeu a également un intérêt pédagogique puisqu’il montre aux plus petits que chaque condition (pastille colorée) entraîne une action distincte, principe de base de l’algorithmique. En ce sens, l’idée est proche du robot Cubetto (http://www.numerama.com/tech/153909-cubetto-apprendre-code-aux-enfants-petit-robot-mignon.html) mais pour un prix plus abordable ! Pour aller plus loin dans cette logique de sensibiliser les plus petits à l’algorithmique, on pourrait rajouter des pastilles de couleurs qui feraient par exemple répéter entièrement la séquence de déplacements qui vient d’être exécutée (boucle), etc.

Matériel

Telnpeaxu1ox1oo0glme

Budget:

90 €

J’ai utilisé:
– un vieux Raspberry Pi B rev 2 : 35 €
– les roues, moteurs, rack de piles et contrôleur moteur d’un kit CamJam Edukit 3 acheté sur Pi Hut (https://thepihut.com/products/camjam-edukit-3-robotics) : 20 €
– un capteur couleur TCS34725 de Adafruit acheté sur GoTronic (http://www.gotronic.fr/art-capteur-de-couleur-ada1334-20690.htm) : 8,8 €
– un powerbank EasyAcc 6400 mAh trouvé sur Amazon (https://www.amazon.fr/EasyAcc-Batterie-Technologie-Smartphones-Tablettes/dp/B00XTU59HM) : 13 €
– un coffret en bois trouvé dans un rayon décoration de magasin de bricolage pour 5 €.

Environnement logiciel et documentation :
– Raspbian 4.1.7 sept 2015
– bibliothèque wiringPi : https://projects.drogon.net/raspberry-pi/wiringpi/
– module i2c de Linux. Voir notamment la mise en oeuvre : https://projects.drogon.net/raspberry-pi/wiringpi/i2c-library/ et : https://learn.adafruit.com/adafruits-raspberry-pi-lesson-4-gpio-setup/configuring-i2c
– capteur couleur TCS34725 : https://cdn-shop.adafruit.com/datasheets/TCS34725.pdf

Etape 1 : Branchements moteurs et capteur couleurs

Luevd6ymcv2ihiapokkj


a) Moteurs :
Le rack de piles se branche sur les deux borniers au centre du contrôleur moteur, puis chaque moteur sur l’un des borniers de côtés.
Ces borniers sont reliés aux broches 7,8,9 et 10 du Raspberry, numéros qu’il faudra utiliser dans le programme plus tard !

b) Capteur couleurs :
4 broches du Raspberry suffisent : l’alimentation à 3,3V, SDA et SCL pour le dialoguer avec le capteur via le protocole i2c, et GND, la masse.

NB : on pourra aussi utiliser la broche 4 et 7 en GPIO pour plus tard pouvoir, d’une part allumer et éteindre la LED blanche du capteur selon les besoins, et, d’autre part, pouvoir recevoir un signal d’interruption lorsque le capteur a terminé sa “lecture”.
Je les ai câblées mais pas utilisées dans la version actuelle du code.

Dans la future version, il est prévu de rajouter :

– des roues codeuses ou de positionner sur le plateau des lignes horizontales et verticales de couleurs différentes + un suivi de ligne pour parfaire la trajectoire rectiligne ;
– des LEDs s’allumant de la même couleur que la pastille traversée : retour visuel attestant que la couleur a bien été reconnue ;
– un capot diffusant la lumière des LEDs et donnant au robot l’aspect d’une chenille qui cherche son fruit (la pomme rouge de la case d’arrivée !)

Etape 2 : Programmation

Lg6ifrgrlr0mzqoklbmw


Les explications ci-dessous s’appuient sur le fichier de code en langage C que vous pouvez télécharger dans ce tuto.

a) Les moteurs :

Les moteurs sont programmés en mode PWM de manière à pouvoir ajuster leur vitesse pour obtenir une trajectoire rectiligne. Les lignes

softPwmCreate(MoteurA_Avance_Pin, 0, 100);
softPwmCreate(MoteurA_Recule_Pin, 0, 100);
softPwmCreate(MoteurB_Avance_Pin, 0, 100);
softPwmCreate(MoteurB_Recule_Pin, 0, 100);

permettent de définir une échelle de vitesse de 0 à 100 : 0 correspond à une tension nulle fournie aux moteurs, 100 correspond à la tension maxi (ici environ 6V).

L’instruction :
Avancer(0, 40, 50);
fait avancer ainsi le robot à environ la moitié de sa vitesse maximale.
Pour plus d’infos sur le PWM, le Raspberry et la variation de tension, voyez : https://mespotesgeek.fr/fr/variation-de-puissance-electrique-via-raspberry/

b) Le capteur Couleurs :

Malgré toutes mes recherches, je n’ai pas réussi à trouver un code en C pour le Raspberry sur Internet… 🙁 Du coup, j’ai dû développer le code moi-même pour pouvoir exploiter ce capteur…

Le maniement de ce capteur ne nécessite pas de comprendre les subtilités du protocole I2C ! Ouf !
Malgré tout, il m’a donné du fil à retordre… J’espère que je vais faire gagner un temps précieux à tous ceux qui voudraient l’utiliser avec un Raspberry (un driver spécifique est fourni pour l’Arduino, ce qui rend son utilisation plus simple sur cette plate forme) !

Tout d’abord, il faut spécifier les adresses des registres qui nous intéressent : ceux qui permettent de l’activer, ceux qui servent à paramétrer sa sensibilité à la lumière (gain et intégration). Ensuite, spécifier les valeurs à y écrire. J’ai codifier tout cela en suivant la nomenclature de la datasheet de TAOS pour m’y retrouver :
//// Définition des adresses des registres utiles du capteur couleur
#define TCS34725_ENABLE 0xA0 // Adresse du registre d’activation
#define TCS34725_ATIME 0xA1 // adresse du registre gouvernant le tps d’intégration
#define TCS34725_CONTROL 0xAF // adresse du registre de GAIN
#define TCS34725_ID 0xB2 // adresse du registre IDENTIFIANT
//// Définition des valeurs à écrire dans les registres
#define TCS34725_ENABLE_PON 0x01 //Power ON, valeur d’activation de l’alim du capteur dans le registre ENABLE
#define TCS34725_ENABLE_AEN 0x02 // valeur d’activation de la lecture RGBC dans le registre ENABLE
#define TCS34725_INTEGRATIONTIME 0xF6 // 0xFF = 2.4ms / 0xF6 = 24 ms / 0xD5 = 103 ms / 0xC0 = 154 ms

Etape suivante : activation du capteur, vérification qu’il a bien été reconnu (la lecture de son identifiant doit donner 68), et réglages de sensibilité. Tout ceci se fait dans la fonction initTCS34725().

Chaque canal de couleur peut ensuite être lu, dans la fonction DetecterCouleur() pour récupérer chaque mesure :

c = wiringPiI2CReadReg16(fd, ADDR_C_Channel);
r = wiringPiI2CReadReg16(fd, ADDR_R_Channel);
g = wiringPiI2CReadReg16(fd, ADDR_G_Channel);
b = wiringPiI2CReadReg16(fd, ADDR_B_Channel);

ensuite, je teste le canal dominant :

domin_r = ir > ig && ir > ib;
domin_g = ig > ir && ig > ib;
domin_b = ib > ig && ib > ir;

Et enfin, j’applique un algorithme de détermination de la couleur mesurée parmi toutes les couleurs disponibles (le jaune et le violet sont présents en prévision des bandes horizontales et verticales intégrées dans la version future décrite ci-dessus). Cet algorithme est issu de nombreux essais sur mes échantillons de couleurs.

NB : Il faut faire attention à utiliser ce capteur dans une position toujours identique par rapport aux pastilles : même distance, même inclinaison. Sinon vous pourriez avoir de mauvaises surprises !… Pour peu que votre surface soit trop réfléchissante ou gondolée (voire les deux !) et la mesure de couleur se retrouve complètement à l’ouest (:-(

Et voilà ! Tout cela tient en moins de 160 lignes de code dont beaucoup de définition et de tests de bon fonctionnement dont on aurait pu se passer, mais que j’ai conservé ici à titre pédagogique.

Bonne chance pour vos réalisations !
Et n’hésitez pas à me poser des questions !…

Vous aimez ce tutoriel ?


James71

20 oct. 2017 à 16:36

Bonjour, je ne trouve pas de lien pour télécharger le fichier source en C.


Recevez une fois par mois les meilleurs tutoriels Technologie dans votre boîte mail




S'inscrire:


  • Vues: 504
  • J'aime: 29