Arduino Macro Pad: differenze tra le versioni

Da Wikiversità, l'apprendimento libero.
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..."
 
Commenti al blocco loop del codice di arduino
Riga 100: Riga 100:


encoder();
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
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) {
switch (counter) {


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


Riga 123: Riga 123:
display.display();
display.display();


pressedKey = keypad.getKey();
pressedKey = keypad.getKey(); //Lettura del pulsante premuto sul keypad


switch (pressedKey) {
switch (pressedKey) { //In base al carattere di pressedKey vengono riprodotte le rispettive macro del profilo 1
case '1':
case '1':
Serial.println("Macro 1");
Serial.println("Macro 1");
Riga 190: Riga 190:


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


Riga 209: Riga 209:
display.display();
display.display();


pressedKey = keypad.getKey();
pressedKey = keypad.getKey(); //Lettura del pulsante premuto sul keypad


switch (pressedKey) {
switch (pressedKey) { //In base al carattere di pressedKey vengono riprodotte le rispettive macro del profilo 1
case '1':
case '1':
Serial.println("Macro 1");
Serial.println("Macro 1");
Riga 275: Riga 275:


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


Riga 294: Riga 294:
display.display();
display.display();


pressedKey = keypad.getKey();
pressedKey = keypad.getKey(); //Lettura del pulsante premuto sul keypad


switch (pressedKey) {
switch (pressedKey) { //In base al carattere di pressedKey vengono riprodotte le rispettive macro del profilo 1
case '1':
case '1':
Serial.println("Macro 1");
Serial.println("Macro 1");
Riga 375: Riga 375:
case 1:
case 1:
displaySet(); //Le istruzioni delle righe da 288 a 305 mostrano del display informazione per le macro da 1-4
displaySet();
display.clearDisplay();
display.clearDisplay();


Riga 394: Riga 394:
display.display();
display.display();


pressedKey = keypad.getKey();
pressedKey = keypad.getKey(); //Lettura del pulsante premuto sul keypad


switch (pressedKey) {
switch (pressedKey) { //In base al carattere di pressedKey vengono riprodotte le rispettive macro del profilo 2
case '1':
case '1':
Serial.println("Macro 1");
Serial.println("Macro 1");
Riga 461: Riga 461:


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


Riga 480: Riga 480:
display.display();
display.display();


pressedKey = keypad.getKey();
pressedKey = keypad.getKey(); //Lettura del pulsante premuto sul keypad


switch (pressedKey) {
switch (pressedKey) { //In base al carattere di pressedKey vengono riprodotte le rispettive macro del profilo 2
case '1':
case '1':
Serial.println("Macro 1");
Serial.println("Macro 1");
Riga 546: Riga 546:


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


Riga 565: Riga 565:
display.display();
display.display();


pressedKey = keypad.getKey();
pressedKey = keypad.getKey(); //Lettura del pulsante premuto sul keypad


switch (pressedKey) {
switch (pressedKey) { //In base al carattere di pressedKey vengono riprodotte le rispettive macro del profilo 2
case '1':
case '1':
Serial.println("Macro 1");
Serial.println("Macro 1");
Riga 638: Riga 638:




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

Versione delle 11:08, 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();                     //Lettura del pulsante premuto sul keypad

              switch (pressedKey) {                             //In base al carattere di pressedKey vengono riprodotte le rispettive macro del profilo 1
                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();                     //Lettura del pulsante premuto sul keypad

              switch (pressedKey) {                             //In base al carattere di pressedKey vengono riprodotte le rispettive macro del profilo 1
                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();                     //Lettura del pulsante premuto sul keypad

              switch (pressedKey) {                             //In base al carattere di pressedKey vengono riprodotte le rispettive macro del profilo 1
                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();                                      //Le istruzioni delle righe da 288 a 305 mostrano del display informazione per le macro da 1-4
              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();                     //Lettura del pulsante premuto sul keypad

              switch (pressedKey) {                             //In base al carattere di pressedKey vengono riprodotte le rispettive macro del profilo 2
                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();                                      //Le istruzioni delle righe da 374 a 391 mostrano del display informazione per le macro da 5-8
              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();                     //Lettura del pulsante premuto sul keypad

              switch (pressedKey) {                             //In base al carattere di pressedKey vengono riprodotte le rispettive macro del profilo 2
                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();                                      //Le istruzioni delle righe da 459 a 476 mostrano del display informazione per le macro da 9-12
              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();                     //Lettura del pulsante premuto sul keypad

              switch (pressedKey) {                             //In base al carattere di pressedKey vengono riprodotte le rispettive macro del profilo 2
                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:                     //Quando 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;
  }

}