Table of Contents

Interrupteur

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

Théorie

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 micro-contrôleur, l’un des contacts de l’interrupteur est connecté à la broche du micro-contrôleur et doit être configuré comme une entrée dans le programme. Si le contact est connecté à la terre ou à un potentiel en entrée, le taux de bits du bus de la broche du micro-contrôleur est modifié. Il est logique d'utiliser l'interrupteur à bascule (toggle), qui permet de connecter un contact avec le contact voulu (dans le cas de la terre ou d’une entrée). Dans notre cas, ce n'est pas si simple. La raison est qu’au moment de changer les connexions les contacts ne sont pas connectés. Le délai est très court (quelques millisecondes), mais pendant ce moment la broche d'entrée du micro-contrôleur n'est connectée à rien et par conséquent a une valeur indéfinie. En raison de l'interférence électromagnétique (qui existe partout) la broche d’entrée qui n'est connectée à rien peut prendre les valeurs 0 ou 1 aléatoirement.

Les interférences rendent l'utilisation des interrupteurs plus compliquée. Une des méthodes principales pour éviter des résultats indéterminés est de connecter l’entrée du micro-contrôleur à la terre ou au potentiel d’entrée au travers d'une résistance. Une résistance remplissant cette fonction est appelée résistance de rappel vers le niveau bas (pull-down) ou vers le niveau haut (pull-up). Habituellement la résistance d’une résistance pull-down ou pull-up varie de 1 kΩ à 1 MΩ. Quand l’interrupteur est ouvert, l'entrée est à la charge de la tension de la résistance. Quand l’interrupteur est fermé, l'entrée reôit la tension de l'interrupteur puisque la résistance de ce dernier est bien plus faible (proche de zéro) que celle de la résistance. C’est typiquement ce qu’on appelle une volt-box.

Schéma de connexion d’un interrupteur avec une résistance pull-up

Avec une résistance pull-up ou pull-down, un simple interrupteur à deux contacts peut être utilisé comme capteur, l’interrupteur connecte l’entrée avec un potentiel et la résistance à l’autre potentiel. Habituellement, les micro-contrôleurs ont une option intégrée de résistance pull-up ou pull-down, il n’y a donc pas besoin d’ajouter de résistance au circuit. Par exemple, les micro-contrôleurs AVR ont des résistances pull-up de 20 kΩ – 50kΩ sur leurs broches d'E/S. Cependant, les interrupteurs mécaniques ont encore un problème – le rebond de l’interrupteur. Cela cause plusieurs petites déconnexions très courtes lors de la connexion. Nous aborderons cette question dans le chapitre suivant, cela n’affectant pas les exemples dans ce chapitre.

Pratique

Sur le module entrée-sortie du HomeLab, il y a trois interrupteurs de type bouton poussoir. Ces interrupteurs connectent les broches du micro-contrôleur à la terre, mais pas directement par l’intermédiaire d'une résistance, afin d’éviter d’avoir un petit circuit en appuyant sur le bouton lorsque les broches sont configurées comme des sorties. L’interrupteur a aussi des résistances pull-up, mais celle-ci a une plus grande résistance que les résistances de protection. Ainsi en appuyant sur le bouton, il y a approximativement une tension de 0V dans la broche correspondante.

Les interrupteurs sont sur les broches PC0, PC1 et PC2. Pour lire le statut des interrupteurs, les broches correspondantes du micro-contrôleur doivent être configurées comme des entrées. Il n’est pas nécessaire de mettre la résistance pull-up interne de l’AVR en fonctionnement, parce que la broche est déjà équipée d’une résistance externe. Lorsque le bouton est enfoncé, le bus de la broche correspondante est à la valeur 0, lorsque le bouton est relâché, cette valeur passe à 1. L’utilisation de LED est possible. pour voir si le micro-contrôleur comprend l'action sur le bouton.

L'exemple de code source suivant permettant l’utilisation des boutons est basé sur la bibliothèque de broches du HomeLab, 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 cet exemple, les LEDs et les boutons sont définis comme des listes – cela permet des les utiliser dans une boucle For. Lors du lancement du programme, les broches des LEDs sont configurées comme des sorties et les boutons comme des entrées. Puis dans le programme, une boucle sans fin récupère constamment 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.