Electronique > Réalisations > Production sonore > Orgue 008

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.

orgue_008_pcb_3d_a

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.

orgue_008

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 :

orgue_008_clavier_ps2
Touches colorées en noir = notes altérées

Touche 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.

connecteur_clavier_ps2_001

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.

orgue_008_proto_001a orgue_008_proto_001b orgue_008_proto_001c

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.

orgue_008_pcb_composants

Typon aux formats PDF, EPS et Bitmap 600 dpi