fbpixel
Etiquetas: , , ,

En este proyecto, vamos a utilizar botones luminosos y gestionar botones y LEDs utilizando el registro de desplazamiento. Para ello, vamos a utilizar un módulo que hemos desarrollado, el módulo AC SR Breakout Board. Este módulo es una placa de extensión compatible con varios microcontroladores, que consta de dos registros de desplazamiento y pines para conectar componentes.

Hardware

  • Microcontrolador Arduino
  • Pulsador luminoso x5 (o pulsadores + LED)
  • AC SR Breakout Board módulo de registro de desplazamiento

Principio

El módulo AC SR Breakout Board consta de dos registros de desplazamiento que utilizaremos para controlar un grupo de LEDs y un grupo de botones. Las salidas del primer registro de desplazamiento se conectarán a los botones, mientras que las del segundo se conectarán a los LEDs. Se pueden conectar varios módulos en serie para aumentar el número de entradas y salidas.

ac-sr-breakout-board-v2 Gestión de botones y LED con un registro de desplazamiento

Esquema eléctrico

N.B.: Para facilitar la lectura, sólo se muestran un LED y un botón en el diagrama de cableado.

acsrmodule-btn-led_bb Gestión de botones y LED con un registro de desplazamiento

Código

En tutoriales anteriores hemos visto cómo utilizar registros de desplazamiento:

  • el código básico para encender y apagar los LEDs
  • El código básico para leer varios botones utilizando registros de desplazamiento

Combinaremos estos dos códigos para encender el LED correspondiente al botón pulsado. Esto es particularmente útil cuando se trabaja con botones iluminados. En este proyecto, vamos a utilizar los botones iluminados como interruptores para encender y apagar sus propios 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();
    }
  }
}

Resultados

Después de pulsar algunos botones, puede ver en el monitor serie que los estados de los LED correspondientes han cambiado.

acsrbreakoutboard-leds-buttons-results Gestión de botones y LED con un registro de desplazamiento

No dudes en dejarnos un comentario para darnos tu opinión, feedback y sugerencias de mejora para este tutorial.

Aplicación

  • Construir una consola MIDI
  • Crear una consola HID interactiva

Fuentes