Dans ce projet, nous allons utiliser des boutons lumineux et gérer boutons et LEDs grâce au registre à décalage. Pour cela nous allons utiliser un module que nous avons développé, le module AC SR Breakout Board. Ce module est une carte d’extension compatible avec différents microcontrôleurs composée de deux registres à décalages et de broches facilitant la connexions de composants.
Matériel
- Microcontrôleur type Arduino
- Bouton poussoir lumineux x5 (ou boutons + leds)
- Module registre a décalage AC SR Breakout Board
Principe
Le module AC SR Breakout Board est constitué de deux registres à décalages que nous allons utiliser pour gérer un groupes de LEDs et un groupe de boutons. Les sorties du premier registre à décalage seront reliées aux boutons tandis que celles du second seront reliées aux LEDs. Il est possible de monter plusieurs modules en série afin d’augmenter le nombre d’entrée sortie.
Schéma de câblage
N.B.: Par soucis de lisibilité, nous n’avons représenté qu’une seule LED et un seul bouton sur le schéma de câblage.
Code
Nous avons vu dans de précédents tutoriels, comment utiliser les registres à décalage:
- le code de base pour allumer et éteindre des LEDs
- Le code de base pour lire plusieurs boutons à l’aide de registre à décalage
Nous allons combiner ces deux codes, pour allumer la LED correspondant au bouton pressé. Ceci est particulièrement utile lorsqu’on travaille avec des bouton lumineux. Dans ce projet, nous allons utiliser les boutons lumineux comme des interrupteurs pour allumer et éteindre leurs propres LEDs.
/ Constants #define number_of_74hc595s 2 #define numOfRegisterPins number_of_74hc595s * 8 #define SER_Pin 2 #define RCLK_Pin 3 #define SRCLK_Pin 4 //Parameters const int grpBtnPin = A0; //Variables boolean registers[numOfRegisterPins]; boolean grpBtnState[numOfRegisterPins]; boolean grpLedState[numOfRegisterPins]; boolean oldGrpBtnState[numOfRegisterPins]; int grpBtnVal[numOfRegisterPins]; void setup() { //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); //Init register pinMode(SER_Pin, OUTPUT); pinMode(RCLK_Pin, OUTPUT); pinMode(SRCLK_Pin, OUTPUT); pinMode(grpBtnPin, INPUT_PULLUP); } void loop() { readGrpBtn(); } void clearRegisters() { /* function clearRegisters */ //// Clear registers variables for (int i = numOfRegisterPins - 1; i >= 0; i--) { registers[i] = LOW; } } void writeRegisters() { /* function writeRegisters */ //// Write register after being set digitalWrite(RCLK_Pin, LOW); for (int i = numOfRegisterPins - 1; i >= 0; i--) { digitalWrite(SRCLK_Pin, LOW); int val = registers[i]; digitalWrite(SER_Pin, val); digitalWrite(SRCLK_Pin, HIGH); } digitalWrite(RCLK_Pin, HIGH); } void setRegisterPin(int index, int value) { /* function setRegisterPin */ ////Set register variable to HIGH or LOW registers[index] = value; } void readGrpBtn() { /* function readGrpBtn */ //// Read each btn for (int i = numOfRegisterPins - 1; i >= 0; i--) { if (i < 16 && i >= 8) { grpBtnState[i] = false; setRegisterPin(i, HIGH); writeRegisters(); delay(20); grpBtnVal[i] = analogRead(grpBtnPin); setRegisterPin(i, LOW); writeRegisters(); Serial.println(grpBtnVal[i]); if (grpBtnVal[i] > 500) { grpBtnState[i] = true; if (oldGrpBtnState[i] != grpBtnState[i]) { grpLedState[i - 8] = !grpLedState[i - 8]; Serial.print(F("Btn ")); Serial.print(i); Serial.print(F(" detected -> State = ")); Serial.println(grpBtnVal[i]); } } } else { // i<8 && i>=0 Serial.print("Set LED"); Serial.print(i); Serial.print(" to "); Serial.println(grpLedState[i]); setRegisterPin(i, grpLedState[i]); writeRegisters(); } } }
Résultat
On peut voir sur le moniteur série, après avoir appuyé sur quelques boutons que les états des LEDs correspondantes ont changé.
N’hésitez pas à nous laisser un commentaire pour nous donner votre avis, vos retours et pistes d’améliorations pour ce tutoriel.
Application
- Fabriquer une console MIDI
- Fabriquer une console HID interactive