This is an old revision of the document!
Necessary knowledge: [HW] User Interface Module, [AVR] Registers, [AVR] Digital Inputs/Outputs, [LIB] Pins, [PRT] Light-emitting Diode
Connaissances nécessaires: [HW] digi, [AVR] Registres, [AVR] Entrées/sorties numériques, [LIB] Broches, [PRT] Diode électroluminescente
Un interrupteur est un dispositif électromagnétique qui permet d’ouvrir ou de fermer un circuit électrique. Il y a beaucoup de types différents d’interrupteurs, l’interrupteur mécanique le plus commun inclut des connecteurs électriques qui peuvent être connectés mécaniquement. Si les connecteurs sont connectés, le circuit électrique est fermé et l'électricité peut passer à travers l’interrupteur. Si les connecteurs sont déconnectés, l'électricité ne peut pas passer à travers l’interrupteur.
Les interrupteurs peuvent être utilisés pour fournir de l'électricité aux circuits électriques ; ils peuvent aussi être utilisés comme capteurs. L’interrupteur comme capteur est le sujet de cet exercice, donc nous n'examinerons pas les interrupteurs spécifiques pour la haute tension ou le fort ampérage. Les interrupteurs diffèrent de par leur nombre de contacts et leur principe de connexion. Il y a des interrupteurs à deux contacts et également des doubles interrupteurs dans lesquels des paires de contact sont connectées. Il y a le bouton poussoir, les interrupteurs à curseur, à bascule. Il y a aussi des interrupteurs qui déconnectent au lieu de connecter le circuit électrique.
Pour identifier les différents types d’interrupteurs, on utilise des symboles différents. Les exemples suivants sont des exemples classiques d’interrupteurs utilisés dans les schémas électriques, accompagnés de leur symbole :
à bouton poussoir | à bascule (toggle) | à bascule (rocker) | Microrupteur | à double rangée de connexions (DIL) |
---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Pour utiliser un interrupteur comme capteur connecté à un microcontrôleur, l’un des contacts de l’interrupteur est connecté à la barrette du microcontrôleur, qui doit être configuré comme une entrée. Si le contact est connecté à la terre ou un potentiel en entrée, le taux de bits du bus de la barrette du microcontrôleur est changé. Il est logique d'utiliser l'interrupteur de basculement, qui permet de connecter de connecter un contact au contact voulu (dans le cas de la terre ou d’une entrée), mais ce n'est pas si simple. La raison est qu’au moment de changer les connexions les contacts ne sont pas connectés. Ce moment est très court (quelques millisecondes), mais pendant ce moment les barrettes d’entrée du microcontrôleur ne sont connectés à rien et il n’y a pas de valeur définie. En raison de l'interférence électromagnétique (qui est partout) les barrettes d’entrée du microcontrôleur peuvent prendre momentanément les valeurs arbitraires de 0 ou 1.
Les interférences rendent l'utilisation des interrupteurs plus compliqué. Une des méthodes principales pour éviter les résultats indéterminés est de connecter l’entrée du microcontrôleur à la terre ou le potentiel d’entrée à travers une résistance. Une résistance remplissant cette fonction est appelée résistance pull-down ou pull-up. Habituellement la résistivité d’une résistance pull-down ou pull-up varie de 1 kΩ à 1 MΩ. Quand l’interrupteur est ouvert, la tension restante en entrée de la résistance est connectée. Quand l’interrupteur est fermé, l’inversion de la tension est appliquée à l’entrée parce que la résistivité de l’interrupteur est plus petite (proche de zéro) que celle de la résistance. C’est typiquement ce qu’on appelle une volt-box.
Avec une résistance pull-up ou pull-down un simple interrupteur deux contacts peut être utilisé comme un capteur, l’interrupteur connecte l’entrée avec un potentiel et la résistance à l’autre potentiel. Habituellement les microcontrôleurs sont fabriqués en tenant compte e l’utilisation des résistances pull-up ou pull-down, il n’y a donc pas besoin d’ajouter de résistance au circuit, par exemple le microcontrôleur AVR a des résistances pull-up de 20 kΩ – 50kΩ sur les 10 barrettes. Cependant, les interrupteurs mécaniques ont encore un problème – debounce de l’interrupteur. C’est la cause de beaucoup de petites déconnexions pendant que l’interrupteur devrait être connecté. Nous aborderons cette question dans le chapitre suivant cela n’affectant pas les exemples dans ce chapitre.
Sur le module entrée-sortie du home laboratory, il y a trois interrupteurs de type bouton poussoir. Ces interrupteurs connectent les barrettes du microcontrôleur à la terre, mais pas directement par l’intermédiaire de la résistance, la raison pour cela est d’éviter d’avoir un petit circuit en appuyant sur le bouton lorsque la barrette est configurée comme une sortie. L’interrupteur a aussi une résistance pull-up, mais celle-ci a une plus grande résistivité que les résistances de protection, ainsi en appuyant sur le bouton, il y a approximativement une tension de 0V dans la barrette correspondante.
Les interrupteurs sont sur les barrettes PC0, PC1 et PC2. Pour lire le statut des interrupteurs, les barrettes correspondantes du microcontrôleur peuvent être configurées comme des entrées. Il n’est pas nécessaire de mettre la résistance pull-up interne de l’AVR, parce que la barrette est déjà équipée d’une résistance externe. Lorsque le bouton est appuyé vers le bas, la barrette correspondante est à la valeur 0, lorsque le bouton est relâché, cette valeur passe à 1, l’utilisation de LED d’indication est possible.
Le code source suivant permettant l’utilisation des boutons est basé sur la librairie home lab, qui a été présentée précédemment dans l’exemple des LED.
// // Program for testing the buttons of the home lab's digital input-output module // #include <homelab/pin.h> // // Determining the pins of LED-d and buttons. // pin leds[3] = { PIN(C, 5), PIN(C, 4), PIN(C, 3) }; pin buttons[3] = { PIN(C, 2), PIN(C, 1), PIN(C, 0) }; // // Main program // int main(void) { unsigned char i; // Setting the LED pins as outputs and buttons' pins as inputs. for (i = 0; i < 3; i++) { pin_setup_output(leds[i]); pin_setup_input(buttons[i]); } // Endless cycle while (true) { //Each button has a corresponding LED, witch lights when button is pressed. for (i = 0; i < 3; i++) { pin_set_to(leds[i], pin_get_value(buttons[i])); } } }
Dans l’exemple donné les LEDs et les boutons sont définis dans une liste – cela permet des les utiliser dans une boucle for. En commençant ce programme, les barrettes des LEDs sont configurés comme des sorties et les boutons comme des entrées. Puis dans le programme, une boucle sans fin récupère l’état des boutons et détermine l’état des LEDs correspondantes. Le premier bouton allume la LED verte, le deuxième la jaune et le troisième la rouge.