Controleur midi usb arduino : Différence entre versions

De fablabo
Aller à : navigation, rechercher
(Programation)
(Programation)
Ligne 113 : Ligne 113 :
 
Dans se cas la le schéma de câblage ressemble a ça:<br/>
 
Dans se cas la le schéma de câblage ressemble a ça:<br/>
 
[[file:SansTableau.png|700px]]
 
[[file:SansTableau.png|700px]]
<code>
+
<code 'lang=C++'>
 
//sans tableau
 
//sans tableau
 
int entrePot = A0;
 
int entrePot = A0;

Version du 14 juin 2020 à 09:17


Controleur midi usb arduino (accessible aux débutants)



Contexte

Le projet démarre par la nécessité de produire son controleur-midi, ne pas avoir besoin de l'acheter, pouvoir le modifier/réparer, et l’envie de pouvoir brancher à peu près n'importe quel capteur en entrée midi (capteur de température à la place d’un fader, ...).
Il nous semblait important aussi, d'avoir un matériel nativement reconnu comme un instrument midi par l'ordinateur sur lequel on le branche en usb.
En gros on va utiliser des composants, et quelques lignes de code qu’on va écrire à l’intérieur, bien bien mélanger et ça va faire un contrôleur midi usb.

Choix des composants

Les cartes

[Nous utilisons parfois puces pour parler des microcontrôleurs]

Il existe plein de cartes arduino différentes. Les modèles qui peuvent être utilisé pour ce projets sont les Uno, Méga, Léonardo et Micro. On peut les classer en deux groupes : les Micro et Léonardo qui fonctionnent a peu près de la même manière (avec une seule puce*) et les Uno et Méga qui ont une autre façon de fonctionner (avec deux puces*). Nous traiterons ici uniquement des Méga et Uno puisque c’est celles que nous avons utilisées.
Pour nous, dire qu'une arduino uno ou mega suffit, reste incomplet, il vous faut pour ce projet vérifier que les carte ont les microcontrôleur suivants:

La arduino uno doit posséder:
  • atmega16u2 (ici 1 images atmega16u2 sous deux formes)
  • atmega328

AtmegaUno16u2.png

La arduino méga doit posséder:
  • atmega16u2
  • atmega2560

Mega16u2.png
Qu’importe leur forme : soudée ou détachable, ce qui compte c’est que les deux puces citées soient présentent !

Attention !! : certains fabricants remplacent la 16u2 par un CH340, les cartes sont alors parfois moins chères, mais on ne peut pas les transformer en périphérique MIDI. Les Firmware des CH340 sont propriétaires, merci pour ce cadeau empoisonné !
exemple de carte uno et méga avec des CH340 (qu'il ne faut pas choisir, pour se projet):

UnoCh340.png MegaCH340.png


Les capteurs

Les entrées de notre contrôleur midi sont:

  • des boutons poussoires,
  • des faders (10kohm),
  • des potentiomètres (10kohm)

Les boutons poussoires sont remplaçables par toute sorte d’interrupteur(magnétique, bille de mercure, ...) et les potentiomètres et faders sont remplaçables par toute sorte de capteurs (capteur d'humidité, photorésistances, ...) dont la résistance maximal est proche de 10kohm et la minimale de 0(sinon le fonctionnement du capteur ne sera pas linéaire).

La boite

Toutes les boîtes sont permises! (vous pouvez aussi simplement souder les composants sur la plaque de circuit imprimé et l'utiliser tel quel)
Attention à l'épaisseur, c'est bien de voir large: 5 cm nous paraissent le minimum pour pouvoir accueillir la carte, les fils et les soudures.
Nous c'est un livre dont le titre est l'intrus d'où le nom de notre contrôleur, et ça a été une galère à évider... et il n'est finalement pas assez haut pour tous les fils.

Principe de fonctionnement

Pour ce contrôleur midi, nous avons utilisé une arduino Méga pour la simple raison qu’elle a 16 entrées analogiques, mais c’est possible de le faire avec une Uno, en remplaçant atmega 2560 par atmega328 dans le texte en utilisant des multiplexeurs.
L’information des capteurs (nos boutons, faders, etc.) est récupérée par l’atmega2560 qui contient le code qu’on a écrit qui transforme l’information des capteurs en message midi. Elle envoie à l’atmega16u2 le message midi pour qu’il le transmette à l’ordinateur.

On ne sait pas si l’atmega16u2 est une interface simple entre l’atmega2560 et l’ordinateur ou si elle modifie le message, si vous le savez, vous pouvez nous le dire.

Le message MIDI

[vous pouvez passer cette rubrique et juste utiliser la fonction qu'on a écrite ou cette bibliothèque [1] si ça vous intéresse pas trop]

Le langage MIDI est un protocole de communication spécialement créer pour la communication musicale numérisé, il peut etre utiliser pour toute sorte d'utilisation, y compris non musicale, par exemple pour contrôler des jeux de lumière.
Les messages sont constitués de 3 octets (24 bits). Le premier bit du premier octet est toujours à 1 et le premier bit des deuxième et troisième octets est toujours à 0 afin de systématiquement identifier le début du message lorsqu'il y a de l'information en continu. Pour simplifier la lecture, l'écriture et la compréhension du message MIDI, on préfère l'écrire en hexadécimal.

le premier octet

Il se découpe en deux partie de 4 bits chacune.
Il commence toujours par 1. Les trois bits suivant code la nature du message (control change(CC), note on, note off, ...)
Les quatre bits suivants codent le canal (chanel en anglais). Cela peut jouer si plusieurs instruments MIDI sont connectés en même temps.

le deuxième octet

Il code l'identité du message. Selon la nature du message:

  • note on/note off: il indique quelle note.
  • control change (CC): il indique quel contrôle.

Comme il commence par 0, il y a 128 possibilités différentes (de 0 à 127), donc max 128 notes différentes ou 128 CC différents. Il existe des conventions mais nous ne les avons pas prises en compte. Cela n'a pas d'incidence dans notre cas, puisque c'est un contrôleur MIDI, mais cela en aurait eu si c'était un instrument MIDI.

le troisième octet

Suivant la nature:

  • note ON: vélocité de la note. Attention: Si on le mets à 0, cela équivaut à un signal note OFF.
  • note OFF: Cela n'a pas d'incidence.
  • control change: il code sa valeur.

Pareil que pour le deuxième octet, puisqu'il commence par 0, il peut prendre 128 valeurs différentes (de 0 à 127).

Câblage

Savoir quoi brancher sur quoi est assez simple en théorie, c'est beaucoup moins évident dans la pratique...
en generale avec trois quatre fils ça passe tranquil, une dizaine sa se complique, pour nous avec la boite qu'on avais choisis( un livre de 23cm x 18cm x 3.5cm), pour 8 faders, 8 potentiomètre et 16 boutons, ça a très vite été bien galère.
Dans l'idée, il faut bien différencier les entrées numérique, des entrées analogiques.
Le but ici, est vous expliquer comment câblé, vous devez adapter le concept a votre contrôleur midi a vous.

les entrées analogiques

Dans cet équipe on retrouve toute les résistances variables: photorésistance, potentiomètres, faders, etc.
Les potentiomètre et fader on généralement 3 pattes, les deux extrémités sont a branché sur le 5v et le GND et la patte du milieu sur une broche analogique de l'Arduino.
Les photorésistances se branche entre le 5v et une entrée analogique de l'Adruino.
Certain fader on 6 pattes, se sont des fader double piste, composer de 2X3 pattes, pour notre projet la deuxième piste ne va pas nous servir.
Dans les fait l'information on peut générer 1024 informations différentes avec les entrées analogiques de l'Arduino, de 0 à 1023.
MegaCablageExemple.png

les entrées numériques

Ici, c'est l'équipes des interrupteurs, nous avons utiliser des bouton poussoir classique, mais il est aussi possible d'utiliser des switchs (il me semble qu'en français on dit interrupteur a bascule).
Dans les fait l'information on peut générer 2 informations différentes avec les entré numérique de l’Arduino, soit 0 soit 1, on peut aussi parler de l'état haut ("HIGHT" en anglais), et l'état bas ("LOW" en anglais).
MegaCablageExempleNumerique.png

Programation

Dans cette partie on va essayer d’être claire, que sa vous paraisse simple, mais la programmation, c'est pas simple, si vous n'avez jamais écris un programme c'est normal que sa vous paraisse obscure, très obscure. on ne peux que vivement vous conseiller de faire un tutoriel de programmation de l'Arduino (celui-la par exemple [2]).
Surtout ne lâcher pas l'affaire. Vous êtes une dorade qui vient de faire l'acquisition sur un dîné succulent. Malheureusement il y a un hameçon dans votre repas, au bout de cet hameçon un fil puis une canne a pêche, puis un bateau. Il vas falloir tirer pour casser soit le fil soit la canne soit le bateau parce que ce repas c'est le votre et y'a pas moyens de négocier et accessoirement aussi que vous n'êtes le repas de personne. C'est pas vous qui aller vous faire grailler par la programmation, c'est la programmation qui va vous servir de casse croûte.

Sans Tableau

Pour simplifier la compréhension du programme nous allons d'abord expliquer une version avec un seul potentiomètre et un seul bouton, se qui signifie que nous n'aurons pas de tableau d'entré donc pas de boucle de lecture pour ces fameux tableaux.
Dans se cas la le schéma de câblage ressemble a ça:
SansTableau.png //sans tableau int entrePot = A0; int entrebou = 2;


Avec Tableau