Controlar Matriz Led 3x3, cada led individualmente, con Matriz de Botones 3x3

Comunidad Arduino.

Soy un entusiasta de la música y la tecnología, y tratando de unir ambas pasiones me he planteado desarrollar este proyecto.

Les presento mi proyecto.

Se trata de un MIDI FootController, un controlador MIDI, que se use con los pies, para guitarristas.

está hecho para controlar software de música (para guitarristas) como el amplitube o el guitar rig

Contará con:

  • 9 pulsadores (Una matriz de pulsadores de 3x3)
  • 9 Leds (Una matriz de Leds 3x3)
  • 2 potenciómetros que actuarán como pedales de expresión (para volumen y/o efectos como el wah)
  • todo Controlado por un ARDUINO UNO

Cada pulsador enviará su correspondiente señal MIDI para activar o desactivar los efectos y otras características del software.

Quiero, además que al presionar dicho pulsador (el (0)(0), de la matriz de pulsadores, por ejemplo, el led correspondiente el, (0)(0) de la matriz de leds se prenda o apague según corresponda. igual que en el programa de switch button.

Actualmente he logrado tener una lectura correcta de la matriz de pulsadores, con uso de la librería Keypad.

sin embargo, y aqui va mi primera pregunta.

No logro controlar adecuadamente la matriz de leds, individualmente, se prenden y apagan como corresponde pero SOLO SI FUNCIONA UNO A LA VEZ.

He leído algo sobre multiplexión en matrices de leds, pero no he logrado incorporarlo al código con éxito alguno. Por ejemplo, al presionar el pulsador (0)(0), se enciende el led (0)(0), al presionarlo de nuevo se apaga (hasta ahí correcto), pero si enciendo el led (0)(0), a continuación el (0)(1) y apago el (0)(1), se apaga también el (0)(0), aunque el estado del pulsador (0)(0) indique que está prendido.

Mi objetivo es que cada Led se encienda y pague independiente con cada pulsador correspondiente, aunque leds y pulsadores se encuentren en una matriz.

He visto un ejemplo de lo que quiero lograr, pero no hay mucha información al respecto.

Adjunto el código que he desarrollado hasta el momento:

#include <Keypad.h>

int state[]={1,2,3,4,5,6,7,8,9};      // the current state of the output pin
int reading[]={1,2,3,4,5,6,7,8,9};    // the current reading from the input pin
int previous[]={1,2,3,4,5,6,7,8,9};   // the previous reading from the input pin

long time = 0;         // the last time the output pin was toggled
long debounce = 200;   // the debounce time, increase if the output flickers

int led_rows[]={8,9,10};
int led_cols[]={11,12,13};
const byte rows = 3; 
const byte cols = 3; 
char keys[rows][cols] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
};

byte rowPins[rows] = {5, 6, 7}; 
byte colPins[cols] = {2, 3, 4}; 

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );

void setup(){
  Serial.begin(9600);
  
  for(int i=1;i<10;i++){
  state[i]=LOW;
  }
  
  for(int i=1;i<10;i++){
  reading[i]=LOW;
  }
  
  for(int i=1;i<10;i++){
  previous[i]=LOW;
  }
  
  for(int i=0;i<3;i++){
  pinMode(led_cols[i], OUTPUT);
  digitalWrite (led_cols[i], HIGH);
  }
  
  for(int i=0;i<3;i++){
  pinMode(led_rows[i], OUTPUT);
  digitalWrite (led_rows[i], LOW);
  }
  
}

void Led1_On(){
  digitalWrite (led_rows[0], HIGH);
  digitalWrite (led_cols[0], LOW);
}

void Led1_Off(){
  digitalWrite (led_rows[0], LOW);
  digitalWrite (led_cols[0], HIGH);
}

void Led2_On(){
  digitalWrite (led_rows[0], HIGH);
  digitalWrite (led_cols[1], LOW);
}

void Led2_Off(){
  digitalWrite (led_rows[0], LOW);
  digitalWrite (led_cols[1], HIGH);
}

void Led3_On(){
  digitalWrite (led_rows[0], HIGH);
  digitalWrite (led_cols[2], LOW);
}

void Led3_Off(){
  digitalWrite (led_rows[0], LOW);
  digitalWrite (led_cols[2], HIGH);
}

void Led4_On(){
  digitalWrite (led_rows[1], HIGH);
  digitalWrite (led_cols[0], LOW);
}

void Led4_Off(){
  digitalWrite (led_rows[1], LOW);
  digitalWrite (led_cols[0], HIGH);
}

void Led5_On(){
  digitalWrite (led_rows[1], HIGH);
  digitalWrite (led_cols[1], LOW);
}

void Led5_Off(){
  digitalWrite (led_rows[1], LOW);
  digitalWrite (led_cols[1], HIGH);
}

void Led6_On(){
  digitalWrite (led_rows[1], HIGH);
  digitalWrite (led_cols[2], LOW);
}

void Led6_Off(){
  digitalWrite (led_rows[1], LOW);
  digitalWrite (led_cols[2], HIGH);
}

void loop(){
  char key = keypad.getKey();
  
  if (key == '1' && previous[1] == LOW && millis() - time > debounce) {
    if (state[1] == HIGH)
     { 
      state[1] = LOW;
      Led1_Off();
     }
    else
      {
      state[1] = HIGH;
      Led1_On();
      }

    time = millis();    
  }
  
  Serial.println(state[1]);
  previous[1] = reading[1];
  
  if (key == '2' && previous[1] == LOW && millis() - time > debounce) {
    if (state[2] == HIGH)
     { 
      state[2] = LOW;
      Led2_Off();
     }
    else
      {
      state[2] = HIGH;
      Led2_On();
      }

    time = millis();    
  }
  
  Serial.println(state[2]);
  previous[2] = reading[2];
  
  if (key == '3' && previous[3] == LOW && millis() - time > debounce) {
    if (state[3] == HIGH)
     { 
      state[3] = LOW;
      Led3_Off();
     }
    else
      {
      state[3] = HIGH;
      Led3_On();
      }

    time = millis();    
  }
  
  Serial.println(state[3]);
  previous[3] = reading[3];
  
  if (key == '4' && previous[1] == LOW && millis() - time > debounce) {
    if (state[4] == HIGH)
     { 
      state[4] = LOW;
      Led4_Off();
     }
    else
      {
      state[4] = HIGH;
      Led4_On();
      }

    time = millis();    
  }
  
  Serial.println(state[4]);
  previous[4] = reading[4];
  
  if (key == '5' && previous[5] == LOW && millis() - time > debounce) {
    if (state[5] == HIGH)
     { 
      state[5] = LOW;
      Led5_Off();
     }
    else
      {
      state[5] = HIGH;
      Led5_On();
      }

    time = millis();    
  }
  
  Serial.println(state[5]);
  previous[5] = reading[5];
  
  if (key == '6' && previous[6] == LOW && millis() - time > debounce) {
    if (state[6] == HIGH)
     { 
      state[6] = LOW;
      Led6_Off();
     }
    else
      {
      state[6] = HIGH;
      Led6_On();
      }

    time = millis();    
  }
  
  Serial.println(state[6]);
  previous[1] = reading[6];
}

Pueden ingresar AQUI, para ver el proyecto en TINKERCAD

Adjunto además un diagrama de la conexión que he realizado.

Muchas gracias, estoy abierto a cualquier idea, ayuda, sugerencia ya que mis conocimientos en electronica y programación se limitan a lo aprendido con arduino.

Nuevamente, muchas gracias.

Eduardo Robelly.
Quito- Ecuador.

2 Likes