Arduino Macro Pad: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Creata pagina con "= Arduino Macro Pad = Per questo progetto ho preso ispirazione da un prodotto attualmente in commercio nel mercato, come la Elgato StreamDeck, ovvero un dispositivo che presenta diversi pulsanti ai quali vengono associati comandi Macro per ridurre le tempistiche di determinate operazioni in software di ogni tipo. L'idea è quella di realizzare un dispositivo simile con Arduino. === Premesse === Nel considerare la realizzazione di un simile progetto bisogna considerare..."
(Nessuna differenza)

Versione delle 10:58, 23 nov 2021

Arduino Macro Pad

Per questo progetto ho preso ispirazione da un prodotto attualmente in commercio nel mercato, come la Elgato StreamDeck, ovvero un dispositivo che presenta diversi pulsanti ai quali vengono associati comandi Macro per ridurre le tempistiche di determinate operazioni in software di ogni tipo.

L'idea è quella di realizzare un dispositivo simile con Arduino.

Premesse

Nel considerare la realizzazione di un simile progetto bisogna considerare diversi fattori:

- Il Fatto che Arduino debba comunicare con il dispositivo al quale è collegato ci vincola nella scelta della scheda da utilizzare scegliendo tra la Scheda Arduino Pro / Pro Micro o Arduino Leonardo. Volendo realizzare qualcosa che sia il più facilmente trasportabile possibile, la scelta ricade sulla scheda Arduino pro Micro.

- Dopo la scelta della scheda da utilizzare dobbiamo tenere a mente della disponibilità di pin da poter utilizzare per questo progetto, di conseguenza stabilire il principio di funzionamento del dispositivo.

- Se si vuole realizzare un prodotto finale ben presentabile, occorre trovare una soluzione. in questo caso tramite l'utilizzo di un CAD di modellazione 3D gratuito modelleremo i pezzi necessari per il progetto, argomento che verrà approfondito nel paragrafo dedicato.

Principio di funzionamento

In primo luogo per aiutare l'utente a ricordare facilmente i vari comandi Macro utilizzeremo un display OLED di risoluzione 64 x 128, che risulta ideale in quanto non eccessivamente ingombrante e abbastanza visibile e leggibile. tramite 12 pulsanti collegati in una matrice, utilizziamo 7 pin digitali della scheda Arduino e questo ci dà la possibilità di implementare lo scorrimento tra diversi profili tramite l'utilizzo di un encoder rotativo.

Schema di montaggio

Codice

Come prima cosa includiamo le librerie necessarie per il funzionamento dello sketch

#include <Keyboard.h>          //Libreria utilizzata per 'simulare' la pressione di tasti su una tastiera fisica
#include <Keypad.h>            // Libreria utilizzata per ridurre il numero di pin digitali utilizzati dalla scheda
#include <Wire. >              //Libreria per la comuncizaione seriale installata nativamente nell'IDE
#include <Adafruit_GFX.h>      // le due librerie di Adafruit sono entrambe necessarie per il funzionamento del display OLED
#include <Adafruit_SSD1306.h>

dopo di che dobbiamo definire alcuni oggetti per le varie librerie. per ridurre la lunghezza del codice includeremo un altro file .ino che chiameremo "Define".

#include <Define.h>

Nel file "Define.ino" scriveremo le seguenti definizioni:

//Variabili e constanti per il display OLED
#define SCREEN_WIDTH 128    //larghezza del display OLED
#define SCREEN_HEIGHT 64    //altezza del display OLED
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

//Costanti per la libreria Keypad.h
const byte ROWS = 3;
const byte COLS = 4;

char keys[ROWS][COLS] = {
  {'1', '2', '3', '4'},
  {'5', '6', '7', '8'},
  {'9', '0', 'A', 'B'},
};

byte rowPins[ROWS] = {7, 8, 9 };
byte colPins[COLS] = {10, 16, 14, 15};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

//Varibili per la selezione dei profili Macro
unsigned int ProfileSelect = 1;
unsigned int profiles = 2;
unsigned int buttonpress = 0;

//Variabili e constanti per il funzionamento dell'encoder
#define CLK 4                       //Pin di collegamento di CLK
#define DT 5                        //Pin di collegamento di DT
#define SW 6                        //Pin di collegamento di SW

int counter = 1;                    //Variabile counter
int currentStateCLK;                //Variabili per il monitoraggio di CLK
int lastStateCLK;
unsigned long lastButtonPress = 0;  //Variabile per il monitoraggio della presisone del pulsante 

int pressedKey = ' ';               //Variabile per il carattere premuto sul keypad

Dopodiché proseguiamo con la scrittura del blocco setup:

void setup() {
  Serial.begin(9600);                               //Inizializzazione della comunicazione seriale

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { //inizializzazione del display OLED [righe da 11-15]
    while (true);
  }
  display.display();
  display.clearDisplay();

  pinMode(CLK, INPUT);                              //Pin di ingresso dell'encoder
  pinMode(DT, INPUT);
  pinMode(SW, INPUT_PULLUP);
  
  lastStateCLK = digitalRead(CLK);                  //Lettura dello stato iniziale di CLK

  displaySet();                                     //Istruzioni per mostrare sul Diplay OLED la sritta "Macro Pad" nella prima riga
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0, 0);
  display.print("Macro Pad");
  display.display();
}

Nel blocco loop va inserito:

void loop() {
  encoder();                        //Funzione definita al di fuori del loop per acquisire informazioni dall'encoder
  switch (buttonpress) {            //in base al valore della variabile buttonpress, che assume solo valore 0 e 1 si puo accedere al 'menu' di selezione del profilo e selezionarlo
    case 0:                         //quando vale 0 si accede alle macro del profilo selezionato
      switch (ProfileSelect) {      //In base al valore della variabile ProfileSelect si definisce cosa fanno i due profili delle macro
        case 0:                     //Quando la variabile vale 0 si riporta al profilo 1
          ProfileSelect = 1;
          break;

        case 1: //------------------------------------------------------------ | Macro Profile 1 | -------------------------------------------------------------------------------

          encoder();
          if(counter < 1) counter = 1; if(counter > 3) counter = 3;             //Con i due if si limita lintervallo di valori della variabile counter da 1 a 3
          switch (counter) {

            case 1:
              displaySet();                                                     //Le istruzioni delle righe da 45 a 62 mostrano del display informazione per le macro da 1-4
              display.clearDisplay();

              display.setTextSize(2);
              display.setCursor(0, 0);
              display.print("Profile 1");

              display.setTextSize(1);
              display.setCursor(0, 18);
              display.print("M1: Copy    (Ctrl+C)");
              display.setCursor(0, 30);
              display.print("M2: Paste   (Ctrl+V)");
              display.setCursor(0, 42);
              display.print("M3: Cut     (Ctrl+X)");
              display.setCursor(0, 54);
              display.print("M4: Undo    (Ctrl+Z)");

              display.display();

              pressedKey = keypad.getKey();

              switch (pressedKey) {
                case '1':
                  Serial.println("Macro 1");
                  Macro1(1);
                  break;

                case '2':
                  Serial.println("Macro 2");
                  Macro2(1);
                  break;

                case '3':
                  Serial.println("Macro 3");
                  Macro3(1);
                  break;

                case '4':
                  Serial.println("Macro 4");
                  Macro4(1);
                  break;

                case '5':
                  Serial.println("Macro 5");
                  Macro5(1);
                  break;

                case '6':
                  Serial.println("Macro 6");
                  Macro6(1);
                  break;

                case '7':
                  Serial.println("Macro 7");
                  Macro7(1);
                  break;

                case '8':
                  Serial.println("Macro 8");
                  Macro8(1);
                  break;

                case '9':
                  Serial.println("Macro 9");
                  Macro9(1);
                  break;

                case '0':
                  Serial.println("Macro 10");
                  Macro10(1);
                  break;

                case 'A':
                  Serial.println("Macro 11");
                  Macro11(1);
                  break;

                case 'B':
                  Serial.println("Macro 12");
                  Macro12(1);
                  break;
              }
              break;


            case 2:
              displaySet();                                                     //Le istruzioni delle righe da 131 a 148 mostrano del display informazione per le macro da 5-8
              display.clearDisplay();

              display.setTextSize(2);
              display.setCursor(0, 0);
              display.print("Profile 1");

              display.setTextSize(1);
              display.setCursor(0, 18);
              display.print("M5: Sel All (Ctrl+A)");
              display.setCursor(0, 30);
              display.print("M6:");
              display.setCursor(0, 42);
              display.print("M7:");
              display.setCursor(0, 54);
              display.print("M8:");

              display.display();

              pressedKey = keypad.getKey();

              switch (pressedKey) {
                case '1':
                  Serial.println("Macro 1");
                  Macro1(1);
                  break;

                case '2':
                  Serial.println("Macro 2");
                  Macro2(1);
                  break;

                case '3':
                  Serial.println("Macro 3");
                  Macro3(1);
                  break;

                case '4':
                  Serial.println("Macro 4");
                  Macro4(1);
                  break;

                case '5':
                  Serial.println("Macro 5");
                  Macro5(1);
                  break;

                case '6':
                  Serial.println("Macro 6");
                  Macro6(1);
                  break;

                case '7':
                  Serial.println("Macro 7");
                  Macro7(1);
                  break;

                case '8':
                  Serial.println("Macro 8");
                  Macro8(1);
                  break;

                case '9':
                  Serial.println("Macro 9");
                  Macro9(1);
                  break;

                case '0':
                  Serial.println("Macro 10");
                  Macro10(1);
                  break;

                case 'A':
                  Serial.println("Macro 11");
                  Macro11(1);
                  break;

                case 'B':
                  Serial.println("Macro 12");
                  Macro12(1);
                  break;
              }
              break;

            case 3:
              displaySet();                                                     //Le istruzioni delle righe da 216 a 233 mostrano del display informazione per le macro da 9-12
              display.clearDisplay();

              display.setTextSize(2);
              display.setCursor(0, 0);
              display.print("Profile 1");

              display.setTextSize(1);
              display.setCursor(0, 18);
              display.print("M9:");
              display.setCursor(0, 30);
              display.print("M10:");
              display.setCursor(0, 42);
              display.print("M11:");
              display.setCursor(0, 54);
              display.print("M12:");

              display.display();

              pressedKey = keypad.getKey();

              switch (pressedKey) {
                case '1':
                  Serial.println("Macro 1");
                  Macro1(1);
                  break;

                case '2':
                  Serial.println("Macro 2");
                  Macro2(1);
                  break;

                case '3':
                  Serial.println("Macro 3");
                  Macro3(1);
                  break;

                case '4':
                  Serial.println("Macro 4");
                  Macro4(1);
                  break;

                case '5':
                  Serial.println("Macro 5");
                  Macro5(1);
                  break;

                case '6':
                  Serial.println("Macro 6");
                  Macro6(1);
                  break;

                case '7':
                  Serial.println("Macro 7");
                  Macro7(1);
                  break;

                case '8':
                  Serial.println("Macro 8");
                  Macro8(1);
                  break;

                case '9':
                  Serial.println("Macro 9");
                  Macro9(1);
                  break;

                case '0':
                  Serial.println("Macro 10");
                  Macro10(1);
                  break;

                case 'A':
                  Serial.println("Macro 11");
                  Macro11(1);
                  break;

                case 'B':
                  Serial.println("Macro 12");
                  Macro12(1);
                  break;
              }
              break;

            default:
              counter = 1;
              break;

          }

          break;


        case 2: //------------------------------------------------------------ | Macro Profile 2 | -------------------------------------------------------------------------------
          pressedKey = keypad.getKey();
          encoder();
         if(counter == 0) counter = 1; if(counter == 4) counter = 3;            //Con i due if si limita lintervallo di valori della variabile counter da 1 a 3
          switch (counter) {
           
            case 1:
              displaySet();
              display.clearDisplay();

              display.setTextSize(2);
              display.setCursor(0, 0);
              display.print("Profile 2");

              display.setTextSize(1);
              display.setCursor(0, 18);
              display.print("M1:");
              display.setCursor(0, 30);
              display.print("M2:");
              display.setCursor(0, 42);
              display.print("M3:");
              display.setCursor(0, 54);
              display.print("M4:");

              display.display();

              pressedKey = keypad.getKey();

              switch (pressedKey) {
                case '1':
                  Serial.println("Macro 1");
                  Macro1(2);
                  break;

                case '2':
                  Serial.println("Macro 2");
                  Macro2(2);
                  break;

                case '3':
                  Serial.println("Macro 3");
                  Macro3(2);
                  break;

                case '4':
                  Serial.println("Macro 4");
                  Macro4(2);
                  break;

                case '5':
                  Serial.println("Macro 5");
                  Macro5(2);
                  break;

                case '6':
                  Serial.println("Macro 6");
                  Macro6(2);
                  break;

                case '7':
                  Serial.println("Macro 7");
                  Macro7(2);
                  break;

                case '8':
                  Serial.println("Macro 8");
                  Macro8(2);
                  break;

                case '9':
                  Serial.println("Macro 9");
                  Macro9(2);
                  break;

                case '0':
                  Serial.println("Macro 10");
                  Macro10(2);
                  break;

                case 'A':
                  Serial.println("Macro 11");
                  Macro11(2);
                  break;

                case 'B':
                  Serial.println("Macro 12");
                  Macro12(2);
                  break;
              }
              break;


            case 2:
              displaySet();
              display.clearDisplay();

              display.setTextSize(2);
              display.setCursor(0, 0);
              display.print("Profile 2");

              display.setTextSize(1);
              display.setCursor(0, 18);
              display.print("M5:");
              display.setCursor(0, 30);
              display.print("M6:");
              display.setCursor(0, 42);
              display.print("M7:");
              display.setCursor(0, 54);
              display.print("M8:");

              display.display();

              pressedKey = keypad.getKey();

              switch (pressedKey) {
                case '1':
                  Serial.println("Macro 1");
                  Macro1(2);
                  break;

                case '2':
                  Serial.println("Macro 2");
                  Macro2(2);
                  break;

                case '3':
                  Serial.println("Macro 3");
                  Macro3(2);
                  break;

                case '4':
                  Serial.println("Macro 4");
                  Macro4(2);
                  break;

                case '5':
                  Serial.println("Macro 5");
                  Macro5(2);
                  break;

                case '6':
                  Serial.println("Macro 6");
                  Macro6(2);
                  break;

                case '7':
                  Serial.println("Macro 7");
                  Macro7(2);
                  break;

                case '8':
                  Serial.println("Macro 8");
                  Macro8(2);
                  break;

                case '9':
                  Serial.println("Macro 9");
                  Macro9(2);
                  break;

                case '0':
                  Serial.println("Macro 10");
                  Macro10(2);
                  break;

                case 'A':
                  Serial.println("Macro 11");
                  Macro11(2);
                  break;

                case 'B':
                  Serial.println("Macro 12");
                  Macro12(2);
                  break;
              }
              break;

            case 3:
              displaySet();
              display.clearDisplay();

              display.setTextSize(2);
              display.setCursor(0, 0);
              display.print("Profile 2");

              display.setTextSize(1);
              display.setCursor(0, 18);
              display.print("M9:");
              display.setCursor(0, 30);
              display.print("M10:");
              display.setCursor(0, 42);
              display.print("M11:");
              display.setCursor(0, 54);
              display.print("M12:");

              display.display();

              pressedKey = keypad.getKey();

              switch (pressedKey) {
                case '1':
                  Serial.println("Macro 1");
                  Macro1(2);
                  break;

                case '2':
                  Serial.println("Macro 2");
                  Macro2(2);
                  break;

                case '3':
                  Serial.println("Macro 3");
                  Macro3(2);
                  break;

                case '4':
                  Serial.println("Macro 4");
                  Macro4(2);
                  break;

                case '5':
                  Serial.println("Macro 5");
                  Macro5(2);
                  break;

                case '6':
                  Serial.println("Macro 6");
                  Macro6(2);
                  break;

                case '7':
                  Serial.println("Macro 7");
                  Macro7(2);
                  break;

                case '8':
                  Serial.println("Macro 8");
                  Macro8(2);
                  break;

                case '9':
                  Serial.println("Macro 9");
                  Macro9(2);
                  break;

                case '0':
                  Serial.println("Macro 10");
                  Macro10(2);
                  break;

                case 'A':
                  Serial.println("Macro 11");
                  Macro11(2);
                  break;

                case 'B':
                  Serial.println("Macro 12");
                  Macro12(2);
                  break;
              }
              break;

            default:
              counter = 1;
              break;

          }
          break;


        case 3:                     //Quanod la variabile vale 3 si riporta al profilo 2 non andando oltre il valore 3
          ProfileSelect = 2;
          break;
      }
      break;

    case 1:                     //Quando vale 1 si accede al menu di selezione del profilo
      displaySet();
      display.clearDisplay();
      display.setTextSize(2);
      display.setCursor(0, 0);
      display.print("Select:");

      display.setTextSize(1);
      display.setCursor(0, 18);
      display.print("Profile: ");
      display.print(ProfileSelect);

      display.display();
      encoder();
      ProfileSelect = counter;
      if (counter == 0) counter = 1;
      if (counter == 3) counter = 2;
      break;
  }

}