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 !…