SCHEMA ELECTRIQUE & PROGRAMMATION DE L'INTERFACE TELESCOPE DE PISCO

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 :

Il est à noter que le câblage de la raquette des montures Takahashi ne permet pas de modifier la vitesse de rattrapage via l'ordinateur. Vous devez choisir avec l'interrupteur prévu à cet effet, soit la vitesse rapide, soit la vitesse lente (pour la plupart des applications vous choisirez la vitesse rapide car les durées de commande de la raquette produites par PISCO peuvent être très brèves).

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.

A la rubrique Plage d'entrée/sortie vous relevez la plage d'adresses des divers registres du port sériel COM1 (en hexadécimal). Pour le port COM2, s'il est présent, vous trouverez une autre plage. La première adresse d'une plage s'appelle l'adresse de base. Dans l'exemple ci-dessus l'adresse de base est 03F8. Pour le second port vous trouverez pratiquement à coup sûr 02F8 si l'adresse de COM1 est 03F8, et vice-versa. Le plus souvent l'un de ces ports est utilisé pour la souris, l'autre est disponible pour l'interface PISCO.

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.
 

Signal
Entrée/Sortie
Registre
Bit
TxD
S
COM+3
6
DTR
S
COM+4
0
RTS
S
COM+4
1
CTS
E
COM+6
4
DSR
E
COM+6
5
RI
E
COM+6
6
DCD
E
COM+6
7
 
Par exemple pour positionner à 1 le signal RTS vous devez mettre le bit 1 du registre COM+4 au niveau haut.

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 :
 

Brochage DB9
Brochage DB25
Signal
3
2
TxD
2
3
RxD
7
4
RTS
8
5
CTS
6
6
DSR
5
7
GND
1
8
DCD
4
20
DTR
9
22
RI
 
 

Le schéma complet de l'électronique est donné ci-après.
 

Le principe de l'interface repose sur un registre à décalage 74HCT595 qui convertit l'information sérielle en une information parallèle (jusqu'à 8 bits parallèles). Le connecteur du port série est appelé D1. On a choisi une désignation des broches correspondant à un connecteur DB9, le plus courant sur les PC portables. Les bits de données sont émis par la broche DTR sur la broche SI du 74HCT595.  Le premier bit chargé dans le registre est celui de poids faible. Le signal RTS constitue une horloge qui commande la propagation du bit de donnée au sein du registre à décalage. Par exemple pour configurer à 1 le bit 3 du registre à décalage (correspondant à la broche de sortie QD du 74HCT595), il faut commencer par mettre au niveau haut le signal DTR, puis envoyer 4 coups d'horloges RTS qui correspondent à 4 décalages dans le registre. Bien entendu, entre chaque décalage il est possible de modifier l'état du signal DTR afin d'écrire à loisir une succession de 1 et de 0 dans le registre. Lors de la phase d'écriture dans le registre à décalage il faut que le signal TxD soit au niveau bas. Pour que la configuration binaire chargée dans le registre soit effectivement visible (broches QA... QH), il suffit de monter le signal TxD au niveau 1. On appelle cela un latch. Le principe du latch évite de se retrouver avec une configuration indéterminée lors du remplissage du registre à décalage, ce qui pourrait provoquer des mouvements erratiques de la monture (le temps de chargement du registre est cependant très bref, bien plus bref que le temps de réaction de la monture, mais deux précautions valent mieux qu'une).

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).

Vous devez veiller à respecter le sens de câblage des diodes électroluminescentes (LED). Cette figure devrait vous aider.

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.

S'il est nécessaire de commuter de forts courants le mieux est de faire appel à des relais bobinés commandés par un circuit ULN2803. Cet ensemble remplace alors le circuit 4016. Dans notre application le signal S0 serait par exemple le signal QA du 74HCT595, le signal S1 correspondrait à QB, et ainsi de suite. Notez que la tension d'alimentation à adopter est liée au type de relais utilisé. Notez encore que le ULN2803 inverse le niveau logique des signaux appliqués aux entrées et qu'il possède des diodes internes de protection qui en font un circuit particulièrement apte à commander des relais.

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.

Les essais de l'interface télescope d'Audine sur une plaque de montage sans soudure. C'est un peu touffu mais cette technique permet de réaliser le montage en un tournemain. En bas le 74HCT595, en haut le 4016. Quelques LEDs permettent de s'assurer rapidement que l'interface répond bien. Notez les deux connecteurs : un DB9 vers l'interface série et un DB15 vers le télescope via un câble intermédiaire réalisant la conversion pour les prises raquette du matériel Takahashi.

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