Dernière mise à jour :
07/11/2010
Présentation
Cette télécommande, composée d'un circuit
émetteur et d'un circuit récepteur, permet de piloter de un
à dix
(ou de un à huit) appareils au travers d'une seule ligne de transmission filaire ou autre. Elle est
réversible, c'est à dire que le récepteur peut
aussi faire office d'émetteur, et inversement.
Pour cette
réalisation, j'ai mis en oeuvre deux PIC de type 16F628A, chacun
pouvant être placé en mode émetteur ou en mode
récepteur, les deux PIC faisant tourner le même programme.
La sélection entre mode émetteur et mode récepteur
s'effectue à l'aide d'un
interrupteur
simple (SPST) ou d'un cavalier. Afin d'assurer une bonne protection
contre les parasites
ambiants éventuels, les données reçues par le
récepteur peuvent être comptées et prise en compte
uniquement si les mêmes ordres sont reçus trois fois de
suite quand un changement dans les données reçues est
détecté. Cette protection supplémentaire, qui
ralentit un poil la commande au niveau du récepteur, peut
être désactivée pour un temps de réponse
plus rapide (si version 002 - pas possible dans la version 002b, voir
plus loin). La transmission entre les deux modules s'effectuant de
façon sérielle, il est parfaitement envisageable de faire
appel à un support sans fil tel que laser, infrarouge, ultrasons
ou HF. De plus, la transmission des données s'effectue selon un
protocole standard de type "RS232" à une vitesse de 9600 bauds,
ce qui rend compatible la fonction émetteur ou récepteur
avec un système autre (ordinateur ou autre type de montage à UC doté
d'une liaison série).
Trois schémas sont proposés, avec ou sans quartz externe :
-
Schéma 002
: sans quartz externe (utilisation oscillateur interne 4 MHz),
possibilité de choisir le mode "envoi seul / répétition" (1 ou 3 ordres
successifs pour chaque commande),
-
Schéma 002b
: avec quartz externe 4 MHz, envoi uniquement en mode "répétition"
(3 ordres successifs identiques pour chaque commande).
-
Schéma 002c
: avec quartz externe 12 MHz, envoi en mode "sur changement d'état des entrées" ou en mode "continu".
Les différences entre chaque montage sont décrites au paragraphe suivant.
Différences entre les trois montages proposés
Le
premier schéma 002 est le plus simple mais risque de moins bien
fonctionner si d'un côté ou de l'autre de la liaison la température
ambiante est extrême. En effet, la fréquence de l'oscillateur interne
joue un peu en fonction de la température, et si les deux modules
émetteur et récepteur sont soumis à des températures opposées (l'un
très chaud et l'autre très froid), le récepteur pourrait avoir du mal à
reconnaitre les données entrantes.
Le second schéma 002b
requiert un quartz externe de 4 MHz et garantit un fonctionnement plus
stable dans des conditions de températures "extrêmes". Les données sont
toujours envoyées trois fois, la fonction de répétition d'envoi n'est
pas désactivable. Le fait de ne pas pouvoir choisir le
mode d'envoi "seul / répétition" avec la version quartz externe est
simplement lié au fait qu'il n'y a plus assez de broches d'entrée /
sortie au niveau du PIC. Avec une liaison bifilaire (Tx / Rx), un accusé de
réception est envoyé par le récepteur à l'émetteur. Ce circuit est très
fiable si la qualité de la ligne de transmission est au rendez-vous.
Le troisième schéma 002c
est reservé pour transmettre des données logiques et non plus des états
d'interrupteurs. Le but de cette version est de pouvoir transmettre des
données plus rapidement, avec un rythme de changement d'état sur les entrées d'au moins 100 Hz. Pour cela, la fonction
d'anti-rebond de chaque entrée a été retirée, la vitesse du port série a
été doublée, les données sont transmises une seule fois et non plus
trois fois et la LED d'indication des données envoyées / reçues n'est
plus sollicitée (elle est toujours là pour indiquer que le programme
démarre bien à la mise sous tension). En complément, le nombre d'entrées est désormais
limité à 8, ce qui permet
de n'utiliser qu'un seul octet pour transmettre l'état des huit entrées
en une seule étape. On a en quelque sorte affaire à un registre à décallage type CD4094 "automatique et intelligent".
En résumé, un petit tableau pour y voir plus clair :
| Type d'oscillateur | Vitesse transmission | Nombre d'entrées | Modes d'envoi | Répétition envoi | Accusé réception | Vitesse transfert max |
Schéma 002 | Interne 4 MHz | 9600 bauds | 10 | Sur changement d'état des entrées | 3 fois (désactivable) | Non | Quelques Hz |
Schéma 002b | Externe 4 MHz | 9600 bauds | 10 | Sur changement d'état des entrées | 3 fois (non désactivable) | Oui | Quelques Hz |
Schéma 002c | Externe 12 MHz | 19200 bauds | 8 | Sur changement d'état des entrées ou en continu | Pas de répétition | Non | 300 Hz (Nota 1) |
Nota 1
: La vitesse est donnée pour des octets complets, ce qui signifie qu'on
peut envoyer au moins 300 octets différents par seconde avec la
certitude qu'ils seront traités correctement à l'arrivée (hors problème
de ligne de transmission bien sûr). On peut en réalité monter
jusqu'à 500 Hz, mais avec un peu moins de certitude sur le bon
traitement à l'arrivée car on commence à constater des petits
décallages temporels (à cette fréquence de 500 Hz, on s'approche des limites liées à la vitesse de transmission des données).
Avertissements
Pour
un usage avec des boutons poussoirs ou interrupteurs et bien que la
version 002 puisse être utilisée, je conseille la version
002b pour les raisons suivantes :
- stabilité d'horloge bien meilleure (transmission des données plus fiable);
-
présence d'un accusé de réception envoyé
par le récepteur vers l'émetteur, indiquant que l'ordre a
bien été reçu.
Le
schéma 002c sera préféré pour des vitesses de transmission plus
élevées, avec des sources logiques provenant de circuits logiques et
non d'interrupteurs (plus de fonction d'anti-rebond).
En conclusion, le schéma 002
est désormais déconseillé et les schémas
002b et 002c conseillés.
Schéma 002 (désormais déconseillé mais utilisable)
Chaque circuit émetteur / récepteur fait donc appel à
un
seul circuit intégré
de type 16F628A, et très peu de composants additionnels sont
nécessaires. Le schéma qui suit montre un ensemble
émetteur / récepteur configuré
en mode émetteur à dix entrées (SW1 fermé).
Principe de base
Il consiste à transformer une information "parallèle" en
une information "série" si le système est placé en
mode Emetteur, ou à transformer une information "série"
en une information "parallèle" si le système est
placé en mode Récepteur. Parallèle car plusieurs
informations sont disponibles en même temps sur plusieurs fils
indépendants, et série parce que la liaison entre
émetteur et récepteur s'opère sur un seul fil. La transmission de
données s'effectue de façon asynchrone (pas de fil d'horloge pour
cadencer l'envoi ou la réception des données), comme pour une liaison
série RS232 traditionnelle. La vitesse est fixée ici à 9600 bauds, mais
rien ne vous empêche d'en choisir une plus élevée. Au tout début de la
conception de cette télécommande, j'avais utilisé un mode de transfert
"propriétaire" des états des entrées / sorties,
qui demandait 12 bits pour transmettre l'ensemble des
informations. J'ai ensuite décidé d'utiliser un protocole standard, qui
permet de réceptionner et traiter les données transmises sur un autre
système, basé sur PC ou non. Certes, cela demande un peu plus de
données à envoyer, puisque chaque changement d'état d'une entrée
(système en mode émetteur) se traduit par l'envoi de 10 bits (1 bit
start, 8 bits de donnée et 1 bit stop),
qui contient le numéro et l'état du port qui a changé de statut. Mais
en pratique, la réactivité du système est amplement suffisante pour que
cette façon de faire ne constitue pas un problème.
Format des données série
Les données sont
transmises selon le principe "Numéro voie" + "Information Marche
/
Arrêt", un peu à la façon du protocole MIDI
utilisé dans l'industrie musicale pour décrire les notes
qui doivent être jouées. Chaque octet de commande
utilisé pour décrire l'état d'une voie de la
télécomande, est composé de quatre bits
décrivant le numéro de voie et de quatre bits
décrivant l'état de la voie en question. Le premer
quartet de bit indique l'état de la voie ("F" pour ON et "0"
pour OFF), et le deuxième quartet de bits indique le
numéro de voie (entre 0 et 9). Ainsi, l'activation de
l'entrée IO1 conduit à l'émission du message
(octet) F0, et sa désactivation provoque l'envoi de l'octet 00.
L'activation de l'entrée IO5 conduit à l'émission
du message (octet) F4, et sa désactivation provoque l'envoi de
l'octet 04. Si on se place côté Récepteur,
l'arrivée d'un octet ayant comme valeur F0 provoque l'activation
de la sortie IO1, et l'arrivée d'un octet ayant comme valeur 00
provoque la désactivation de cette même sortie IO1.
Action
|
Octet émis
(côté émetteur)
|
Octet reçu
(côté récepteur)
|
Action
|
Activation IO1
|
F0
|
F0
|
Activation IO1 |
Désactivation IO1
|
00
|
00
|
Désactivation IO1 |
Activation IO2 |
F1
|
F1
|
Activation IO2 |
Désactivation IO2 |
01
|
01
|
Désactivation IO2 |
Activation IO3 |
F2
|
F2
|
Activation IO3 |
Désactivation IO3 |
02
|
02
|
Désactivation IO3 |
...
|
...
|
...
|
...
|
Activation IO9 |
F8
|
F8
|
Activation IO9 |
Désactivation IO9 |
08
|
08
|
Désactivation IO9 |
Activation IO10 |
F9
|
F9
|
Activation IO10 |
Désactivation IO10 |
09
|
09
|
Désactivation IO10 |
Bien entendu, un
seul bit suffirait pour indiquer un statut "marche ou arrêt", mais
ici on a de la marge. Toujours avec un seul octet, on peut pousser le
principe jusqu'à 127 voies de télécommande, au
lieu de 16 ici (la capacité est de 16 mais on ne dispose que de
dix sorties à cause des capacités physique du PIC
employé). C'est d'ailleurs ce que j'ai fait avec mon
interface
série RS232 001, dotée de 32 voies. Pour renforcer la
sécurité et limiter
le risque de réception de mauvais "codes", le programme
intègre un système de vérification
supplémentaire des données reçues, qui doivent
alors être reçues de la même façon trois fois
de suite pour être considérées comme valides. Cette
protection peut être activée ou désactivée,
au choix de l'utilisateur, via l'interrupteur SW2 Repeat.
Utilisation des ports du PIC
Les dix voies de télécommande sont partagées entre les ports A et B du
PIC :
- 4 voies occupent une partie des E/S du port A : RA0 à RA3,
- 6 autres voies occupent une partie du port B : RB0 et RB3 à RB7.
Le port A possédant 8 pins d'E/S, il en reste 4 de disponibles :
- RA4, utilisée pour confirmer visuellement qu'une entrée (ou sortie)
au moins est activée,
- RA5, non utilisée
- RA6, utilisée pour spécifier si le mode Répétition doit oui ou non
être activé,
- RA7, utilisée pour spécifier le mode émission ou réception.
Le port B possédant 8 pins d'E/S, il en reste 2 de disponibles :
- RB1, configurée en UART-Rx et utilisée pour la
réception des données (système utilisé en
mode récepteur),
- RB2, configurée en UART-Tx et utilisée pour la
transmission des données (système utilisé en mode
émetteur).
En mode émetteur, une
boucle de scrutation des entrées se charge de lire l'état
des dix voies IO1 à IO10, et de transmettre une
trame de données vers le récepteur si au moins une voie à changé d'état
depuis la dernière lecture (ou trois trames
répétées si le mode de protection
supplémentaire Repeat est activé). Aucune interruption n'est utilisée
dans ce mode.
En mode récepteur,
aucune boucle de lecture de données n'est mise en oeuvre,
l'entrée principale de données (RB1) déclanchant une
interruption uniquement si des données arrivent. Les
interruptions sont donc ici utilisées pour mettre à jour l'état des E/S
configurées ici en sorties.
Vu l'utilisation faite ici des entrées / sorties, il est
impératif que les deux PIC émetteur et récepteur
tournent avec la même fréquence d'horloge. L'utilisation
du mode RC basse fréquence (sans quartz) aurait pû faire
notre affaire si le timing avait moins d'importance, mais on ne peut
malheureusement pas se le permettre. L'emploi de l'oscillateur interne
de 4 MHz a été choisi, et sa précision suffit amplement pour la vitesse
de transmission de données employée ici, à condition toutefois que la
température ambiante soit à peu près la même côté émetteur et récepteur.
Schéma 002b (désormais conseillé)
Même
principe général de fonctionnement qu'avec le schéma précédent,
avec quelques différences matérielles et logicielles.
Différences matérielles
Au niveau des 10 entrées / sorties de commande elles-mêmes, rien n'a changé. Mais voici pour le reste :
- présence
du quartz externe de 4 MHz et de ses deux condensateurs associés
pour une meilleur stabilité d'horloge;
- retrait
de l'interrupteur SW2 qui permettait de choisir le mode "envoi seul /
répétition" (désormais répétition obligatoire);
-
déplacement de l'entrée du mode "émetteur / récepteur" (Tx/Rx) :
anciennement en broche RA7, se trouve désormais en broche RA5.
Différences logicielles
Là, ça change pas mal :
-
les commandes envoyées par l'émetteur sont toujours
constituées de trois octets consécutifs et identiques.
-
le récepteur envoie un accusé de réception quand un ordre a été
correctement reçu. Cet accusé est matérialisé par un allumage bref
de la LED de l'émetteur. Dans la version précédente 002, la LED
s'allumait quand on envoyait un ordre, maintenant elle s'allume quand
elle reçoit l'accusé de réception.
Si
l'émetteur ne reçoit aucun accusé de réception dans les 200 ms qui
suivent l'envoi de la commande, une nouvelle tentative (nouvel envoi de
la commande) est effectuée. Si toujours aucune réponse au bout de 200
ms, troisième tentative. Pas plus de trois tentatives, ça ne servirait
pas à grand chose. L'accusé de réception est constitué de trois octets :
- le premier octet est toujours égal à $FF, valeur qu'on ne rencontre jamais dans les commandes
- le second octet est identique à ceux reçus pour la commande
- le troisième octet est toujours égal à $FF.
Liaison deux fils ou trois fils ?
Ce
mode de fonctionnement bidirectionnel implique des échanges de données
dans les deux sens, que le module soit configuré en émetteur ou en
récepteur. Il est donc nécessaire d'avoir trois fils de liaison (masse,
Tx et Rx) pour bénéficier des accusés de réception. Il reste toutefois
bien sûr possible de conserver une liaison bifilaire si on n'a que
faire de ces accusés. Dans ce cas l'émetteur ne recevant pas d'accusé
va réitérer ses commandes trois fois de suite, et le récepteur ne
réagira que sur la première commande reçue avec succès. Ce qui veut
dire qu'en terme de temps de réaction cela ne change absolument rien du
tout (il est toujours voisin de 20 ms). Si pour une raison ou une autre
la fonction d'accusé de réception vous semble superflue ou même vous
embête, vous pouvez la supprimer puisque le code source est livré et
que vous pouvez recompiler le programme avec la version gratuite de
MikroPascal.
Schéma 002c - Version 8 bits plus rapide
Ce
troisième schéma présente une grande ressemblance avec les deux
précédents. On supprime deux lignes d'entrée / sortie (IO9 et IO10) et on ajoute
un interrupteur (SW2) pour indiquer si l'envoi des données doit survenir sur
un changement d'état des entrées ou si s'il doit être effectué de façon continue.
Mode d'envoi :
- si SW2 ouvert : mode OnChange, l'octet représentatif des entrées I1 à I8 est envoyé dès qu'une entrée au moins change d'état.
-
si SW2 fermé : mode Continu, l'octet représentatif des entrées I1 à I8
est envoyé en rafale même si l'état des entrées ne change pas.
Le
premier mode sera sans doute suffisant dans la majorité des cas, et
permet une consommation un peu moindre. Mais si l'unique octet envoyé
n'est pas correctement réceptionné, les sorties du module récepteur ne
reflèteront pas forcement l'état des entrées du module émetteur. Avec
le second mode, la perte éventuelle d'un octet au niveau du récepteur
(liaison perturbée) ne pose pas de problème car ce dernier se
"resynchronise" avec les octets suivants. Vous avez le choix, faites
comme bon vous semble.
Remarque
: si raccord des lignes d'entrée / sortie sur des circuits logiques
CMOS ou TTL, les résistances de rappel R1 à R9 peuvent à priori être
supprimées.
Mise en pratique des entrées et des sorties
Le montage est alimenté sous une tension de +5 V, ce qui le rend
compatible TTL. Mais comment donc exploiter les entrées et les
sorties ? Interrupteurs, boutons poussoirs et relais peuvent-ils
être de la partie ?
Utilisation des entrées
Les broches du PIC qui peuvent servir d'entrées ou de sorties
sont toutes reliées à la masse au travers de
résistance de rappel, appelées en anglais pull-down.
Quand ces broches sont utilisées en entrée, il faut
appliquer une tension de +5 V pour les activer. Cette tension peut
être amenée par un simple interrupteur ou par les contacts
d'un relais, par exemple. Au repos, entrées
désactivées, vous n'avez pas besoin d'amener une tension
de 0 V puisque cela est déjà fait avec les
résistances de rappel. Mais si vous le faites, ça ne pose
pas de problème.
Utilisation des sorties
Quand les broches du PIC qui peuvent servir d'entrées ou de
sorties sont configurées en sortie, vous disposez d'une tension
de 0 V pour toute sortie désactivée et d'une tension de
+5 V pour toute sortie activée. Quand une sortie est
activée, la tension de +5 V peut servir à allumer une LED
munie de sa résistance de limitation de courant, ou commander un
relais via un petit transistor monté en commutation.
Si l'intention est de piloter plusieurs relais, vous aurez sans doute
intérêt à utiliser un octuple darlington en circuit
intégré tel un ULN2803 ou ULN2804 qui permet de piloter
huit relais à lui seul. Pour plus de détails sur la
commande de relais, merci de vous reporter aux pages
Relais et
Commandes logiques.
Liaison entre émetteur et récepteur
La liaison peut se faire avec fil ou sans fil. Si vous utilisez un
câble, attention à sa longueur, qui peut poser
problème à cause des parasites environnant (il y en a
partout de nos jours). Si la longueur de la liaison dépasse
quelques mètres, vous aurez intérêt à
utiliser un mode de transport de type "courant" et non de type
"tension", voir page
Interface tension courant 001 pour un exemple d'interface autorisant une liaison grande distance. Pour une distance de plusieurs centaines
de mètres, il est possible que la vitesse de transmission doive
être baissée, par exemple à 1200 bauds ou 2400
bauds (au lieu de 9600 ou 19200 actuellement).
Logiciel du PIC
Comme dit auparavant, le programme est le même pour le mode
émetteur et le mode récepteur, même si bien
sûr les routines internes mises en oeuvre diffèrent selon
le mode choisi. Vous devez donc charger dans votre PIC le programme mis
ici à disposition, et choisir ensuite son mode d'utilisation en
appliquant sur la borne RA7 (schéma 002) ou RA5 (schéma 002b ou 002c) un état
logique haut (mode
émetteur) ou un état logique bas (mode récepteur), avec l'interrupteur
SW1. Le code a été écrit en MikroPascal V8.3 pour la version 002, en
MikroPascal Pro V3.20 pour la version 002b et en MikroPascal V3.80 pour la version 002c. Les trois ensembles de
fichiers (codes sources et fichiers compilés *.hex) sont dispos dans la
même archive dont le lien suit :
Telecommande
002, 002b et 002c- 16F628A - (07/11/2010)
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é. Vue 3D uniquement faite pour donner un aperçu des composants utilisés.