L'électronique de l'interface PISCO se branche sur le port série du PC. Ce choix libère le port parallèle pour la caméra Audine. Il aurait aussi été possible de connecter l'interface sur le port d'extension de la caméra, mais ici encore il a été choisi de garder ce port libre pour d'autres applications. Bien sûr, l'interface peut fonctionner avec les ordinateurs portables.
Le choix de l'interface série peut apparaître au premier abord comme périlleux. Fort heureusement l'interface PISCO exploite le port série d'une manière telle qu'il est parfaitement inutile de régler les paramètres propres à cette interface et mieux encore, il est inutile de mettre en oeuvre un circuit complexe pour gérer le protocole de communication. En fait, l'interface série est détournée pour être utilisée comme un port parallèle : nous allons changer par logiciel l'état des broches de l'interface en modifiant les bits de certains registres. Mais, si avec le port parallèle, il est possible d'émettre des signaux vers le monde extérieur sur une étendue de 8 bits (sans compter certains signaux de commande), nous ne pourrons utiliser que 3 bits avec l'interface série. Mais c'est plus qu'il n'en faut !
Au prix d'une complication extrêmement raisonnable, l'interface a été pensée pour pouvoir en fin de compte offrir au moins 8 bits de commande, même si ces bits ne sont pas tous utilisés à l'heure actuelle. Voici leur attribution :
La plupart des PC disposent de deux ports séries désignés par COM1 et COM2. Pour connaître les adresses des ports sériels, ouvrez le Panneau de configuration à partir du menu Démarrer de Windows. Cliquez sur l'icône Système puis sur l'onglet Gestionnaire de périphériques. Déroulez la liste Port (COM & LPT). Cliquez sur COM1 puis sur l'onglet Ressources.
Parmi les nombreux registres d'un port série, seul 2 registres
sont directement utiles pour notre application. Si COM désigne l'adresse
de base, alors les registres utiles sont aux adresses COM+3 (registre de
commande) et COM+4 (registre de commande du modem). Pour information,
le port COM+6 (registre d'état du modem) donne accès à
des bits permettant de lire l'état des signaux présent sur
certaines broches du port série (pratique par exemple pour déterminer
la position des filtres dans une roue à filtres). Le tableau suivant
donne la correspondance entre les signaux disponibles sur un port série
et l'adresse des registres puis les bits qu'il faut modifier pour activer
ou lire les signaux. Rappelez-vous que le bit 0, dit bit de poids faible,
est le premier bit d'un mot de 8 bits. Le bit de poids fort de ce
mot de 8 bits est le bit 7.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Il existe deux types de connecteur pour le port série, soit un
DB9, soit un DB25. Dans tous les cas, le connecteur est du type mâle
côté PC. Voici le brochage de ces deux connecteurs :
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Le schéma complet de l'électronique est donné ci-après.
L'interface sérielle RS-232 utilise normalement des niveaux commutant entre +12V et -12V. Les diodes 1N4148 bloquent la tension négative qui pourrait être mortelle pour le circuit 74HCT595. Les résistances en série de 47K permettent d'obtenir la bonne tension de commande du 74HCT595. Plusieurs LEDs ont été ajoutées (elles sont optionnelles), alimentées au travers des résistances de 2.2K, afin de visualiser l'état des signaux. Il ne faut pas oublier de connecter la masse du port série (broche 5).
A la sortie du registre à décalage, les signaux QA, QB, QC et QD sont utilisés comme commande de 4 interrupteurs analogiques intégrés dans le circuit 4016. Ce sont les interrupteurs qui vont prendre le relais des boutons-poussoirs de la raquette. Ici les signaux à commuter sont supposés arriver depuis le télescope sur un connecteur DB15 désigné par D2 dans le schéma. Le brochage de ce connecteur est arbitraire, mais dans un souci de standardisation il est recommandé de le respecter si vous utilisez ce type d'interface. Remarquez que le signal QE n'est pas exploité ici, mais qu'il pourra l'être si vous êtes en mesure de commander la vitesse de commande de la raquette du télescope (S/F = Slow/Fast). Dans ce cas, il faudra ajouter un second circuit 4016. L'état des signaux de commande QA à QE est visualisé par des LEDs.
Attention, un circuit comme le 4016 ne permet de commuter que de faibles courants, de l'ordre de 1 mA. Il n'est pas question de s'en servir directement pour ouvrir ou fermer l'alimentation d'un moteur électrique ou de lampes à incandescence. Pour commuter des courants plus forts, disons 10 mA, vous pouvez faire appel à des interrupteurs analogiques du type MAX333, largement utilisés dans l'électronique de la caméra Audine. Pour des courants plus élevés encore il faut sélectionner un circuit intégré spécialisé dans la commande de puissance. Le ULN2803 fait partie de cette famille avec ses 8 sorties pouvant chacune alimenter des éléments consommant jusqu'à 500 mA sous 5V (ou 200 mA sous 12V), ce qui est bien suffisant pour piloter des relais par exemple.
Pour l'électronique de commande des montures Takahashi, le 4016 convient fort bien. En fin de compte le coût total de l'interface est extrêmement bas, moins de 100 F et sa simplicité vraiment réelle. Il suffit de quelques dizaines de minutes pour câbler tous les composants sur une carte de prototypage du type Veroboard ou DIP, voire quelques minutes si vous utilisez pour les essais une plaque d'expérimentation sans soudure.
L'alimentation électrique sera tout simplement réalisée avec une pile plate de 4,5V. Une pile alcaline peut tenir aisément 10 nuits entières avant de devoir être remplacée, la consommation du circuit étant très faible (surtout si vous supprimez les LEDs).
Pour programmer l'interface il nous faut donc produire trois signaux (DTR, RTS, TxD) en mettant à 1 ou à 0 les bons bits des bons registres. Il est opportun par ailleurs de ne modifier que l'état du bit qui nous intéresse et de laisser tels qu'ils sont les autres bits du registre. Les instructions suivantes, écrites en Visual Basic, mais très faciles à traduire dans d'autres langages, réalisent ses opérations élémentaires pour nos trois signaux.
'
------------------------------------------
'
Ecriture sur le port série
'
Signal DTR = broche 4 (connecteur DB9)
'
Bit 0 du registre 4
'
------------------------------------------
'
Pour mettre à zéro le signal DTR
r = outport(ComAdress+4,
inport(ComAdress+4) And &hFE)
'
Pour mettre à un le signal DTR
r = outport(ComAdress+4,
inport(ComAdress+4) Or 1)
'
------------------------------------------
'
Ecriture sur le port série
'
Signal RTS = broche 7 (connecteur DB9)
'
Bit 1 du registre 4
'
------------------------------------------
'
Pour mettre à zéro le signal RTS
r = outport(ComAdress+4,
inport(ComAdress+4) And &hFD)
'
Pour mettre à un le signal RTS
r = outport(ComAdress+4,
inport(ComAdress+4) Or 2)
'
------------------------------------------
'
Ecriture sur le port série
'
Signal TxD = broche 3 (connecteur DB9)
'
Bit 6 du registre 3
'
------------------------------------------
'
Pour mettre à zéro le signal TxD
r = outport(ComAdress+3,
inport(ComAdress+3) And &191)
'
Pour mettre à un le signal TxD
r = outport(ComAdress+3,
inport(ComAdress+4) Or 64)
La variable ComAdress contient l'adresse de base du port série (soit &h2F8, soit &h3F8).
Le format de l'instruction outport est : OUTPORT(ADRESSE, VALEUR), où VALEUR est le mot de 8 bits à écrire à l'adresse physique ADRESSE. Le format de l'instruction inport est VALEUR=INPORT(ADRESSE), où VALEUR est le mot de 8 bits lu à l'adresse physique ADRESSE.
Une difficulté potentielle de la programmation en Visual Basic est qu'il n'est pas possible dans le langage de base d'écrire ou de lire dans des adresses physiques (cette limitation n'existe pas en C). Les instructions outport et inport des exemples précédents ne font pas partie du langage. Ces instructions font appel à du code situé dans une DLL spécifique écrite en C. Voici le code source de ces commandes (pour une compilation en Visual C++) :
/*
OUTPORT : ECRITURE SUR UN PORT */
_declspec(dllexport)
short _stdcall outport(short adresse,short valeur)
{
outp(adresse,valeur);
return(0);
}
/*
INPORT : LECTURE SUR UN PORT */
_declspec(dllexport)
short _stdcall inport(short adresse)
{
return(inp(adresse));
}
et la déclaration des routines en Visual Basic :
Public Declare Function
outport Lib "AUDINE.DLL" (ByVal adresse As Integer, ByVal valeur
As Integer) As Integer
Public Declare Function
inport Lib "AUDINE.DLL" (ByVal adresse As Integer) As Integer
Notez que les fonctions outport et inport sont codées dans la DLL AUDINE.DLL (il s'agit d'une sorte de librairie de fonctions). Si vous ne disposez pas de compilateur C pour produire une DLL vous pouvez utiliser AUDINE.DLL pour vos applications. Elle se trouve dans le répertoire d'installation du logiciel PISCO.
Pour simplifier l'écriture du programme, 3 fonctions réalisent de manière transparente l'écriture dans les registres :
'
====================================
'
Ecriture port série
'
DTR = broche 4 (bit 0 du registre 4)
'
====================================
Sub WriteBit0(valeur
As Integer)
Dim r As Integer
If valeur = 0 Then
r =
outport(ComAdress + 4, inport(ComAdress + 4) And &HFE)
r =
outport(ComAdress + 4, inport(ComAdress + 4) And &HFE)
r =
outport(ComAdress + 4, inport(ComAdress + 4) And &HFE)
Else
r =
outport(ComAdress + 4, inport(ComAdress + 4) Or 1)
r =
outport(ComAdress + 4, inport(ComAdress + 4) Or 1)
r =
outport(ComAdress + 4, inport(ComAdress + 4) Or 1)
End If
End Sub
'
====================================
'
Ecriture port série
'
RTS = broche 7 (bit 1 du registre 4)
'
====================================
Sub WriteBit1(valeur
As Integer)
Dim r As Integer
If valeur = 0 Then
r =
outport(ComAdress + 4, inport(ComAdress + 4) And &HFD)
r =
outport(ComAdress + 4, inport(ComAdress + 4) And &HFD)
r =
outport(ComAdress + 4, inport(ComAdress + 4) And &HFD)
Else
r =
outport(ComAdress + 4, inport(ComAdress + 4) Or 2)
r =
outport(ComAdress + 4, inport(ComAdress + 4) Or 2)
r =
outport(ComAdress + 4, inport(ComAdress + 4) Or 2)
End If
End Sub
'
====================================
'
Ecriture port série
'
TxD = broche 3 (bit 6 du registre 3)
'
====================================
Sub WriteBit2(valeur
As Integer)
Dim r As Integer
If valeur = 0 Then
r =
outport(ComAdress + 3, inport(ComAdress + 3) And 191)
r =
outport(ComAdress + 3, inport(ComAdress + 3) And 191)
r =
outport(ComAdress + 3, inport(ComAdress + 3) And 191)
Else
r =
outport(ComAdress + 3, inport(ComAdress + 3) Or 64)
r =
outport(ComAdress + 3, inport(ComAdress + 3) Or 64)
r =
outport(ComAdress + 3, inport(ComAdress + 3) Or 64)
End If
End Sub
On reconnait dans ces 3 routines les instructions bas niveau qui changent l'état des bits. Vous avez sans doute remarqué que l'on écrit successivement 3 fois la même configuration binaire. C'est tout simplement pour ménager un délai d'attente de quelques millisecondes entre les instructions d'écriture afin d'être sûr que l'électronique de l'interface a bien pris en compte l'ordre émis par le logiciel. La perte de temps est totalement marginale.
A partir de ces fonctions de base il est dès lors simple de programmer l'interface télescope de PISCO. Par exemple pour fermer l'interrupteur commandant le déplacement suivant l'axe des déclinaisons et dans le sens négatif, il faut mettre à 1 le bit 3 du registre à décalage du 74HCT595. En VisualBasic cela donnera :
'
================
'
Déclinaison moins
'
(Bit 3)
'
================
Sub DecMoins()
Dim i As Integer
WriteBit2 0
' Latch à 0. Ceci évite que les changements
d'état des bits
' lors de la configuration du registre soient visibles de l'extérieur
'
On met à zéro tous les bits du registre
For i = 1 To 8
WriteBit0
0 ' On écrit 0 via DTR
WriteBit1
0 ' 8 impulsions
sur la Clock (horloge)
WriteBit1
1
Next
WriteBit1 0
WriteBit0
1 ' Ligne DTR à 1
WriteBit1 1
' Front montant de la Clock
WriteBit1 0
' Front descendant de la Clock. A ce stade notre
information binaire se situe dans le bit de poids faible du registre
WriteBit0 0
' On pousse d'un cran le bit dans le registre
WriteBit1 1
WriteBit1 0
' Notre information binaire est à présent
dans le bit 1 du registre
WriteBit0 0
' On pousse encore d'un cran
WriteBit1 1
WriteBit1 0
WriteBit0 0
' On pousse encore d'un cran
WriteBit1 1
WriteBit1 0
' Notre information est à présent correctement
positionnée dans le registre
WriteBit2 1 ' Latch à 1, la programmation du registre à décalage est à maintenant visible du monde extérieur (broche QD)
End Sub
La dernière difficulté avec cette interface concerne l'initialisation. Avant de pouvoir jouer avec la raquette virtuelle et brancher l'interface sur le télescope il est impératif d'initialiser le port série et de mettre tous les bits du registre à décalage dans un état précis (tous à zéro). C'est la raison d'être du bouton d'initialisation que vous trouvez à l'onglet Télescope du logiciel PISCO. Lorsque vous cliquez sur le bouton d'initialisation, vous lancez le code suivant :
'
====================================
'
Initialisation du port série
'
Impulsion sur le bit 3 du registre 4
'
====================================
Sub InitCom()
Dim r As Integer
Dim i As Integer
r = outport(ComAdress
+ 4, 0)
r = outport(ComAdress
+ 4, 0)
r = outport(ComAdress
+ 4, 0)
r = outport(ComAdress
+ 4, 8)
r = outport(ComAdress
+ 4, 8)
r = outport(ComAdress
+ 4, 8)
r = outport(ComAdress
+ 4, 0)
r = outport(ComAdress
+ 4, 0)
r = outport(ComAdress
+ 4, 0)
'
On vide le registre à décalage
WriteBit2 0 ' Latch
à 0
For i = 1 To 8
WriteBit0
0 ' On écrit 0
WriteBit1
0 ' 8 impulsions sur la Clock
WriteBit1
1
Next
WriteBit1 0
WriteBit2 1 '
Latch à 1
End Sub
Pour trouver l'ensemble du code des fonctions gérant l'interface
cliquez ici. Vous constaterez que les instructions
pour modifier la vitesse de rattrapage ou pour ajuster la focalisation
sont incluses, mais non exploitées dans l'interface électronique
actuelle. Si vous en sentez le besoin, le schéma électronique
peut être modifié très simplement, par exemple par
l'ajout d'un 4016 exploitant les sorties non utilisées du 74HCT595.
Le code est entièrement opérationnel dans PISCO, par exemple
au travers des boutons de focalisation dans l'onglet Télescope.
Retour