Récepteur infra-rouge PS/2 (clavier)
ContenuRésumé du projet

On m'a donné un petit clavier sans fils infra-rouge, model RC-KB2, à l'origine destiné
à être utilisé avec un système de sons de marque Kenwood. Dès que je l'ai eu en main,
j'ai eu envie de comprendre le format de transmission qu'il utilisait. Ainsi, je pourrais
construire un récepteur qui permettrait d'utiliser le claiver sur un port clavier PS/2 de PC.

Deux ans plus tard, j'ai finalement trouvé (ou pris?) le temps de le faire. Cette page a pour but de documenter le
projet. Qui sait, peut-être ne suis-je pas le seul à vouloir utiliser ce clavier sur un PC? Sinon,
la partie décodant les signaux infra-rouges peut être réécrite pour d'autres modèles de clavier et même
pour des télécommandes ordinaires.
Photos
Photos du clavier Kenwood RC-KB2:
Photo prises durant le développement:
Détails techniques
Lorsque le clavier émet des infra-rouges, ce n'est pas en continue. C'est en fait une onde
de fréquence entre 35 et 38 khz car un petit récepteur infra-rouge standard (récupéré d'un magnétoscope)
arrive à détecter la présence du signal (Je n'ai pas pris la peine de mesurer la fréquence exacte).
Après avoir observé le signal sortant du récepteur à l'aide d'un oscilloscope digital, j'ai
compris comment les donnés étaient transmises. Notez que mon récepteur IR a une sortie 'active low',
donc dans les diagrammes qui suivent, un niveau logique bas correspond à la présence d'une onde.
Lorsque le clavier souhaite émettre un évènement de touche appuyée, il
commence par générer un signal que j'ai nommé 'Attention':
4.5ms
----+ +----
|________|
9.1ms
Immédiatement après, le clavier transmet les bits de donnés. Le niveau logique 1 ou 0 est déterminé selon le
temps qui s'écoule entre les pulsations actives (560us). J'ai décidé qu'une
longue durée (environ 1640us) correspondrait à un 1 et une courte durée (environ 560us)
correspondrait à un 0.
-----+ +-+ +-----+ +-----+ +-+ +--...
|_| |_| |_| |_| |_|
0 1 1 0 ...
Lorsqu'une touche reste enfoncée, le clavier envoi un court signal que
j'ai appelé 'Répétition':
2.2ms
----+ +--+ +----
|_________| |_|
9.1ms ^
600us
Le clavier envoi un total de 32 bits de donnés, donc 4 octets. Voici la signification de chaque
octet:
Octet | Signification |
Premier | Identification du périphérique. Toujours la même valeur. |
Deuxième | Octet de poids fort du code de touche |
Troisième | Octet de poids faible du code de touche |
Quatrième | Inverse binaire de l'octet de poids faible. L'addition du troisième et
du quatrième octet doit donc toujours donner 255. Utile pour détecter les erreurs. |
J'ai compilé une liste des codes envoyés pour chaque touche. La combinaison Shift + [Touche] ne fonctionne
pas pour tout les touches. Les touches 'Room B' agissent comme les touche 'Shift', mais ne fonctionne
pas avec les même touches. Les touches du clavier n'étant pas étiquetés n'émettent aucun signal.
keycodes_rc-kb2.txt
Keymap
Ce clavier a été conçu pour un usage spécifique. Il est par conséquant très différent
d'un clavier de PC conventionel. Pas de touches
ctrl,
alt,
F1-F12,
Home,
End,
Page up,
Page down,
Insert,
Delete... Aussi, il y a des
touches qui n'existent tout simplement pas sur les claviers ordinaires. Par exemple,
Disc Sel,
Sub out monit.,
User file name,
Room B...
Mais le plus gros obstacle pour que le clavier soit vraiment utilisable est le fait qu'il est possible de
faire seulement certaines combinaisons de touches. Et lorsqu'on fait une combinaison, disons
shift + a,
on reçoit un code de touche différent. Ceci est très différent d'un clavier PC qui transmettrait les événements
'Touche shift appuyée' suivi de 'Touche A appuyée'...
Voici un résumé des combinaisons de touches possibles. Voir
keycodes_rc-kb2.txt pour plus de détails.
- Les boutons Shift peuvent être combinés avec les Lettres, les chiffres, et les charactères ;',./-+
- Les boutons Room B peuvent être combinés avec certaines touches spécifiques au système
de son: Confirm, Repeat, Random, Display, +10, +100, les chiffres 0-9, set, disc skip down, disc skip up et les touches
stop/play/prev/next/rew/ff
Dans ces conditions, comment pouvons nous faire CTRL + C ou ALT+F1 ? Shift Page-up? Impossible. Pour contourner
ce problème, voici comment je traduis événements de touches du claiver IR en événements PS/2:
- Lorsque la touche CONT PLAY a été appuyée, la prochaine touche appuyée est transmise au PC entre les
événements CTRL appuyé et CTRL relaché
- Lorsque la touche Sub Out Monit. a été appuyée, la prochaine touche appuyée est transmise au PC entre les
événements ALT appuyé et ALT relaché
- Il est possible d'appuyer sur CONT PLAY suivi de Sub Out Monit. pour obtenir l'équivalent de CTRL + ALT + qqch
Voici maintenant un tableau décrivant quelle touche du clavier correspond à quelle touche(s) envoyée(s) au PC.
Les touches évidentes, comme les chiffres, lettres et signes de ponctuation sont omises de ce tableau.
Bien sur, il manque quelques touches. Mais je ne penses pas utiliser le clavier pour programmer,
ni pour jouer à des jeux alors ça devrait aller. Je pourrai toujours implémenter de nouvelles
combinaisons si nécéssaire.
Kenwood key | PS/2 Key | Commentaires |
Power | ESC | |
Confirm à +100 | F1 à F9 | |
Delete | Backspace | La touche delete est réellement là ou la touche Backspace est normalement placée |
Disc.Sel. | Tab | |
P.mode | \ | |
Check | insert | |
Clear | Delete | |
Set | Home | |
Mode | End | |
Cursor L | Flèche Gauche | Indispensables! |
Cursor R | Flèche Droite |
Charac. Srch. Down | Flèche Bas |
Charac. Srch. Up | Flèche Haut |
Disk Skip Down | Page Down | |
Disk Skip Up | Page Up | |
Room B + Disc skip Down | Shift + Page down | Parfait pour scroller dans les terminaux et la console de Linux |
Room B + Disc skip Up | Shift + Page up |
Cont Play | Ctrl + ???? | Touche magique pour que la prochaine touche soit combinée avec CTRL du point de vue du PC |
Sub Out Monit. | Alt + ???? | Touche magique pour que la prochaine touche soit combinée avec ALT du point de vue du PC |
Schéma
Note: Le circuit est alimenté par le port PS/2.
Logiciel
Voici le fichier hex qu'il faut programmer dans l'Atmega8:
ir2ps2.hex
Les fuses bytes pour ce projet sont:
high_byte=0xc9 low_byte=0x9f.
Pour de l'information sur la programmation d'un AVR,
visitez ma page sur la
programmation
d'AVR
Code source:
Le code source est rendu publique sous la license
GPL. Consultez
le fichier COPYING présent dans le tar pour plus d'informations.
ir2ps2-1.0.tar.gz
Références
Avertissement
Je ne saurais être tenu responsable pour les dommages
que l'utilisation des informations ou la mise en œuvre des instructions présentées
sur cette page pourrait causer à votre équipement,
à vous-même ou à autrui. Aussi, je ne donne aucune garantie quant
à l'exactitude des informations et à leur fonctionnement.