Test de la CMUCAM3
reliée a un PROPELLER sur les broches TTL
Pour relier le module CMUCAM3 au Propeller il faut enlever le cable série qui relie la caméra au PC et enlever le cavalier qui permet cette liaison (voir le schéma de la carte).
On dispose alors sur la carte caméra, de 4 broches qui recoivent , ou émettent, non plus des signaux de tensions 12 volts mais de tensions dites TTL voisines de 3,6 volts , plus compatibles avec un microcontrolleur (cette transformation des voltages utilise une puce voisine du classique MAX232) .Les 4 broches en question, sont en bas de la carte et vers le mileu.Voir le schéma du manuel, pour les identifier . Sur notre montage on a de gauche a droite : la terre, une connection Tx qui envoie des messages de la caméra vers le Propeller , une connection 5 volts, une connection RX qui reçoit des messages depuis le Propeller.
La caméra et le microcontrolleur sont alimentés par la même source de courant continu : un pack de 6 batteries rechargeables de 1,3 volts.
Aprés différents essais , il semble que les connections suivantes donnent de bons résultats (pour un Propeller):
- il est inutile de connecter la borne 5 volts
- la connection a la terre commune du Propeller est classique
- les connections entre les pattes du Propeller et les bornes Rx et Tx se font directement par un simple fil de liaison: nous avons abandonné les résistances et diodes essayées au début , elles créent plutôt des difficultés (comme toutes les tensions vont de 0 a 3,6 volts elles sont bien supportées des deux cotés : caméra et Propeller)
- par contre, il faut bien faire attention a envoyer les messages du Propeller sur la patte reliées au RX de la caméra.
Pour les tests d'envoi de commandes , nous utilisons coté PC , le logiciel de déboguage du Propeller , le PST , adapté aux échanges série, avec deux zones dans la fenêtre : une pour les envois, une pour afficher les messages reçus.
Paramétres série: 115200 bauds, 8 bits, 1 stop, pas de parité , pas de controle.
Premier test: Programme du Propeller pour lui faire envoyer la commande que nous utilisions sur la liaison série PC pour allumer/éteindre des LED:
le programme est écrit en langage SPIN et utilise l'Objet "Fullduplexserialplus" pour les liaisons série.
- utiliser la version la plus récente de l'objet "Fullduplexserialplus" pour avoir vitesse et fonctions suffisantes
- caler la vitesse du Propeller sur 80 Mhz
- nous appelons SER3 l'objet "Fullduplexserialplus"
- démarrer la liaison série <Proleller-Port TTL de la caméra> en utilisant la ligne de programme : SER3.start(CAM_TX, CAM_RX, 0,115200) (en fait 116500 bauds peut marcher mieux que 115200 !! )
- démarrer un autre liaison série vers le PC pour pouvoir envoyer des données vers le logiciel PST de débogage: VersPC.start(30,31,0,115200)
- on utilise un delai de 200 millisecondes aprés chaque commande
- pour envoyer la commande RS on écrit : SER3.str(string("RS",13)) (le 13 est pour le CR)
- pour allumer la LED de la CMUCAM : SER3.str(string("LO 1",13)) (le 13 pour CR)
- pour éteindre la LED :SER3.str(string("L0 0",13))
- on peut ajouter des commentaire vers l'écran du PC : VersPC.str(string("Allume LED",13))
- On a noté dans ce test qu'il est prudent d'envoyer 2 fois la commande pour être sur qu'elle sera exécutée
Deuxiéme test : programme pour localiser une tache bleue
- On reprend les mêmes commandes de début , puis on ajoute
- pour passer en poll mode: SER3.str(string("PM 1",13))
- pour donner la couleur a suivre(ici du bleu) : SER3.str(string("TC 0 40 0 65 100 185",13))
- puis on enverra périodiquement dans une boucle repeat la commande : SER3.str(string("TC",13)) : comme on est en Poll mode la caméra ne renverra un paquet T qu'aprés chaque commande TC.
- pour récupérer ce paquet T de réponse on utilise : SER3.Getstr(@reponse) (ou reponse est déclaré comme tableau de 40 bytes )
- En fait dans la réponse ce qui nous intéresse est ici la position en X de la tache colorée , c'est a dire le premier nombre de la réponse. Or la réponse est du genre: T 62 87 49 0 66 142 210 206 . Ici on veut donc récupérer la valeur 62 correspondant a Xmilieu.
- Pour isoler ce nombre on va d'abord attendre d'avoir un caractére "T" qui indique le début de réponse , et on passe l'espace blanc qui suit .
- On fait : repeat until (SER3.rx=="T") puis repeat until (SER3.Rx=='" ") avant de faire SER3.Getstr(@reponse)
- Une fois qu'on a la chaines des chiffres de la réponse , pour en extraire la valeur Xmilieu, on utilise une forme modifiée de la fonction de transformation d'une chaine de caractéres en un nombre (fonction StrToDec contenue dans "Fullduplexserialplus" qui transforme tous les caractéres d'une chaine en un nombre décimal ) comme on ne veut utiliser que le premier nombre, qui est suivi d'un espace blanc on lit donc la chaine jusq'au premier espace blanc en utilisant : repeat until ((char := byte[stringptr][index++]) == " ") . On obtient la valeur décimale : repdec.
- Ensuite on envoie la valeur trouvée s'afficher dans la fenêtre du programme PST sur le PC : versPC.dec (repdec)
- Les valeurs affichées montraient dans la configuration utilisée : des chiffres d'environ 50 pour un objet bleu situé au centre du champ de la caméra, environ 80 pour un objet placé sur le bord droit du champ et vers 10 pour un objet proche du bord gauche du champ.
- On peut donc utiliser ces valeurs pour faire suivre une ligne bleue au robot: on corrige la vitesse des moteurs des roues droite et gauche pour ramener repdec vers 50.