vendredi 15 juin 2018

MIDI par usb avec Arduino Leonardo

Jusqu'à maintenant, chaque fois que j'ai abordé un projet impliquant le protocole MIDI, j'ai utilisé les traditionnels connecteurs DIN à 5 broches.  Ces connecteurs sont tout à fait appropriés lorsqu'on veut brancher une carte Arduino à un clavier MIDI, par exemple.  Mais pour établir une communication MIDI entre l'Arduino et un ordinateur, un simple câble usb s'avère plus pratique (surtout si vous ne possédez pas d'instruments de musique compatibles MIDI).

Dans ce tuto, nous explorons donc l'utilisation d'une carte Arduino Leonardo pour établir une communication MIDI avec un ordinateur.  Plutôt qu'un Leonardo, n'importe quelle carte Arduino pouvant se comporter comme un périphérique USB pourrait faire l'affaire (Zero, Due, 101...); toutefois, ce projet ne fonctionnera pas avec une carte Arduino Uno.

Installation d'un logiciel MIDI sur l'ordinateur

Nous aurons besoin d'un logiciel compatible MIDI sur l'ordinateur auquel nous brancherons le Leonardo.  Si vous avez déjà l'habitude de jouer avec des contrôleurs MIDI, utilisez votre logiciel préféré.  Sinon, je vous propose VMPK, ou Virtual MIDI Piano Keyboard qui est léger, gratuit, et convient parfaitement à nos besoins.  Le logiciel est disponible pour Windows, Linux et Mac, mais j'ai fait mes tests sous Windows 7.



Installation de la bibliothèque MIDIUSB

Vous devez également installer la bibliothèque MIDIUSB dans votre IDE Arduino.  Attention, il ne s'agit pas de la bibliothèque MIDI conventionnelle que vous avez peut-être déjà installée dans le passé.



Exemple 1:  communication de l'Arduino vers l'ordinateur (MIDI out)

Une première utilisation possible consiste à envoyer des instructions MIDI de la carte Arduino vers l'ordinateur (le Leonardo agit comme contrôleur MIDI).  L'exemple "MIDIUSB_write" qui accompagne la bibliothèque MIDIUSB envoie à l'ordinateur une même note de façon répétitive; j'ai modifié cet exemple pour jouer en boucle une courte mélodie constituée de 16 notes.

Le sketch

Le sketch contient une fonction noteOn qui permet de jouer une note.  Cette fonction nécessite trois paramètres:  channel (le canal MIDI utilisé), pitch (la note de la gamme à jouer) et velocity (le volume sonore avec lequel la note doit être jouée).

Ainsi,  "noteOn(0, 0x48, 64)" jouera la note "do du 5e octave" avec une vélocité de 64 (moyenne) sur le canal 0.

Dans le protocole MIDI, chaque note est jouée aussi longtemps qu'elle n'est pas interrompue par un message "noteOff", qui prend les mêmes arguments que la fonction "noteOn".

Les 16 notes qui constituent notre mélodie sont stockées dans un tableau bidimensionnel nommé "melodie":  le premier élément est le "pitch", et le deuxième est la durée en millisecondes.  J'aurais pu ajouter un troisième élément pour la vélocité mais, dans cette exemple, toutes les notes de la mélodie sont jouées avec la même intensité.



Réglages du logiciel MIDI

Pour que la mélodie émise par l'Arduino soit jouée par l'ordinateur, il faut faire en sorte que Virtual MIDI Piano Keyboard utilise la carte Leonardo comme entrée MIDI.  Pour  ce faire, vous choisissez "Connexions MIDI" dans le menu "Éditer".


Si la carte est branchée à un port USB de l'ordinateur, "Arduino Leonardo" devrait être disponible dans la liste proposée pour "Connexion du port d'entrée MIDI".  Il vous faut également un pilote capable de jouer les sons ("Pilote MIDI OUT").  Dans mon cas, on me propose "Windows MM", probablement parce que Windows Movie Maker était déjà installé sur l'ordinateur.  Si la liste "Pilote MIDI OUT" est vide pour vous, vous devrez installer un pilote sur votre ordinateur (VirtualMIDISynth, par exemple).

La mélodie devrait maintenant être jouée sur la carte de son de l'ordinateur.  Notez que vous pouvez modifier le "programme" (l'instrument utilisé pour jouer la mélodie): ça peut être un son de piano, de trompette, de clarinette, etc.

D'autres exemples de MIDI out

Comme je l'ai déjà mentionné, l'exemple "MIDIUSB_write" fournit avec la bibliothèque MIDIUSB fait la même chose, mais avec une seule note.  De plus, des informations apparaissent dans le moniteur série de l'IDE Arduino, ce qui peut aider au débogage.

Si vous préférez fabriquer un petit contrôleur MIDI, jetez un oeil sur la page MidiDevice du site officiel Arduino: on vous guide dans la fabrication d'un clavier MIDI constitué de 7 boutons poussoirs.


Exemple 2:  communication de l'ordinateur vers l'Arduino (MIDI in)

Dans ce deuxième exemple, nous allons envoyer des messages MIDI de l'ordinateur vers l'Arduino.  Pour vérifier que ça fonctionne, vous pouvez essayer l'exemple "MIDIUSB_read" fourni avec la bibliothèque MIDIUSB: lorsque vous jouez une note sur le clavier du logiciel Virtual MIDI Piano Keyboard, elle s'affiche dans le moniteur série de l'IDE Arduino.

Pour ma part, j'ai essayé quelque chose qui me semblait un tout petit peu plus amusant:  chaque fois que je clique sur une note du logiciel Virtual MIDI Piano Keyboard, l'Arduino produit cette note à travers un haut-parleur.  Le Leonardo servira donc de synthétiseur MIDI (remarquez que la pertinence du projet est un peu discutable: la carte de son de l'ordinateur produit un son de bien meilleur qualité que la fonction tone de l'Arduino...).

Circuit

Le haut-parleur est relié à la broche 8 du Leonardo, par l'entremise d'un transistor pour éviter que le haut-parleur, à cause de sa très faible impédance, ne draine trop de courant (plus de détails ici).



Sketch

Lorsque le Leonardo reçoit un message "noteOn", il établit une correspondance entre le code MIDI qui indique la hauteur de la note (pitch) et la fréquence qui devra être émise par le haut parleur.  La variable MidiToFreq est un tableau bi-dimensionnel qui contient, pour chaque pitch MIDI, la fréquence en hertz.  Une fois la fréquence connue, on utilise la fonction tone pour jouer cette note sur le haut-parleur (broche 8).  Lorsqu'on reçoit un message "noteOff", on utilise noTone pour interrompre le signal PWM de la broche 8.



Réglages du logiciel MIDI

Pour que le logiciel Virtual MIDI Piano Keyboard achemine les messages vers la carte Leonardo, il faut effectuer quelques réglages, en passant par "Connexions MIDI" dans le menu Éditer.


Si la carte est branchée à un port USB de l'ordinateur, "Arduino Leonardo" devrait être disponible dans la liste "Connexion du port de sortie".



Chaque fois que vous cliquez sur une touche du clavier de piano dans la fenêtre du logiciel Virtual MIDI Piano Keyboard, la note se fait entendre dans le haut-parleur branché à l'Arduino (pour que toutes les touches fonctionnent, réglez le paramètre "Octave de base" à 3).

Yves Pelletier   (TwitterFacebook)


dimanche 10 juin 2018

Data logging avec Arduino Leonardo

Les microcontrôleurs constituent un outil précieux dans le domaine scientifique, grâce à la possibilité d'y brancher différents capteurs afin de prendre des mesures. 

Lorsqu'il s'agit de mesures nombreuses, étalées sur une certaine plage de temps, il faut penser à un moyen d'enregistrer ces données et les rendre disponibles à l'utilisateur.

Pour ce faire, il existe plusieurs méthodes, et j'en ai déjà exploré quelques-unes  dans ce blog: enregistrer un fichier "csv" sur une carte SD, ajouter une macro à votre tableur pour qu'il recueille les données par communication série, utiliser un service en ligne comme carriots, ou simplement utiliser le moniteur série et/ou le traceur série intégrés dans l'IDE Arduino...

Aujourd'hui, je procède autrement:  puisque la carte Arduino Leonardo peut se comporter comme un clavier USB, il est facile de la programmer pour qu'elle écrive les données dans un tableur.

Ce n'est probablement pas la façon la plus élégante de procéder; l'utilisateur devra prendre soin d'ouvrir un tableur (Excel, Google Sheets, Libre Office Calc), d'y sélectionner la cellule qui recevra la première donnée, et de conserver le logiciel à l'avant-plan pendant toute la durée de la mesure... Mais ça fonctionne, et ce n'est pas très difficile à réaliser.

Le circuit

Pour faire mes tests, j'ai fabriqué un capteur de température constitué d'une thermistance et d'une résistance.  Lorsque la température augmente, la thermistance devient moins résistive, ce qui a pour effet de diminuer la tension acheminée à l'entrée A0 de la carte Leonardo.

Évidemment, vous pouvez remplacer ce capteur par n'importe quel autre, peu importe qu'il soit analogique ou numérique (il peut même y en avoir plusieurs), en apportant des modifications mineures au sketch présenté plus bas.



Le sketch

Le bref programme présenté ci-dessous "tape au clavier" le temps écoulé depuis le démarrage de la carte (fonction"millis"), envoie le code ASCII de la touche "tab" pour passer à la cellule voisine de droite, écrit la valeur lu à l'entrée analogique A0, envoie le code ASCII de la touche "enter" pour descendre d'une ligne, puis attend 1 seconde avant de recommencer.

Prenez note d'une importante précaution qui nous permet d'interrompre au besoin la prise de données:  la routine s'effectue à la condition que la broche 2 de la carte soit au niveau logique haut (5 V).  Ainsi, lorsque vous désirez reprogrammer la carte, vous reliez la broche 2 à GND pour éviter que les mesures soient dactylographiées à l'intérieur de votre sketch!!!



Le résultat

Après avoir ouvert un tableur, vous sélectionnez  une de ces cellules, puis vous reliez la broche 2 à 5 V.  Les données s'écrivent sur deux colonnes: le temps dans la colonne de gauche, et la mesure de l'entrée A0 dans la colonne de droite.

Le graphique ci-dessous a été produit dans Google Sheets: j'ai tenu la thermistance entre mon pouce et mon index pour la réchauffer, puis je l'ai laissé reprendre sa température initiale.


Si vous voulez, vous pouvez préparer le tableur pour que les données soient présentées sous forme de graphique à mesure qu'elles sont prises.  Vous pouvez également effectuer les calculs nécessaires pour convertir les mesures (soit dans le sketch Arduino, soit dans le tableur).


Yves Pelletier   (TwitterFacebook)

samedi 2 juin 2018

Émuler une souris avec l'Arduino Leonardo

Une caractéristique intéressante des cartes Arduino Leonardo, c'est que les ordinateurs les reconnaissent comme de véritables périphériques USB.  On peut donc programmer le Leonardo afin qu'il se comporte comme un clavier ou une souris.

Le langage Arduino vous propose 7 fonctions permettant de reproduire le mouvement d'une souris d'ordinateur:


  • Mouse.begin() est nécessaire pour initialiser l'émulation et utiliser les autres fonctions décrites ci-dessous.  Typiquement, vous l'utilisez à l'intérieur de setup().  Si vous désirez interrompre l'émulation de la souris, utilisez Mouse.end().
  • Mouse.move(x, y, wheel) permet de faire bouger le pointeur de souris à l'écran de l'ordinateur.  x est le nombre de pixels dont on désire faire bouger le pointeur horizontalement, alors que y est le nombre de pixels dont on désire déplacer le pointeur verticalement.  Notez que ces déplacements sont relatifs à la position initiale du pointeur sur l'écran.
  • Avec Mouse.click(), votre Leonardo aura le même comportement que si vous aviez cliqué avec le bouton gauche de la souris.  Si vous désirez produire un clic sur le bouton droit, vous utilisez Mouse.click(MOUSE_RIGHT).
  • Mouse.press() ressemble à Mouse.click(), sauf que le bouton demeure enfoncé jusqu'à ce que vous appeliez Mouse.release().
  • Mouse.isPressed() est un booléen dont la valeur sera vraie si une le bouton d'une souris reliée à l'ordinateur est enfoncé.

Le site officiel Arduino présente deux exemples très clairs pour construire votre propre souris au moyen de 5 boutons poussoirs, ou pour contrôler le pointeur au moyen d'un joystick analogique.

Question de ne pas refaire inutilement des projets qui existent déjà, je vous propose un petit sketch inutile mais rigolo qui vous permettra  de jouer un tour à vos amis: la souris truquée.  Lorsque vous branchez l'Arduino Leonardo au port USB de l'ordinateur, le pointeur de souris se mettra à bouger avec une trajectoire circulaire, comme dans la vidéo ci-dessous.  Avec une telle souris hyperactive, l'utilisateur aura bien du mal à contrôler son ordinateur...



Mais prenez garde de ne pas vous piéger vous-mêmes: si le pointeur se met à faire des cercles aussitôt que la carte Leonardo est branchée à votre ordinateur, vous serez incapable de téléverser un autre sketch dans la carte, lorsque vous en aurez assez de celui-ci.  Pour cette raison, il faut prévoir un moyen de d'empêcher la carte d'exécuter sa routine.  Dans le sktech ci-dessous, nous vérifions d'abord l'état de la broche numéro 2 de l'Arduino.  Si elle est au niveau logique haut, nous faisons bouger le pointeur de la souris, mais si elle est au niveau logique bas, nous ne faisons rien.  Donc vous reliez la broche 2 à la sortie 5 V au moyen d'un fil conducteur lorsque vous voulez faire tourner le pointeur à l'écran, mais vous la reliez à la masse (GND) lorsque vous souhaitez reprogrammer la carte.



Yves Pelletier   (TwitterFacebook)
Related Posts Plugin for WordPress, Blogger...