Atelier pour commander une voiture jouet avec KiCar

Transcription

Atelier pour commander une voiture jouet avec KiCar
http://www.didel.com/
[email protected]
www.didel.com/kidules/KiCarDeb.pdf
Atelier pour commander une voiture jouet avec KiCar
Documentation pour encadrants www.didel.com/kidules/KiCar.pdf
Les voitures télécommandées dont la mécanique est
encore bonne et ont une alimentation de 3 à 6V
peuvent être modifiées (on enlève le circuit radio) pour
être pilotées par le Kidule KiCar (ou la cartes qui ont
les circuits de commande pour deux moteurs). Le jeu
est de commander les moteurs pour en faire un robot
autonome, ajouter des phares, des capteurs
d’obstacles, des capteurs de lumière, etc.
Avec une voiture jouet, un moteur fait avancer et un actuateur (un moteur ou électro-aimant) fait
tourner. Un robot avec deux roues motorisées comme un tank est tout aussi facile à programmer.
Cette notice est prévue pour accompagner un atelier avec des moniteurs qui peuvent expliquer
l’environnement de programmation et les programmes (voir www.didel.com/kidules/KiPiDe.pdf )
La carte processeur
La carte KiCar va remplacer la carte radio, qui commande les moteurs et a deux fils qui viennent
de la pile, via l’interrupteur. Ne pas couper le fil d’antenne.
Le kit fournit les
connecteurs à mettre
sur la carte et à souder
sur les éléments
raccordés sur la carte.
Quelques connecteurs
ne doivent pas être
soudés, mais ils sont
fournis dans le kit, en
vue du futur.
Le but est de câbler les moteurs, tester le fonctionnement sous contrôle du processeur, ajouter
des phares, un klakson, des capteurs de distance. Ceci sera expliqué et testé au fur et à mesure.
Le soudage doit être fait
soigneusement, avec les
connecteurs bien droits et bien
enfoncés. Comme toujours, on
soude une patte, vérifie que c’est
le bon connecteur, bien soudé.
S’il est en biais ou pas assez
enfonçé on pousse le connecteur
avec le doigt en chauffant de
l’autre côté. Ensuite, on soude
toutes les pins.
Maintenant on peut voir ou placer KiCar dans la
voiture et quelle longueur de fils prévoir.
Première partie : modification de la voiture
La première étape est de bien regarder comment c’est construit. Quels sont les fils qui viennent
du bloc de pile, via l’interrupteur, quels sont les fils moteur et direction. On va couper ces fils et
mettre des connecteurs. La radio pourra être réinstallée, et avec les connecteurs compatibles, le
processeur pourra tout contrôler. En plus, on pourra ajouter des phares et des capteurs.
On veut pouvoir rebrancher la radio, et le fils qui vont vers la radio sont trop court pour le KiCar.
Le plus simple est de couper les câbles loin de la radio, et de remettre des câbles neufs qui
partent des moteurs et de l’alimentation.
Pour l’alimentation, utiliser la Prise-B (http://www.bricobot.ch/docs/PriseB.pdf)
Pour les moteurs, actuateurs, ampoules et LEDs, mettre des prises mâles à 2 broches côté
moteur.
Insérer les pins dans un connecteur
femelle pour éviter que le chauffage
déforme le plastique.
Un fil soudé sans protection casse
rapidement à la soudure. Il faut soit
mettre de la gaine thermorétractable,
soit, ce qui est mieux si c’est bien fait,
mettre une goutte de colle chaude
aplatie entre 2 plaques protégées par
du papier cuisson.
Pendant que le fer est chaud, on peut déjà préparer les adaptateurs des pages suivantes.
Le processeur
Avant de câbler et tester en utilisant des programmes du microcontrôleur, il faut comprendre un
minimum.
Le boitier noir contient la mémoire et la logique qui
exécute les instructions.
Sur les pins on a des groupes de 8 bits, les PORTS
A B C. Les lignes de ce port peuvent être
programmées en entrées ou sorties. En entrée, on
lira l’état d’un interrupteur : 5V si l’interrupteur est
ouvert, 0V s’il est fermé. En sortie, on peut allumer
une diode lumineuse ou faire coller la membrane
d’un haut-parleur. On préfère si le courant est
‘’pompé’’ par le processeur plutôt qu’envoyé. C’est
un 0V qui allume la LED. Les moteurs ont besoin
d’un amplificateur.
Programmer avec Pinguino
La programmation ne s’apprend pas en 5 minutes, il y a beaucoup de règles à comprendre et à
respecter exactement avant de pouvoir créer son propre programme.
Mais c’est assez facile de voir ce que fait un programme en comprenant les quelques mots
d’anglais des instructions et en lisant ses commentaires.
L’environnement Pinguino est utilisé pour éditer les programmes, les compiler (traduire en code
processeur) et télécharger le code dans le KiCar. Mettre en place cet environnement est ingrat,
l’aide d’un gourou est souvent nécessaire. Suivre la procédure dans www.didel.com/kidules/KiPiDe.pdf
Pour apprendre à programmer, cette documentation explique les instructions et propose des
exercices. Un Kidule Dé peut être connecté au KiCar, mais le poussoir du KiCar ne peut pas être
lu, il faut adapter le programme pour lire le poussoir du KiCar.
Pour comprendre le KiCar dans le détail, programmer correctement ses entrées-sorties et aller
vers des applications robotiques complètes, voir www.didel.com/kidules/KiCar.pdf. Le but ici est de
tester des programmes et apprendre à les modifier.
Les phares
Les phares sont prévus sur le connecteur U6top proche du connecteur USB. Les cathodes sont
reliées via leur résistance aux pins 3 et 4, le point commun est la pin2 = +5V.
Le programme pour clignoter les phares est simple. Charger et exécuter KiCarCliPhares.pde
après avoir mis dans un dossier Kicar les fichiers extraits de www.didel.com/kidules/KiCar.zip
La procédure pour mettre en route Pinguino est décrite sous www.didel.com/kidules/KiPiDe.pdf
On doit appeler les définitions de base du KiCar, ajouter celles de l’application, et lancer le
programme qui allume, attend, éteint, attend.
Le connecteur prévu pour les phares est le U4top (connecteur à 4 pins en haut, initialisé en
sorties). Le câblage et les définitions doivent correspondre. La Led droite est câblée entre la pin 4
et la pin 1 (+) Elle s’allume quand le processeur mets un 0 sur sa sortie RC7 (ligne 7 du portC).
En C, on écrit PhareDroite = Allume ;
Il faut avoir déclaré au début #define PhareDroite PORTCbits.RC7 (dépends de notre
application) et #define Allume 0 (dans le fichier KiCarDef.h, s’est valable pour toutes les Leds
que l’on câblera).
// KiCarCliPhares.pde
#include "KiCarDef.h"
#define PhareGauche
PORTCbits.RC6
#define PhareGauche
PORTCbits.RC7
void loop()
{
PhareGauche = Allume;
PhareDroite = Allume;
delay(500); // 500 ms = 0.5s
PhareGauche = Eteint;
PhareDroite = Eteint;
delay(500);
}
Modifiez pour que cela alterne
Une partie non visible du programme (dans le #include) définit des noms qui correspondent aux
pins du processeur et prépare le processeur avec les pins dans la bonne direction (c’est le setup).
On peut tester plusieurs programmes avec les phares, et se familiariser avec quelques
instructions.
KiCarOnOffPhares.pde on allume et éteint si on presse sur le poussoir du processeur.
KiCarVariePhares.pde Variation d’intensité (PWM)
KiCarVariePharesf.pde Idem avec la variation en fonction
KiCarVariePharesLib.pde Idem avec la variation en librairie
KiCarOnOffLentPhares.pde on allume et éteint progressivement si on presse
Le poussoir
Le poussoir nous sera utile pour appeler différents programmes, mais commençons avec des
exemples simples. Il est un peu spécial, car quand on presse, la Led bleue s’allume. Et si la led
bleue est allumée, le processeur voit un poussoir pressé.
On peut tester le poussoir et faire tourner le moteur ou allumer une LED quand on presse.
Le programme KiCarCopieMot.pde utilise la commande if, avec un double = parce que l’on
compare (est-ce que le poussoir est pressé ?)
//KiCarCopieMot.pde
active Mot1Pos
#include "KiCarDef.h"
void loop()
{
if (PousProc == PousOn)
Mot1Pos = On;
else
Mot1Pos = Off;
}
Ce que l’on ne voit pas avec ce programme, c’est que le poussoir a des rebonds de contact, il
alterne on-off irrégulièrement pendant quelque millisecondes, Un délai de 5 ms est nécessaire si
on veut attendre que cela soit pressé, puis relâché pour par exemple démarrer le moteur et
l’arrêter. On a vu les instructions dans le programme KiCarOnOffPhares.pde.
Les programmes suivant agissent sur la Led Bleue qui s’allume 2 secondes quand on a pressé.
On voit que c’est plus clair en utilisant la fonction WaitPous en librairie
KiCarWaitPous.pde
Allume la Led bleue pour 2 secondes à chaque pression
Supprimer ?
Un fonction très utile, un peu plus compliquée à programmer permet de compter le nombre de fois
où on a pressé. Le programme KiCarCntPous.pde apelle GetPous (); qui donne le nombre
d’actions (copiées dans Cnt). On fait ensuite clignoter la Led bleu ce nombre de fois avec une
boucle for.
A noter, que quand on presse, la Led bleue s’allume parce que l’on presse. Quand on n’a plus
pressé pendant 1 seconde, c’est le programme qui fait clignoter la Led.
Plusieurs démos dans le programme
La fonction GetPous peut être appelée à l’enclenchement pour appeler des programmes
différents selon le nombre d’actions sur le poussoir. On verra des exemples plus loin.
Poussoirs supplémentaires et Moustaches.
Là ou il y a une ligne de libre, on peut brancher un
interrupteur, un poussoir, une moustache qui ferme un
contact quand la voiture touche un obstacle.
Pour une paire de moustache, les ligne 0 1 2 3 du
connecteur U6 top conviennent bien et sont déjà prévues
en entrée. Sur ce connecteur, on propose plus loin de
brancher un haut-parleur puissant.
Pour un programme d’évitement d’obstacle naif, il faut dire
‘’ avance, si contact à droite ou à gauche recule pendant 2
secondes .. ‘’ KiCarMoustache.pde a faire et tester
Pour le moteur, on voit que l’ont peut soit penser aux pins
activées ou non, soit à la fonction : avancer, reculer,
stopper. Il suffit de définir ce que l’on veut.
Capteurs de lumières
Une LDR est une résistance
variable. Si on fait un pont
avec une résistance fixe. la
tension va varier. Avec le
câblage ci-contre (LDR contre
le Gnd), la tension diminue
avec la lumière. Le
processeur lit un zéro quand
la tension est en dessous de
1.2V environ, il lit un 1 si la
tension est supérieure à 1.3V.
Entre les deux, le processeur n’aime pas et va hésiter. On vérifie dans un instant.
Le programme KiCarTestIrDist.pde, identique au précédant mais avec l’entrée définie sur la
ligne RA0, c’est à dire la pin 3 du connecteur U6bot teste la LDR en allumant la LedBleue si c’est
obscur.
/*KiCarTestLdr.pde Allume la LedBleue si éclairé
Brancher une LDR avec un pot de 20k sur Dist 0 1..
\image:KiCarLdr.bmp
*/
#include "KiCarDef.h"
void loop()
{
RA4LED; // Led bleue active
LedBleue = Dist0 ; //allume si Dist0 < 1.2V
}
On aurait pu écrire
void loop()
{
RA4LED; // Led bleue active
if (Dist0==0) LedBleue = Allume ;
else LedBleue = Eteint ;
}
On doit mettre l’instruction RA4LED parce que par défaut (si on ne modifie pas les définitions
dans KiCarDef.h) le poussoir PousProc est actif.
On voit que lorsque la lumière varie et que l’on passe entre éteint et allumé, la Led bleue apparaît
en demi-intensité, parce qu’elle est tantôt allumée, tantôt éteinte. Si on rajoute un délai(20); à
la fin du programme, on voit bien que la led clignote dans cette zone de transition.
Jouer avec la lumière n’est pas facile, car l’intensité de l’éclairage varie considérablement et notre
œil, qui a une réponse logarithmique (on est sensible à 10 fois plus, 100 fois plus), ne s’en rend
pas bien compte. L’électronique est linéaire (2 fois plus, 4 fois plus) et il faut adapter les
résistances, avec comme seule règle que la résistance de la résistance doit être 3 fois celle de la
LDR dans la zone de passage du tout ou rien.
En remplaçant la résistance par un potentiomètre, on peut régler le seuil dans une certaine
gamme d’éclairage. On peut aussi mettre un cache sur la LDR. Donc la règles est :
- si c’est obscur, augmenter la résistance
- si c’est très lumineux, cacher une partie de la LDR ou mettre une résistance plus faible.
Avec une LDR, un potentiomètre de 22 à100k est bien adapté.
Attention avec un potentiomètre, il faut toujours se demander ce qu’il se passe lorsqu’il est en
extrémité et que la résistance est faible, puis nulle. Si le courant n’est pas limité, c’est dangereux.
Dans notre cas, le courant est limité par le capteur de lumière. Il faudrait éclairer très fort pour que
cela chauffe.
On peut mettre deux LDR pour éviter les obstacles ? Difficilement car la
variation de lumière est trop faible lorsque l’on se rapproche de l’obstacle. Par
contre, avec un cache entre deux LDR qui regardent dans la même direction,
on peut écrire un programme qui fait que le robot se dirige vers une bougie.
Eviter des obstacles
Les capteurs de distance infrarouge (IR) ont une diode qui éclaire et un phototransistor qui
mesure la lumière. Le phototransistor est comme une LDR, un peu moins sensible. Pourquoi de
l’infrarouge ? Pour être moins sensible à la lumière ambiante. Le soleil donne peu d’infrarouge,
une ampoule beaucoup, un néon moins, une Led visible pas du tout. Donc ne comptez pas sur
une lampe de poche à Leds pour faire réagir votre robot.
Comme on le voit dans la figure, il
faut une résistance pour limiter le
courant dans la Led IR et un
potentiomètre pour régler la
distance de commutation. On
veut deux capteurs, et on peut
mettre les diodes IR en série.
Pour économiser du courant, on
passe par un transistor qui allume
pendant la mesure ; une mesure
toutes les 20ms (le robot se
déplace de quelques mm) et bien
suffisante.
Le transistor est prévu sur le
connecteur U6bot et pour faciliter
le câblage, un circuit imprimé est
utilisé pour le capteur.
Il nous faut d’abord un
programme de test. La
Led Bleue est de
nouveau très utile. Le
programme précédent a
été modifié en faisant un
cycle avec les Leds IR
allumées, puis éteint. On
sait mieus ainsi que
l’éclairage fonctionne.
/*KiCarTestIrDist.pde Allume la LedBleue si obscur
Brancher une LDR avec un pot de 20k sur Dist 0 1 2 3
\image:KiCarDist2Ir.bmp
*/
#include "KiCarDef.h"
void loop()
{
RA4LED;// active la Led bleue en sortie
IR01 = On ; IR23 = On ;
LedBleue = Dist0 ;
delay (100) ;
IR01 = Off ; IR23 = Off ;
LedBleue = Dist0 ;
delay (100) ;
}
Si on décide que RA0 est à gauche et que l’on câble correctement, on va tout de suite définir des
noms clairs : #define IRGauche PORTAbits.RA0
#define IRDroite PORTAbits.RA1
Une lecture analogique permettrait de mesurer des petites différences de lumière, mais seulement
dans la zone entre 1V et 4V. Le potentiomètre reste nécessaire, car entre une chambre et une
terrasse, la lumière change dans un facteur 1000, sans que notre œil s’en rende vraiment compte.
Pour un premier test, mettre une résistance de 2 à 10 kOhm et charger le programme
KiCarIn0.pde, qui copie l’état de la pin IRGauche (ou Droite si on appuie sur le poussoir) sur la
LedBleue.
Photos pcb, vero, selon sol choisie par Jonatan
La sol que je préfère. Capteurs pré-câblés
PCB avec ou sans pot.
Les moteurs
Les moteurs d’un robot jouet sont souvent bruyant et consomment beaucoup de courant. Une
résistance de 5 à 10 Ohm en série, ou mieux une paire de diodes tête-bêche (le courant doit
passer dans les 2 sens) limite la puissance. Avec la pile directement connectée sur un moteur (les
connecteurs sont pratiques, c’est facile de tester. Ce qu’il faut savoir, et que l’on peut vérifier en
mettant une ampoule de lampe de poche en série avec le moteur (pas une diode lumineuse),
c’est que le courant de démarrage est 2 à 5 fois plus important que quand le moteur tourne.
Si le câble USB du Kidule fournit ce courant, il y a chute de tension dans le câble et avec le câble
fin des dérouleurs, le processeur peut voir sa tension baisser tellement qu’il redémarre. Il y a
aussi des parasites dus aux balais qui n’améliorent pas. Bref, utilisez un câble USB court ou
laissez la batterie de la voiture sous tension (il y a une diode de protection).
Souder deux LEDs bicolores sur un
connecteur. Cela permettra de remplacer les
moteurs par des LEDs et d’avoir toute
l’information voulue sur le sens de rotation et la
vitesse, sans avoir l’inconvénient du bruit et de
l’usure plus rapide des piles.
La carte KiCar a deux amplis qui font circuler le courant dans un sens ou dans l’autre. Selon les
combinaisons des 2 bits, on a 4 comportements pour un moteur ou une diode bicolore
Mot0Pos=0;Mot0Neg=0; 0 0
roue libre
diode bicolore éteinte
Mot0Pos=0;Mot0Neg=1; 0 1
tourne dans un sens
vert (ou rouge)
Mot0Pos=1;Mot0Neg=0; 1 0
tourne dans l’autre sens
rouge (ou vert)
Mot0Pos=1;Mot0Neg=1; 1 1
bloqué
diode éteinte
idem pour le moteur1
Le courant maximum est 0.5A. Roue libre signifie que l’ampli est ‘’inexistant’’ pour le moteur. Dans
l’état bloqué, les transistors sont conducteurs, et la force contre-électromotrice freine le moteur,
comme quand on court-circuite ses sorties.
Le programme KiTestMoteurs.pde fait des aller-retours avec arrêt de 0.8 secondes. Si on presse
sur le poussoir, le moteur est bloqué à l’arrêt. On voit bien la différence.
Moteur ralenti
Pour ralentir un moteur, on lui envoie des impulsions. Le PWM continuer
On a vu comment clignoter des Leds. En augmentant la fréquence, on peut commander un
moteur en ralenti. Mais on ne fait rien d’autre. Ralentir le moteur par des impulsions oblige de
travailler par interruption. On lance une routine d’interruption assez compliquée, puisqu’elle va
aussi surveiller le capteur de distance et le poussoir.
Trajectoires
avance (vitesse, angle) recule () tourneDroite ?? vitesse –7.. 0..7 tourne -7..0..7
ex de programme avance si obstacle recule etc
Le klakson
Un buzzer ou haut-parleur est commandé par une sortie du
microcontrôleur. Il faut savoir si un 1 ou un 0 fait coller la
membrane. Sur une sorties directe, on peut choisir, mais c’est
un 0 actif qui est préféré. Si le haut parleur est câblé sur une
sortie transistor, c’est un 1 car le transistor inverse. Le transistor
augmente considérablement le courant, donc le bruit.
Le programme KiCarSon.pde est simplement un clignotement
rapide. Dépéchez-vous de charger KiCarSonPous.pde qui ne
fait du son que si l’on presse sur le poussoir.
Le programme KiCarSirene.pde a été repris de la notice www.didel.com/kidules/KiPiDe.pdf ,
qui explique différents approches.
Capteur de télécommande infrarouge
Un IRM (InfraRed Module) a trois pattes et se branche
sur une prise servo redéfinie en entrée.
La routine KiCarZap.pde a faire surveille ce qui vient
en infrarouge et prend une décision tout-ou-rien, comme
si c’était un poussoir qui a des long rebonds pendant
que l’on pèse.
Le programnme KiCarTestIRM.pde a faire n’est pas
bloquant.il dure quelques millisecondes pendant
lesquelles il étudie comment le signal change, et il
active une variable s’il y a eu pression d’une touche
quelconque de la télécommande pendant une demiseconde.
Pour décoder les touches, il faut savoir quelle est le type
de la télécommande et c’est nettement plus compliqué.
photo
jdn 110423/110529
Programmes sur le .zip
KiCarDef.h
KiCarCliPhares.pde
KiCarCopieMot.pde
KiCarTestLdr.pde
KiCarWaitPous.pde
KiCarTestIrDist.pde
KiCarIn0.pde
KiCarSon.pde
KiCarSonPous.pde
KiCarSirene.pde
KiCarSireneLente.pde