Commander un interrupteur à inclinaison (tilt switch) avec Arduino
Nous vous montrons comment utiliser un interrupteur à inclinaison (tilt switch) avec une carte Arduino UNO.
Les interrupteurs à inclinaison (tilt switch en anglais) vous permettent de détecter l'orientation ou l'inclinaison. Ils sont compacts, économiques, économes en énergie et faciles à utiliser. En général, ils ne s'usent pas non plus. Leur simplicité les rend populaires pour les jouets, les gadgets et les appareils ménagers.
Ils sont parfois également appelés « interrupteurs à mercure », « interrupteurs à inclinaison » ou « interrupteurs d'angle d'inclinaison ». Autrefois, les interrupteurs à inclinaison étaient des interrupteurs à mercure, dans lesquels un tube en verre rempli d'une goutte de mercure était muni de deux contacts électriques. Aujourd'hui, on utilise des billes roulantes à la place du mercure. À l'extrémité de la cavité se trouvent deux éléments conducteurs (pôles) qui, à partir d'une certaine inclinaison, sont connectés par la bille pour atteindre l'état de commutation.
Composants nécessaires
- Carte compatible Uno R3
- Interrupteur à inclinaison
- 2x câbles Dupont femelle-mâle
Avantages des interrupteurs à inclinaison
Les interrupteurs à inclinaison ne sont pas aussi précis ou flexibles qu'un accéléromètre complet, mais ils peuvent détecter les mouvements et les orientations. Un autre avantage est que les interrupteurs à inclinaison plus grands peuvent commuter le courant eux-mêmes. Les accéléromètres, en revanche, émettent une tension numérique ou analogique qui doit ensuite être analysée avec un circuit supplémentaire. Un bon exemple d'utilisation de capteurs d'accélération sont les contrôleurs avec une commande de mouvement (par exemple, ceux de la console Switch ou Wii).
Inconvénients des interrupteurs à inclinaison
- Les interrupteurs à mercure sont toxiques et dépassés
- Les vibrations peuvent provoquer des entrées erronées
- Les interrupteurs ne fonctionnent pas sans gravité
- Le fonctionnement n'est pas fiable dans les projets mobiles
Schéma électronique
Schéma de connexion
Code exemple
Avec ce code exemple, nous faisons clignoter la LED intégrée (marquée L sur la carte) lorsque l'interrupteur à inclinaison bascule. Vous pouvez également connecter une LED à la broche 13. Cet exemple est un peu plus complexe que d'habitude, mais grâce à la fonction de débounce, il fonctionne de manière beaucoup plus fiable.
Afficher / masquer le code
// Déclaration des broches
const int ledPin = 13; // Broche pour la LED
const int sensorPin = 2; // Broche pour l'interrupteur à inclinaison
// Déclaration des variables
int sensorState; // État actuel du capteur
int lastTiltState = HIGH; // Dernier état du capteur
int sensorWert; // Variable pour lire la valeur mesurée
unsigned long lastDebounceTime = 0; // Dernière fois que le capteur a été déclenché
unsigned long debounceDelay = 50; // Valeur d'anti-rebond en millisecondes pour éviter les fausses entrées
void setup() {
pinMode(ledPin, OUTPUT); // Initialiser la broche LED comme sortie
pinMode(sensorPin, INPUT); // Initialiser l'interrupteur à inclinaison comme entrée
digitalWrite(sensorPin, HIGH); // Régler l'interrupteur à inclinaison sur HIGH
digitalWrite(ledPin, LOW); // Régler la LED sur LOW
Serial.begin(9600); // Ouvrir la connexion série avec un débit de 9600
}
void loop() {
sensorWert = digitalRead(sensorPin); // Lire la valeur du capteur
// Anti-rebond (debounce) de la valeur du capteur pour éviter les fausses entrées
if (sensorWert == lastTiltState) {
// Réinitialiser le temporisateur d'anti-rebond
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// Si la valeur du capteur est présente plus longtemps que le délai d'anti-rebond, la valeur du capteur est adoptée
lastTiltState = sensorWert;
}
// Si la valeur du capteur est 1 (HIGH), la LED est allumée. Sinon, la LED est éteinte
if (sensorWert == 1) {
digitalWrite(ledPin, HIGH); // Allumer la LED
} else {
digitalWrite(ledPin, LOW); // Éteindre la LED
}
Serial.println(sensorWert); // Affichage de la valeur du capteur
delay(500);
}