Pour la détection du sol j’ai installé 5 capteurs infrarouges, 3 à l’avant du robot et 2 derrière.
Mon objectif est de construire une variable en binaire contenant le résultat des tests des 5 capteurs. Ainsi il sera facile de connaitre ou le sol n’est pas détecté pour que le robot ne s’y dirige pas.
Le travail préparatoire réalisé avec l’aide de Joël. Au propre ça donne quelque chose comme ça :
Ci-dessus un schéma de Vor9 et ses capteurs numérotés de 1 à 5 de manière formelle, dans le code de 0 à 4.
Si le capteur n° 1 est déclenché, il met le premier byte à 1, si le capteur n°2 l’est, il passe le second byte à 1 et ainsi de suite. Ce qui permet d’obtenir les tableaux suivant :
Capteur N°
|
Déclenché seul
|
En décimal
|
Direction du robot
|
1
|
0000 0001
|
1
|
Avant
|
2
|
0000 0010
|
2
|
Avant
|
3
|
0000 0100
|
4
|
Avant
|
4
|
0000 1000
|
8
|
Arrière
|
5
|
0001 0000
|
16
|
Arrière
|
|
|
|
|
|
|
|
|
N° capteur Déclenché simultanément
|
En Binaire
|
En décimal
|
Direction du robot
|
1 + 2
|
0000 0011
|
3
|
Avant
|
2 + 3
|
0000 0110
|
6
|
Avant
|
1 + 2 + 3
|
0000 0111
|
7
|
Avant
|
4 + 5
|
0001 1000
|
24
|
Arrière
|
3 + 4
|
0000 1100
|
12
|
Flanc Droit
|
1 + 5
|
0001 0001
|
17
|
Flanc Gauche
|
Si plusieurs capteurs sont déclenchés simultanément, on obtient les valeurs du tableau ci-dessus.
Ce qui donne en langage Arduino une fonction retournant la valeur détecté. La machine d’état n’a plus qu’a testé la valeur de cette fonction pour connaitre les zones ou le robot ne peut pas se déplacer.
Une rapide explication de la fonction :
- J’initialise ma variable en binaire à 0.
- Avec une boucle for, je lis l’état des 5 capteurs.
- Si la lecture du capteur est supérieure au seuil paramétré, je décale de 1.
- Si ma variable en binaire est égale à 0, le sol est détecté par tous les capteurs donc je garde la led d’état éteinte, sinon je l’allume.
- Et enfin, la fonctionne retourne la valeur de la variable.
int groundTest()
{
byte statusCapteur = B00000000 ;
for (int cellCapteur = 0; cellCapteur <= 4; cellCapteur++)
// pour tous les capteurs numérotés de 0 à 4
{
if(analogRead(tableauCapteurs[cellCapteur]) > irThreshold)
// si la lecture du capteur est supérieur au seuil, alors incrémenter 1 au binaire si non 0
statusCapteur |= ( 1 << cellCapteur);
}
if( statusCapteur == 0 )
// Si tous les capteurs détectent le sol, alors on garde la led éteinte, si non on l’allume
digitalWrite(GroundDetLED, LOW);
else
digitalWrite(GroundDetLED, HIGH);
// retourner le statut des capteurs
return statusCapteur;
//Serial.println(statusCapteur); // DEBUG
}
Le prochain chantier est l’odométrie. Pierre a modélisé les plaques de Vor9 et me les a imprimé. Il m’a aussi fait une roue codeuse ayant le bon diamètre pour être emmanché sur l’axe du moteur.
Disposant d’une deuxième plateforme j’ai commencé à travailler sur le calcul de la vitesse des moteurs. Le but est de synchroniser la vitesse des moteurs pour aller en ligne droite, puis dans un second temps se diriger de manière plus précise à droite ou à gauche.
Si dessous le travail à l’oscilloscope, avec les deux capteurs allant un presque à la même vitesse. Ici j’ai synchronisé la vitesse des moteurs à la main à l’aide de potentiomètre.
La prochaine étape est d’utiliser des interruptions pour compter les fentes des roues codeuses et d’utiliser un timer interne au 2560 pour mesurer le temps et ainsi obtenir une vitesse.