Objectif
Si quelques amateurs d'images n'ont pas encore remisé leur projecteur de diapositives au grenier,
le petit boîtier décrit ici leur permettra de le piloter avec une banale télécommande infra-rouge RC5 pour téléviseur ou assimilée.
Avant de passer à la suite, un avertissement tout de même :
VOUS tiendrez le fer à souder ! Ce montage a été réalisé et fonctionne sans problème,
mais VOUS SEUL pourrez garantir le bon fonctionnement de VOTRE
réalisation. Ceci dit, le projet est assez simple et ne devrait
pas poser de problème à quelqu'un ayant une petite expérience de l'électronique.
Le projet en quelques mots
A l'origine :
Une observation sur le mode "pilote automatique" courant sur les projecteurs de diapos : le dispositif le plus fréquent est
un petit potentiomètre qui permet d'enclencher l'avance automatique
des vues, avec une temporisation comprise allant jusqu'à une trentaine de secondes. Beaucoup trop rudimentaire ...
Donc, l'idée :
Un dispositif, un "truc", permettant de piloter beaucoup plus
souplement le projecteur et autorisant des temporisations bien plus
longues si on le souhaite. Une contrainte : que le dispositif se
connecte de manière "aimable" au projecteur (éviter la scie et le marteau).
Le résultat :
Le petit boîtier présenté ici, qui se substitue
à la traditionnelle commande filaire,
- commandable à distance à l'aide d'une télécommande de téléviseur ou de lecteur de CD,
- capable de piloter le projecteur vue par vue, ou en avance automatique réglable de 10 s à 4 minutes.
La réalisation
A la base de la réalisation, une note d'application d'Atmel
AVR410
"RC5 IR Remote Control Receiver" (PDF)
qui propose de construire un récepteur de télécommande RC5 à base d'un capteur infrarouge SFH506-36 et d'un
micro-contrôleur AT90S1200.
Au final, il ne reste pas grand-chose de la note d'application, puisque
toute le décodage des signaux RC5 a été réécrit, mais le point de départ est là !
Avant d'attaquer le détail des fonctions offertes, fixons quelques contraintes librement choisies :
Compatibilité avec toute télécommande RC5
Le code RC5 est utilisé pour de nombreuses télécommandes infra-rouge :
téléviseur, lecteur de CD, micro-chaîne, etc.
Très brièvement, une commande dans le protocole RC5 se décompose en deux "mots" : une adresse (Tuner,
Tape, CD, Aux, ...) et une valeur (Volume+, Volume-, Play, Stop, Pause,
Off, ...). On notera qu'aucune adresse ne semble prévue pour le "projecteur de diapos" ...
RC5 est une norme élaborée par Philips et Sony. De nombreuses informations sont disponibles sur Internet, mais je
n'ai trouvé aucun document exhaustif ; peu importe, on fera sans ...
La contrainte ci-dessus porte sur la compatibilité RC5
uniquement ! Il existe de nombreux autres codages infra-rouge : il
suffit de consulter un jour le mode d'emploi d'une
télécommande dite "universelle".
Compatibilité avec les projecteurs à commande "1 contact" ou à commande "2 contacts"
De nombreux projecteurs fonctionnent avec une commande filaire à deux
fils : la commande à distance est un simple bouton poussoir électrique
qui permet de mettre en contact ces deux fils ; un contact court
provoque l'avance du chariot de vues, un contact plus long provoque le
recul du chariot. Ici, toute la subtilité consiste à
doser le contact "court" et le contact "long".
D'autres projecteurs fonctionnent avec une commande "2 contacts"
et 3 fils dont un commun, un contact
étant dédié à la "marche avant", l'autre à la
"marche arrière" : avec deux contacts distincts, on risque moins
de "passer la mauvaise vitesse".
Auto-alimentation
Constaté sur tous les projecteurs essayés : la télécommande filaire est alimentée par
une tension de 30 V environ ; l'appui sur la commande court-circuite deux fils, ce
qui déclenche le mouvement du chariot dans le projecteur. L'idée est de pouvoir utiliser cette tension
pour alimenter l'électronique du boîtier de télécommande. On conservera tout de
même une possibilité d'utiliser une petite alimentation universelle 12 V externe.
En revanche, on fera l'impasse sur certaines autres contraintes que
l'on aurait aussi pu se fixer ... En particulier :
Contrôle de la mise au point
Le boîtier présenté ici ne permettra pas de
contrôler la mise au point. Projecteur auto-focus souhaible,
par conséquent !
On peut toutefois imaginer une évolution dans ce sens : il suffit de gérer deux
touches supplémentaires de la télécommande, et de
commander les fils correspondants sur le projecteur.
Pas de raccordement universel
Il restera, au cas par cas, à raccorder le boîtier magique au projecteur :
- Dans le cas où le connecteur de la télécommande
filaire sur le projecteur est un modèle standard (type jack
par exemple), il sera alors
possible de s'en procurer un pour réaliser un raccordement "propre".
- Dans le cas (le plus courant ?) où le connecteur est un
modèle exotique, il sera toujours possible d'intervenir sur la
télécommande filaire, sur la liaison filaire elle-même, voire sur le projecteur
pour y ajouter une prise plus "classique".
Les fonctions disponibles
Les fonctions disponibles sont les suivantes :
Pilotage automatique : 4 touches doivent permettre la
marche/arrêt du pilotage automatique, et le
réglage +/- du délai entre vues.
Pilotage vue par vue : 2 touches de la télécommande doivent donner
accès à l'avance ou au recul vue par vue (deux touches
distinctes représentent tout de même un confort par
rapport au bouton unique et à l'appui court/long des classiques
commandes deux fils !). Le pilotage vue par vue reste accessible
même si le pilote automatique est enclenché.
Contrôle visuel du boîtier, par une série de LEDs
permettant de vérifier l'état de fonctionnement.
Les outils
Le schéma électronique et le circuit proposé ont été réalisés avec la
version 4.11 Freeware de
Eagle Layout
Editor de
CadSoft.
Se référer au site de l'éditeur pour les
conditions
d'utilisation du logiciel en version Freeware.
Rien ne s'oppose a priori à l'utilisation de versions plus récentes.
Le logiciel du microcontrôleur Atmel AT90S1200 a été développé
et compilé avec l'application
AVR
Studio 3.56 d'
Atmel.
Si vous utilisez une version plus récente, attention à la
compatibilité entre le Studio et les différents
modèles de micro-contrôleurs et de programmeurs.
Vous pouvez aussi vous passer d'AVR
Studio si vous ne retouchez pas le logiciel proposé
(disponible ici sous forme de code source et sous forme compilée) et si
vous programmez le micro-contrôleur depuis une autre application.
La programmation du micro-contrôleur peut être
réalisée depuis AVR Studio si l'on dispose d'un programmeur
compatible avec AVR Studio (programmeurs compatibles : voir la copie d'écran AVR Studio / Tools ci-dessous) ;
on peut aussi programmer le micro-contrôleur depuis un port
parallèle et un petit logiciel adéquat.
[Remarque : la réalisation d'un programmeur de type "AVR
Prog" est décrite dans une autre note d'application Atmel
AVR910 :"In-System Programming" (PDF)
qui propose un schéma bâti autour d'un
micro-contrôleur AT90S1200 ... dans lequel il faut commencer
par charger le logiciel proposé par Atmel. Pour ma part, j'ai
construit cet "AVR Prog" en programmant le micro-contrôleur requis
avec une petite application et un programmeur extrêmement
rustique sur port parallèle ; l'AVR Prog permet ensuite de
travailler beaucoup plus confortablement depuis AVR Studio. ...
Mais nous nous éloignons du sujet initial, et Internet est riche
d'informations sur l'utilisation des composants Atmel]
La nomenclature des composants
Ci-dessous la nomenclature des composant nécessaires.
Attention : une partie des choix a été dictée uniquement
par les composants disponibles dans le tiroir ... Voir les remarques dans le tableau.
MARS 2006 : Atmel recommande d'utiliser le microcontrôleur
ATtiny2313
pour les nouvelles conceptions, en remplacement de l'AT90S1200. Ce circuit est compatible pour le
brochage, et pour le logiciel après des
adaptation
mineures documentées (PDF)
chez Atmel.
Part |
Value |
SFH506 |
capteur infra-rouge SFH506-36 (le -36 est important : il indique la fréquence de fonctionnement) |
IC1 |
AT90S1200P (+ support DIL 20 broche optionnel) |
IC2 |
7805 (prenez un modèle basse consommation compatible avec une entrée 30 V) |
C1 |
22 pF |
C2 |
22 pF |
C3 |
100 nF |
C4 |
2200 µF 50V (capacité indicative: c'est la "batterie" du boîtier ; le + gros = le mieux) |
C5 |
100 µF 10V |
D1 |
1N4004 (diode "puissance" tenant 30 V en inverse ; une diode signal pourrait probablement faire l'affaire) |
D2 |
1N4004 (idem D1) |
D3 |
1N4004 (idem D1) |
D4 |
1N4004 (idem D1) |
D5 |
1N4148
|
JP1 |
4 plots de raccordement (barrette simple à découper, ou soudez les fils directement) |
JP2 |
1 plot de raccordement (barrette simple à découper, ou soudez les fils directement) |
JP3 |
1 plot de raccordement (barrette simple à découper, ou soudez les fils directement) |
JP4 |
1 plot de raccordement (barrette simple à découper, ou soudez les fils directement) |
JP5 |
1 plot de raccordement (barrette simple à découper, ou soudez les fils directement) |
OK1 |
MCA231 (optocoupleur) |
Q1 |
Quartz 4MHz |
Q2 |
2N2222A |
Q3 |
2N2219A |
Q4 |
2N2219A |
R1 |
10k |
R2 |
100 |
R3 |
47k |
R4 |
1k |
R5 |
1k |
R6 |
1k |
R7 |
1k |
R8 |
1k |
R9 |
1k |
R10 |
10k |
R11 |
10k |
R12 |
10k |
R13 |
1M |
SV1 |
Connecteur 10 points (barrette double à découper ; interface de programmation "In-System" du micro-contrôleur)
|
U$3 |
LED |
U$4 |
LED |
U$5 |
LED |
U$6 |
LED |
U$7 |
LED |
U$8 |
LED |
X1 |
Prise jack 3.5 mm mono (pour l'alimentation externe) |
L'électronique
Ci-dessous le schéma complet du boîtier. Ce schéma
a été conçu pour être adaptable, autant que
possible : si vous ne souhaitez pas utiliser une fonction
particulière, vous pouvez ne pas implémenter les
composants correspondants. Immédiatement après,
le même schéma commenté.
Comme annoncé, voici maintenant le schéma
détaillé en blocs fonctionnels, et commenté :
Bloc 1 : alimentation
Le régulateur 7805 fournit l'alimentation +5V au boîtier
à partir, au choix :
- de la tension +30V provenant du projecteur
- de la tension +12V provenant de la petite alimentation externe optionnelle.
Dans le cas du +30V, le piège est bien évidemment que
l'on N'A PLUS ces +30V durant les instants où l'on referme
le contact du projecteur pour commander la progression des vues (le cas le
plus défavorable étant le contact long pour la "marche
arrière"). D'où, pour l'alimentation depuis le +30V :
- la capacité C4 qui sert de réservoir durant les phases
de fermeture du contact
- la résistance R2 pour limiter le courant (sinon, la capa
initialement vide ressemble beaucoup à un contact fermé ...)
- la diode D3 pour ne pas vider la capa quand le boîtier
commande le projecteur
Dans le cas du +12V, on supposera qu'il y a déjà une
capacité décente dans la petite alimentation et que la
tension de sortie peut être présentée sans
inquiétude au régulateur.
On peut supprimer D3/R2/C4 si l'on préfère utiliser
systématiquement une alimentation externe.
La diode D1 protège le régulateur des inversions
malheureuses de polarité.
Bloc 2 : capteur et micro-contrôleur
Le micro-contrôleur nécessite une électronique
minimale pour fonctionner, à savoir :
- le quartz de 4MHz et les deux capacité de 22 pF
- le circuit de reset constitué de R1 et C3
Le connecteur SV1 sert uniquement à la programmation
"in-situ" du micro-contrôleur et peut être omis si le
composant Atmel est programmé sur un système externe.
Le couple R12/D5 permet de créer une tension de
référence présentée sur la broche PB0 qui
est l'entrée "-" du comparateur analogique
intégré au micro-contrôleur, tandis que le couple R13/R3
présente sur la broche PB1 (entrée "+" du comparateur) une image de
la tension disponible
en entrée du régulateur. Grâce à ce
dispositif, le boîtier peut
vérifier qu'il n'effondre pas sa source
d'alimentation en
forçant trop longtemps et trop fréquemment la
sortie à 0V. Ce jeu de composants peut être
supprimé, mais il faut alors adapter le logiciel en conséquence.
Le capteur infra-rouge SFH506 se charge de recevoir le signal
infra-rouge, de le filtrer et de le décoder pour ressortir un
signal logique prêt à l'emploi. Attention, comme
mentionné plus haut, au -36 qui est important car il indique la
fréquence de fonctionnement du capteur.
Bloc 3 : réglages
Ce connecteur est destiné à commander les entrées
PD0 et PD1 du micro-contrôleur (positionnées en
pull-up par programmation).
- PD0, forcé à 0V, permet de passer en mode "commande 2 contacts"
tandis que le mode par défaut est "commande 1 contact".
- PD1, commuté un instant à 0V, permet de
mémoriser la dernière adresse RC5 reçue et de
verrouiller le boîtier sur cette adresse (si l'on n'utilise pas
cette fonction de verrouillage, le boîtier reste ouvert à
toutes les sollicitations).
Bloc 4 : voyants
La LED commandée par le port PB5 clignote lorsque le
boîtier reçoit un signal infra-rouge
Les 5 LEDs commandées par les ports PB4-2 et PD6-5 constituent
un barregraphe qui indique le mode de fonctionnement courant du
boîtier :
- La position de la LED qui clignote donne une indication sur le
délai courant entre vues (de 10 s à 250 s)
- Le type de clignotement indique l'état du pilotage automatique :
clignotement régulier : pilotage manuel
clignotement saccadé : pilotage automatique
Bloc 5 : commande du projecteur
Il s'agit ici de la commande du contact :
- contact unique en cas de fonctionnement "pilotage 1 contact"
- contact "avance" en cas de fonctionnement "pilotage 2 contacts"
Les composants choisis doivent pouvoir supporter le +30V présent
en contact ouvert, et le courant que provoque la fermeture du contact
(pas de problème d'échauffement tant que le transistor de
sortie est correctement saturé !).
Bloc 6 : commande du projecteur
Il s'agit ici de la seconde commande du contact :
- contact "recul" en cas de fonctionnement "pilotage 2 contacts"
Les composants choisis doivent pouvoir supporter le +30V présent en
contact ouvert, et le courant que provoque la fermeture du contact (pas
de problème d'échauffement tant que le transistor de
sortie est correctement saturé !).
Par rapport au bloc 4, on note la présence d'un opto-coupleur
qui va permettre de travailler indifféremment avec des commandes
3 fils à + commun (relier alors les points JP2 et JP4) ou
à - commun (relier alors JP1 et JP3). Le MCA231 proposé
ici a l'avantage de contenir un montage Darlington (sensibilité
améliorée) et de supporter un fonctionnement sans
composant additionnel de pull up ou down.
Si l'on ne compte utiliser que des projecteurs à commande "1 contact", ce bloc peut être supprimé sans
inconvénient.
Le résultat :
Ici, le routage effectué avec Eagle n'a servi qu'à
élaborer un plan d'implémentation correct des composants.
La réalisation utilise un plaque Veroboard. Le contact poussoir
de verrouillage de l'adresse RC5 n'est pas monté ; un jeu de
LEDs en DIL a été utilisé.
La fenêtre pour le capteur infra-rouge et les LEDs est
réalisée à la scie et au cutter dans un
boîtier plastique standard ; une amorce de film négatif
prend place au niveau de cette fenêtre pour l'esthétique
et contre la poussière.
Le fichier zip du projet Eagle
Le logiciel
Le
fichier source en assembleur est
"raisonnablement" commenté (pour sauvegarder : clic-droit /
Enregistrer le lien sous ...)
On peut y distinguer les sections suivantes :
.include "1200def.inc" : inclusion des paramètres spécifiques à l'AT90S1200
.def : affectation des registres Rnn du micro-contrôleur aux différentes variables du programme
.equ : définition de constantes
.cseg : code
Le code commence par les directives .org qui spécifient les
adresses à inscrire pour chacun des vecteurs du
micro-contrôleur (adresse "reset" de démarrage du code,
adresses des différentes routines de gestion des
interruptions)
On y trouve ensuite le code associé à la routine "reset"
: il s'agit du code exécuté à l'initialisation du
micro-contrôleur pour définir le mode de fonctionnement
(paramétrage des broches en entrée ou en sortie,
activation de timer, etc.).
Le code enchaîne ensuite directement sur la routine "main" qui
initialise les variables applicatives :
- AppSystem : destinée à recevoir le code
"adresse" de la dernière commande RC5 traitée
- AppCommand : destinée à recevoir le code
"valeur" de la dernière commande RC5 traitée
- AppState : variable d'état de l'application
Le bit 0 "AppPlay" à 1 indique le mode pilotage automatique
Le bit 1 "AppNextReq" à 1 indique qu'une demande d'avance a été émise
Le bit 2 "AppPrevReq" à 1 indique qu'une demande de recul a été émise
- Pause : définissant le délai d'avance en pilotage automatique
- MemoSystem : destinée à verrouiller (optionnellement) le code "adresse" de la télécommande utilisée
Le programme entre ensuite dans une boucle sans fin "loop" :
- Gestion des temps de récupération : suite à la
commande d'un contact, le programme entre dans une brève phase
de récupération (900 ms après une avance, 1200 ms
après un recul) durant laquelle il refuse toute nouvelle
commande du projecteur. Cette protection est virtuellement
imperceptible de l'utilisateur, mais assure que le boîtier
peut "recharger son accu", et assure aussi vis-à-vis du
projecteur une discrimination suffisante entre deux commandes. Si la tension
à l'entrée du régulateur est détectée comme insuffisante, l'application active
un temps de récupération double.
- Prise en compte des demandes de verrouillage de l'adresse RC5
- Traitement des commandes reçues, sans considération du
temps de récupération
Commande "arrêt du pilotage automatique" (Stop)
Commande "délai plus élevé" (Volume+)
Commande "délai moins élevé" (Volume-)
- Traitement des commandes reçues, si le temps de récupération est terminé
Commande "lancement du pilote automatique" (Play)
Commande "vue suivante" (Next)
Commande "vue précédente" (Previous)
- Gestion du pilote automatique s'il a été enclenché
- Gestion des sorties
Contact(s) de commande du projecteur
LEDS ; les LEDs sont commandées par impulsions brèves pour économiser la courant.
On trouve plus loin le code de gestion de l'interruption INT0, sur
laquelle est cablée la sortie du capteur infra-rouge. Cette
routine "int0_irq" travaille en détection de fronts (elle
reprogramme dynamiquement le front de détection d'interruption),
attend les débuts de trame repérés par un front
suivant un état stable significativement long, puis
réceptionne les bits successifs d'une trame RC5 avant de
d'inscrire dans les variables "System" et "Command" les valeurs
reçues.
Cette routine de décodage RC5 est finalement totalement
différente de celle proposée dans la note d'application
d'Atmel, qui ne fonctionnait pas sous interruption (ce qui rendait
beaucoup moins confortable la gestion simultanée d'autres
entrées-sorties).
La dernière section de code correspond à la gestion des
interruptions du Timer0. Cette routine "timer0_irq", à partir des
interruptions du timer, décompte les 3 compteurs applicatifs de
gestion du temps :
- CountDown64us : décompte pour les bits RC5
- CountDown16ms : décompte pour les impulsions
- CountDown1s : décompte pour la répétition des impulsions
La routine de gestion du timer utilise pour ses propres besoins 2
compteurs internes : T64us et T4ms.
Le code compilé au format hexadécimal
Le fichier zip du projet AVR Studio
La mise en service
Une fois le boîtier assemblé et le micro-contrôleur programmé, il reste à
- vérifier que votre projecteur fonctionne bien avec une tension
de contrôle de 30 V, et vérifier le brochage de la
commande filaire (tâches mentionnées ici pour
mémoire, puisque vous l'aurez fait avant de vous lancer dans
l'aventure, logiquement !)
- "Subtilisez" une télécommande RC5 comportant au moins les touches suivantes
Play / Stop / Volume+ / Volume- / Next / Prev
- Alimentez le boîtier, pour commencer en le raccordant à
une alimentation externe, ou directement en le raccordant au projecteur
Exemples de télécommandes utilisées :
etc.
La dernière LED du barregraphe doit clignoter
régulièrement dès la mise sous tension, indiquant
que la temporisation par défaut est réduite (30
s) et que le boîtier est en pilotage manuel.
Pressez à plusieurs reprises la touche volume+
(pressez/relâchez : il n'y a pas d'auto-répétition) :
la LED clignotante doit changer, indiquant que la temporisation
augmente. Le délai varie par pas de 10 s entre 10 et 250 s ;
il faut donc 24 appuis pour parcourir toute l'échelle disponible.
Pressez de la même manière la touche volume- : la LED
clignotante doit parcourir le chemin inverse.
Vous pouvez aussi noter que chaque appui sur la
télécommande provoque l'allumage de la LED de
contrôle.
Maintenant, l'étape suivante nécessite que l'on soit
raccordé au projecteur, le projecteur sous tension et
équipé d'un panier de vues. Réglez le
boîtier comme il se doit (commande 1 contact ou commande 2
contacts), procédez au raccordement. Pressez maintenant la
touche Next : le projecteur doit passez à la vue suivante.
Pressez la touche Prev : le projecteur doit revenir à la vue
précédente.
Dernière étape : Pressez la touche Play : l'avance
automatique doit commencer, le cycle de clignotement de la LED doit
changer pour devenir saccadé. Vous pouvez modifier la
temporisation en cours de fonctionnement, forcer l'avance ou le recul
automatique. Pressez la touche Stop pour sortir du pilotage automatique.
Pour aller plus loin
Plusieurs variations sont possibles :
- Modifier le choix des touches gérées. Il suffit de
modifier les constantes dans le code source, de recompiler et de
recharger le micro-contrôleur (c'est là qu'on
apprécie la fonction de reprogrammation "in-situ").
- Ajouter des touches pour gérer la mise au point. Là, il
faut choisir des ports de sortie du micro-contrôleur (en
câblant les deux ports PD3 et PD4 par exemple) et
compléter le logiciel. Il faut ensuite répliquer
l'électronique de sortie pour piloter les contacts de
l'habituelle liaison filaire.
- Dupliquer, tripliquer (je m'emporte ...) l'électronique de
sortie pour piloter plusieurs projecteurs de manière
synchrone.
- Pour tester les télécommandes RC5, faire une version
simplifiée du montage et du logiciel pour afficher les adresses
ou les commandes sur un bandeau de LEDs (ça, je l'ai fait, mais
j'ai recyclé les composants et le papier brouillon depuis ...).
- A vos idées !
Bonus
En bonus, une liste de codes RC5, glanés sur Internet ou
relevés au gré des essais :
Address |
System |
0x10 |
Générique ? |
0x11 |
Tuner |
0x12 |
Tape |
0x13 |
|
0x14 |
CD |
0x15 |
Aux |
Value |
Command |
0x00 |
"0" |
0x01 |
"1" |
0x02 |
"2" |
0x03 |
"3" |
0x04 |
"4" |
0x05 |
"5" |
0x06 |
"6" |
0x07 |
"7" |
0x08 |
"8" |
0x09 |
"9" |
0x0B |
Time |
0x0C |
Off |
0x0D |
Mute |
0x10 |
Volume+ |
0x11 |
Volume- |
0x1C |
Shuffle |
0x1D |
Repeat |
0x20 |
Next |
0x21 |
Previous |
0x24 |
Programm |
0x26 |
Sleep |
0x2B |
Highlight |
0x30 |
Pause |
0x32 |
<< |
0x34 |
>> |
0x35 |
Play |
0x36 |
Stop |
0x3F |
On ? |