Acquisition des données aux entrées : des capteurs au PIC
 

 

Nous allons maintenant nous intéresser à un point important qui est l'acquisition des données. Celle-ci a pour but de récupérer les étages demandés (poussoirs BP), et également d'informer le programme sur la position actuelle de l'ascenseur (capteurs C).

 

Ici, nous allons, avec l'aide du plan de câblage interne de la carte Pico-API que nous avons vu précédemment, repérer l'arrivée des entrées (poussoirs et capteurs), et regarder comment elles sont reliées au  PIC. Nous allons donc suivre le chemin du signal électrique engendré par l’activation d’une entrée.

 

Les entrées

Mais avant nous devons définir quand est-ce qu'une entrée est dite active.
Une entrée est active lorsque le signal qui en provient est spécifique à l'état actif de l'élément extérieur. Ici, les modifications d'état ont lieu, soit par pression de l'utilisateur sur un bouton poussoir BP, soit par détection du module à un étage pour le cas des capteurs d'étage.

 

Les Capteurs :
 

Mais que sont ces capteurs ? Un capteur est un élément qui doit transformer une information physique, prélevée en entrée, en une autre information physique, dite sortante et le plus souvent de nature électrique. Cette dernière est la représentation de la grandeur entrante et est utilisée dans le but de la mesurer et/ou de commander un quelconque système.

Dans le cas présent, ces capteurs sont passifs, c’est-à-dire qu’ils nécessitent une alimentation extérieure. Ici, ils servent à détecter la présence de l'ascenseur à n'importe lequel des quatre étages du système. Ils sont d’ailleurs visibles sur la maquette, au niveau de chaque étage. Ils doivent se déclencher lors du passage ou l'arrêt de l'ascenseur devant eux. La solution qui est utilisée est un ensemble de capteurs de type magnétique (inductif). Ils ont un caractère dit de proximité.

L’ascenseur est équipé d'un petit aimant. Sur la cage sont fixés à intervalle régulier, à chaque étage les capteurs. Ils sont pratiques car ils ne nécessitent pas de contact physique avec l'objet à détecter. Ils renseignent donc sur le passage ou l'arrêt de la cabine à tel ou tel étage ; en effet, sa présence devant un capteur provoque la création d'une force électromotrice variable dans la bobine.

 

Principe du capteur inductif

 

Le signal électrique délivré en sortie est de nature binaire de manière à être aisément exploitable : les capteurs sont donc du type TOR (tout ou rien). Soit il y a du courant en sortie (le capteur est alors équivalent à un interrupteur fermé) ; soit le courant ne passe pas (et l’interrupteur est ouvert).

 

Le principe du TOR, Tout ou Rien

 

Dans ce système, les capteurs ont une très grande importance. Ils vont servir à détecter les étages, et ceci dans le but, après traitement des signaux, de décider du mouvement de l’ascenseur (haut, bas, arrêt), d’afficher l'étage où est positionné le module, et d'allumer la D.E.L. correspondante à l'étage concerné. Ils sont vraiment à la base du montage.

Par ce schéma nous pouvons d'abord voir que dès qu’un capteur, ou un bouton, est activé, l’effet est celui d’un interrupteur que l’on ferme : le courant passe et atteint un optocoupleur.

 

Liaison entre maquette et carte PIC

 

Donc lorsqu’il y a du courant, au niveau de Opto 1 et Opto 2, celui-ci passe par plusieurs résistances et diodes pour au final arriver au niveau de la DEL infrarouge de l’optocoupleur.

 

Principe de fonctionnement et rôle d’un optocoupleur

Un optocoupleur est constitué d’une DEL et d’un photo transistor. Lorsque la DEL est alimentée, elle émet un faisceau lumineux, ici des rayons infrarouges. Mais le photo-transistor est sensible à ces rayons, et lorsqu’il en reçoit à sa base, il se crée un courant électrique. Le photo-transistor se comporte alors comme un transistor classique et laisse passer le courant des points C à E. Ce composant à l’avantage par rapport à un transistor traditionnel d’isoler l’entrée de la sortie. Ici, l’optocoupleur fonctionne en mode bloqué/saturé. Cela signifie que s’il est saturé, se comporte comme un interrupteur fermé et laisse passer le courant, tandis que lorsqu’il est bloqué, l’interrupteur est ouvert et le courant ne passe pas.

 

Principe de l'optocoupleur

 

Au final, si nous nous reportons au schéma électrique ci-dessous, le passage du courant entre C et E indique un passage du courant entre M et N, et donc que le capteur est actif.

 

Zoom sur les entrées

 

L'ensemble multiplexeur-PIC

Pour continuer à suivre le trajet du courant vers le PIC, nous allons maintenant voir une représentation très simplifiée de la carte programmable, et en particulier de l'ensemble multiplexeur-PIC. On pourrait le schématiser tel que ci-dessous. Sur ce dessin, une seule entrée et une seule sortie sont représentées. C'est un schéma de principe.

 

Ensemble Z
Etat des entrées du multiplexeur
Etat des sorties du PIC

 

Tout d’abord, nous allons nous intéresser à l’entrée. Nous l’avons vu, lorsque le photo-transistor est saturé, il se comporte comme un interrupteur fermé. Autrement dit, la tension entre ses bornes CE est nulle, car elle est alors équivalente à celle aux extrémités d’un fil. En revanche lorsque le transistor est bloqué, CE est maximale. Le photo-transistor est ici représenté par l’interrupteur k1. Or en schématisant l’ensemble de composants PIC + Multiplexeur par Z, on peut voir que l’état en entrée de Z dépend du potentiel aux bornes de l’interrupteur. Lorsque celui-ci est au point haut, le niveau est à 1 ; inversement lorsqu’il est au point bas (ici nul), l’état logique en entrée est 0.

Donc, lorsque l’interrupteur (le capteur) est activé, l’état en entrée de Z est 0, alors que lorsqu’il est désactivé, l’état est 1.

 

Mais intéressons-nous maintenant à cette structure Z.

Cet ensemble est composé principalement du PIC (PIC 16F84) et d’un multiplexeur reliés entre eux comme nous pouvons le voir sur ce schéma.

 

Zoom sur l'ensemble "Z" multiplexeur-PIC

 

Ainsi il faut voir que le PORTA du PIC est connecté au multiplexeur. Et nous allons donc nous intéresser aux échanges entre ces 2 entités en étudiant le fonctionnement du multiplexeur.

On peut schématiser un multiplexeur comme ceci : D'un côté les entrées reliées aux capteurs et poussoirs, de l'autre l'interface avec le PIC. 3 bits sont des entrées, du PIC vers le multiplexeur, l'autre est une sortie du multiplexeur vers le PIC. A chaque entrée E du multiplexeur correspond un code en binaire : 000 pour E0, 001 pour E1, 003 pour E2, etc… En fonction du code binaire reçu à ses entrées ABC, le multiplexeur change l’état de la sortie S. Celle-ci prend alors comme état le complément de l’entrée E correspondante au code reçu sur ABC. En fait la sortie S est inverseuse, c’est pour cette raison que l’état en sortie est le complément de l’état initial.

Exemple : Lorsqu'on envoie l'information 000 aux entrées ABC, c'est comme si le multiplexeur reliait l'entrée E0 à une inverseuse, elle-même reliée à la sortie S. Si l'on envoie (000)2, le lien se fait avec E0. Avec (100)2, S prend la valeur binaire différente de E8… Si E8 est à 1, la sortie est à 0.

La nécessité d’avoir un multiplexeur vient du fait que le PIC ne compte que 5 entrées en PORTA, alors qu’il en faut en minimum de 8. Mais de l’utilisation du multiplexeur découle donc un problème. Comme les entrées BP et C ne sont pas reliées directement au PIC, celui-ci ne peut savoir instantanément et simultanément l’état des entrées BP et C.

Nous devons donc mettre en place une boucle dans le programme qui va scanner en permanence les entrées l'une après l'autre.

Donc, au niveau du PIC, A0, A1 et A2 sont des sorties reliées à A, B et C tandis que A3 est une entrée reliée à S. Il s'agit donc d'envoyer aux sorties {A0, A1, A2} du PIC la valeur (000), de récupérer l’état de A3, puis d’envoyer (001), de récupérer l’état de A3, et ainsi de suite en boucle…

Au final, après passage dans tous ces circuits, l’état à l’entrée du PIC correspond bien à l’état du capteur (1 ó activé et 0 ó inactif). Nous travaillons donc en entrée en logique positive.

 

Le Programme

Et maintenant voici la transposition de ces idées en langage C, avec en premier la fonction scan() du programme qui s’occupe de récupérer les informations en entrées et que nous allons examiner.

 

Programme d'acquisition des données

 

char dejaBP, i, entree, poussoir, etage, dejaetage;
while(1)
{
     dejaBP=0;
     for (i=0 ; i<=3 ; i++)
     {
          PORTA=i;
          entree=PORTA && 0x08;
          if (entree!=0)
          {
               poussoir=i;
               dejaBP=dejaBP+1;
          }
     }
     if (dejaBP==1) //1 unique poussoir a été détecté
     {
          return poussoir;
     }
}

Zoom sur l'ensemble "Z" multiplexeur-PIC

 

Explications

Cette fonction, lorsqu’elle est appelée par le programme principal, a pour rôle de scanner l’une après l’autre les différentes entrées BP. La fonction continue de tourner en boucle [while(1) {}] tant qu’une impulsion sur un bouton poussoir n’a pas été détectée. A l’intérieur de cette boucle, une autre boucle [for (i=0 ; i<=3 ; i++) {}] est crée, dont la variable i est modifiée à chaque tour. Elle contient ces instructions :

PORTA=i;
entree=PORTA && 0x08;

Le PORT A prend alors la valeur de i, qui varie de 0 à 3 en décimal, donc de (000) à (011) en binaire. En modifiant ce PORT A, on modifie donc les entrées A, B et C du multiplexeur, qui va indiquer en sortie S l’état du poussoir Ei ce qui modifie A3. Il nous suffit ensuite de lire cette valeur.

L’opération qui donne la variable entree s’appelle un masquage. On détaillera le masquage plus loin lorsqu’on parlera des sorties. Ici, il faut savoir que cela permet d’extraire du PORT A l’état du seul bit A3. Donc entree récupère une valeur, soit égale à 0, soit différente.

Par la suite on analyse donc cette donnée :

if (entree!=0) {poussoir=i;}

Nous l’avons vérifié dans les paragraphes précédents, nous travaillons bien en logique positive en entrée ; donc si entree vaut 0, alors le poussoir BPi est désactivé, tandis que si entree est différente de 0, c’est que BPi est actif et poussoir prend la valeur du numéro du BP.

Toutefois, nous nous sommes posés la question, qu’arrive-t-il si l’on appuie sur deux boutons en même temps ? Il y avait deux options : soit l’un était privilégié et celui-ci aurait alors été celui qui était scanné à ce moment ; soit on interdisait cette possibilité. Et c’est cette dernière option que nous avons choisi. Si plusieurs poussoirs sont appuyés en même temps, aucun n’aura de réponse. Ceci a été rendu possible par l’ajout d’une variable supplémentaire dejaBP. Celle-ci s’occupe de comptabiliser le nombre de poussoirs reconnus comme actifs lors d’un cycle de la boucle while(1) {}. En fait, elle est remise à 0 à chaque cycle de cette boucle, et est incrémentée de 1 chaque fois qu’un BP est détecté actif. A la fin de la boucle, il suffit alors de poser cette condition :

if (dejaBP==1) {return poussoir;}

Ainsi, si un seul poussoir actif a été détecté, on retourne la valeur de l’étage demandé, et si aucun ou plusieurs sont dans ce cas, la fonction ne retourne pas de valeur et re-boucle afin de démarrer une nouvelle période de détection.

 

La fonction que nous venons d'étudier ne traitait que des boutons poussoirs, mais la même technique est utilisée pour récupérer l'état des capteurs.

 
E PRÉCÉDENT SOMMAIRE SUIVANT F