ButtonBox Problem

Schönen guten Abend,

ich habe eine Leiterplatte machen lassen, um diese einfacher in meine Button-Box einbauen zu können. Ich habe so weit alles programmiert und verlötet. Der Arduino Micro sitzt fest auf der Platine.

Leider lassen sich 4 Knöpfe nicht drücken, besser gesagt kommt kein Signal an. Alle anderen Tasten gehen. Die File dazu hatte ich aus dem Internet.

Im Anhang mein Code und ein Plan meiner Platte und Nummerierung der nicht gehenden Felder.

`//ARDUINO PCB 
//USE w ProMicro


#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);
    };
  }
}

`

Du hast 25 Button angegeben in einer Matrix 5x5
Du benutzt aber eine Matrix 4x4 und irgendwie noch die Umschalter in der unteren Reihe.
Gibt es dazu einen richtigen Schaltplan?
Dann bitte posten. Auf dem DoppelLayer ist das ein einziges Gerate.

Habe nur den Link zu der Platine

Ok, das unten sind encoder.
Aber ich brauch nur mit der Maus da drüber und sehe, das eine Taste ganz bestimmt nicht gehen kann.
grafik

Da sind bestimmt noch mehr Schnitzer....
Incl. der Matrix.
Das wird richtig schwierig....

Nachtrag:
Ich hab das mal durchgescrollt mit der Maus.
Du hast die untere Zeile der Matrix nicht auf Pin 14, sondern auf die erste Spalte auf Pin 15 gelegt.
Lässt sich evtl. lösen, indem Du am Pin 15 die Leiterbahn trennst, ein wenig blank machst und mit einem Draht an pin 14 verbindest.
Dann bekommen wir das mit der Matrix evtl. hin.
Die Encoder sehe ich noch nicht ...

1 Like

Vielen Dank schonmal.

Die Encoder habe ich auch mal getestet, die gehen alle und werden erkannt.
Muss ich mal testen ob ich das ändern kann auf der Leiterplatte.

Du hast die Platine auf dem Tisch, so schwer das Schema nachzeichnen ist doch nicht, ja kostet Arbeit, so wie @my_xy_projekt hat gezeigt, es sind Unstimmigkeiten sogar in der EasyEda
das gleiche sehe auch, die untere Reiche sollte gehen auf Pin 14
was aber auch unsere Adler Auge gesehen hat :wink:
image

Nochmal drüber geschaut...

Also die Spalten von rechts nach links:
Linie Blau - Pin 9
Linie Blau - Pin 10
Dann kommt schon die erste Ungereimtheit.
Pin 16
Da wäre die 3.te Spalte dran.

  • Soweit so gut.
    Jetzt eine Änderung gegenüber meiner Aussage oben:
    Die letzte Spalte ist ebenfalls blau und MUSS an den Pin daneben.
    In Deiner Zeichnung hat der die Nummer 14, sollte doch aber ganz bestimmt die 12 sein.
    Der Pin 15 sollte ganz bestimmt 13 sein. Der bekommt die erste Zeile. In rot.
    Alle da drüber liegenden bekommen dann ab A0 die jeweilige rote Zeilenzuordnung.

Und dann bekommen wir das auch mit der Matrix hin.

Wenn man der Logik folgt nicht - siehe mein Text.
Und die Pin-Nummern stimmen doch nicht.... :thinking:

ist anders aufgebaut 13 wurde weg gelassen bzw. ist RST

Ach, das ist ja nen pro Micro - das ist was anderes als der micro....

Ok - dann nochmal Kommando zurück.
Ich sag ja, nen vernünftiger Plan wäre eindeutig besser gewesen.
:roll_eyes:

#define NUMBUTTONS 29

upd. das hier wird nicht genutzt, 32 Tasten sind beim Joystick deklariert.

Der Code passt eh nicht zu den Buttons. Siehe meins ganz oben zur Thematik keypad...
Erstmal muss das elektrisch richtig sein.

ich dachte 5* 5 das sind 25 in Matrix und dazu noch 4 tasten am Encoder.

Ne, das ist 4x5 und die Encoder haben keine Tasten - es fehlt dafür einfach der Pin. :wink:

War auch überrascht, der TO hat den falsch bezeichnet, nur im Sketsch wurde der genannt

Tur mir leid für die falsche Bezeichnung! In der Anleitung zur Programmierung stand nur Micro / ProMicro - es sei quasi egal was ich auswähle. Daher der Fehler.

Alles gut - gemeinsam sehen wir alles :slight_smile:
Ok. Also umlöten musst Du sowieso.

Ich bau mal in #7 die Pins richtig.

nein normaler Micro passt nicht drauf, hat viel mehr Pins, und ob in der Breite der drauf passt ist auch die Frage. Dazu die Pinbelegung ist auch anders

das erklärt wieso nur 24 Tasten in Matrix

Ist andere Projekt wahrscheinlich

Die Box da oben hat keine Encoder... Fang nicht an was zu mischen was nicht passt, das macht das nur unübersichtlich und später unlesbar, weil nichts mehr zusammengehört.