Synchronisation radio

 

Accueil
Remonter

 

Le contexte

L'idée n'a rien de nouveau, puisqu'il s'agit de faire jouer ensemble plusieurs orgues de barbarie. De concert pourrait-on dire.
La technique habituellement utilisée consiste à diffuser la totalité des messages midi générés par un instrument maitre. Dans le flux reçu, les récepteurs choisissent ensuite les messages qui les concernent. D'un strict point de vue technique il s'agit plutôt d'une diffusion de données que d'un processus de synchronisation. Les données reçues sont synchrones par définition... à condition qu'elles arrivent.
Les principales difficultés posées à l'amateur par cette technique sont au moins de deux ordres :
1. La bande passante radio nécessaire est assez conséquente car le signal midi requiert tout de même un débit de 32500 kbauds.
2. Il faut assurer la continuité du flux des messages reçus, faute de quoi on risque d'avoir des interruptions dans la musique. Une liaison bidirectionnelle avec processus d'acquittement et de réémission serait donc souhaitable.

Et si on faisait autrement ?

Les deux idées de base sont les suivants :
1. On trouve sur le marché des modules radio en 433 MHz. Leur prix est dérisoire (1€ la paire) mais leur bande passante est assez faible, mais quand-même... ils ne sont pas chers...
2. Par principe, chaque module PPCaP dispose de ses propres données concernant le morceau à jouer dans une carte à puce. Il n'est donc nullement besoin de les diffuser puisqu'elles sont déjà là. Il faudrait "juste" les synchroniser.

Le principe

Il peut s'énoncer de manière très simple : Chaque instrument exécute son propre morceau de musique sous le contrôle d'un instrument maitre qui impose son rythme. Ce dernier est le "chef d'orchestre" en somme. Et nous voilà donc revenus à la notion de concert. :o)
 

Les contraintes

1. La bande des 433 MHz est très encombrée par des dispositifs de toutes sortes (télécommandes de portes et portails, jouets, sondes des stations météo domestiques etc...). Il faut donc sécuriser les messages radio au maximum et concevoir un système qui soit robuste vis à vis des aléas de transmission.
2. Ces modules radio autorisent un débit maximum de l'ordre de 2 kbits/s. Il est donc hors de question de transmettre une grande quantité d'information.
3. L'intégration dans l'existant doit être quasi-transparente. Un minimum de matériel additionnel et une mise à jour soft seraient l'idéal.
 

La solution retenue

Oui retenue, car plusieurs autres solutions ont été envisagées et testées.

En premier lieu, on se rend compte qu'il ne suffit pas de synchroniser le départ des morceaux. La disparité des quartz des cartes arduino est telle que l'on se retrouve assez facilement avec des décalages de l'ordre de la seconde en fin de morceau et ce n'est guère acceptable.
L'idée du calibrage de l'horloge de base a été tentée, mais selon la température, la tension de la batterie et que sais-je encore, la dérive finit par se faire sentir.
Une sélection de cartes arduino qui seraient de meilleure qualité a été par principe écartée. Comment apprécier cette qualité à priori et sur quels critères ?
Des techniques de recalage sur des informations de référence insérées dans les morceaux ont également été essayées avec plus ou moins de succès quant aux effets sur le déroulé musical et sa fluidité. Et puis les contraintes en amont étaient trop lourdes.

La technique retenue consiste à remonter à la source des signaux musicaux et à ce qui les génère, plus précisément à leurs horloges et à comparer le comportement de celles-ci sur des périodes fixes. Entre autres avantages, elle ne demande aucun travail particulier préalable sur les fichiers de musique, autre que celui de l'arrangement.

Alors ça fonctionne comment ?

bulletToutes les 1024 occurrences de son horloge, l'émetteur envoie un message de synchronisation. Ce message est bref et dure environ 40 ms toutes les 4.267 secondes.
bulletLe récepteur compte également les coups d'horloge qu'il génère entre deux réceptions successives du message de l'émetteur et compare à 1024. La différence observée en positif ou en négatif, donne alors lieu à deux actions :
- De manière immédiate : Rattrapage du retard ou correction de l'avance en agissant sur les temps d'attente des événements suivants et en appliquant un processus de lissage.
- On tente d'établir la tendance de l'horloge locale par rapport à celle de l'émetteur et on procède à son ajustage. En résumé, si on est souvent en retard, on diminue la période de l'horloge locale pour accélérer et vice versa (tout est dans le "souvent" :o)).
bulletDe cette manière on assure que le nombre de coup d'horloge effectués des deux côtés sera en moyenne le même à l'issue de chaque séquence de 1024 et en conséquence les morceaux s'exécuteront donc de manière synchrone.


Principe de la synchronisation

A noter :
Tout ceci est mis en œuvre dans le contexte de l'excellente bibliothèque radio VirtualWire de Mike McCauley.
Les messages émis comportent 80 bits : 36 bits de préambule + 12 bits de start + longueur utile + le message lui-même + un CRC. A un débit de 2 kbit/s, leur durée d'émission est donc de 40 ms. Celle-ci s'effectue selon un processus d'interruptions sous le contrôle du timer1 de l'Atmega cadencé à 62.5 microsecondes et elle est quasi-transparente pour le programme principal. La réception s'effectue exactement de la même manière et sous le contrôle de ce même timer1.
 

Mise en œuvre

Des résistances de 3.3 K sont mises en parallèle sur l'entrée du module émetteur ainsi que sur la sortie du récepteur. Leur présence ne perturbe en rien le fonctionnement de ces derniers et elle permet au programme de détecter lequel des deux est en service en marquant un '0' logique sur la broche correspondante lorsqu'un pullup interne à l'Atmega est momentanément activé pendant la phase de setup.
La mise en service d'un des modules s'effectuera donc simplement au moyen d'un commutateur raccordant sa connexion de données à la broche de l'arduino qui lui est dédiée.
Il n'est pas nécessaire de couper l'alimentation des modules inutilisés. Leur consommation est assez négligeable par rapport au reste du montage et l'émetteur étant de type ASK, il n'émet strictement rien lorsque son entrée est à 0. Mais bon, pourquoi pas. Dans ce cas il faut des commutateurs à double-circuits.

Pour plusieurs raisons, le connecteur RF qui était présent en prévision sur certaines carte PPCaP ne peut être utilisé en l'état. Difficile de penser à tout 4 années en avance... Il est donc nécessaire d'effectuer quelques adaptations conformément au schéma ci-après. La sortie midi des e.serinettes qui implantent la synchro radio devra également être modifiée.
En résumé on doit avoir :
- Sortie midi : Broche Tx de l'arduino (D1)
- Donnée vers l'émetteur radio : Broche D9 (ex midi)
- Sortie du récepteur radio : Broche D13

  I

Implantation des modules RF et exemple de carte d'adaptation

Important :
1. Si cette version des logiciels (5.0) est chargée sur des modules PPCaP sans radio (carton, orgue ou serinette), aucune modification de câblage n'est à effectuer et tout fonctionne comme auparavant.
2. Afin de prendre en compte la redirection de la sortie midi, si des modules radio sont installés le logiciel offre la possibilité de s'auto-paramétrer. Pour ce faire :
  . Mettre l'émetteur en service et insérer une carte tout en appuyant sur le poussoir.
  . A l'extinction de la led rouge, on peut relâcher le bouton. Un double clignotement de cette même led signale la détection de l'émetteur sur D9 ainsi que le positionnement d'un paramètre impliquant le basculement des signaux midi en D1.
  . On peut retirer la carte et la redirection de la sortie midi sera alors effective pour tout type de fonctionnement.
  . Bien sûr, si on recharge une version précédente du soft, la sortie midi s'effectuera à nouveau en D9.
 

Utilisation

Il suffit d'actionner les commutateurs des différents instruments en fonction du rôle que l'on veut leur faire jouer avec pour règle : Un seul émetteur et autant de récepteurs que l'on veut.

bulletCôté récepteurs on introduit une carte tout en pressant le bouton. La led rouge s'allume, puis s'éteint au bout d'une seconde. On peut alors relâcher le bouton. Un clignotement rouge atteste que le module est en mode réception. On peut tourner la manivelle pour produire de l'air, mais musicalement il ne se passe rien. On est en attente de déclenchement par l'émetteur.
bulletOn procède de la même manière côté émetteur, à ceci près qu'au lâcher de bouton la led rouge clignotera 2 fois signifiant le fonctionnement en mode émetteur et le morceau débutera immédiatement.
bulletEt c'est tout ;o)

On pourra alors constater tout au long du morceau, que la led rouge de l'émetteur clignote brièvement environ toutes les 4 secondes, signifiant l'envoi d'un signal de synchronisation.
Parallèlement, la led rouge côté récepteur clignote également, en léger retard par rapport à l'émetteur et pour une durée variable. Elle témoigne de la réception du signal radio ainsi que de l'instant d'application d'une correction éventuelle, qui peut s'étaler sur autant d'événements que nécessaire afin d'en adoucir les effets.
  

Particularités

bulletIl est préférable d'utiliser la version 5.0 des logiciels pour programmer les cartes si les morceaux contiennent des délais d'attente supérieurs à 8 secondes, ce qui sera souvent le cas dans un jeu à plusieurs instruments dans lequel ils se répondent.
bulletNe pas utiliser le mode 32 notes pour de la synchro radio ! La précision de la représentation du temps est insuffisante pour obtenir un calage précis entre des morceaux différents. Si on souhaite insérer des marques dans les morceaux, passer en 42 notes.
bulletSi un des morceaux doit débuter en retard, il est nécessaire d'y insérer une note hors gamme au moment du démarrage. Elle ne sera pas jouée et ne doit pas être déclarée dans les notes additionnelles. L'algo d'écriture sur cartes a été conçu pour économiser la mémoire et la présence de cette note l'oblige à passer outre et à insérer des blancs.
 
bulletLa pénurie de broches dans le montage m'a amené à utiliser D13 pour les données du récepteur. Or, traditionnellement dans le monde arduino cette broche pilote une led. Selon les implantations des cartes Nano en particulier, cette led peut être précédée d'un ampli mais parfois seulement d'une simple résistance. Dans ce dernier cas et si on souhaite jouer au tempo midi, il est possible que l'on obtienne une fausse détection d'un récepteur alors que celui-ci est hors service ou même absent. Le module se retrouve alors "bloqué" en attente d'un signal de l'émetteur qui n'arrivera pas.
Une simple pression sur le poussoir pendant que l'on tourne permet de démarrer le morceau et de retrouver le fonctionnement des versions antérieures.

Exemple d'implantation externe sur le carton électronique (Un peu à l'arrache je l'admets :o))

 

Choix des modules radio

Parmi toutes les offres de modules de ce genre, il est de loin préférable de commander la version superhétérodyne présentée en début de page. Si les émetteurs se valent, la sensibilités de ces récepteurs est bien meilleure que celle de celui qui est présenté ci-dessus dans ma version carton électronique et qui n'est rien d'autre qu'un montage à amplification directe.
De plus l'absence de réglage et la génération de la FI sous contrôle d'un quartz augurent d'une plus grande stabilité. Quoique hein... c'est aussi un quartz bas coût ;o)
 

Logiciel

L'indispensable mise à jour logicielle est ici : Software\PPCaP_V50.zip


Test des modules radio

Après installation du soft sur un système PPCaP, il suffit d'observer la led rouge tant côté émetteur que récepteur pour s'assurer du bon fonctionnement du lien radio. Cependant, la période de clignotement est un peu longue pour procéder à des ajustages d'antennes, tester la portée etc.
Voici un petit programme qui effectue une émission toutes les 500 ms ou moins... C'est du code source et donc une bonne occasion de bidouiller à votre convenance sous l'IDE arduino. A téléverser bien sûr dans toutes les cartes concernées.
C'est ici : Software\Test_modules_RF.zip

 

Amusez-vous bien !