Sommaire Carte Index Recherche Nouvelles Archives Liens A propos
[Barre Superieure]
[Barre Inferieure]
Cet article est disponible en: English  Castellano  Deutsch  Francais  Italiano  Nederlands  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[Photo of the Author]
par Ismael Ripoll & Elisa Acosta

L´auteur:

Elisa Acosta est Ingénieur en Informatique à l'Ecole Polytechnique de Valencia. Elle travaille actuellement à Indra (société spécialisée en communications) sur la problématique de l'an 1900 :-).

Cet article est basé sur son projet de fin d'études.


Sommaire:

RT-Linux III

[Illustration]

Résumé:

En utilisant un simple circuit électrique, nous pouvons obtenir que RT-Linux reçoive les ordres d'une commande à distance à infrarouge.



 

Introduction

Même si le projet que nous allons aborder contient une petite composante hardware, il n'est pas nécessaire de posséder des connaissances en électronique.

Il existe un projet appelé "lirc" (Linux Infra-red Remote Control) lancé par Ralph J. K. Metzler (http://www-wjp.CS.Uni-SB.DE/~columbus/lirc/) pour lequel a été développé un pilote de récepteur à infrarouge utilisant les services "normaux" de Linux. Par "normaux" je veux dire qu'il n'a pas utilisé les extensions temps réel RT-Linux. Dans cet article nous abordons la même problématique mais en nous basant sur RT-Linux.

 

Description globale

Le projet que nous allons réaliser possède une première partie de développement hardware relative à la connexion du récepteur à infrarouge à l'ordinateur, et une seconde partie de développement relative au système Temps-Réel qui accède à ce dispositif. Le matériel dont nous avons besoin est minime: un récepteur à infrarouge du fabriquant Sharp (IS1U60) et quelques câbles et connecteurs.

Le récepteur à infrarouge IS1U60 est une merveille de l'électronique; dans une prise à seulement trois broches (deux pour l'alimentation et une pour la masse) il est capable de mener à bien presque tout le travail de réception et de conversion, fournissant un signal série TTL à la troisième broche.

Vision globale du système et des branchements électriques.

Le PC dispose d'une multitude de connecteurs pour brancher tous les types de périphériques digitaux (modems, imprimantes, SCSI, clavier, moniteurs, etc...), mais il n'est pas prévu pour se connecter à des éléments électroniques simples. En d'autres termes, un PC normal ne dispose pas de carte d'acquisition de données capable de lire la tension (voltage) d'une ligne déterminée.

Par chance, le port parallèle (ainsi que le port série) peut être utilisé comme port d'entrée/sortie générique. De nombreux périphériques utilisent cette caractéristique pour communiquer avec le PC, comme par exemple un lecteur Iomega ZIP(R).

Nous utiliserons le port parallèle pour recevoir des données du récepteur à infrarouge. Nous n'aurons besoin que d'une broche du port parallèle, puisque le récepteur à infrarouge n'a qu'une broche de données.

 

Le récepteur à infrarouge

Comme déjà mentionné, le IS1U60 est un récepteur à infrarouge spécialement conçu pour construire des récepteurs pour appareils domestiques.

Le signal émis par une commande à distance est réellement complexe, puisque s'y unissent différents types de codification et de modulation. Observons attentivement ce signal.

Le moyen physique qui transporte le signal de la commande à distance est une onde lumineuse de la catégorie des infrarouges. Ce type de lumière n'est absolument pas dangereux pour la santé contrairement à la lumière ultraviolette. La lumière infrarouge est invisible à l'oeil humain, mais pas aux dispositifs semiconducteurs. Les sources de lumière infrarouge sont: le soleil, les ampoules à incandescence, les diodes LED, etc. Une LED est utilisée par les commandes à distance pour émettre le signal.


Lumière infrarouge Lumière ultraviolette visible

Tous les dispositifs semiconducteurs sont sensibles à la lumière (tous les types de lumière), c'est donc le facteur principal pour déterminer la manière dont les chips sont encapsulées: un plastique totalement opaque, habituellement noir. Un capteur à infrarouge est basiquement construit autour d'un ensemble semiconducteur recouvert d'un verre ne laissant passer que la lumière infrarouge.

Un capteur à infrarouge construit de cette manière, sera capable de détecter la présence de n'importe quelle lumière infrarouge, indépendamment de la source qui la génère. Les concepteurs de commandes à distance ont du ajouter une caractéristique différentielle à la lumière émise depuis une commande à distance afin de la rendre distincte du reste des sources lumineuses. Le signal émis par une commande à distance est modulé à une fréquence comprise entre 32 et 40 Khz, selon le fabriquant et le modèle concernés. Par avance, nous considèrerons que la fréquence de la commande à distance est de 38 Khz, puisqu'il s'agit de la valeur la plus commune. Plus de 90% des commandes étudiées utilisent cette fréquence ou une très proche.

Le récepteur à infrarouge.

Nous ne devons pas perdre de vue que tout ce qui est fait pour émettre le signal, devra être supprimé ensuite pendant la réception. Si l'on émet une lumière infrarouge, il faut ensuite la recevoir; si ce signal est modulé par une porteuse de 38 Khz, il faudra ensuite éliminer (filtrer) cette porteuse. La démodulation est réalisée analogiquement par un simple filtre de bande passante (éliminer toutes les fréquences qui ne sont pas proches de la fréquence d'émission) et un correcteur/intégrateur.

La lumière infrarouge modulée à une fréquence de 38 Khz, est le moyen de communication entre l'émetteur (commande à distance) et le récepteur (TV, video, etc.). Maintenant, il reste à déterminer comment se transmet l'information, c'est-à-dire les bits qui identifient la touche tapée sur la commande à distance.

La manière de codifier l'information dépend du fabricant, mais par chance, dans ce projet nous n'avons pas besoin de connaître ces méthodes, nous devons seulement les comparer.

Il est évident, compte tenu de la manière de moduler le signal, que l'information est transmise en série, c'est-à-dire un bit après l'autre et par conséquent nous n'avons besoin que d'un canal (de données) pour la recevoir.

La figure suivante vient directement des pages de caractéristiques techniques du récepteur IS1U60 (http://ns14.sharp.co.jp/ecg/unit/is1u60/is1u60-fea.html), et présente la structure interne. Les deux flèches à gauche représentent la lumière infrarouge qui est convertie en un signal électrique par la led. Le signal est amplifié, la composante continue est éliminée, il est filtré pour ne laisser passer que les fréquences proches de 38Khz, ensuite il est corrigé (démodulateur + intégrateur), et enfin il est converti en un signal compatible TTL.

 

Le port parallèle

Le port parallèle est prévu et conçu pour communiquer avec des imprimantes, mais avec le temps, et faute de mieux, il est devenu utilisé pour connecter tous les types de périphériques.

Actuellement, il existe au moins deux variantes (ECP, EPP) prévues pour transformer le port parallèle en un véritable port de communications à usage général. Notre projet est assez modeste pour ce qui concerne les prestations réclamées au port parallèle, puisque n'importe quelle version nous servira. De fait, nous n'aurons besoin que d'un canal d'entrée.

Registre d'état
Détail du registre d'état

Le port parallèle est contrôlé depuis le PC par trois registres de 8 bits. Il y a un registre de données (0x378), un registre d'état (0x379) et un de contrôle (0x37A). Les valeurs entre parenthèses représentent les adresses habituelles des registres du premier port parallèle.

Ecrire dans le registre de contrôle permet de programmer le fonctionnement du port. Parmi les 8 bits du registre, le seul qui nous intéresse est le bit 4. En écrivant un "1" dans ce bit, le hardware du port génère une interruption (normalement la numéro 7) quand il détecte que le canal d'état ACK passe du niveau haut (5 volts) au niveau bas (0 volt).

Le registre de données est une porte ouverte vers les broches du connecteur. Toutes les données que nous écrivons dans ce port apparaitront dans les broches 2 à 9 du connecteur parallèle. Ce port n'est qu'un port de sortie puisque nous ne pouvons pas connaître la valeur ("0" ou "1") des broches du connecteur lisant le port. Puisque nous devons lire les valeurs que le récepteur à infrarouge fournit, ce port ne nous sert pas.

Le port d'état reflète l'état des canaux de contrôle de l'imprimante. Grâce à ces canaux, l'imprimante est capable d'informer l'ordinateur sur l'état dans lequel elle se trouve. Ce sont des canaux qui gèrent l'imprimante (ou un dispositif externe) et que l'ordinateur lit, par conséquent ce sont des canaux d'entrée. Bien que le registre soit de 8 bits, seuls les 5 bits de poids fort sont reliés aux canaux, les trois autres bits sont toujours à zéro. Les numéros des canaux ont leur origine dans la fonction qu'ils remplissent quand ils sont utilisés pour communiquer avec une imprimante, mais ces canaux sont réellement des entrées digitales génériques pouvant être utilisés pour pratiquement n'importe quoi.

Entre ces 5 canaux, le plus intéressant est la broche 10 (bit 6 du registre), puisqu'en plus de servir de canal d'entrée digitale, elle peut aussi produire des interruptions quand le canal change d'état (de 5 à 0), comme écrit plus haut.

 

Connexion à l'ordinateur

Description physique de l'encapsulé et du brochage

Le récepteur à infrarouge nécessite une tension d'alimentation comprise entre 4.7 et 5.3 volts. Si la tension descend au-dessous de 4.7 le récepteur cesse de fonctionner. Cette tension peut s'obtenir de différentes façons:

  1. En utilisant des piles. Dans ce cas il est conseillé d'utiliser une pile de 4V5 en série avec une de 1V5. La tension réelle fournie ne sera pas de 6V mais de 5.5V.

  2. En utilisant une source d'alimentation (appareil qui convertit la tension alternative en tension continue de faible voltage). Bien que sa construction soit très simple, elle sort du cadre de cet article.

  3. Tirer les 5 Volts de l'ordinateur. Dans un ordinateur, il y a schématiquement deux types de câbles: des câbles plats (qui transportent les données) et des câbles épais de couleurs rouge, noire et jaune qui sont les câbles d'alimentation. Le câble rouge est celui de +5V et le câble noir est celui de la masse ou 0V.

Pour alimenter le récepteur, nous connecterons le câble noir à la broche 2 du récepteur et le câble rouge (5V) à la broche 3.

La connexion est aussi simple que de connecter la broche numéro un du récepteur d'infrarouge à la broche 10 du port parallèle et la broche 2 du récepteur à la broche 18 du port parallèle. Notons que la broche GND (Ground, masse) doit être connectée en deux endroits: masse de l'alimentation et masse du port parallèle.

Pour effectuer ces connexions, vous pouvez utiliser n'importe quel type de câble.

 

La tâche Temps-Réel

Module de TEMPS-REEL
#define PERIOD 100
#define SIZE 8192
#define FIFO_ZERO 0
#define LP0 0x378 /*Address /dev/lp0*/
#define STS LP0+1

RT_TASK task;

//---------- Tâche de temps réel
void Real_Time_Task(){
  unsigned short data1, data2=0;
  unsigned long  cont = 0L;

  while(1){
    // Lire la valeur du port
    data1=inb(STS) & 0x40;

    // Si pas de changement..
    if ( data2 == data1) {
      // Incrementer le compteur.
      cont++;
    } else {

      // Envoyer la valeur du compteur.
      rtf_put(FIFO_ZERO,
              (char *) &cont,
	    sizeof(cont));
      cont = 0L;
      data2 = data1;

    }
    rt_task_wait();
  }
}

//------------- Programme principal
int init_module(){
  RTIME now = rt_get_time();

  // Créer le FIFO de communication avec Linux.
  rtf_create(FIFO_ZERO,SIZE);

  // Créer la tâche de temps réel.
  rt_task_init(&task,Real_Time_Task,1,3000,4);

  // La rendre périodique.
  rt_task_make_periodic(&task,now+3000,PERIOD);

  return 0;  // Tout a fonctionné.
}

//------------- Pour décharger le module
void cleanup_module(){
  rt_task_delete(&task);
  rtf_destroy(FIFO_ZERO);
}  

La manière la plus simple de mesurer l'état de la broche ACK du port parallèle est de créer une tâche périodique qui se charge de lire l'état du bit (broche). Si elle détecte un changement, alors que la broche ne change pas d'état, on incrémente un compteur qui représente le temps pendant lequel le bit est resté au même niveau. Quand on détecte que la valeur a changé, on envoie la valeur du compteur à une tâche normale de Linux par l'intermédiaire d'un FIFO. Un processus Linux doit être en attente de lecture de ce FIFO. Les valeurs lues sont alternativement la durée de la mise à niveau bas et ensuite celle à niveau haut du signal envoyé par la commande à distance et récupérées par le récepteur à infrarouge.

Effectuer une bonne mesure du signal donné par le récepteur à infrarouge est fondamental, de fait, c'est l'unique motif qui justifie l'usage de temps réel. Interpréter la séquence de valeurs que fournit la tâche de temps réel, pour identifier la touche tapée n'a aucune restriction dans le temps et cela peut être géré dans un processus normal de Linux.

Un autre moyen de mesurer les changements dans la broche ACK consiste à installer un gestionnaire d'interruptions sur l'interruption 7. Cette autre solution dispense de l'usage d'un planificateur ou d'une tâche périodique.

La fonction init_module s'occupe de lancer la tâche. Il suffit de créer le FIFO par lequel communiquera la tâche, créer ensuite la tâche et enfin la convertir en périodique. La valeur de la période (100 RT-Ticks, ce qui correspond à environ 90 micro secondes) est donnée pour tester et gérer les erreurs. Plus la période est faible plus la résolution de la mesure est élevée, mais par contre, plus la tâche induit une surcharge.

Le programme utilisateur suivant envoie sur la sortie standard ce qu'il lit sur le périphérique /dev/rtf0. Avec ce simple programme, nous pouvons "voir" la forme de chaque trame envoyée par l'émetteur à infrarouge quand une touche est pressée.

Programme utilisateur
#include 
#include 
#include 
#include 
#include 
int main(){
  int fd;
  unsigned long cont;
  fd=open("/dev/rtf0",O_RDONLY);
  while(1) {
      read(fd,&cont,sizeof(cont));
      if ( cont > 700) printf("\n");
      printf("%d ",cont);
      fflush(stdout);
    }
  return 0;
}   

La valeur 700 qui apparaît dans le programme est une valeur estimée et représente le temps minimal entre deux trames consécutives.

Bien que la plupart des commandes à distance utilise un signal infrarouge similaire, la manière de codifier les touches peut être assez différente. Reconnaître la touche pressée est un problème de "reconnaissance de formes" et pas de "temps réel". Le meilleur moyen de construire un programme reconnaissant une commande concrète est de regarder la sortie de ce programme pour se faire une idée sur la manière exacte dont notre commande émet les données.

En simplifiant à l'extrême, nous pouvons dire que lorsqu'une touche de la commande à distance est pressée, elle envoie une séquence de frappes que nous verrons à l'écran comme une séquence de chiffres. Si nous maintenons la touche enfoncée, la commande enverra la même séquence de manière périodique (les commandes SONY sont l'exception à la règle).

Regardons une exécution (il faut se rappeler d'installer les modules de temps réel nécessaires: les FIFO et le planificateur):


  # modprobe rt_fifo_new
  # modprobe rt_prio_sched
  # insmod ir
  # ir_get
  0
  126509 13 6 23 7 13 7 12 7 12 7 12 7 12 8 11 8 11 8 11 8 11 8 11 19 11
  1081 13 6 23 7 12 7 12 8 11 8 11 8 11 8 12 7 12 8 11 8 11 8 11 19 11
  1080 14 6 23 7 12 7 12 7 12 7 12 8 11 8 11 8 11 9 11 7 12 8 11 19 11
  1080 13 6 24 6 13 7 12 7 12 7 12 7 12 7 12 8 11 8 11 8 11 8 11 19 11

On peut observer que cette commande répète la même séquence lorsque la touche est maintenue enfoncée. L'autre chose remarquable est l'erreur de mesure. Les chiffres des différentes trames n'ont qu'une variation de 1, ce qui représente l'erreur de quantification.

Pour programmer un moyen de reconnaissance, il suffit de garder dans un tableau de variables chacune des trames envoyées par notre commande, et ensuite, chaque fois qu'une trame arrive, nous comparons (en tolérant une erreur de plus ou moins un) avec celles que nous avons dans le tableau de trames. Ce programme est laissé comme exercice au lecteur.

Quelques commandes à distance émettent une trame distincte chaque fois qu'une touche est pressée, même si nous pressons toujours la même. Voilà ce qu'elles font: quand nous pressons une touche, elles envoient une trame que nous appellerons "TrameA", si nous relâchons et pressons de nouveau elles émettent la "TrameB" ensuite à la pression suivante elles émettent de nouveau la "TrameA" et ainsi de suite. Si on maintient la touche enfoncée, la même trame est émise plusieurs fois. De cette manière, le récepteur peut distinguer une pression longue de deux pressions successives. Comment croyez-vous qu'on gère le canal 11 sur les nouvelles commandes à distance?

 

Reférences

 

Discussion sur cet article

Chaque article possède sa page de discussion. Vous pouvez y soumettre un commentaire ou lire ceux d´autres lecteurs:
 page de discussion 

Site Web maintenu par l´équipe d´édition LinuxFocus
© Ismael Ripoll & Elisa Acosta, FDL
LinuxFocus.org

Cliquez ici pour signaler une erreur ou envoyer un commentaire � Linuxfocus
Translation information:
es -> -- Ismael Ripoll & Elisa Acosta
es -> fr Georges Tarbouriech

2001-03-18, generated by lfparser version 2.8