Buttonmatrix ändern

Guten tag

Ich habe leider keine ahnung von gar nichts und eine idee. Ich habe eine buttonbox gebaut und dafür einen arduino pro micro und eine 5x5 matrix verwendet. Den sketch hab ich gekauft. Jetzt würde ich gerne ein paar dinge ändern. Statt wie jetzt 22 button über die 5x5 matrix würd ich gerne 20 button über eine 4x5 matrix anschliessen und 1 button direkt. Es ist ja dann 1 pin frei. Der einzelne button ist ein kippschalter mit on/off. Der hat eine led und ein anderer button, der in der matrix hängt hat auch led. Meine idee wäre da ein netzteil anzuschliessen damit die led funktioniert und wenn ich den kippschalter betätige geht auch die led von dem anderen button an. Das an sich ist ja kein problem. Die frage ist kann ich überhaupt den kippschalter am board anschliessen wenn der am netzteil hängt und funktioniert er dann auch? Die buttonbox bräuchte ich für simracing und der plan wäre den kippschalter als zündung zu belegen, dass der dann leuchtet wenn die zündung an ist und damit dann auch der anlasserknopf leuchtet. Ist das überhaupt umsetzbar.
Ich hoffe man kann mir folgen, leider kenn ich mich so gar nicht aus.

Nein.

Zeig mal ein paar Bilder, das Programm und den Kippschalter.
Bilder sagen immer mer als 1000 Worte.

Zeig doch mal, was das für ein Schalter ist.
Nen link oder wenigstens ne typ/modellangabe.

wenn da was am Netzstrom hängt dann bitte wieder vorsichtig zuschreiben und Finger Weg.

Ansonsten wenn noch ein Pin frei ist, wird man da schon einen Schalter anschließen können.
Man muss es halt komplett neu programmieren.
Wer hat dir das Programm erstellt?
Hast du den Sourcecode gekauft und erhalten? - Wenn ja - dann poste ihn in Code Tags.

Wenn nicht, stehen dir die nächsten Wochen ein paar aufregende Stunden vor, da du dass dann selber lernen musst.


```cpp
//BUTTON BOX
//USE w ProMicro
//Tested in WIN10 + Assetto Corsa
//AMSTUDIO
//20.8.17

#include <Keypad.h>
#include <Joystick.h>

#define ENABLE_PULLUPS
#define NUMROTARIES 4
#define NUMBUTTONS 24
#define NUMROWS 5
#define NUMCOLS 5


byte buttons[NUMROWS][NUMCOLS] = {
  { 0, 1, 2, 3, 4 },
  { 5, 6, 7, 8, 9 },
  { 10, 11, 12, 13, 14 },
  { 15, 16, 17, 18, 19 },
  { 20, 21, 22, 23 },
};

struct rotariesdef {
  byte pin1;
  byte pin2;
  int ccwchar;
  int cwchar;
  volatile unsigned char state;
};

rotariesdef rotaries[NUMROTARIES]{
  { 0, 1, 24, 25, 0 },
  { 2, 3, 26, 27, 0 },
  { 4, 5, 28, 29, 0 },
  { 6, 7, 30, 31, 0 },
};

#define DIR_CCW 0x10
#define DIR_CW 0x20
#define R_START 0x0

#ifdef HALF_STEP
#define R_CCW_BEGIN 0x1
#define R_CW_BEGIN 0x2
#define R_START_M 0x3
#define R_CW_BEGIN_M 0x4
#define R_CCW_BEGIN_M 0x5
const unsigned char ttable[6][4] = {
  // R_START (00)
  { R_START_M, R_CW_BEGIN, R_CCW_BEGIN, R_START },
  // R_CCW_BEGIN
  { R_START_M | DIR_CCW, R_START, R_CCW_BEGIN, R_START },
  // R_CW_BEGIN
  { R_START_M | DIR_CW, R_CW_BEGIN, R_START, R_START },
  // R_START_M (11)
  { R_START_M, R_CCW_BEGIN_M, R_CW_BEGIN_M, R_START },
  // R_CW_BEGIN_M
  { R_START_M, R_START_M, R_CW_BEGIN_M, R_START | DIR_CW },
  // R_CCW_BEGIN_M
  { R_START_M, R_CCW_BEGIN_M, R_START_M, R_START | DIR_CCW },
};
#else
#define R_CW_FINAL 0x1
#define R_CW_BEGIN 0x2
#define R_CW_NEXT 0x3
#define R_CCW_BEGIN 0x4
#define R_CCW_FINAL 0x5
#define R_CCW_NEXT 0x6

const unsigned char ttable[7][4] = {
  // R_START
  { R_START, R_CW_BEGIN, R_CCW_BEGIN, R_START },
  // R_CW_FINAL
  { R_CW_NEXT, R_START, R_CW_FINAL, R_START | DIR_CW },
  // R_CW_BEGIN
  { R_CW_NEXT, R_CW_BEGIN, R_START, R_START },
  // R_CW_NEXT
  { R_CW_NEXT, R_CW_BEGIN, R_CW_FINAL, R_START },
  // R_CCW_BEGIN
  { R_CCW_NEXT, R_START, R_CCW_BEGIN, R_START },
  // R_CCW_FINAL
  { R_CCW_NEXT, R_CCW_FINAL, R_START, R_START | DIR_CCW },
  // R_CCW_NEXT
  { R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START },
};
#endif

byte rowPins[NUMROWS] = { 21, 20, 19, 18, 15 };
byte colPins[NUMCOLS] = { 14, 16, 10, 9, 8 };

Keypad buttbx = Keypad(makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
                   JOYSTICK_TYPE_JOYSTICK, 32, 0,
                   false, false, false, false, false, false,
                   false, false, false, false, false);

void setup() {
  Joystick.begin();
  rotary_init();
}

void loop() {

  CheckAllEncoders();

  CheckAllButtons();
}

void CheckAllButtons(void) {
  if (buttbx.getKeys()) {
    for (int i = 0; i < LIST_MAX; i++) {
      if (buttbx.key[i].stateChanged) {
        switch (buttbx.key[i].kstate) {
          case PRESSED:
          case HOLD:
            Joystick.setButton(buttbx.key[i].kchar, 1);
            break;
          case RELEASED:
          case IDLE:
            Joystick.setButton(buttbx.key[i].kchar, 0);
            break;
        }
      }
    }
  }
}


void rotary_init() {
  for (int i = 0; i < NUMROTARIES; i++) {
    pinMode(rotaries[i].pin1, INPUT);
    pinMode(rotaries[i].pin2, INPUT);
#ifdef ENABLE_PULLUPS
    digitalWrite(rotaries[i].pin1, HIGH);
    digitalWrite(rotaries[i].pin2, HIGH);
#endif
  }
}


unsigned char rotary_process(int _i) {
  unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
  rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
  return (rotaries[_i].state & 0x30);
}

void CheckAllEncoders(void) {
  for (int i = 0; i < NUMROTARIES; i++) {
    unsigned char result = rotary_process(i);
    if (result == DIR_CCW) {
      Joystick.setButton(rotaries[i].ccwchar, 1);
      delay(50);
      Joystick.setButton(rotaries[i].ccwchar, 0);
    };
    if (result == DIR_CW) {
      Joystick.setButton(rotaries[i].cwchar, 1);
      delay(50);
      Joystick.setButton(rotaries[i].cwchar, 0);
    };
  }
}

Was soll der Schalter senden wenn er ausgeschaltet wird?
Was soll der Schalter senden wenn er eingeschaltet wird?

Welchen colPin bzw. welchen rowPin möchtest du künftig für den Schalter opfern?

Ach schau...
[OT]
Der Code ist nicht neu. (Anderes Problem und tut nix zur Sache) Problem: Arduino pro micro rotaries
:slight_smile:
[/OT]

Dein Schalter hat drei Anschlüsse?
Dann dürfte einer für die LED sein und einer als gemeinsamer Fusspunkt.
Der dritte Kontakt dann Dein Kontakt für den Arduino.

ICH würde erstmal probieren, ob die LED auch bei 5V funktionert.
Und dann kommt die Frage, ob der gemeinsame PIN für den Schalter und die LED mit GND zu verbinden ist, damit die LED leuchtet.

Dann brauchst kein extra Netzteil und kannst einfach den ArduinoPin mit INPUT_PULLUP aktivieren und auf LOW testen.

Der Rest ist dann in ein paar Zeilen gegosssen.

Die led leuchtet mit 5v.
Brauch ich 2 pins für den kippschalter oder kann ich einen anschliessen und den anderen an raw anschliessen?

Idealerweise bei on on bei off off.
Sollte ja softwareseitig einstellbar sein mit joytokey wenn ich das richtig verstanden habe. So dass einfach nur ein impuls kommt wenn er auf on ist und wieder ausgeht wenn ich auf off schalte

Also so wie hier die grünen am grd, den roten an raw und den leeren am übrigen pin. Der runde button ist in der matrix integriert. Oder muss der rote z.b. an pin 1 und der leere an pin 2?
Ich hab leider echt null plan.
Vielen dank für eure schnellen antworten

Wenn der Schalter eingeschaltet ist, hast Du dann zwischen dem roten draht oder dem grünen und dem Anschluß ohne Draht Durchgang?
Wenn der Schalter ausgeschaltet ist, hast Du dann durchgang zum roten , gruenen oder keinen Durchgang?

Der COM ist nicht belegt :wink:

Deine jetzige Buttons werden als Joystick button gesandt:

Joystick.setButton(buttbx.key[i].kchar, 1);

aus dieser Struktur:

byte buttons[NUMROWS][NUMCOLS] = {
  { 0, 1, 2, 3, 4 },
  { 5, 6, 7, 8, 9 },
  { 10, 11, 12, 13, 14 },
  { 15, 16, 17, 18, 19 },
  { 20, 21, 22, 23 },
};

also 0..23
du solltest jetzt also zwei neue Buttons definieren die ausgelöst werden sollen.

Weiters habe ich um diese Auskunft ersucht:

Wenn du es nun allein schaffst, brauchst du das natürlich nicht beantworten.

Zum grünen hab ich nie durchgang, der andere wenn der schalter auf on ist, sonst nicht

Ich weiss nicht was rowpin bzw colpins sind sorry. Sind das einfach zwei pins, z.b. 14 15 wenn man das bild nimmt? Ich frage mich ob das geht dass ich es so wie hier auf dem bild verkabel, und dann zb. Pin 8 weglasse um dort meinen einzelnen button anzuschliessen. Oder brauch ich dafür zwei pins damit erkannt wird wann on und wann off ist?

d.h. drei Knöpfe nicht genutzt, 10 Pins aus 18 sind belegt;

9 Pins aus 18 möglichen werden für Knopfmatrix genutzt, bleiben noch 9 frei, insgesamt kann man im Matrix 81 Knöpfe anschließen.

schau mal hier rein

8 pins brauch ich für die encoder

зображення
Rote Linien sind Reihen engl. Row;
Blaue Spalten - Column.

Spielt es eine rolle ob analog oder digital pins? Und muss ich zwei freimachen für den kippschalter?