Arduino et MIDI

Cette page est destinée à faire comprendre comment faire apparaître la carte Arduino comme un appareil midi via USB. Cette fonctionnalité est très utile car elle permet d'éviter l'installation de drivers sur les ordinateurs, comme dans une salle de classe de Collège où tous les ordinateurs sont sur un Windows décentralisé…

Seules les cartes Uno, Mega et Leonardo peuvent être utilisée comme cela. En effet, sur les cartes Uno et Mega, il existe un petit micro-contrôleur (souvent atmega8u2 ou atmega16u2) qui est dédié à la communication entre le port USB et le micro-contrôleur principal. C'est l'interface de communication. Par défaut le programme à l'intérieur utilise une communication Série, mais comme celui-ci est programmable, nous pouvons le changer pour faire apparaître l'Arduino en tant qu'appareil Midi, Joystick ou clavier. Pour informations, sur les anciennes cartes Arduino, il n'y avait pas ce micro-contrôleur, il y avait un composant nommé FTDI, pour la communication série. Étant propriétaire, il n'était pas modifiable. Sur la Leonardo, tout est compris dans le micro-contrôleur atmega32u4, la méthode est différente.

Arduino Uno Midi

1 - DFU-programmer

Sur les cartes Arduino Uno et Mega, il faut pouvoir reprogrammer le micro-contrôleur ATMEGA16U2. Pour cela il faut d'abord installer un programme sur votre ordinateur qui va pouvoir communiquer avec lui : le dfu-programmer (DFU pour Device Update Firmware). Ressource : DFUProgramming8U2.

Sur UBUNTU/Linux, cette commande installe le programme:

sudo apt-get install dfu-programmer

Mais la version semble ancienne (0.6.2) et ne pas prendre en compte la cible recherchée ici “atmega16u2”.

dfu-programmer --version // pour vérifier la version
dfu-programmer --targets // pour lister les cibles, nous devrions y trouver atmega16u2

Il est donc nécessaire d'installer la dernière version. Télécharger la dernière version : https://sourceforge.net/projects/dfu-programmer/files/latest/download?source=files

sudo apt-get install build-essential libusb-1.0-0-dev
cd dfu-programmer-0.7.2/
./bootstrap.sh
./configure
make
sudo make install

Nous avons maintenant une version plus récente (0.7.2) et dans la liste des cibles (targets), nous avons enfin “atmega16u2”

dfu-programmer --version
dfu-programmer --targets

2 - Flash atmega16u2

Pour reprogrammer la puce, on parle de flash.

Attention, pour les cartes UNO rev.1 il faut souder une résistance comme sur cette image.

1 - Reset
Il faut d'abord faire un reset de la puce. Il faut connecter la carte Arduino en USB à l'ordinateur et connecter le GND et RESET des pins mâles au dessus de la puce atmega16u2, avec un jumper par exemple. Ces pins sont utiles pour programmer un micro-contrôleur de l'extérieur (ISP). Voir une vidéo de la manipulation.

À partir de ce moment-là, la carte Arduino n'est plus reconnue en tant que périphérique USB/Série.

2 - Erase
Après avoir enlever le jumper. Vous pouvez entrer cette commande pour effacer le programme de la puce

sudo dfu-programmer atmega16u2 erase 
Checking memory from 0x0 to 0x2FFF...  Not blank at 0x1.
Erasing flash...  Success

3 - Remettre le programme par défaut
Ce n'est pas notre intention ici, mais vous pouvez revenir en arrière et remettre le programme par défaut, celui qui fait apparaître l'Arduino comme un appareil série.

Aller dans le répertoire de votre logiciel Arduino et naviguer pour trouver le répertoire “atmegaxxu2”

cd ~/Softs/arduino-1.6.8/hardware/arduino/avr/firmwares/atmegaxxu2/arduino-usbserial

Vous trouverez un fichier “Arduino-usbserial-uno.hex”, c'est lui que nous allons flasher pour retrouver le comportement par défaut de la carte.

sudo dfu-programmer atmega16u2 flash Arduino-usbserial-uno.hex
Checking memory from 0x0 to 0xFFF...  Empty.
0%                            100%  Programming 0x1000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
0%                            100%  Reading 0x3000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
Validating...  Success
0x1000 bytes written into 0x3000 bytes memory (33.33%).

Vous devriez pouvoir réutiliser l'Arduino comme avant.

3 - Flash atmega16u2 avec le Midi

  1. Télécharger MOCOLufa et dézipper le: https://github.com/kuwatay/mocolufa
  2. Reset de l'atmega16u2, comme vu précédemment
  3. Erase
  4. Flash du firmware Midi : sudo dfu-programmer atmega16u2 flash mocolufa/HEX/dualMoco.hex
$ sudo dfu-programmer atmega16u2 flash dualMoco.hex 
Checking memory from 0x0 to 0x167F...  Empty.
0%                            100%  Programming 0x1680 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
0%                            100%  Reading 0x3000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
Validating...  Success
0x1680 bytes written into 0x3000 bytes memory (46.88%).

C'est ce firmware qui permet de faire passer l'Arduino comme un périphérique Midi. C'est lui qui fait tout le travail ! En plus, il permet une autre fonctionnalité très pratique, de basculer en mode MIDI (par défaut) ou serial en connectant simplement les pins 4 et 6 de l'ISP, avec un jumper, comme sur cette photo.

Car vous ne pouvez pas reprogrammer l'Arduino en mode Midi. Vous ne pouvez le faire qu'en mode serial ou bien en passant par les pins ISP du micro-contrôleur principal. Vous pouvez ainsi assez facilement programmer l'Arduino et ensuite utiliser l'Arduino comme appareil MIDI. Pour basculer, il faut débrancher/rebrancher le câble USB.

En tapant la commande “lsusb”, on voit apparaître une ligne “Atmel Corp. LUFA MIDI” nous indiquant que l'Arduino est désormais perçu par l'ordinateur comme un périphérique Midi.

4 - Programme Arduino Midi

  1. Installer la bibliothèque MIDI dans votre dossier Arduino/libraries
  2. Passer l'Arduino en mode serial (voir au dessus). Débrancher, rebrancher. Vous verrez alors apparaître la carte dans le sélecteur de Ports du logiciel Arduino.
  3. Téléverser un exemple de la bibliothèque MIDI
  4. Passer l'Arduino en mode Midi en enlevant simplement le jumper. Débrancher, rebrancher.
  5. Visualiser le résultat sur un logiciel Midi

Arduino Leonardo Midi

La méthode est un peu plus simple car nous n'avons pas besoin de flasher. La plus récente consiste à utiliser l'environnement développer pour la carte Teensy dans Arduino et de faire passer la Leonardo comme une Teensy.

Ressources :

1 - Installer TeensyDuino

Respectez la méthode d'installation sur https://www.pjrc.com/teensy/td_download.html

Attention, la version de TeensyDuino doit être compatible avec votre version d'Arduino. Par exemple, pour l'instant (25/10/2016), il faut utiliser Arduino 1.6.11, la version pour Arduino 1.6.12 n'est pas encore prête.

2 - Installer de nouvelles cartes

Avec la nouvelle version d'Arduino, il est très facile d'ajouter du matériel. Il suffit d'ouvrir les préférences “Fichier > préférences” et d'ajouter le lien Internet suivant :

https://adafruit.github.io/arduino-board-index/package_adafruit_index.json

Ensuite, nous allons installer le paquet Adafruit TeeOnArdu, en ouvrant le gestionnaire de carte “Outils > Carte > Gestionnaire de carte” , puis en sélectionnant “Adafruit TeeOnArdu” et en cliquant sur “installer”.

3 - Sélectionner la bonne carte

  1. “Outils > carte TeeOnArdu”
  2. “USB Type > Midi”

4 - Programme Arduino

N'importe quel programme pour la teensy marchera pour la Leonardo, voir http://www.pjrc.com/teensy/td_midi.html

Une fois le programme téléversé dans la carte Arduino, il faudra appuyer sur le bouton Reset de la carte pour la reprogrammer, car par défaut elle sera vue comme un appareil Midi.

Code Midi Leonardo et Teensy