Collegamenti Button Box con Arduino Micro

Mmmm ... la Nano è basata su ATmega328P, la Micro su ATmega32U4 ... verificherei bene prima di scambiarle ...

Guglielmo

Si ma io intendevo solo ai fini della simulazione, non nella realtà. Il codice che può girare su Micro gira anche su Nano a meno di non giocare con registri e cose a basso livello, per il resto la gestione di pulsanti ed encoder è la stessa.

In uno schema elettrico i pin di un integrato o di un modulo non stanno necessariamente in ordine, né sono tutti presenti, ma solo quelli usati, al fine di migliorare la comprensibilità dello schema. Tutto è rivolto alla massima comprensibilità. A volte, addirittura i pin di alimentazione e massa vengono rappresentati separatamente su un altro rettangolo, come se fosse un altro componente, ma con la stessa sigla.

Qualche esempio a caso:

https://www.industrial-electronics.com/elektor_303_10.html

per lo OP

prova a vedere qui:https://www.baldengineer.com/arduino-keyboard-matrix-tutorial.html

Quindi con i diodi verrebbe qualcosa del genere:

Però, se voglio mettere i diodi, sono costretto a fare una scheda, tipo circuito stampato o potrei usare una breadboard? immagino non possa mettere i cavi collegati direttamente dai pulsanti alla Micro...
Per quanto riguarda la possibilità di programmare i pulsanti, leggendo al link postato da Ducembarr, in fondo dice che con la libreria Keypad, è possibile "define the keys", sarebbe quello che vorrei fare io? anche se poi dice che aumenta la complessità del codice quindi non so se sarei in grado.
A presto, grazie.
Giuseppe

Sbroglia quella cosa illeggibile e spaghettosa

SW1 ha il diodo connesso male

Temo che quello che vuoi fare tu dipenda dalla libreria joystick, che non conosciamo
Se non addirittura dal PC

La keypad si limita a leggere i tasti
A trasmettere l'informazione al PC ci pensa la joystick

Ho messo a posto il diodo ma per quanto riguarda l'ordine non saprei come fare... una mezza idea ce l'ho e quando avrò tempo ci provo.
La programmazione di una macro keyboard con pulsanti a matrice ed encoder sembrerebbe si possa fare, almeno secondo alcuni tutorial che ho visto; ovviamente il codice usato da loro non si abbina alla mia Button Box perchè sono diversi il numero dei bottoni e i collegamenti... proverò a confrontare il mio sketch col loro e vedo se riesco a capire il funzionamento speando di non segarmi la Micro.

Questo è certo
Ma non dipende dalla keypad

Poi sei libero di guardare tutti i demo, tutorial e video che vuoi...

Bho a me non interessa se servirà la libreria Keypad o la libreria Joystick o chissà che altro, io sono in cerca di consigli su come programmare la Micro per fare quello che voglio; se qualcuno riesce a darmeli, partendo dallo sketch che ho postato prima o con uno sketch completamente nuovo, bene se no amen troverò altre soluzioni.
Intanto ho analizzato esattamente tutti i comandi che dovrò dare nel simulatore e, in effetti, non c'è mai la necessità di avere un contatto sempre attivo o due pulsanti premuti in contemporanea quindi cambierò le levette a 3 posizioni con delle levette col ritorno automatico e non metterò i diodi semplificando le cose.
A presto.
Giuseppe

Mettendo le levette col ritorno automatico le considero in pratica alla stessa stregua dei pulsanti e tolti i diodi, che in realtà non mi servono, ho rifatto lo schema che ora mi sembra decisamente in ordine e chiaro; se pensate che ci siano cose da migliorare ditemelo che cerco di farle... se poi mi sapete aiutare nello sketch... :smiley: :smiley: :smiley:
A presto.
Giuseppe

Per la serie "chi fa da se fa per tre" :joy: ho trovato una discreta soluzione; ancora non ho collegato gli encoder, quella sarà la prossima sfida.
Allego lo sketch che magari può servire a qualcuno con lo stesso problema (cambiando il keyboard.print tipo al CASE '7' posso mettere delle macro:

#include <Keypad.h>
#include <Encoder.h>
#include <HID-Project.h>

// Keypad buttons
int R1 = 21;
int R2 = 20;
int R3 = 19;
int R4 = 18;
int R5 = 15;
int C1 = 14;
int C2 = 16;
int C3 = 10;
int C4 = 9;
int C5 = 8;

const byte ROWS = 5;
const byte COLS = 5;
char keys[ROWS][COLS] = {
  {'X', '7', '4', '1', '0'},
  {'L', '8', '5', '2', 'M'},
  {'N', '9', '6', '3', 'A'},
  {'B', 'C', 'D', 'E', 'F'},
  {'G', 'H', 'I', 'J', 'K'}
};

byte rowPins[ROWS] = {R1, R2, R3, R4, R5};
byte colPins[COLS] = {C1, C2, C3, C4, C5};

Keypad kpd = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// Encoder buttons
int button1Pin = 5;
int button2Pin = 6;
int button3Pin = 2;
int button4Pin = 3;

// Encoder objects
Encoder encoder1(5, 4);
Encoder encoder2(6, 7);
Encoder encoder3(2, 3);
Encoder encoder4(0, 1); // TX, RX pins

void setup() {
  Serial.begin(9600);

  Keyboard.begin();

  pinMode(button1Pin, INPUT_PULLUP);
  pinMode(button2Pin, INPUT_PULLUP);
  pinMode(button3Pin, INPUT_PULLUP);
  pinMode(button4Pin, INPUT_PULLUP);
}

void loop() {
  char key = kpd.getKey();
  if (key) {
    switch (key) {
      case '*':
        // Implement your logic for the '*' key
        break;
      case '#':
        Keyboard.press(KEY_RETURN);
        Keyboard.releaseAll();
        break;
      case 'A':
        Keyboard.press(KEY_ESC);
        Keyboard.releaseAll();
        break;
      default:
        Layout1(key);
        break;
    }
  }

  CheckEncoderButton(button1Pin, encoder1);
  CheckEncoderButton(button2Pin, encoder2);
  CheckEncoderButton(button3Pin, encoder3);
  CheckEncoderButton(button4Pin, encoder4);

  CheckEncoderRotation(encoder1);
  CheckEncoderRotation(encoder2);
  CheckEncoderRotation(encoder3);
  CheckEncoderRotation(encoder4);
}

void Layout1(char button) {
  switch (button) {
    case '1':
      Keyboard.print('1');
      break;
    case '2':
      Keyboard.print('2');
      break;
    case '3':
      Keyboard.print('3');
      break;
    case '4':
      Keyboard.print('4');
      break;
    case '5':
      Keyboard.print('5');
      break;
    case '6':
      Keyboard.print('6');
      break;
    case '7':
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.write('x');
      Keyboard.release(KEY_LEFT_CTRL);
      break;
    case '8':
      Keyboard.print('8');
      break;
    case '9':
      Keyboard.print('9');
      break;
    case '0':
      Keyboard.print('0');
      break;
    case 'A':
      Keyboard.print('A');
      break;
    case 'B':
      Keyboard.print('B');
      break;
    case 'C':
      Keyboard.print('C');
      break;
    case 'D':
      Keyboard.print('D');
      break;
    case 'E':
      Keyboard.print('E');
      break;
    case 'F':
      Keyboard.print('F');
      break;
    case 'G':
      Keyboard.print('G');
      break;
    case 'H':
      Keyboard.print('H');
      break;
    case 'I':
      Keyboard.print('I');
      break;
    case 'J':
      Keyboard.print('J');
      break;
    case 'K':
      Keyboard.print('K');
      break;
    case 'L':
      Keyboard.print('L');
      break;
    case 'M':
      Keyboard.print('M');
      break;
    case 'N':
      Keyboard.print('N');
      break;
    case 'X':
      Keyboard.print('X');
      break;
  }
}

void CheckEncoderButton(int buttonPin, Encoder encoder) {
  int buttonState = digitalRead(buttonPin);
  if (buttonState == LOW) {
    Keyboard.press(KEY_ENTER);
    delay(100);
    Keyboard.release(KEY_ENTER);
    delay(100);
  }
}

void CheckEncoderRotation(Encoder encoder) {
  long encoderValue = encoder.read();
  if (encoderValue != 0) {
    if (encoderValue > 0) {
      Keyboard.press(KEY_RIGHT_ARROW);
      Keyboard.release(KEY_RIGHT_ARROW);
    } else {
      Keyboard.press(KEY_LEFT_ARROW);
      Keyboard.release(KEY_LEFT_ARROW);
    }
    delay(50);
  }
}

A presto.
Giuseppe

due curiosita', visto che non ho mai usato una micro prima e sono interessato anch'io:

come hai fatto, nello schema, a collegare gli encoder a tre piedini che non sono accessibili come digitali? (Miso Mosi e Sck)
come hai fatto a collegare al pin 5 sia gli encoder veri e propri che i loro bottoni?
come hai fatto a collegare la botton box (righe R1 ed R2) ai pin 20 e 21 se il micro e' dato per solo 20 pin digitali?

sto pensando di prenderne una per provare a giocarci...

Allora...le curiosità sono 3... :rofl: :rofl: :rofl:
Per quanto riguarda gli encoder, come dicevo, devo ancora mettermici; questa era la soluzione copiata dal progetto originale, non li ho ancora fisicamente collegati e non so se funzionano come "rotelle", di sicuro funzionano come pulsanti. Comunque nella Micro, guardando lo schema di pinout, i pin Miso, Mosi e SCK sono i pin digitali 14 16 e 15.
Sul pin 5 non capisco cosa intendi... se intendi il 5 digitale c'è collegato solo un piedino dell'encoder, ma non il pulsante.
invece per il pin 21, a dire il vero, sempre guardando lo schema pinout della micro che c'è sul sito Arduino, i pin digitali sembrerebbero 23... però ti ricordo che la mia conoscenza in materia è molto scarsa... quello che faccio nasce googolando, chiaccherando con chatGPT e ragionandoci sopra.
A presto.
Giuseppe

Grazie, anche a nome di Massimo, che adesso è via

Grazie di che? e chi è Massimo? però mi chiedevo una cosa... ho notato che in realtà uno dei pulsanti non funziona, quello che nello sketch nel char keys[ROWS][COLS] corrisponde alla A. Sono impazzito per capire perchè non funzionasse, pensavo a un collegamento sbagliato o a un difetto della levetta che non faceva contatto, poi mi è venuta un'illuminazione...e se fosse la scelta della A che non va bene? così ho messo Y e magicamente funziona... qualcuno sa spiegarmi per quale motivo la A non va bene?
A presto.
Giuseppe

Ho riletto il codice e mi rispondo da solo, la A non va perchè già usata alla riga 71.
A presto.
Giuseppe

Sospettavo una cosa simile, ma non la vedo nel programma che hai pubblicato...

E' qui...

void loop() {
  char key = kpd.getKey();
  if (key) {
    switch (key) {
      case '*':
        // Implement your logic for the '*' key
        break;
      case '#':
        Keyboard.press(KEY_RETURN);
        Keyboard.releaseAll();
        break;
      case 'A':
        Keyboard.press(KEY_ESC);
        Keyboard.releaseAll();
        break;
      default:
        Layout1(key);
        break;
    }

Almeno credo sia questa, io l'ho vista così...
cos'è, roba della libreria HID-Project?

Io sono Massimo
Io e Fabio (Ducem Barr) siamo fratelli