Keypad-Nachhilfe (61 Tasten einlesen)

Hallöle.
Grad versuche ich, mein olles Keyboard auf Midi umzubauen.
Die Tasten sind in ner Matrix 6x10 angeordnet, so viel hab ich herausgefunden, und ich kann sie auch so einlesen, aber: die 61. fehlt.

Pinbelegung und Testprogramm stammen von da: electro-music.com :: View topic - The Casioduino Project - Understanding the Keyboard Matrix, ich hab lediglich meine Pins angepasst (nehm ne andere Belegung, aber es funktioniert).
Dumm nur: es sind in Wirklichkeit 17 Leitungen.
Da ich gerne die gesamte Tastatur nutzen würde, nun die Frage: wie kann ich herausfinden, wie die 61. Taste angeschlossen ist?
Die Matrix einfach erweitern um ne Reihe (laut einiger mehr oder weniger verlässlicher Aussagen soll es so beschalten sein) funktioniert nicht, dann kommt alles durcheinander (die Releases werden dann gar nicht mehr ausgegeben, nur noch die Drücke).

Und, wenn das gelöst ist: hat jemand ne Idee, was ich anstellen muss, um die eingelesenen Tasten einfach 1:1 auf andere Pins durch zu reichen?
Ich würde nämlich gerne sowohl Midi-out als auch midi-in implementieren, und das Keyboard auch weiter normal benutzen können.

Mit einem Ohmmeter oder Durchgangsprüfer feststellen, wo die 61. Taste angeschlossen ist. Es könnte ja eine 7x10 oder 6x11 Matrix sein...

Bei 6x10 kann nicht mehr wie 60 rauskommen :wink:
Folglich muß die Matrix anders organisiert sein. 7x10, 6x11 oder 8x8
Oder ein Segment wird analog eingelesen über unterschiedliche Spanugsteilerwiderstände. Das wäre aber schon ziemlich abwegig.

Da haben wir sie wieder, die Problemchen: die Matrix hat sechs Spalten- sonst würde sie ja jetzt nich arbeiten.
Das aber tut sie..., und zwar fehlerfrei.
Also müssen es elf Zeilen sein, nur: ich hab versucht, die Matrix, wie hier http://www.instructables.com/id/Add-MIDI-port-to-Keyboard/ gezeigt, durch zu messen, aber das funktioniert bei meinem Casio nicht-ich hab niemals auch nur nen Pieps vom Durchgangsprüfer bekommen. Somit ist diese Methode unbrauchbar (das Yamaha hab ich weg gegeben, kann so also nicht mehr testen ob es bei denen funktioniert).

Wenn ich jedoch das Programm umstricke auf elf Zeilen, also anstatt

const byte ROWS = 10; //zehn Reihen
const byte COLS = 6; //6 Spalten

char keys[ROWS][COLS] = {
  {1,2,3,4,5,6},
  {7,8,9,10,11,12},
  {13,14,15,16,17,18},
  {19,20,21,22,23,24},
  {25,26,27,28,29,30},
  {31,32,33,34,35,36},
  {37,38,39,40,41,42},
  {43,44,45,46,47,48},
  {49,50,51,52,53,54},
  {55,56,57,58,59,60},
 
};

byte rowPins[ROWS] = {23, 25, 27, 29, 31, 45, 47, 49, 51, 53 }; //die Zeile-Anschlüsse
byte colPins[COLS] = {33, 35, 37, 39, 41, 43}; //die Spalte-Anschlüsse

Schreibe:

const byte ROWS = 11; //zehn Reihen
const byte COLS = 6; //6 Spalten

char keys[ROWS][COLS] = {
  {1,2,3,4,5,6},
  {7,8,9,10,11,12},
  {13,14,15,16,17,18},
  {19,20,21,22,23,24},
  {25,26,27,28,29,30},
  {31,32,33,34,35,36},
  {37,38,39,40,41,42},
  {43,44,45,46,47,48},
  {49,50,51,52,53,54},
  {55,56,57,58,59,60},
  {61},
 
};

byte rowPins[ROWS] = {23, 25, 27, 29, 31, 45, 47, 49, 51, 53, 52 }; //die Zeile-Anschlüsse
byte colPins[COLS] = {33, 35, 37, 39, 41, 43}; //die Spalte-Anschlüsse

Kommt nix vernünftiges bei heraus: die 61 wird trotzdem nich erkannt, aber statt dessen werden die Releases gar nicht mehr erkannt...offenbar bringt das die ganze Matrix aus dem Konzept.
Auch dann, wenn ich die letzte Reihe der Ordnung halber auffülle, kommt nur Nonsens heraus:

{61, 62, 63, 64, 65, 66},

Ich hab keine Ahnung, wie ich mit nem Multimeter (mehr hab ich nicht), die 17. Leitung prüfen könnte, was da wirklich passiert.

Bei sowas lohnt es sich immer in die Libraries zu schauen. Da gibt es oft Limitationen wenn mit Arrays gearbeitet wird, da diese i.d.R. statisch angelegt werden (so z.B. auch bei TimeAlarms oder UTFT_Buttons):

#define LIST_MAX 10		// Max number of keys on the active list.
#define MAPSIZE 10		// MAPSIZE is the number of rows (times 16 columns)

Also so geht anscheinend maximal 10 * 16. Es geht laut der Beschreibung wenn man 16 Columns und 10 Rows nimmt (bzw. 10 * 6 bei dir)! Also vielleicht mal rumdrehen.

Danke dir- genau da lag der tote Hund. :o

Die Bibliothek ist so voreingestellt, dass sie maximal 10 Zeilen nimmt.
Ich hab die Datei keypad.h mal kurzerhand geändert:

#define LIST_MAX 16		// Max number of keys on the active list.
#define MAPSIZE 11		// MAPSIZE is the number of rows (times 16 columns)

und schon klappt es, wenn ich einfach in der Matrix noch ne Zeile hinzufüge.
Bei der Gelegenheit hab ich auch gleich noch die Zahl der gleichzeitig möglichen Tastendrücke von 10 auf 16 erhöht- beides ohne Nebenwirkungen. ???

Super.

Sodele. Bis hierher (und nen bissel weiter...) läuft die Sache.

Nächstes Problem: ich will, wahlweise, die Taste zum Arduino schicken ODER zur eingebauten Elektronik, wie das ursprünglich war.
Da ich kein Oszilloskop habe, bekomme ich nicht wirklich raus, mit welcher Spannung das Keyboard da arbeitet- mitm Multimeter kann man diese kurzen Impulse nich messen.
Es könnten aber mehr als 5V sein (in dem Ding ist an etlichen Stellen 9V auffindbar).
Momentan habe ich nen Umschalter an der Netzteil-Buchse, der zwischen Arduino (für den Midi-Kram) und interner elektronik einfach umschaltet.
Frage an die Elektriker: ist der Arduino sicher, wenn ich diesen Umschalter zweipolig auslege, und somit den Arduino auch von Masse trenne?
Zwar liegen auch dann ggf. mehr als 5V an den Pins an (wenn die originale Elektronik die Matrix scannt), aber da er auch massemässig abgetrent ist, dürft da ja nix fliessen, oder denke ich falsch?

Masse abschalten hilft nichts, dann kann weiterhin Strom zwischen den Eingangspins fließen.

Die "Umschaltung" ist mir irgendwie schleierhaft. Wenn eine eingebaute Elektronik die Tastatur abfragt, dann wäre es doch ziemlich aufwendig, die vielen Leitungen auf den Arduino umzuschalten.

Zum Messen von Impuls-Spannungen: eine Diode vor das Voltmeter schalten, danach ggf. einen kleinen Kondensator gegen Masse, dann bekommt man den Spitzenwert der Spannung (DC Bereich) heraus.

Der Umschalter versorgt einfach entweder den Arduino mit Strom oder die Bordelektronik, so einfach ist das.
Da beide am selben Spannungseingang (Netzbuchse) hängen, ist das easy.
Wenn ich also die normale Elektronik benutzen will, ist der Arduino lediglich noch über Masse verbunden, ansonsten aber tot.
Und umgedreht.
Aber: ich schalte im Moment eben lediglich VCC um, Masse bleibt verbunden.