Electronique > Réalisations > Interfaces > Interface série RS232 001

Dernière mise à jour : 08/05/2011

Présentation

Cet article décrit une interface de puissance 32 voies que j'ai spécialement conçue pour interfacer un port série RS232 avec des lampes 230 V, ces dernières étant pilotées par mon logiciel séquenceur ProgSeq. Cette interface 001, contrairement à l'interface 001b, possède un microcontrôleur qui lui confère un usage assez universel, puisqu'il suffit de lui envoyer cinq octets pour décider des sorties qui doivent être activées (détails plus loin). D'un point de vue gestion des données série, le procédé utilisé ici est fort similaire à celui employé dans ma télécommande 002.

Schéma

Schéma complet de l'interface RS232, mais sans la partie puissance.

interface_rs232_001

Principe général de fonctionnement
L'interface réceptionne l'état des 32 sorties du séquenceur ProgSeq selon une transmission série, effectuée au travers d'une liaison de type RS232 (port COM1, COM2 ou autre sur le PC). Les données reçues sont traitées par un PIC, qui assure une "traduction" des données reçues et qui les envoie ensuite dans des registres à décallage de type CD4094. Ces derniers jouent le rôle de convertisseurs série / parallèle, permettant ainsi de récupérer l'état de chaque sortie sur des sorties électriques individuelles. Afin d'éviter tout "scintillement" des sorties pendant les transferts de données, les registres sont "bloqués" via une liaison STROBE (STR), qui valide la prise en compte des données quand l'état des 32 sorties a été intégralement transféré depuis le PIC.

Interface RS232
Les signaux véhiculés par la liaison série RS232 présentent des amplitudes de l'ordre de -12V et +12V, et on a recours ici à un circuit spécialisé d'interface du type MAX232 pour faire la transition avec les niveaux logiques TTL 0V / +5V.

max232_001a

A noter que l'usage d'un MAX232 n'a rien d'obligatoire et que l'on peut employer des transistors tout bêtes (bipolaires ou FET style 2N3819) pour faire l'adaptation de niveau.

interface_rs232_001_entree_fet

Surtout ici où il s'agit uniquement de travailler avec deux signaux de réception (plus facile que pour les signaux RS232 à émettre). Notez que la broche 3 du connecteur Sub-D9 RS232 est la broche d'où partent les données côté PC, et que ces données arrivent sur la broche 2 du connecteur côté PIC. Il vous faudra donc utiliser un câble de liaison croisé. Si vous êtes allergique aux câbles croisés, il vous suffit de réceptionner les données émises par le PC sur la broche 3 du connecteur côté PIC. Après tout vous êtes maître de vos liaisons, faîtes comme vous le sentez.

Format des données attendues
(en entrée du PIC)
Le format de la trame de données que le PC (ou autre système) doit envoyer au PIC doit être composé de cinq octets qui se suivent, selon les paramètres indiqués ci-après.
Paramètres de communication
- Vitesse 9600 bauds
- 8 bits Données
- 1 bit Stop
- Aucune parité
- Aucun contrôle de flux (ni matériel, ni logiciel)
Contenu de la trame
Une trame comporte cinq octets.
- Le premier octet de la trame indique le type des données contenues dans les octets qui suivent. Cet octet porte actuellement la valeur $02, et indique que les données reçues doivent être traitées immédiatement. Je prévois en effet dès maintenant la possibilité de stocker dans la mémoire du PIC un ensemble d'états, qui pourront être rejoués de façon autonome (chenillard sans connexion au PC). Les données reçues pour stockage en EPROM débuteront par un octet d'entête différent.
- Les quatre octets suivant contiennent l'état des 32 sorties, en 4 groupes de 8 sorties : le deuxième octet de la trame concerne l'état des sorties 1 à 8, et le cinquième octet concerne l'état des sorties 25 à 32.

Signal de validation et prise en compte des données reçues
Afin de minimiser le risque d'activation de mauvaises sorties lié à la réception de données erronnées, le logiciel du PIC inclue deux méthodes de validation des données reçues.
- validation par signal électrique encadrant les données reçues;
- validation par ouverture d'une fenêtre temporelle d'autorisation de traitement des données reçues.

Validation par signal électrique encadrant les données reçues
la ligne RTS (Ready ToSend) de la liaison série (côté PC) doit être activée avant l'envoi des cinq octets, et doit être désactivée juste après. Selon le câblage de votre cordon de liaison (il en existe une multitude de sortes possibles), le point du connecteur RS232 qui devra être utilisé côté PIC sera la broche 1 (DCD), la broche 7 (RTS) ou la broche 8 (CTS). En cas de doute avec votre cordon (surtout s'il s'agit d'un cordon moulé acheté dans le commerce), il faudra jouer du contrôleur de continuité si le câblage n'est pas indiqué. Bien que cela soit déconseillé, le signal de validation peut être ignoré si votre cordon de liaison RS232 n'est pas entièrement câblé et que le signal RTS n'arrive pas au PIC. Pour cela, il suffit de mettre en place le cavalier JP1/Mode de sorte que l'entrée RB2 du PIC soit porté à l'état logique bas (signal [En] non requis). En temps normal ce cavalier ne doit pas être mis en place (RB2 à l'état logique haut via la résistance R2 câblée au +5 V, signal [En] requis).
Remarque : en mode de transmission "COM32", le logiciel ProgSeq envoie le signal de validation sur la broche RTS. Cette ligne de contrôle RTS est activée juste avant l'envoi des 5 octets et est désactivée juste après. Sur certains ports virtuels (obtenus par exemple avec une interface USB/RS232), les données sont parfois transmises avec un peu de retard par rapport à l'ordre d'envoi, ce qui peut être perturbant pour l'interface qui dans ce cas peut voir la ligne de contrôle RTS retomber avant que la totalité des données ne soit transmise. Pour cette raison, le logiciel ProgSeq permet désormais de spécifier un petit retard (de quelques ms) entre fin de transmission des données et désactivation du signal de validation.

Validation par ouverture d'une fenêtre temporelle d'autorisation de traitement des données reçues
Une fenêtre d'autorisation des données reçues est ouverte à la condition qu'aucune donnée n'ait été reçue pendant au moins 15 ms, et que le dernier octet reçu ait la valeur $02. A partir de cet instant, le logiciel n'accepte que les quatre octets suivants, qui doivent arriver dans un laps de temps maximal de 15 ms. A titre d'info, il faut environ 6 ms pour transmettre 5 octets à la vitesse de 9600 bauds. La fenêtre d'ouverture est fermée après réception des cinq octets attendus.

Conversion série / parallèle
(en sortie du PIC)
Elle est assurée par les quatre registres à décallage CD4094 montés en cascade. Les données représentatives de l'état des 32 sorties sont véhiculées sur la ligne DATA, et arrivent en premier lieu sur la broche D du premier registre (borne 2). La mise en série des registres s'effectue en reliant la sortie QS d'un registre à l'entrée DATA du registre suivant. Cette façon de faire conduit à obtenir un fonctionnement tel que celui que l'on aurait avec un seul registre à décallage de 32 sorties. L'entrée CLK reçoit les données d'horloge qui vont faire avancer d'un cran l'état logique qui été présenté à l'entrée D du premier registre le coup d'horloge précédent. Ainsi, l'état logique présenté au premier coup d'horloge sur l'entrée DATA, va se retrouver sur la sortie O5 au bout de 5 coups d'horloge, et va se retrouver sur la sortie O27 au bout de 27 coups d'horloge. Le dernier état logique présenté sur l'entrée DATA du premier registre à décallage va ainsi se retrouver sur la sortie O1. Lors du transfert des données, il convient donc de transmettre en premier l'état logique de la sortie O32, puis ensuite l'état logique de la sortie O31, puis celui de la sortie O30, etc., pour finir par la transmission de l'état logique de la sortie O1. Pendant le transfert des données (état des 32 sorties), les sorties des registres sont verrouillées sur les anciennes valeurs. Les nouvelles valeurs ne sont appliquées que lors de l'envoi d'une impulsion sur la ligne STROBE.
Pour résumer :
- La ligne DATA véhicule l'état des 32 sorties, les unes après les autres;
- La ligne CLOCK permet aux registres à décallage de transmettre ces états sur les lignes de sorties, les unes après les autres;
- La ligne STROBE n'est utilisée qu'après envoi de l'état des 32 sortie, pour indiquer aux registres qu'ils peuvent prendre en compte les nouveaux états.

Interface de puissance
Non représentée sur le premier schéma, elle pourra prendre la forme de l'interface décrite à la page Interface de puissance 5V / 230V 001, multipliée en autant de fois que nécessaire (4 blocs de 8 voies).

interface_lpt_002c

Pour un fonctionnement impeccable de l'interface de puissance, vous pouvez aussi inclure un réseau de transistors darlington ULN2803 entre les sorties commande et les entrées des optotriacs. Le câblage est un poil différent car on attaque les leds des optotriacs par leru cathode et non plus par leur anode, mais ça ne change rien et ça ne coute qu'un seul petit CI supplémentaire.

interface_lpt_003

Voir aussi les pages Interface port parallèle 001 et Interface port parallèle 003 (deuxième lien conseillé) pour des exemples de mise en forme pratique.

Trames de données attendues par le PIC

Si cette interface est destinée à être utilisée avec mon logiciel séquenceur ProgSeq, vous n'avez pas besoin de connaitre les détails concernant la structure de la trame. Mais si vous souhaitez utiliser l'interface dans un autre contexte, les exemples suivants devraient vous aider à comprendre ce qu'il faut envoyer au PIC pour qu'il réponde correctement à vos commandes. En tout état de cause, je vous invite à consulter la page Les nombres en informatique si vous n'êtes pas encore bien habitué à passer du monde binaire au monde décimal ou hexadécimal.

Exemple N° 1
On veut activer immédiatement les sorties 1 à 8, 13 à 16 et 26 à 28. Chaque groupe de huit sorties correspondant à un octet, il convient au préalable de convertir la valeur binaire qui correspond à l'état des quatre groupes de huit sorties, en code hexadécimal. Connaissant les sorties à activer, on en déduit les valeurs binaires et hexadécimale suivantes, en mettant à 1 les sorties qui doivent être activées et en mettant à 0 les sorties qui ne doivent pas l'être :


Entête
trame
Groupe sorties N° 1
(sorties 1 à 8)
Groupe sorties N° 2
(sorties 9 à 16)
Groupe sorties N° 3
(sorties 17 à 24)
Groupe sorties N° 4
(sorties 25 à 32)
en binaire 00000010 11111111 00001111 00000000 01110000
en hexa $02 $FF $0F $00 $70

La trame à envoyer - incluant l'entête - est donc : 02 FF 0F 00 70

Remarque : pour chaque groupe de huit sorties, la sortie dont le numéro est le plus faible correspond à l'état binaire le plus "à gauche" de la série de huit bits (ce qu'on appelerait le MSB - bit de poids ford - en temps normal). Par exemple pour le groupe de sorties N° 2, l'activation de la seule sortie N° 9 s'écrit "10000000" (valeur hexa $80), et l'activation de la seule sortie N° 16 s'écrit "00000001" (valeur hexa $01).

Exemple N°2
On veut activer toutes les sorties paires et désactiver les sorties impaires. Dans ce cas, on a ceci :


Entête
trame
Groupe sorties N° 1
(sorties 1 à 8)
Groupe sorties N° 2
(sorties 9 à 16)
Groupe sorties N° 3
(sorties 17 à 24)
Groupe sorties N° 4
(sorties 25 à 32)
en binaire 00000010 01010101 01010101 01010101 01010101
en hexa $02 $55 $55 $55 $55

La trame à envoyer - incluant l'entête - est donc : 02 55 55 55 55

Et si on veut faire l'inverse, c'est à dire activer toutes les sorties impaires et désactiver les sorties paires, on a ceci :


Entête
trame
Groupe sorties N° 1
(sorties 1 à 8)
Groupe sorties N° 2
(sorties 9 à 16)
Groupe sorties N° 3
(sorties 17 à 24)
Groupe sorties N° 4
(sorties 25 à 32)
en binaire 00000010 10101010 10101010 10101010 10101010
en hexa $02 $AA $AA $AA $AA

La trame à envoyer - incluant l'entête - est donc : 02 AA AA AA AA

Prototype

Interface testée avec un PIC programmé avec le code adéquat et pilotant le circuit d'affichage leds 005, le tout piloté par le logiciel séquenceur ProgSeq.

afficheur_leds_7seg_005_proto_001s afficheur_leds_7seg_005_proto_001m afficheur_leds_7seg_005_proto_001t

Ca fonctionne au poil et les enfants adorent jouer avec les figures du logiciel ProgSeq. De ce point de vue ils ont plus d'imagination que moi.

Logiciel du PIC

Le programme compilé binaire au format (*.hex), ainsi que les fichiers de code source (format MikroPascal Pro V3.80) sont disponibles dans l'archive suivante.
Interface serie 001 - 16F628A (version du 04/05/2011)
Remarque : vous trouverez dans l'archive deux fichiers compilés *.hex. Un prévu pour tourner avec un quartz 4 MHz et l'autre prévu pour tourner avec un quartz 8 MHz. Mes tests n'ont pas été intensifs, mais il me semble avoir observé un ou deux ratés d'affichage avec la version à 4 MHz. Difficile à dire car ce n'était pas flagrant et pouvait aussi venir du port série du PC envoyant les commandes. En tout état de cause, je conseille la version 8 MHz.
Si vous souhaitez recevoir par la poste un PIC préprogrammé et prêt à utiliser, merci de consulter la page PIC - Sources.

Circuit imprimé

Non réalisé.

Corrections et remarques

08/05/2011
- Remise en place des bons fichiers dans l'archive zip du logiciel du PIC. Contrairement à ce que j'indiquais dans le texte, l'archive ne comportait pas les deux versions de fichiers compilés pour quartz 4 MHz et 8 MHz, et les fichiers étaient ceux d'une version antérieure. Je rappelle que la version 8 MHz est conseillée.
01/08/2010

- Portage du code en MikroPascal Pro V3.80.
- Correction erreur indexage des sorties par rapport aux données envoyées par le logiciel ProgSeq. La sortie appelée "sortie 1" dans le logiciel ProgSeq ne correspondait pas à la sortie appelée "O1" de l'interface RS232 mais à la sortie appelée "O8". L'erreur n'était pas très grave dans le sens où on remettait les pendules à l'heure en faisant pivoter de 180 degrés les connecteurs 8 points des quatre blocs de sortie. Mais il me semble tout de même mieux d'avoir une correspondance "aux normes". Attention, la correction est apportée au niveau du logiciel du PIC et non au niveau du logiciel ProgSeq, ce qui signifie que si les données sont fournies par un soft de votre cru, vous devez adapter les données envoyées en inversant bit de poids fort avec bit de poids faible.
- Protection accrue du logiciel contre les erreurs d'interprétation des données reçues en cas de connexions / déconnexions répétées (il pouvait arriver que le logiciel du PIC mette plusieures secondes pour se resynchroniser).
- Ajout bouton Reset sur le PIC pour éviter l'arrêt / marche secteur en cas de "plantage" (activation aléatoire des sorties due à un décallage dans le traitement des octets reçus). Cela arrivait avec la version précédente et je n'en ai pas constaté avec la dernière version, mais on ne sait jamais.