fbpixel
Étiquettes : , , ,

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.

ac-sr-breakout-board-v2 Gérer boutons et LEDs avec un registre à décalage

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.

acsrmodule-btn-led_bb Gérer boutons et LEDs avec un registre à décalage

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é.

acsrbreakoutboard-leds-buttons-results Gérer boutons et LEDs avec un registre à décalage

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

Sources