Résumé du projet: un vieux clavier d'orgue électronique est branché à un Arduino par l'entremise de deux registres à décalage HC595. Lorsqu'on appuie sur une ou plusieurs touches du clavier, le nom des notes activées s'affiche à l'écran de l'ordinateur.
Le but ultime (qui sera atteint, je l'espère, dans un prochain article) sera de construire moi-même un instrument à clavier complet: un clavier MIDI, un synthétiseur, une Keytar, peut-être?
J'ai déjà décrit le clavier et sa matrice
dans un article précédent: il a été récupéré d'un vieil orgue électronique Yamaha Electone qui avait été fabriqué au début des années '80. Le clavier comporte 37 touches (3 octaves) et j'ai utilisé sans modification sa matrice de diodes.
Le schéma ci-dessous montre la matrice du clavier (dont je n'ai représenté que 4 des 37 touches). Il y a 4 entrées d'octaves. La première est reliée aux 8 premières touches du clavier (de FA à DO), la deuxième est reliée aux 12 touches suivantes (de DO# à DO), etc. Il y a 12 entrées de notes: une même entrée pour tous les "sol" , une autre entrée pour tous les "la", etc.
Pour identifier les touches qui sont enfoncées, j'ai opté pour le principe suivant (voir le circuit ci-dessous): si je veux vérifier l'état de la touche "sol 1" je place l'entrée "octave 1" à 5 volts, les autres entrées d'octave à 0 volts, l'entrée "sol" à 0 V et les autres entrées de notes (la, si, do, etc.) à 5 V.
De cette façon, la sortie "octave 1" sera à 5 V si la touche "sol 1" est enfoncée puisqu'aucun courant ne circule dans la résistance. Le voltage de la sortie "octave 1" deviendra (idéalement) 0 V lorsque la touche "sol 1" est enfoncée. L'état des autres touches du même octave ne change rien, puisque ces touches ne sont soumises à aucune différence de potentiel (5 volts de part et d'autre).
Il s'agit ensuite de tester l'état de chacune des 37 touches du clavier, l'une après l'autre, ce que l'Arduino pourra faire très rapidement.
Mais pas question d'utiliser 20 entrées/sorties de l'Arduino (4 entrées d'octave, 12 entrées de notes et 4 sorties d'octave), surtout que mon Duemilanove en comporte beaucoup moins... J'ai donc utilisé deux registres à décalage
74HC595 en cascade. Puisque chaque registre à décalage comporte 8 sorties, ils contrôleront les 4 entrées d'octave et les 12 entrées de notes.
Si vous n'êtes pas familiers avec les registres à décalage, je mentionne rapidement qu'il s'agit d'un circuit intégré qui transforme un signal numérique 8 bits reçu de façon séquentielle à son entrée en un signal équivalent étalé en parallèle sur 8 sorties. Par exemple, l'Arduino peut envoyer le message "11111111" à l'entrée du registre à décalage; sur réception de cette instruction, le régistre mettra ses 8 sorties à 5 volts. Si l'Arduino envoie le message "01010101", 4 sorties seront à 0 volt, les autres seront à 5 volts, etc.
Le schéma ci-dessous montre les branchements des deux registres à décalage.
Il restait ensuite à coder un sketch pour que l'Arduino vérifie les 37 touches du clavier l'une après l'autre. J'ai d'abord tenté de produire un programme élégant avec des boucles et des opérateurs "bitwise"...et je me suis lamentablement cassé la gueule: rien ne fonctionnait! Voici donc une version peu élégante, très répétitive, mais qui a l'avantage de fonctionner (et qui est facile à comprendre, je crois), dans laquelle je vérifie l'état de chaque touche une par une.