Dernière mise à jour :
28/04/2024
Article non terminé, volontairement
non
référencé dans les sommaires du
site
Présentation
Cette interface permet de créer une liaison MIDI sans fil qui
fonctionne à la fréquence d'émission de 2,4 GHz.
Basé sur un PIC 18F26K22 et un composant HF (HF = Haute Fréquence)
spécialisé nRF24L01+, le même
montage peut faire office d'émetteur ou de récepteur. Il faut
bien sûr deux modules pour assurer une liaison point à point :
un
module configuré en émetteur et branché sur une sortie MIDI
OUT, l'autre configuré en récepteur et relié à une
entrée
MIDI IN.
Avertissements
Le système a été conçu pour permettre la transmission des
messages MIDI
courts de type "Note", "Program Change" (PC), "Control Change" (CC) et
"Real Time" (System, Clock, MMC). Les Sysex sont supportés tant que
leur longueur ne dépasse pas 30 octets (au-delà, ils sont
ignorés). L'objectif prioritaire de ce projet est de pouvoir
transmettre les
messages
principaux (notes, PC et CC) avec le minimum de latence.
Le
système fonctionne "globalement". Tous les types de messages MIDI
énumérés ci-devant sont transmis correctement (sans erreur), sauf quand
lesdits messages sont nombreux et rapprochés.
Pour l'heure,
système pas fiable pour usage "jeu clavier", mais OK pour usage
"télécommande". Détails au § Prototype.
Schéma
Les deux composants principaux sont bien sûr le PIC et le
module HF équipé du nRF24L01.
-
Fonctionnement général
Le fonctionnement général dépend du mode dans lequel on place
le module MIDI 032, ce dernier pouvant être configuré en émetteur (TX)
ou en récepteur (RX). Le mode est défini par le cavalier (jumper) JP2/TxRx :
- JP2/TxRx
retiré = mode émission - Le PIC configure le module
HF nRF24L01 en mode émission. Les messages MIDI entrant sur
J1/MidiIn
sont placés dans un buffer circulaire et sont acheminés au plus vite au
module HF qui les transmet par voie hertzienne. En même temps, ces
mêmes messages MIDI entrant sont réacheminés sur la sortie J2/MidiOut.
A noter qu'il ne s'agit pas
dans ce cas d'une sortie MIDI THRU (qui répliquerait les données
entrantes de manière brute, sans passer par un logiciel). Le but ici
est simplement de pouvoir vérifier si les données MIDI entrantes sont
bien traitées par le logiciel du PIC, si d'aventure la liaison HF ne
fonctionnait pas.
- JP2/TxRx en
place = mode réception - Le PIC configure le module
HF nRF24L01 en mode réception. Les données reçues par voie
hertzienne
(provenant du module configuré en émission qui prend en charge les
messages MIDI à transmettre) sont "décodées" par le logiciel du PIC et
délivrées sur la sortie J2/MidiOut. Les messages MIDI
entrant sur le module configuré en émetteur sont ignorés.
Indicateurs lumineux
Quatre LED ont été prévues pour disposer d'une indication du mode (TX
ou RX) et des échanges de données MIDI.
- LED1/Mtx
- ce voyant s'allume quand le module est configuré en mode émission
(TX).
- LED2/Mrx
- ce voyant s'allume quand le module est configuré en mode réception
(RX).
- LED3/Tx
- ce voyant s'allume quand le module est configuré en mode émission,
que des message MIDI arrivent sur l'entrée MIDI IN et
que les
données "codées" correspondantes sont transmises en HF
- LED4/Rx
- ce voyant s'allume quand le module est configuré en mode réception
(RX), que des données HF sont reçues et qu'elles sont "décodées" avant
d'être transférées au format MIDI sur la sortie MIDI OUT
Point besoin de prévoir un témoin de présence d'alimentation, puisque
l'un des deux voyants LED1 ou LED2 est forcément allumé.
Canaux
On
ne se soucie généralement guère du canal d'émission ou de code
d'adressage quand une seule liaison HF est requise. Mais quand on veut
établir en même temps plusieurs liaisons HF dans un même espace de
travail et avec un même plan de fréquences, il faut bien que les
appareils ne se mélangent pas les pinceaux. Le nRF24 dispose d'un plan
d'adressage pour le canal d'émission (0 à 125) qui permet de
travailler à une fréquence HF comprise entre 2400 MHz et 2525 MHz. Il
dispose également d'un code
d'adressage "interne" sur 40 bits (5 octets) qui permet de travailler
en "sous-canaux" (pipes) au sein d'un même canal HF. Aurais-je été inspiré
en prévoyant dès le début des lignes d'extension (IOx) sur le PIC ?
Pour
l'instant, mes tests de sélection de canal ne sont pas concluants,
puisque la liaison entre émetteur et récepteur reste établie même si
j'attribue des canaux différents aux deux modules... très drôle.
Liaison entre PIC 18F26K22 et module nRF24
Le
PIC est alimenté sous +5V et le module nRF24 l'est sous une tension de
+3V3. Pourtant, les liaisons entre les deux sont directes, sans
translateur de niveau. La raison en est que les broches d'E/S du nRF24
sont "compatibles" 5V : les entrées tolèrent une
valeur de
+5V et les tensions de +3V3 délivrées par ce même module sont
correctement interprêtées comme un état logique haut par les entrées du
PIC. Cela nous va très bien !
Alimentation
Le PIC est alimenté sous une tension continue stabilisée de
+5V grâce
au régulateur de tension U101/LM7805. L'entrée de ce
régulateur doit
recevoir une tension continue de valeur comprise entre +8V et +12V, par
le biais du connecteur J101. La diode D101 assure la
protection
contre toute inversion accidentelle de polarité, tandis que les
condensateurs C101 et C102 assurent le filtrage général et la
stabilité du régulateur. Le
condensateur C103 est indispensable et doit être placé au plus près des
broches d'alimentation du PIC.
Une tension de +3V3 est requise pour le module HF nRF24L01,
cette tension est tirée du rail +5V et stabilisée par le régulateur
U102/78M33.
Prototype
Basé sur le dessin de circuit imprimé (PCB) visible plus loin. Deux
exemplaires ont été réalisés pour assurer une liaison unique. Economie
oblige, j'ai soudé un seul connecteur DIN sur
le module configuré en émetteur (MIDI IN) et un seul connecteur DIN sur
le module configuré en récepteur (MIDI OUT). Les modules nRF24L01 sont
ceux qu'on trouve facilement.
De gauche à droite :
circuits émetteur et récepteur, régulateur de tension 3V3 pour le module HF, module nRF24L01+
Pour mes tests, j'ai adopté une configuration simplifiée et figée
correspondant au schéma suivant (1er module configuré en émetteur avec
transmission des données arrivant sur l'entrée MIDI IN, 2è module
configuré en récepteur et données reçue expédiées sur MIDI OUT) :
On peut dire que cela "fonctionne globalement" en envoyant
des messages de type Note, CC, PC ou sysex de longueur
maximale 30 octets (les messages "temps réel" composés d'un seul octet
d'état
System/Clock
sont supportés) de manière isolée. L'émetteur envoie bien
les paquets de données (longueur entre 1 et 30 octets) et
le récepteur les restitue correctement.
J'ai effectué un test de robustesse qui a consisté à envoyer plus
de 60000 (soixante mille) événements MIDI avec une pause de 1 ms entre
chaque événement (de manière automatisée, bien sûr), et à compter les
défauts. Aucun loupé sur la totalité, mais curieusement et
malheureusement, les choses ne se passent pas aussi bien avec un jeu
réel sur clavier, quand je presse plusieurs touches en même temps à un
rythme endiablé et que les notes utilisent le running status. Le
problème ne me semble pas lié à la gestion des messages MIDI entrants,
mais plutôt à un conflit entre les interruptions de l'UART et
celles du module nRF24. Bref, pour
l'heure, mon système n'est pas fiable pour un usage "jeu scénique".
Je
n'ai pas encore évalué la portée (distance acceptée entre émetteur
et récepteur) qui de toute façon dépend toujours d'un nombre élevé de
facteurs (puissance d'émission, visibilité entre Tx et
Rx, environnement). Je n'ai pas non plus mesuré le temps de
latence entre émetteur et récepteur,
qui en première approximation est faible (a priori de l'odre de la
milliseconde quand la liaison est bonne et qu'il n'y a pas besoin de
renvoyer les paquets de données).
Reste à faire :
- Meilleure gestion des notes groupées "en accord" quand elles utilisent le running status.
- Gestion
des canaux HF. Je pensais qu'il suffisait de modifier la valeur du
registre #05 (RF_CH), mais curieusement les modules Tx et Rx continuent
de dialoguer même si je configure l'émetteur sur 2420 MHz (canal
20) et le récepteur sur 2440 MHz (canal 40)... Serait-ce dû à la
proximité des deux modules, sachant que la puissance du module émetteur
est configurée à -18 dBm (minimum possible) ? Là, je dois avouer que je
n'en sais rien.
Logiciel du PIC
Le fichier binaire compilé (*.hex) de la version alléegée (_LE) est disponible en
libre service
dans l'archive dont le lien suit.
Interface
MIDI 032 - PIC 18F26K22 - LE - xx/xx/2024
Si
vous souhaitez recevoir par la poste un PIC préprogrammé
et prêt à utiliser, merci de consulter la page
PIC - Sources.
Circuit imprimé (PCB)
Réalisé en double face.
Si au terme des tests que j'ai prévus le prototype se comporte très bien, je
développerai peut-être un PCB simplifié pour la fonction émetteur et un
autre PCB simplifié pour la fonction récepteur, au lieu d'un seul PCB
pour
les deux fonctions. Par PCB simplifiés, j'entends circuits de moindres
dimensions avec composants CMS uniquement (excepté les connecteurs
MIDI-DIN et bornier d'alimentation).
Historique
xx/xx/2024
- Première mise à disposition.