Précédente Accueil Suivante

 

Accueil
Le projet IRBOT
Chassis roues
Servomoteur
Modif servos
Test servos
Le radar IR
Premiers pas robot
Détection collision
Télécommander
Test RC5
IRBOT et RC5
Mémo parcours
Mise en veille
Vers PIC16F628
Borne recharge
Compilateur CCS
Modif matérielle
Recharge du robot
Bip Bip ...
En musique
Vidéos
Téléchargements
Carte développ.
Liens Affiliation

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.
On va augmenter les capacités du robot IRBOT en le faisant se diriger vers une borne de rechargement équipé d'une balise éméttrice infrarouge.
L'évènement déclencheur sera soit :


touche 9 de la télécommande
la tension batterie est tombée sous un seuil critique


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.
Il s'agit donc de construire une balise qui émette ce type de signal.
IRBOT reçoit déjà deux signaux sur son récepteur IR :

signal du radar IR de détection d'obstacle
signal de la télécommande


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

option 1 : on utilise le même codage que le signal de la télécommande et on lui affecte un chiffre
option 2 : on fabrique un nouveau codage spécifique pour la balise



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 )

Le schéma est simple. Le signal IR sort sur RA0. Il est amplifié par un transistor qui alimente une LED émettrice IR ( la LD274, la même que pour IRBOT).

L'angle d'émission du faisceau IR est de +- 10°. On coiffera la LD274 d'une gaine noire de 3cm de long afin de réduire encore l'angle du faisceau.

La puissance d'émission est règlable par la résitance variable RV1. La puissance doit être ajustée assez précisement de manière à ce que le faisceau atteigne juste le mur opposé. Trop puissant les IR rebondissent et frappent IRBOT qui se dirige dans la mauvaise direction.

Une led LED1 clignote pour signaler le fonctionnement de la balise. On peut alimenter la balise avec un bloc secteur 9V branché sur une prise de courant.
Pour ma part, j'ai réalisé en un temps record le montage de la balise sur l'excellente Carte d'expérimentation pour PIC (http://pro.wanadoo.fr/yves.heilig/Boutique/29.htm) vendu par Robots Loisirs (voir photo ci-dessous). Je vous rappelle que la carte peut maintenant recevoir tous les PIC 18 pins, en l'occurence le PIC16F628 qui est très intéressant. (fin de la pub )

Le schéma de la balise



Le montage expérimental sur la carte d'expérimentation




Le soft

Il est des plus simple, écris en CCS. Pas de commentaire particulier.


//***************************************************
// CCS Compiler
// irbal10 - Balise IR pour IRBOT
//
// signal balise : 1 pendant 2222µs - 0 pendant 500µs - 1 - 0 - 1 - 0 - 1
//
// Auteur : HEILIG Yves
//***************************************************

#include <16f84.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)

//******************
// DEFINE
//******************


#define LED1 PIN_B0 // led1
#define LED_IR PIN_A0 // LED IR


//****************************************
// Fonctions
//****************************************

void periode_38k (n) { // n périodes de 38.7khz soit n * 25.84µs (1/38.7)


while (n--) {
output_high(LED_IR);
delay_us(12);
output_low(LED_IR);
delay_us(12);
}

}

//**********************
// Programme principal
//**********************

main() {

int i, k, j=12, led=0;

while (TRUE) {
if (!j--) { // clignotement d'une LED toutes les 12*20ms=240ms
j=12;
if (led) {
output_low(LED1);
led=0;
}
else {
output_high(LED1);
led=1;
}
}

delay_ms(20); // envoie d'une trame toutes les 20ms


for (k=0; k<1; k++) { // 1 trame, il est possible d'envoyer plusieur trames
periode_38k(86); // 2222µs
for (i=0; i<3; i++) {
delay_us(500);
periode_38k(20); // 500µs
}
delay_us(2000);
}

}

}




Prochain post : intégration recherche balise dans IRBOT

Intégration du test de la balise dans IRBOT

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 de la télécommande : on a fini de jouer avec IRBOT et on veut qu'il ailles se recharger
les batteries sont faibles


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 :

on allume une LED pour signifier qu'on est dans le faisceau
on met BAL=1
on va tout droit
on met le compteur CPT_BAL à 2 . Ce compteur est décrémenté toutes les 20ms dans la fonction test_bal() qui est appelé par le signal d'interruption. Tant que IRBOT réceptionne le signal de la balise, le compteur CPT_BAL sera supérieur à 0, puisqu'il est réinitialisé à chaque réception (toutes les 20ms).


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

Comment détecter une tension batterie faible ?

On va exploiter la caractéristique électrique des entrées TTL du PIC.
Une entrée sera :

au niveau bas : si la tension présente sur cette entrée est comprise entre 0 et 0.8V
au niveau haut : si la tension est comprise entre 2V et 5V


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).

http://pro.wanadoo.fr/yves.heilig/Forum/IRBOT/Videos/irbot_borne_recharg.avi

Un petit commentaire

Comme vous pouvez le constater sur la vidéo, ça marche plutôt bien. IRBOT arrive très rapidement à localiser la balise et à venir s'y coller.
Il est vraiment avide de nourriture car dès qu'on le décolle de la balise, il s'y recolle immédiatement.

L'appui sur la touche 9 de la commande démarre IRBOT en mode recherche de balise.
La stratégie de déplacement est la suivante : IRBOT avance d'environ 1m puis tourne sur lui-même et avance à nouveau.
Tout au long de son déplacement il cherche le signal ir de la balise. S'il le réceptionne, celà signifie qu'il est dans le faisceau ir et avance donc tout droit.
S'il perd le signal, il tourne au hasard dans une direction. Si le signal réapparait, il tourne encore un peu pour bien se mettre dans le faisceau, et avance tout droit. Si le signal ne réapparait pas, c'est qu'il a tourné dans la mauvaise direction. Il tourne donc en sens inverse. Il se déplace ainsi jusqu'à établir le contact avec les rails de la balise.
Lorsque les deux switchs détecteur de collision sont actionnés et que la tension de rechargement est détectée sur les moustaches, c'est gagné .
IRBOT ne bouge plus et se recharge, deux LED clignotent pour le signaler.

Nota: il peut aussi le faire en jouant de la musique en même temps

Pour remettre IRBOT en route, il suffit d'appuyer sur la touche 7.

Pour l'instant la recharge est très sommaire. J'ai simplement branché un bloc secteur de 12V 500mA continu sur les rails de la balise. (+12V en haut et GND en bas).

Dans le prochain post, une gestion de la recharge par la balise.



http://pro.wanadoo.fr/yves.heilig/Forum/IRBOT/Telechargements/irb19_schema.zip

Prochain post : Recharge

Précédente Accueil Suivante