Dispositif de réponse potentiométrique pour Eprime
Divers périphériques (clavier,
souris, etc…) permettent aisément de saisir la réponse d’un sujet au cours
d’une expérience réalisée avec Eprime. Mais lorsqu’on veut que le sujet réponde
en actionnant une « manette » avec un feedback à l’écran, la première idée
qui survient est évidemment le « joystick ».
Mais il nous fallait
trouver une solution qui, à la fois, soit compatible avec Eprime, simplifie le
plus possible la tâche de l’expérimentateur qui doit programmer son expérience,
et qui puisse se brancher sur tous les ordinateurs de la faculté.
Nous avons donc opté pour
un système « sur mesure », qui offre toutes ces qualités, avec un
maximum de souplesse pour l’adapter, le cas échéant, à d’autres applications.
Description:
Notre système de réponse se présente sous la forme d’un petit boîtier doté d’un potentiomètre et d’un bouton poussoir.
Un câble USB permet de le
connecter au pc aussi simplement qu’une souris.
Une fois installé, le
module peut dialoguer avec le pc au travers d’une liaison série : le port
« Com », émulé par le pilote USB.
Figure 1
A l’intérieur du boîtier,
une interface USB assure la liaison avec le PC.
Un microcontrôleur se charge
de mesurer la position du potentiomètre, d’enregistrer l’état du bouton
poussoir et de dialoguer avec l’application PC.
Un protocole de
communication très simple a été implémenté. Le module reconnait les commandes
sous forme de caractères ASCII prédéfinis et envoie sa réponse au pc.
Le système peut être interrogé
et calibré à partir d’un terminal télétype ou toute application pc ayant accès aux
ports « Com » du système. Le bon vieux programme « Terminal »
convient parfaitement à cet usage.
Une fois les réglages effectués,
les paramètres peuvent être sauvegardés dans le module lui-même, plus
précisément, dans l’eprom du microcontrôleur. Ils seront relus par le module à
chaque démarrage.
Mesure de la position du potentiomètre:
Le principe utilisé pour
la mesure est assez simple. Afin de numériser la position du potentiomètre,
celui-ci est inséré dans un dipôle RC (R+Rp et C sur la figure 2). Le temps de
charge de la capacité étant une constante (τ=RC), une relation linéaire entre
la valeur de la résistance et le temps mis par la capacité pour atteindre une
tension déterminée permet au microcontrôleur d'effectuer un
"comptage" temporel.
Figure 2
La fermeture du switch S, permet de décharger complètement le condensateur. Une tension de référence fixée par le pont diviseur R1,R2 étant appliquée à l'entrée "+" du comparateur, la tension proche de 0 à son entrée "-" sature la sortie de ce dernier. Lorsque S est ouvert, la capacité C se charge au travers de R et de Rp. Dès que la tension aux bornes de C atteint la valeur de la tension de référence, la sortie du comparateur bascule.
On peut vérifier que la relation entre la position du potentiomètre et le temps mesuré est bien linéaire. Dans notre schéma, nous avons placé une résistance en série avec le potentiomètre, afin de rester dans des limites de courant raisonnables. Le temps mis par la capacité pour atteindre 63% de sa charge complète est donné par l'équation (1):
(1)
Dans le cas présent, nous
voulons connaître le temps qui lui est nécessaire pour atteindre une tension
donnée. L’équation (2) nous donne la valeur instantanée de la tension :
(2)
nous pouvons donc en
déduire le temps nécessaire à la capacité pour atteindre la tension de seuil
(fixée par le pont-diviseur R1,R2 de la figure 2) qui fera basculer la sortie
du comparateur :
(3)
En combinant (1) et (3), nous avons:
Soit , le facteur constant,
(4)
Lorsque Rp=0, l’équation
(4) devient:
On en déduit que
Il y a bien une fonction linéaire
qui lie Rp à t, et qui va
nous permettre de "situer" la position angulaire du potentiomètre,
pour autant que celui-ci soit lui-même « linéaire », évidemment.
La figure 3 montre
l'évolution de la tension aux bornes de C pour 6 positions équidistantes du
potentiomètre (Rp).
Figure 3
Fonctionnement:
Pour cœur de cette
application, nous avons choisi le 16F628 de Microchip. Sa tension de référence
programmable et l'un de ses deux comparateurs intégrés nous feront économiser
quelques composants additionnels et son port série intégré simplifiera le code
du programme enfoui.
Figure 4
Pour décharger préalablement le
condensateur, la broche 18 (RA1) du microcontrôleur est configurée en sortie
digitale et mise à 0. Au démarrage d'une conversion, et après un délai
suffisant, cette même broche est reconfigurée comme entrée "-" du
comparateur
Le condensateur commence
donc sa charge, mais le comptage ne commencera qu'après un délai d'attente
défini par une constante correspondant à t0 (fig.2). C'est ce délai
qui permettra de fixer la valeur "0" du potentiomètre et nous évitera
des valeurs négatives par la suite. Le comptage peut alors commencer. Une
boucle teste à chaque passage, l'état de la sortie du comparateur et incrémente
un registre de 16 bits.
Lorsque la tension de charge a atteint la valeur de la tension de référence, la sortie du comparateur 2 bascule à l'état "bas". La valeur du compteur peut alors être utilisée pour déterminer la position du potentiomètre.
Afin d'éviter toute oscillation
entre deux valeurs voisines lorsque le potentiomètre est positionné sur la
frontière entre deux plages, le programme crée un effet d'hystérésis en
comparant chaque valeur obtenue avec la précédente. La différence entre ces
deux valeurs nous permettant de déduire le sens de rotation du potentiomètre.
La valeur obtenue sera ensuite divisée par deux, successivement, de façon à la coder conformément au nombre de bits choisi par l'utilisateur. Un minimum de 2 bits subdivise la course du potentiomètre en 4 secteurs (0 à 3) et un maximum de 8 bits en 255 valeurs (0 à 254), la valeur 255 étant réservée au bouton poussoir.
Lorsque le bouton-poussoir est pressé. Un flag "keypress" est mis à 1. Lorsque le pc fait une demande de position, le système teste l'état de ce flag. S'il vaut 0, il envoie la valeur "255" et remet le flag à 0. Sinon, il envoie la dernière position mesurée.
Réglage de la tension de référence:
Vr |
Vref(V) (VRange=0) |
Vref(V) (VRange=1) |
0 |
1.25 |
0.00 |
1 |
1.41 |
0.21 |
2 |
1.56 |
0.42 |
3 |
1.72 |
0.62 |
4 |
1.87 |
0.83 |
5 |
2.03 |
1.04 |
6 |
2.18 |
1.25 |
7 |
2.34 |
1.46 |
8 |
2.50 |
1.66 |
9 |
2.67 |
1.87 |
10 |
2.81 |
2.08 |
11 |
2.97 |
2.29 |
12 |
3.12 |
2.50 |
13 |
3.28 |
2.70 |
14 |
3.44 |
2.92 |
15 |
3.59 |
3.12 |
Afin de calibrer le
système, le réglage de la tension de référence a été rendu accessible à
l'utilisateur par l'intermédiaire de deux variables:
·
VRange (0 ou 1) qui permet de
sélectionner l'une des deux plages de tension.
· Vr (0 à 15) qui fixe la valeur de cette tension à l’intérieur de la plage sélectionnée.
La valeur de la tension de référence répond aux équations suivantes:
Si
VRange=0:
Si
VRange=1:
Le tableau ci-dessus
donne les valeurs théoriques calculées pour Vdd=5V.
L'interface USB:
Pour interfacer ce
système de réponse avec un pc, l'interface USB était incontournable. Elle est
présente sur tous les équipements, des plus récents aux plus anciens (encore en
activité), ce qui n’est plus le cas des ports « série ».
Le choix du FT232RL de FTDI s'est
rapidement imposé à plusieurs titres. D'abord, son émulation de port de
communication série simplifie énormément l'intégration du dispositif dans des
applications Windows comme Eprime. Son eprom intégrée permet, sans adjonction
de circuit supplémentaire de lui attribuer un nom et un numéro de série. Ceci
peut s'avérer bien utile lors du processus d'énumération des périphériques USB.
Son oscillateur programmable
que nous avons défini à 12 MHz et envoyé sur le port CBUS2 (broche 13) est
directement utilisé pour cadencer le microcontrôleur. Connecté à la broche 16
(OscIn) de ce dernier, il permet de faire l'économie des composants habituels
(quartz et condensateurs en "H").
Seul inconvénient, qui
serait certainement son atout majeur en d’autres circonstances : son
extrême miniaturisation… la photo ci-dessus est à l’échelle 2/1 ! Son
boîtier, qui n’existe qu’en format CMS SOP28 fait moins d’1 cm et l’espace
entre deux broches n’est que de
Programmation de l'interface USB:
Une interface Windows, « MProg »,
téléchargeable sur le site de FTDI à l'adresse http://www.ftdichip.com/Resources/Utilities.htm,
permet de programmer le FT232RL.
Nous l’utiliserons pour
fixer les paramètres suivants :
·
Manufacturer :
« UCL-IPSP »
·
Product
Description : « Sys de rép 1 pot + 1 bouton »
·
Fixed
Serial Number : un numéro par module fabriqué
·
USB
Power Options :
o
Bus Powered (l’option par défaut
étant « Self Powered »)
o
Max
Bus Power : 90 mA
·
I/O
Controls :
o
C2 :
CLK12 (indique qu’un clock de 12 MHz sera dirigé sur CBUS2)
Les autres paramètres
garderont leurs options par défaut.
Le protocole de communication :
Afin de paramétrer le
système et de lui permettre de communiquer avec le pc, un protocole très simple
à été implémenté. Des commandes, codées sur un octet, sont envoyées du pc vers
le module via le port « com » du pc. Les codes des commandes
spécifiques à la procédure de calibration ont été choisis pour donner à l’utilisateur
la possibilité d’effectuer celle-ci avec une application de type
« terminal ». Les commandes pourront être entrées directement au
clavier et le module renverra un feedback sous forme de chaînes de caractères
lisibles à l’écran.
Code ASCII |
Signification |
Réponse du module |
8 |
Fixer la plage du
potentiomètre de 0 à 7 |
aucune |
16 |
Fixer le plage du
potentiomètre de 0 à 15 |
aucune |
32 |
Fixer le plage du
potentiomètre de 0 à 31 |
aucune |
64 |
Fixer le plage du
potentiomètre de 0 à 63 |
aucune |
128 |
Fixer le plage du
potentiomètre de 0 à 127 |
aucune |
255 |
Fixer le plage du
potentiomètre de 0 à 255 |
aucune |
'r' |
Passer à la plage inférieure
du potentiomètre |
Renvoie une chaine de
caractères avec les paramètres actualisés. Exemple: « K=68
Vr=6 Vrange=0 Range=8 » |
'R' |
Passer à la plage supérieure
du potentiomètre |
idem |
'-' |
Décrémenter Vr (Vref) |
idem |
'+' |
Incrémente Vr (Vref) |
idem |
'(' |
Fixer Vrange à 0 (plage
Vref) |
idem |
')' |
Fixer Vrange à 1 (plage
Vref) |
idem |
'k' |
Décrémenter K |
idem |
'K' |
Incrémenter K |
idem |
's' |
Lister les paramètres
en RAM |
idem |
'S' |
Sauvegarder les
paramètres en eeprom |
idem |
'=' |
Lister les paramètres
et la position du pot. |
Renvoie une chaine de
caractères contenant les valeurs décimales H et L du registre du compteur et
la position calculée du pot. Ex:
« 001 243 <127>
K=68 Vr=6 Vrange=0
Range=8 » |
'v' |
Demander la version du
microcode |
« UCL-IPSP Pot
V1.20 » |
'g' |
« get » :
demande de position du potentiomètre |
Renvoie un octet 0 à 254 : position
du potentiomètre 255 : la touche à été
pressée |
Utilisation avec Eprime :
Parmis les différentes
commandes décrites plus haut, seules deux d’entre-elles sont utilisée en
fonctionnement normal sous Eprime:
·
La
première consiste à initialiser le module en lui spécifiant le nombre de
secteurs qu’il doit attribuer à la course totale du potentiomètre (8, 16, 32,
64, 128 ou 255).
·
La
seconde consiste à interroger le module pour connaître la position du
potentiomètre.
Mais avant toute chose,
il est nécessaire d’ajouter un « serial » dans la liste des « device »
utilisés par votre expérience et d’en fixer les paramètres suivants :
ü
COM
Port : x (x est une valeur de 1 à 4 voir plus loin)
ü Bits
per second : 19200
ü Data
bits : 8
ü Parity
: none
ü Stop
bits : 1
Le numéro du port
« com » doit correspondre avec celui attribué par le système au
module. Pour le connaître, il faut aller dans « Propriétés
système/Matériel/Gestionnaire de périphériques/Ports(COM et LPT). Le device
« USB Serial Port (COM3)» devrait apparaitre. Il est possible de le
modifier via ses propriétés avancées. Attention cependant à ne pas créer de
conflit avec un dispositif qui serait en fonction (modem, par exemple).
Voici deux exemples de
scripts Ebasic :
Exemple 1 - Initialiser le potentiomètre :
Dim
Range(1) As Integer
Range(0)=255 ‘ fix to 255 sectors
Exemple 2 – Enregistrer la position du potentiomètre:
Dim Data(1) As Integer ‘serial
output buffer
Dim nRead As Long ‘serial
input buffer
Dim l As Long
Dim RS as Long
Data(0)=103 ‘send
a "g" to the module
Serial.WriteBytes Data, 1
l=0
Do
nRead = Serial.ReadBytes(Data,1)
l=l+1
if l>1000 then Exit Sub
Loop While (nRead = 0) ‘wait
for a answer
if Data(0) < 255 then ‘not
a keypress
c.SetAttrib "text",
str(Data(0)) ‘put the value in the
context var “text”
goto Label1 ‘ jump
to feedback screen
end
if
Caractéristiques:
· Course totale du potentiomètre : 280°
· 1 bouton poussoir de validation
· Connexion au PC: USB compatible avec les normes 1.0 et 2.0
· Emulation "Port Com" via le pilote FTDI
· Vitesse de transmission : 19.2 kBauds
· Format des données séries: sans parité, 8bits, 1 stop bit (n,8,1)
· Alimentation 5V via le port USB
· Consommation: inférieure à 90mA
Bibliographie :
Pic16F62X datasheet, MicroChip International, 2003
FT232R USB UART IC Datasheet v1.04, Future Technology Devices International Ltd, 2005