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 2. L'entrée "+" étant connectée (en interne) à la tension de référence programmable (via les variables Vref et Vrange), l'état de la sortie du comparateur restera à l'état "haut" tant que la tension aux bornes du condensateur sera inférieure à la tension de référence.

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 0.6 mm. Son utilisation nécessite donc l’outillage et le savoir-faire appropriés.

 

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

       Serial.WriteBytes Range, 1           ‘ and send it

        

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