Dernière mise à jour :
20/02/2011
Présentation
L'orgue décrit ici est un peu particulier,
puisqu'en guise de touches on utilise celles d'un clavier pour PC avec
connectique PS2 (sans ordinateur entre clavier et orgue). Il s'agit plus d'un jouet que d'un véritable
instrument.
Le
montage fait appel à un PIC de type 16F628A, composant peu coûteux et
facile à trouver. On branche le clavier PS2 sur le PIC et ce dernier
sort ses sons sur un petit HP. Pas plus compliqué !
Schéma
Avec beaucoup d'aisance et précieux amour, de ce schéma vous aurez vite fait le tour.
Principe de fonctionnement
Le logiciel flashé dans le PIC
16F628A scrute en permanence l'état des entrées PS2D (sortie DATA du
clavier PS2) et PS2C (sortie CLOCK du clavier PS2) venant du connecteur
PS2 (J1 sur le schéma). Dès que des données
sont reçues, le logiciel du PIC cherche à savoir quelle touche du
clavier PS2 a
été enfoncée. S'il s'agit d'une touche correspondant à un des
caractères alphanumériques A à Z (majuscule) et colorée en blanc ou en noir sur le dessin qui suit, un son est émis sur
la sortie RA0 du PIC. La correspondance entre touche enfoncée (en mode MAJUSCULE) et note produite est conforme à ce qui suit :
Touches colorées en noir = notes altéréesTouche Q = Si2
Touche S = Do3 - Touche E = Do#3
Touche D = Re3 - Touche R = Re#3
Touche F = Mi3
Touche G = Fa3 - Touche Y = Fa#3
Touche H = Sol3 - Touche U = Sol#3
Touche J = La3 - Touche I = La#3
Touche K = Si3
Touche L = Do4 - Touche P = Do#4
Touche M = Re4
Pour le décortiquage des données issues du
clavier, je ne me suis pas fatigué et ai utilisé les routines PS2 toutes
faites de MikroPascal. De même que pour générer les sons je me suis
contenté des
routines "son" de MikroPascal.
program electronique_orgue_008_16f628;
var
keydata, special, down: byte;
PS2_Data: sbit at RB6_bit;
PS2_Clock: sbit at RB7_bit;
PS2_Data_Direction: sbit at TRISB6_bit;
PS2_Clock_Direction: sbit at TRISB7_bit;
procedure Main_Init;
begin
CMCON := CMCON or $07; // disable comparators
TRISA := $00;
TRISB := $FF;
Ps2_Config; // Init PS/2 Keyboard
Delay_ms(100); // Wait for keyboard to finish
Sound_Init(PORTA, 0); // init sound port
Delay_ms(100); // Wait for sound init to finish
end;
begin
Main_Init;
while true do
begin
// données reçues du clavier PS/2 ?
if Ps2_Key_Read(keydata, special, down) then
begin
// touche standard reconnue ?
if (down <> 0) and (special = 0) and (keydata <> 0) then
begin
// émission de la note correspondant à la touche enfoncée
case keydata of
81 : Sound_Play(247, 100); // touche Q - Si2
83 : Sound_Play(262, 100); // touche S - Do3
69 : Sound_Play(277, 100); // touche E - Do#3
68 : Sound_Play(294, 100); // touche D - Re3
82 : Sound_Play(311, 100); // touche R - Re#3
70 : Sound_Play(330, 100); // touche F - Mi3
71 : Sound_Play(349, 100); // touche G - Fa3
89 : Sound_Play(370, 100); // touche Y - Fa#3
72 : Sound_Play(392, 100); // touche H - Sol3
85 : Sound_Play(415, 100); // touche U - Sol#3
74 : Sound_Play(440, 100); // touche J - La3
73 : Sound_Play(466, 100); // touche I - La#3
75 : Sound_Play(494, 100); // touche K - Si3
76 : Sound_Play(523, 100); // touche L - Do4
80 : Sound_Play(523, 100); // touche P - Do#4
77 : Sound_Play(523, 100); // touche M - Re4
end;
end;
end;
Delay_ms(10); // Debounce
end;
end.
Comme vous pouvez le constater, le programme au grand complet ne
comporte que quelques lignes de code assez faciles à comprendre. Pour
plus de
détails sur les rapports entre fréquences générées et notes de musique,
voir page
Notes musique.
Plus de touches du clavier prises en compte ?
Vous
venez de compter le nombre de notes qui peuvent être jouées et vous
arrivez à 16. Hum, trop peu pour la partition de Mozart que vous voulez
tapper au clavier, il faut étendre tout ça. Qu'à cela ne tienne, vous
avez téléchargé la version gratuite (et limitée à 2 kO de code) de
MikroPascal et vous avez pris le code source en main pour ajouter 16
"notes" supplémentaires. Mais malédiction, le code source ne peut plus
se compiler pour cause de manque mémoire dans le PIC ! Une solution ?
Peut-être bien, en utilisant par exemple un PIC 16F648A à la place du
16F628A...
Horloge de référence
On utilise ici un quartz externe de 8 MHz.
Une horloge de 4 MHz aurait suffit pour générer les sons, mais il faut
tourner à au moins 6 MHz pour la partie lecture clavier PS2 (dixit l'aide en ligne de MikroPascal). L'horloge
interne de 4 MHz du PIC ne peut donc pas être utilisée, et l'emploi du
quartz externe permet en outre d'obtenir une bonne précision de la hauteur des
notes jouées, ce qui n'est pas forcement du luxe.
Sortie audio
La
ligne RA0 du PIC est configurée en sortie et c'est sur cette broche que
l'on récupère le signal BF de la note jouée. La sortie du PIC ne peut
débiter qu'un
courant maximal de 25 mA, ce qui est suffisant pour attaquer
directement un haut-parleur de 100 ohms au minimum avec résistance
série de 100 ohms, à condition d'accepter un volume sonore faible. On
utilise ici un HP de 8 ohms (plus facile à trouver) associé à une
résistance série de 220 ohms destinée à protéger le PIC (sans cette
résistance série on aurait des courants crêtes qui dépasseraient les
capacités du PIC). Le volume sonore est encore plus réduit que si on
utilisait un HP de 100 ohms, mais c'est un test que vous devez faire
pour vous rendre compte du rendu. Pour jouer le soir quand tout le mode
dort, c'est parfait. On
peut aussi si on le désire utiliser un petit buzer piezo - dont la
"consommation" est
bien plus faible - en remplacement du haut-parleur. La broche RA0 peut
également servir de sortie audio
au niveau ligne en vue d'attaquer un amplificateur BF externe, en
intercalant un
pont diviseur résistif de rapport
1/10 à 1/20 environ (résistance série de 10 kO suivie d'une résistance
parallèle de 680 ohms par exemple). Cela permet de ramener l'amplitude du
signal de 5 V à quelques centaines de mV, pour une meilleur compatibilité avec
une
sortie
de type ligne. Un
condensateur de liaison peut éventuellement être
ajouté mais cela n'est pas obligatoire puisque la tension de sortie sur
la ligne RC5 est de 0 V au repos (quand aucune note n'est jouée).
Alimentation
L'ensemble fonctionne sous
une tension d'alimentation régulée de +5 V. Une solution
consiste à récupérer le +5 V fourni par un PC via le connecteur PS2 ou
une prise USB, mais dans ce cas le montage n'est plus autonome.
Sans doute est-il préférable de disposer d'une source de tension
vraiment indépendante, venant d'une pile ou d'un bloc d'alimentation
secteur. Si utilisation d'une pile, n'oubliez pas qu'il faut alimenter
le montage à base de PIC et le clavier PS2... Une pile de 9 V associée
à un régulateur de tension +5 V tel le LM7805 peut convenir mais la
pile risque de ne pas vivre très longtemps. Quelque soit l'option que
vous choisirez, il n'est pas impossible que vous trouviez le nécessaire
sur la page
alimentation
de ce site.
Câblage de la prise PS2
Le
brochage précisé sur le schéma pour la prise PS2 est valable pour le
connecteur femelle chassis qui accueille la fiche mâle en bout de câble
du clavier. On trouve donc le même brochage mais en miroir pour
la fiche mâle du clavier.
Sur le clavier que j'ai utilisé et dont j'ai sectionné la fiche, j'ai repéré les câbles selon leur couleur :
- fil noir = GND, masse. Aussi relié au pourtour métallique de la fiche (blindage)
- fil rouge = +5 V
- fil vert = Data
- fil blanc = Clock
Je ne sais pas si ces couleurs sont normalisées (même si pour le noir
et le rouge ça me semble logique), aussi vérifiez aussi de votre côté
si vous devez bidouiller le même genre de chose que moi.
Prototype
Au début, je comptais utiliser ma platine de
développement EasyPic4 qui possède
d'origine un connecteur pour clavier PS2. Mais les broches DATA et
CLOCK dudit connecteur PS2 sont routées sur les lignes RC0 et RC1 de la
carte et n'aboutissent donc pas sur le support de CI apte à recevoir un
16F628A. C'est pourquoi, et comme je l'ai dit juste avant, j'ai fini par décortiquer le connecteur PS2 d'un clavier
"de rebus" (je l'ai déclaré comme tel pour l'occasion) et à établir des connections directes avec un PIC qui dans un
premier temps a été programmé sur la EasyPic4 et dans un deuxième temps
inséré sur une plaque d'essais sans soudure.
Tests
effectués avec un HP 8 ohms avec résistance série de 220 ohms. Le test
de bon fonctionnement du PIC a été rapide car j'ai inclus une petite
routine de "bienvenue" au lancement du logiciel qui joue les huit notes
non altérées à la queue-leu-leu. Les ayant entendues dès la première
mise sous tension, je me suis réjouis et ai laché un large sourire à
mon entourage. Qui n'a rien vu car trop pris dans le film qui passait
alors à l'écran TV. Puis j'ai appuyé sur les touches du clavier... et
aucune note ne sortait. Bon, je vérifie la tension au niveau du clavier
: 5 V pile, ça colle donc. Je retire et remet la pile, les leds du
claviers s'allument, ce qui est bon signe. Mais toujours aucune note
quand j'appuie sur les touches. Et puis d'un coup bon sang mais c'est
bien sûr ! Minuscules et majuscules ! Je passe en mode majuscule et
hop, c'est parti pour les mélodies de fin de soirée. Génial, ça
fonctionne !
Remarque :
ayant oublié de prendre mon quartz 8,000 MHz dans ma chambre avant de
coucher la plus petite, j'ai du me rabattre sur un quartz de 8,192
MHz qui trainait au garage. Ben ça marche pareil, mais bien sûr avec
des notes un poil plus aigues que celles attendues. Mais si vous saviez
à quel point ce détail m'importait peu à ce moment...
Logiciel PIC
L'archive zip dont le lien suit contient le source complet (MikroPascal
Pro
V3.8) et le fichier binaire compilé (*.hex).
Orgue
008 - PIC 16F628A (20/02/2011)
Si vous souhaitez recevoir par la poste un PIC
préprogrammé et prêt à utiliser, merci de
consulter la page
PIC
- Sources.
Circuit imprimé
Réalisé en simple face.
Typon aux formats PDF, EPS et Bitmap 600 dpi