Récepteur infra-rouge PS/2 (clavier)

Résumé du projet

Le clavier 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.

Mon récepteur 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:
Led infra-rouge

Led infra-rouge

Le clavier

Le clavier

encore le clavier

encore le clavier


Photo prises durant le développement:
Montage pour le développement

Montage pour le développement

Vue de près du récepteur infra-rouge. Un tsop1238.

Vue de près du récepteur infra-rouge. Un tsop1238.





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:
OctetSignification
PremierIdentification du périphérique. Toujours la même valeur.
DeuxièmeOctet de poids fort du code de touche
TroisièmeOctet de poids faible du code de touche
QuatrièmeInverse 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

Le clavier

Le clavier

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

The PS/2 Keyboard Interface: http://www.computer-engineering.org/ps2keyboard/
Interfacing the AT keyboard: http://www.beyondlogic.org/keyboard/keybrd.htm
Petr Simandl - PC keyboard communication protocol: http://www.simandl.cz/stranky/elektro/keyboard/keyboard_a.htm



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.