COMMANDER un ROBOT a distance AVEC une TELECOMMANDE de TELEVISION
(Ou comment faire un robot Sympa sans Peine)
J'ai deux bonnes nouvelles pour vous:
- les diodes de détection infrarouge livrées avec PEKIT sont les mêmes que celle qui permettent a votre télé de rèpondre a son boitier de télécommande , alors c'est facile d'envoyer des signaux a votre robot et comme il y a beaucoup de touches sur la télécommande de votre télé c'est autant de commandes différentes que vous pouvez envoyer
- dans la foire aux objets pour le Propeller sur le site Parallax.com on trouve des méthodes toutes faites qui lisent vite et bien les codes envoyés aux télés Sony (merci a Tom Doyle qui a écrit cet Objet ) : donc pas de probléme si vous avez un boitier Sony ou un boitier polyvalent (il coutent moins de 20 euros) .
- Concernant les objets , il faut savoir: que de nombreux programmeurs , souvent professionnels, déposent sur le site de Parallax des centaines d'objets téléchargeables gratuitement . On les trouve classés par théme dans la zone Object exchange (OBEX en abbrégé) : dans le bandeau du haut de la page d'accueil de Parallax.com cliquer sur <Propeller chip>, puis <Propeller Object Exchange> . Ces objets réunissent des ensembles de méthodes utiles , commentées et classées par thémes : affichage vidéo, musique et synthése vocale, controle de moteurs, détecteurs IR et sonars, stockage de données , etc.... Une mine d'aide et d'inspiration inestimable, a consulter absolument !
- Mais pour ne pas réécrire tout le temps les mêmes méthodes vous pouvez écrire des objets vous même: .Par exemple vous avez ecrit un programme appelé <moteurs.spin> avec les méthodes avancer,reculer,droite,gauche et vous branchez toujours vos 2 servos sur les mêmes pattes. Vous écrivez un nouveau programme pour faire déplacer votre robot dans un labyrinthe (ce nouveau programme s'appelle <labyrinthe.spin> et il a besoin d'utiliser les méthodes avancer,reculer, droite,gauche . Vous n'avez pas besoin de réécrire ces méthodes dans le programme <labyrinthe.spin>.Vous écrivez dans la zone <OBJ> de <labyrinthe.spin> le texte suivant : motor: "moteurs" et ensuite dans le programme <labyrinthe.spin> vous écrivez : motor.avancer pour avancer etc.. (le point entre motor et avancer indique au programme labyrinthe : va chercher dans le programme <moteurs> , qui est stocké dans le même dossier que toi, la méthode <avancer> et utilise la. C'est tout! Vous voyez qu'en mettant les méthodes que vous utilisez souvent dans des objets du genre : musique, moteurs, lumiéres etc.. vous écrirez de nouveaux programmes sans vous fatiguer ! Il suffira d'appeler les méthodes d'objets que vous avez déja écrits (et aussi de ceux que vous trouverez dans la banque d'échange d'objets sur le site de Parallax).
Pour le programme actuel il faut :
- récupérer une télécommande Sony compatible
- télécharger l'objet <IrRemote> depuis la zone <Fun> de l'OBEX de Parallax et le stocker dans le dossier ou vous allez écrire votre programme
- faire le petit montage simple suivant sur votre plaque de montage
A la fin de cette manip nous ferons un concours de vitesse sur le parcours en huit que nous avons déja utilisé , mais cette fois ci on dirigera le robot avec la télécommande et il faudra faire le trajet le plus vite possible sans rouler en dehors des dalles du parcours.
Rappel : la lumiére visible va de longueurs d'onde d'environ 400 (violet) a 700 (rouge) nanométres (1 nanométre = 1 milliardiéme de métre !) . En dessous de 400 il y a les Ultra violets et au dessus de 700 nm l'infrarouge. Les infra rouges sont utilisés pour la transmission de commandes a courtes distances (quelques métres) . Comme un corps chaud émet des infra rouges ils servent aussi a détecter les êtres vivants (mettez un pyro détecteur sur votre robot et il repérera votre chat !)et a les "photographier" de nuit. Comme c'est le cas pour la lumiére visible ,les infra rouges sont réfléchis par les obstacles : on s'en sert donc pour faire éviter les obstacles aux robots.
Le Montage:
- la diode de détection qu'on trouve dans la boite du PEkit est un tout petit boitier métallique muni de 3 pattes , sur l'avant du quel il a une toute petite vitre bombée marquée par un croisillon. Ce boitier contient un récepteur IR, des filtres sélectionnant les fréquences voisines de 38 500 ce qui permet d'éliminer des IR parasites, un démodulateur (il récupére des signaux hachés a une fréquence de 38 500 et en tire la suite de signaux hauts et bas qui correspondent aux 13 bits du message envoyé par la télécommande) .
- On va relier la patte marquée 3 sur le boitier par l'intermédiaire d'une résistace de 10 kilo Ohm a la patte 0 du Propeller , la patte du milieu est reliée a la masse et la troisiéme patte a une source de 5 volts (par exemple celle qui alimente les servo moteurs)
Le programme:
- On va utiliser le programme de commande des moteurs un peu modifié et lui ajouter au début un accés a un objet en tapant
avant la zone des variables :
- Notez que l'ojet <ir> a besoin d'un autre objet pour fonctionner ; <simple numbers>
- Cet objet <ir > va fonctionner sans arret pour recevoir des messages et lorsqu'il en recoit il modifie deux variables écrites sur un tableau noir visible par tous les programmes . Ces deux variables sont Lduree et Rduree , elles modifient la duree des impulsions envoyées aux servo moteurs droits et gauches , donc leur vitesse de rotation .
- dans un nouveau cog démarré en paralléle par une commande cognew on fait fonctionner en continu le programme < rouler> qui sans s'occuper de recevoir des messages se contente d'adapter les déplacements du robot aux valeurs actualisées de Lduree et Rduree et d'envoyer au deux servos les impulsions correspondantes
- On notera que pour démarrer on initialise Ldurée et Rdurée a 1450 , durées d'impulsions qui correspondent a un arret de la rotation des servo moteurs.
Le programme permet de diriger ou de stoper le robot mais notez qu'il y a 35 commandes sur le boitier télé : une mine pour déclencher d'autres choses, par exemple :
- une musique
- des effets lumineux avec des LED de différentes couleurs ou puissances
- et tout ce que vous imaginerez
- mieux : si vous lisez le commentaire du programme de Tom Doyle , vous voyez que l'auteur conseille d'en masquer 8 lignes si vous voulez utiliser la commande autorepeat (quand on appuie en continu sur un bouton de télécommande il répéte le message , c'est ça qui vous permet de diminuer ou d'augmenter le son de la télé) .Avec autorepeat on peut utiliser les touches de télécommande du boitier télé comme un joystick et faire virer en douceur le robot vers la droite ou la gauche !
Pour ceux qui sont curieux et ont quelques connaissances en programmation je les invite a regarder et comprendre le programme IR_remote : c'est clair , propre et instructif (mais en Anglais !). En effet:
- on y trouve une page d'explications , placée en commentaire
- on découvre qu'il n'y a pas besoin de langage assembleur pour aller trés vite (on fait 80_000 lectures par seconde avec les 2 états haut et bas d'une impulsion) il utilise uniquement le langage Spin habituel mais en mettant a profit le compteur de registres rapides du Propeller : le < phsa>
Et voilà le programme complet, amusez vous bien ! (et voyez d'autres utilisations des IR a la fin du chapitre)
{{
IR_RemoteCommandes.spin
selon Tom Doyle
2 March 2007
Moteur GAUCHE connecté sur PIN 14
MOTEUR DROIT connecté sur PIN 15
}}
CON
_CLKMODE = XTAL1 + PLL16X ' 80 Mhz clock
_XINFREQ = 5_000_000
IRdetPin = 0 ' IR Receiver - Propeller Pin
OBJ
ir : "IR_Remote"
num : "simple_numbers"
VAR
Long stack2[50]
byte IRcode ' keycode from IR Receiver
long Time ,Lduree,Rduree
PUB Init | freq, index, cog, lcode
dira[15]~~'c'est la même cose que dira[15]:=1 mais en abbrégé
dira[14]~~
Lduree:=1450
Rduree:=1450
cognew(rouler, @stack2) 'ON DEMARRE UN NOUVEAU CERVEAU (le CERVEAU numero 1) DU PROPELLER
'CE QUI EST BEAU C'EST QUE CETTE METHODE <rouler> VOIT Les VARIABLES Lduree et Rduree modifiées dans le COG du programme principal (le CERVEAU numéro 0)
'EN EFFET TOUTES LES VARIABLES DECLAREES DANS LA ZONE <VAR> au début d'un programme SONT VISIBLES par tous les programmes SUR UN TABLEAU NOIR COMMUN
cog := ir.Start(IRdetPin, @IRcode) ' on démarre le programme de détection de messages infra rouges codés
'il renvoie dans IRCode le numero de la touche appuyée sur la télécommande de la télé
if cog > 0
repeat
If IRcode <> ir#NoNewCode 'on attend un nouveau code
lcode := IRcode
ir.Start(IRdetPin, @IRcode) ' utilise le nouveau code reçu
case lcode 'selon le code q'on a reçu on exécute des petites méthodes différentes (en fait ici on change seulement la durée des impulsions sur les roues)
'Noter que les codes qui sont envoyés pour les touches sont le numéro de la touche MOINS UN
'le code zéro correspond a la touche "9" de la télécommande
0 :'avancer vers gauche , le # indique une constante récupérée a partir d'un Objet
Lduree:=1300
Rduree:=1500
1 : 'avancer
Lduree:=1250
Rduree:=1650
2 : 'avancer vers droite
Lduree:=1400
Rduree:=1600
3 : 'pivot gauche
Lduree:=1250
Rduree:=1250
4 : 'stop
Lduree:=1450
Rduree:=1450
5 :'pivot droite
Lduree:=1650
Rduree:=1650
6 : 'reculer vers gauche
Lduree:=1600
Rduree:=1400
7:'reculer droit
Lduree:=1650
Rduree:= 1250
8 : 'reculer vers droite
Lduree:=1500
Rduree:=1300
'ir#zero : 'télécommande non utilisée
'ir#chUp : '(string("chUp ")) 'non utilisée
'ir#chDn : '(string("chDn ")) 'non utilisée
'ir#volUp : '(string("volUp"))'non utilisée
'ir#volDn : '(string("volDn"))'non utilisée
'ir#mute : '(string("mute "))'non utilisée
'ir#power : '(string("power"))'non utilisée
'ir#last : 'string("last "))'non utilisée
other : 'ne rien faire
waitcnt((clkfreq / 1000) * 30 + cnt)
'!outa[27]
PUB pulseleft |duree, TimeL
duree:=Lduree
TimeL:=cnt
!outa[14]
waitcnt(((clkfreq/1_000_000) *Lduree) +cnt) 'clkfreq= 1seconde
!outa[14]
waitcnt ( TimeL+= clkfreq/50 )
PUB pulseright |duree , TimeR
duree:=Rduree
TimeR:=cnt
!outa[15]
waitcnt(((clkfreq/1_000_000)*duree) +cnt)
!outa[15]
waitcnt ( TimeR+= clkfreq/50 )
PUB rouler
dira[14]~~ 'servo droit
dira[15]~~ 'servo gauche
outa[15]~
outa[14]~
repeat
pulseleft
pulseright
PUB stop
Lduree:=1450
Rduree:=1450
Autres utilisations de la détection Infra rouge: voici les plus courantes en robotique
- évitement d'obstacles : on utilise 2 couples (émetteur /récepteur) l'un dirigé un peu vers l'avant a doite l'autre un peu a vers la gauche et on corrige les déplacements du robot a fin de s'éloigner des obstacles (pour limiter les risques d'interférences entre droite et gauche on met un petit écran en carton entre les 2 couples droit et gauche). Comparativement aux détecteurs a ultra sons l'angle de détection est plus étroit et les distances plus courtes (en pratique de 10 centimétres a un métre)
- sortie de labyrinthe par suivi de mur : en restant a une distance assez constante d'un mur (situé a droite par exemple) le robot peut sortir d'un labyrinthe simple , mais il est loin d'utiliser le chemine le plus court
- navigation dans une piéce en se repérant par rapport a 2 ou 3 balises infra rouges situées prés du plafond : ça marche assez bien avec un détecteur qui tourne sur le dessus du robot, si les 3 balises émettent a des fréquences différentes et si des obstacles ne le cachent pas au robot (meubles, humains, animaux)
- repérage d'objets chauds (étres vivants ..) :les objets chauds émettent des rayons infra rouges