Pédalier MIDI USB

De Wiki LOGre
Révision de 2 septembre 2017 à 18:24 par Yruama Lairba (discuter | contributions) (Bootkey conflict)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)
Aller à : navigation, rechercher


Projet en cour, réalisé par Yruama_Lairba

Présentation

Le but de ce projet et de réaliser un contrôleur MIDI s'utilisant avec les pieds, d'où le nom de "pédalier". La particularité de celui que je veux construire serais de pouvoir envoyer des commandes MIDI au travers d'un câble USB afin de piloter un logiciel de musique sur un ordinateur.

Caractéristiques et fonctionnalités principale souhaitée

  • Possibilité d'envoyer des commandes MIDI par USB
  • Possibilité d'alimentation par USB
  • Une sortie MIDI en connecteur din 5 broches
  • Des commutateur momentanés (dit aussi fugitifs), actionnable au pied pour l'envoie de commande midi de type "tout ou rien"
  • Une pédale d'expression pour l'envoie de commande MIDI avec une valeur continue.
  • Possibilité de configuration : canal midi, numéro de commande midi....

Partie électronique

Composants et modules utilisés

  • Le noyau : carte Arduino Micro. j'ai choisi cette carte parce qu'elle s'intègre facilement dans une breadboard ou une carte électronique et parce que l'atmega32U4 permet de vrai communication en USB (hardware dédié).
  • Interface de configuration :
    • un écran OLED monochrome blanc de 0.96 pouce (SSD1306) : cette écran a un très bon contraste mais semble petit. Néanmoins, la taille me semble suffisante si le pédalier est a porté de main et si on écris plutôt gros sur l’écran. À voir si on peut aussi afficher une information utile lorsque que le pédalier est au pied.
    • un codeur rotatif pour faire défiler les choix et incrémenter/décrémenter des valeurs.
    • 2 petit bouton poussoirs : Valider ou Annuler
  • Contrôle au pied:
    • des "momentary footswitch" (commutateur fugitif activable au pied) : au besoin, peut être transformée en bascule grâce à l'arduino.
    • la pédale d'expression : juste un potentiomètre pour la partie électronique, avec éventuellement 1 ou 2 condensateur pour filtrer les parasites
    • des leds pour visualiser l’état interne des footswitch.
  • Autre:
    • condensateurs anti-rebond et anti-parasite peuvent être supprimé grace à des techniques de debouncing"

Partie programmation

Modules existants

  • Adafruit-GFX-library : noyaux commun à toute les librairie graphique développé par Adafruit
  • Adafruit_SSD1306 : librairie arduino pour le pilotage des écran OLED SSD1306. Attention, cette librairie doit être modifié en fonction de la résolution de l’écran utilisé. Cette librairie permet de faire des choses assez complexe mais à l’inconvénient d’être très gourmande en ressource (mémoire programme et RAM à cause d'un framebuffer). Ce module pourrais être remplacé lors d'une phase d'optimisation.
  • MIDIUSB : librairie arduino qui permet de faire du midi par USB si le micro-controleur support nativement l'USB

Architecture global

  • un module pour la gestion des footswitch et de la pédale d'expression
  • un module pour la gestion des messages midi
  • un module de configuration qui permets d'associer un message midi à un footswitch

Châssis et mécanique

brouillon

Les footswitch

Footswitch

Pour des raisons de simplicité, je pense utiliser des footswitch du type ci-contre. Il suffit de faire un trou et de visser. Le seul inconvénient mineur par rapport à d'autre forme de footswitch, c'est que ça peut être désagréable lorsque utilisés en chaussette xD .

La pédale d'expression

Je pense m'inspirer des pédales de volume réalisé sur cette chaine youtube, notamment le premier modèle présenté. j'espère notamment avoir l'aide d'autre membre du LOG pour la conception/réalisation des engrenages. C'est peut être qu'un pignon et qu'une crémaillère, mais j'y connais pour l'instant pas grand chose.

Chassis global

Un schéma vaut mieux qu'un long discourt :) par contre le moteur du wiki a l'air de faire du caca avec les svg :(

Pedalboard midi schema apercu.svg

Problèmes et difficultés rencontrés

L'envoie de paquet MIDIUSB peut durer 250ms

Lorsque l'arduino micro est connecté à l'USB d'un ordinateur, mais qu'aucune application ne récupère les paquets Midi de l'arduino, l'envoie d'un paquet midi bloque le sketch pendant 250 ms. Je pense que ces 250ms viennent d'un timeout defini dans la library MIDIUSB. La résolution n'est par urgente puisque à l'utilisation, cela ne pose problème que lorsque qu'on se sert d'un port USB de pc seulement pour l'alimentation et qu'on se sert du port midi physique.

Bootkey conflict

Ce problème concerne les arduino micro et leonardo. Sur ces cartes, le bootloader officiel écris en ram une clé de manière non fiable aux adresses 0x800 et 0x801. Cela peux corrompre des données ou provoquer des bug étranges et inexplicables (voir l'issue "Critical Leonardo + Micro Bootkey conflicts" sur github). J'ai aussi noté que le la corruption de données ou le bug n'a lieu que lorsque l'arduino est relié en USB à PC.

Mise en évidence

le sketch suivant rempli un tableau lors de la phase d'initialisation puis relis en boucle le tableau. Si une valeur lu ne corresond pas à l'adresse écrite, on affiche l'adresse en ram en hexa et l'indice de la valeur en decimal.

#define SIZE 2250 //size of tab
uint8_t tab[SIZE];
 
#define VALUE 0xFF // value used to fill the tab
 
void setup() {
  Serial.begin(9600);
  //fill the tab
  for(int i = 0; i<SIZE;i++)
  {
    tab[i] = VALUE;
  }
}
 
void loop() {
  delay(1000);
  //read the tab
  Serial.print(F("Start reading tab\n\r"));
  for(int i = 0; i<SIZE;i++)
  {
    if (tab[i] != VALUE)
    {
      Serial.print(uint32_t(&tab[i]),HEX);//print address in ram
      Serial.print(F(" "));
      Serial.println(i,DEC);//print tab index
    }
  }
}

Normalement on devrais obtenir :

Start reading tab
Start reading tab
Start reading tab

Mais avec un arduino micro branché en USB a un PC, on obtient :

Start reading tab
800 1735
801 1736
Start reading tab
800 1735
801 1736

Solution : Hoodloader 2.0.5

Une solution consiste à remplacer le bootloader officiel par HoodLoader 2.0.5. Regarder le wiki de Hoodloader pour avoir les instructions à jour.

Instruction pour changer le bootloader depuis l'IDE arduino

Cela nécessite un programmateur externe

  1. Aller dans Fichier>Préférences puis dans l'onglet Paramètres
  2. Ajouter https://raw.githubusercontent.com/NicoHood/HoodLoader2/master/package_NicoHood_HoodLoader2_index.json dans URL de gestionnaire de cartes supplémentaires
  3. Aller dans Outils>Type de carte>Gestionnaire de carte
  4. Installer HoodLoader2
  5. Changer le type de carte pour "HoodLoader2 32U4"
  6. Dans Outils>Board/Bootloader/USB-Core choisir HoodLoader2 Micro (ou Leonardo)
  7. Puis cliquer sur Outils>Graver la séquence d'initialisation