|
|
|
|
Borne de rechargement
Accrochez-vous, ça va se compliquer un p'tit peu. Mais ne vous alarmez pas, il
y aura très peu de modification à apporter au schéma, le récepteur IR en
place est utilisé. Tout le travail est fait sur le soft.
Le principe Une balise émettrice d'un signal IR codé est disposée près d'un mur. Elle émet un faisceau IR vers le mur opposé. IRBOT se met en recherche du signal de la balise. Il tourne alternativement sur lui-même puis avance d'un mètre. Lorsqu'il a capté le signal de la balise, il se trouve dans le faiscau IR et se dirige tout droit. S'il sort du faisceau, il effectue une correction de trajectoire pour retourner dans le faisceau. Il se dirige ainsi jusqu'à toucher la balise. (voir figure). ![]() Prochain post : la balise Comme vous le savez déjà, le récepteur IR d'IRBOT est
sensible à un signal IR d'une fréquence de 38khz.
Un troisième signal, celui de la balise, vient donc se rajouter. Pour dissocier ces signaux entre eux, il va falloir les coder. Pour le signal de la télécommande, c'est vite règlé. Il est déjà codé. Par contre, il va falloir coder le signal du radar IR et celui de la balise. Ne vous alarmez pas, on ne va pas utiliser le dernier cryptage de CSAT (SECA2 pour ne pas le nommer) pour notre affaire. Ce sera un code simple permettant de dissocier les signaux entre eux. Codage du signal de la balise Je vois deux options
L'option 1 parait la plus facile à mettre en oeuvre. Très peu de modification au niveau du soft. Inconvénient la durée d'une trame est assez longue 1.778ms * 13 bits soit 23.1 ms. Si la balise envoie ce signal en permanence ou même cycliquement cela risque de perturber le fonctionnement d'IRBOT en mode normal. L'option 2 est un peu plus compliquée à mettre en oeuvre, mais le résultat devrai être meilleur à condition de choisir un code assez court. Je m'oriente vers l'option 2 : créer un nouveau code spécifique à la balise et envoyer le signal toutes les 20ms. Le code retenu est le suivant : émission d'une trame composée d'un bit de start de 2222µ suivi de 6 bits de données d'une durée de 500µs chacun. Et répétition de l'envoi cette trame toutes les 20ms. (voir figure). J'ai choisi 2222µs car passée cette durée on peut dire que ce n'est pas le signal de la télécommande. Codage du signal du radar IR Comme la balise va émettre un signal IR toutes les 20ms, il va falloir coder le signal du radar IR de détection d'obstacle afin que celui-ci ne soit pas perturbé en mode de fonctionnement normal d'IRBOT. Actuellement, le radar envoie un signal d'une fréquence de 38 khz pendant 1300µs et ceci toutes les 20ms. Au lieu d'envoyer un 1 permanent, on envoie un code de 2 bits , 0 puis 1 (voir figure) pendant 650µs chacun. 0, signifie que l'on envoi rien mais que l'on teste s'il y a un retour. S'il y a un retour, c'est que c'est un signal étranger (probablement la balise) et l'on ne prend pas en compte. Les signaux reçus par le récepteur IR ![]() Prochain post : schéma et soft de la balise La balise est réalisée avec un PIC16F84 (pour rester fidèle
à Microchip J'ai dit précedemment qu'il y avait deux évènements déclencheurs pour faire passer IRBOT en mode recherche de balise. Soit
Touche 9 Facile à faire. On rajoute un "case" dans l'instruction "switch" Ca donne ceci case 9: // passage en mode recherche balise MODE=RECH_BAL; BAL=0; CPT_BAL=2; direction=STOP; duree=30; break; On fait arrêter IRBOT pendant 1" pour marquer le coup. On en profite pour rajouter un deuxième "case" pour ressortir du mode recherche de balise (au cas où l'on aurai changé d'avis. Je choisis la touche 7. case 7: MODE=0; // pour sortir du mode RECH_BAL direction=AV; duree=0; break; Voilà, on appuie sur la touche 9 et IRBOT est en MODE=RECH_BAL Il va adopter un nouveau mode de déplacement pour scruter le signal de la balise. Il va alternativement tourner sur lui-même (un coup à gauche, un coup à droite) puis avancer d'environ 50cm. Ceci est géré par la fonction d'intérruption du TIMER. Toutes les 20ms, on appel la fonction test_bal() qui décrémente un compteur (CPT_BAL). Lorsque ce compteur arrive à 0 (au bout de quelques sec.) on change la direction d'IRBOT. Voilà pour le déplacement. Maintenant, il s'agit de capter le signal de la balise. Ceci est fait dans le programme principal, dans la boucle infinie (while(TRUE) ). On teste d'abord si c'est le signal de la télécommande. Si ce n'est pas le cas, on teste le signal de la balise. Si on capte le signal de la balise, le code 1 0 1 0 1 (voir bout de prog ci-dessous), on :
Le bout de prog if (buffer[0] == CODE_BAL) { // c'est le signal de la balise ? output_low(LED4); sens(AV,0); BAL=1; CPT_BAL=2; } Notre IRBOT, avance donc tout droit, il est tout content de capter la balise. Manque de bol, il ne va pas droit sur la balise, mais il va de biais et sort du faisceau Ceci est détecté par CPT_BAL=0 dans la fonction test_bal(). Comme il ne sait pas de quelle direction vient le faisceau, il vire légérement à gauche par exemple. Après cela il reteste si le signal de la balise est réapparue. Si c'est le cas, il est content et va tout droit et il mémorise qu'il a tourné dans le bonne direction ( ça peut lui servir). Par contre, si le signal n'est pas réapparu, il vire dans l'autre sens assez longtemps. Si le signal ne réapparait toujours pas il se remet en mode de recherche de balise en tournant sur lui-même etc .... Tout ceci est géré par la fonction test_bal(). Voilà notre IRBOT avance donc vers la balise. Petit détail, lorsqu'il est dans le faisceau IR (BAL=1), le radar IR est désactivé. Ce serai trop con qu'il prenne la balise pour un obstacle et fasses demi-tour. IRBOT avance donc toujours, il se rapproche à grands pas de la balise. Maintenant, il va falloir gérer le contact. A cet effet, on va utiliser la détection de collision (switchs). Autre détail : lorsque l'on est dans le faisceau, les switchs détectent bien une collision, mais IRBOT ne fait pas demi-tour, mais au contraire recherche le contact. Dès qu'un switch est actionné d'un côté, IRBOT pousse contre la balise en virant dans le bon sens pour actionner le deuxième switch. Lorsque les deux switchs sont actionnés, c'est gagné. On arrête les moteurs et on teste si la tension de recharge batterie est présente ...... Ca c'est une autre histoire. La gestion des switchs est réalisée dans la routine d'intérruption (INT_RB). Le programme très prochainement (il n'est pas encore tout à fait au point) Prochain post : détection batterie faible Deuxième évènement déclencheur :
tension batterie faible
C'est à dire, que ça bascule entre 0.8 et 2V. Ca dépend en l'occurence de la tension d'alimentation du PIC. Les trois résitances R10, RV1 et R11, placées entre le + et le - de la batterie, forment un diviseur de tension. Le point milieu de ce diviseur est relié à l'entrée RB2 du PIC. Donc, en temps normal avec une batterie bien chargée, la tension sur RB2 (proche de 2V) est supérieure au seuil de basculement. On a donc un 1 logique sur RB2. Si la batterie faiblie, la tension sur RB2 diminue en conséquence , et à partir d'un certain seuil, règlable par RV1 , l'entrée RB2 bascule à un niveau 0 logique. Des essais pratiques ont donné une tension de basculement de 1.2V. Il ne reste plus qu'à surveiller par soft l'état de RB2. Ceci est fait dans la routine d'interruption toutes les 20ms. Si l'état de RB2 tombe à 0 , on assigne MODE=RECH_BAL Ci-dessous, la partie détection tension batterie d'IRBOT. ![]() Prochain post : vidéo, schéma et programme d'IRBOT Comme promis, voici la vidéo de IRBOT se dirigeant vers la borne de
rechargement (2,5M). |
|
|