Se connecter
Se connecter

ou
Créer un compte

ou
FR
EN

Vumètre MIDI Arduino

  • 27 réponses
  • 5 participants
  • 1 030 vues
  • 7 followers
Sujet de la discussion Vumètre MIDI Arduino
Bonjour

J’ai réussi à concevoir un contrôleur MIDI type table de mixage DJ 4 voies qui pilote Ableton et Traktor.
5 potentiomètres 1 fader 1 bouton rétro éclairé par voie.

Maintenant je bloque sur les vumètres. J’aimerais mettre 1 vumètre/voie qui serai contrôlé par Ableton.

Je ne sais pas si je dois le créer moi même LED par LED ou s’il existe des tout fait. Et surtout le code, je bloque.

Est-ce qu’une âme charitable pourrait me venir en aide? Je suis preneur de tout conseil!!!!

Merci

2
Bonjour,

Citation de Ray-Me :
je bloque sur les vumètres. J’aimerais mettre 1 vumètre/voie qui serai contrôlé par Ableton.
Je ne sais pas si je dois le créer moi même LED par LED ou s’il existe des tout fait. Et surtout le code, je bloque.


Il existe des vumètres tout faits, mais qui attendent un signal audio analogique standard.
Dans ton cas, il te faut créer ces vumètres de toute pièce, pour faire réagir les LED en fonction des données numériques reçues.

Si j'ai répondu à côté, merci de donner plus de précisions...

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

3
Citation :
Si j'ai répondu à côté, merci de donner plus de précisions...


Tout d'abord merci pour ta réponse.

tu ne réponds pas à coté, et d'ailleurs tu soulèves une chose que je ne savais pas. Je croyais que je pouvais mettre n'importe quel vumètre. Alors en cherchant j'ai déjà trouvé quelque vumètre tout prêt, mais en effet ils doivent surement recevoir de l'analogique.

Je vais me lancer dans la construction LED par LED. ou alors acheter un barre graphe à la place des led je ne sais pas encore. Par contre mon problème va se situer dans le nombre de vumètre que je veux (4). Apparemment c'est 1 LED par pin digital. Du coup il va quasiment me falloir 2 Arduino pour les 4 vumètres.

J'ai vu ça mais je ne sais pas si il faut lui mettre une entrée analogique ou numérique.

On peut voir qu'avec le connexion kit d'Ableton on peut utiliser un module Arduino avec des envois de signal analogiques ou numérique selon le module qu'on utilise.

Est-ce que tu pense que ca peut marcher ?

4
Citation :
mon problème va se situer dans le nombre de vumètre que je veux (4). Apparemment c'est 1 LED par pin digital. Du coup il va quasiment me falloir 2 Arduino pour les 4 vumètres

Oui, si tu décides de piloter chaque LED indépendamment et directement depuis l'Arduino.
Non, si tu ajoutes à l'Arduino des registres à décalage ou expandeurs de ports qui permettent d'augmenter le nombre de sorties.

Citation :
On peut voir qu'avec le connexion kit d'Ableton on peut utiliser un module Arduino avec des envois de signal analogiques ou numérique selon le module qu'on utilise. Est-ce que tu pense que ca peut marcher ?

Je ne connais pas le "connexion kit d'Ableton"...

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

5
6
si fabrication
que çà soit avec des leds unitaires ou des bargraph ( à cathode ou à anode commune)
il te faudra des résistances pour limiter le courant dans les leds autour de 10 à 20mA

la tension de seuil des Leds dépend de leur couleur
1,2 à 1,4 pour les rouge
3V à 3,6V pour bleu et blanc
les leds blanches sont faites d'une led bleue avec une préparation de phosphore jaune et rouge
7
Donc si je récapitule

U- Uled = 5V-3,6V = 1,4V

1,4/20 = 70ohm pour une LED bleue ou blanche.

Je me trompe?

8

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

9
Mon calcul était bon

Du coup j'ai pris au plus défavorable, je prend donc des résistances de 100ohm, 0.25w. J'ai aussi commandé le 74HC595 et les LED blanches/bleues.

Une fois que tout ce petit monde fonctionnera, il me restera à faire faire une PCB et commander des composants de qualité. (là j'ai testé avec des chinoiseries vu que c'est mon premier test avec Arduino).

T'aurais une marque de composants à me conseiller? (j'ai pu voir Bourns qui apparemment est de qualité.)
Et pour faire des PCB un site à me conseiller? (j'ai vu JLCPCB)

10
Citation de Ray-Me :
T'aurais une marque de composants à me conseiller?

Pour les bons composants, il suffit de commander chez des revendeurs sérieux (Farnell, Radiospare, Mouser, Digikey...).

Citation de Ray-Me :
Et pour faire des PCB un site à me conseiller? (j'ai vu JLCPCB)

JLCPCB est très bien. J'en suis à plus de 500 PCB chez eux et jamais eu le moindre soucis.

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

11
Attention au 74HC595, il ne peut supporter un courant maximum total de 70mA (ICC supply current ou Continuous current through VCC or GND suivant les Data Sheet).
Tu dois revoir fortement tes valeurs de résistance à la hausse pour diminuer le courant traversant les LED.
https://electroniqueamateur.blogspot.com/2014/04/etude-de-ci-registre-decalage-hc595.html
12
Merci pour vos réponses.

Pour les 70mA c’est bizarre sur tous les montages que je trouve sur le net il y a des résistances vraiment plus petites, du genres 180,220ohm. J’ai vu une fois du 320ohm.

Pour la 180ohm on est à 222mA, c’est enorme.

En regardant la datasheet en effet c’est 70mA sur le VCC. Donc il me semble bien que tu as raison puisque l’alimentation de toute les LED passe par le VCC.

[ Dernière édition du message le 09/04/2022 à 07:03:06 ]

13
Citation de Ray-Me :
Pour les 70mA c’est bizarre sur tous les montages que je trouve sur le net il y a des résistances vraiment plus petites, du genres 180,220ohm. J’ai vu une fois du 320ohm.

La valeur de 70 mA n'est pas bizarre, elle est spécifiée par le fabricant. Les valeurs adoptées par les bidouilleurs (terme non péjoratif) sont choisies soit après calcul (qu'on suppose correct), soit au pif, soit selon le degré de luminosité souhaité (qui n'est pas forcément toujours le maximum).
Pour ma part, j'utilise désormais exclusivement des LED "haute luminosité" (minimum 500 mcd), lesquelles se contentent d'une intensité de courant de 1 mA (parfois même 0,1 mA) pour éclairer correctement. Une résistance série de 2k7 à 27k pour mes LED (domaine "indicateurs" visuels et non éclairage) fait parfois sursauter les non-habitués, j'assume. En tout cas, moins de soucis d'alim quand on a des dizaines de LED à piloter.

Citation de Ray-Me :
Pour la 180ohm on est à 222mA, c’est enorme.

Je ne sais pas sur quelle base de calcul tu es parti, mais pour 5 V et LED rouge 1V6 / 20 mA, on a 18-19 mA pour chacune, soit 150 mA pour 8 LED allumées simultanément. Ce qui bien sûr est toujours trop.

Citation de Ray-Me :
En regardant la datasheet en effet c’est 70mA sur le VCC. Donc il me semble bien que tu as raison puisque l’alimentation de toute les LED passe par le VCC.

Il a raison ;)

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

14
Citation :
Je ne sais pas sur quelle base de calcul tu es parti.

Pour l'exemple à 180ohm, I =U/R mais il était 6h19 du matin ;). j'ai pris 5v/180ohm x8

Donc si je récapitule, pour la valeur que je dois prendre en résistance pour 8 LED blanches ou bleues

R=U/I = 1,4/0,02 = 70, que je multiplie par 8 pour 8 LED?

donc je dois mettre une résistance de 560ohm par LED?

[ Dernière édition du message le 09/04/2022 à 13:44:21 ]

15
Citation de Ray-Me :
Donc si je récapitule, pour la valeur que je dois prendre en résistance pour 8 LED blanches ou bleues
R=U/I = 1,4/0,02 = 70, que je multiplie par 8 pour 8 LED?
donc je dois mettre une résistance de 560ohm par LED?

Non. La valeur que tu calcules ici est pour 1 seule LED.

Mais attention, ton calcul se base sur 20 mA par LED, soit 160 mA pour les 8 LED.
Relis ce qui a été écrit avant par ahaa concernant le courant max pour le circuit intégré 74595...

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

16
8,75mA par LED, les LED bleues ou blanches ont une chute de tension de 3.0 à 3.6V (je vais prendre au plus défavorable = 3.0)

On se retrouve donc avec : 2/0.00875 = 228,6ohm.

J'ai des résistances de 220ohm à la maison, ça devrait faire l'affaire, la dernière LED ne sera quasi jamais allumée. Je changerai plus tard avec des 232 qui sont celles les plus proches au dessus de 228.


Merci pour ta patience :facepalm:

[ Dernière édition du message le 09/04/2022 à 18:49:08 ]

17
Petit retour

les 220ohm on l'air de suffire. mais je peux me permettre de mettre des plus grosses, vu que comme toi c'est du retour visuel, pas besoin que ça éclair fort, et ça sera plus safe.

J'arrive donc à faire fonctionner les LED avec le 74HC595 avec un code trouvé sur le net. Mais impossible de l'adapter pour moi. C'est vraiment trop complexe. Si vous pouviez me donner des petits conseils ça serait cool.

j'ai trouvé un librairie à force de fouiller partout (qui s'appelle Control Surface), où j'ai pu lire :

NoteValueLED : Listens for a single note and saves its velocity value, but also displays the current value using an LED: on if velocity is above a configurable threshold, off if below threshold.

aussi on peut récupérer la valeur de la vélocité avec getValue()

Donc il faudrait que le ladino lise ce qui arrive en MIDI avec NoteValueLED, récupère la vélocité avec getValue, et allume les LED en fonction. du genre si vélocité <= a 50 alors j'allume les led sur les pin 10,11,12.

Mais alors pour le mettre en code, je fouille, j'arrive pas à comprendre.

[ Dernière édition du message le 10/04/2022 à 18:41:22 ]

18
J’ai fini par prendre un strip NeoPixels. Ça fonctionne nickel avec ce code

Citation :
int velocity;

#include <MIDIUSB.h>
#include <Adafruit_NeoPixel.h>

// Which pin on the Arduino is connected to the NeoPixels?
#define PIN 6 // pin sortie WS2812

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 8 // Popular NeoPixel strip

// When setting up the NeoPixel library, we tell it how many pixels,
// and which pin to use to send signals. Note that for older NeoPixel
// strips you might need to change the third parameter -- see the
// strandtest example for more information on possible values.
Adafruit_NeoPixel strip(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

uint32_t offColor = strip.Color(0, 0, 0); //
uint32_t greenColor = strip.Color(0, 255, 0);
uint32_t whiteColor = strip.Color(255, 255, 255);
uint32_t redColor = strip.Color(255, 0, 0);
uint32_t blueColor = strip.Color(0, 128, 253);


byte ng;
byte oct;
const char* pitch_name(byte pitch) {
static const char* names[] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
return names[pitch % 12];
}

int pitch_octave(byte pitch) {
return (pitch / 12) - 1;
}

void controlChange(byte channel, byte control, byte value) {
Serial.print("Control change: control=");
Serial.print(control);
Serial.print(", value=");
Serial.print(value);
Serial.print(", channel=");
Serial.println(channel);
}

void setup() {
Serial.begin(115200);
strip.begin();
strip.clear();
}

void loop() {


noPixels();
midiEventPacket_t rx = MidiUSB.read();
switch (rx.header) {
case 0:
break; //No pending events

case 0x9:
noteOn(
rx.byte1 & 0xF, //channel
rx.byte2, //pitch
rx.byte3 //velocity


);
velocity = rx.byte3;
break;

case 0x8:
noteOff(
rx.byte1 & 0xF, //channel
rx.byte2, //pitch
rx.byte3 //velocity

);
velocity = 0;
break;

case 0xB:
controlChange(
rx.byte1 & 0xF, //channel
rx.byte2, //control
rx.byte3 //value
);
break;

default:
Serial.print("Unhandled MIDI message: ");
Serial.print(rx.header, HEX);
Serial.print("-");
Serial.print(rx.byte1, HEX);
Serial.print("-");
Serial.print(rx.byte2, HEX);
Serial.print("-");
Serial.println(rx.byte3, HEX);
}



//strip.noPixels();
if (value < 1) {
// pixels.setPixelColor(0, whiteColor);
strip.setPixelColor(0, offColor);
}
if (value >= 1) {
// pixels.setPixelColor(0, whiteColor);
strip.setPixelColor(0, whiteColor);
}
if (value >= 2) {
// pixels.setPixelColor(1, whiteColor);
strip.setPixelColor(1, whiteColor);
}
if (value >= 3) {
// pixels.setPixelColor(2, whiteColor);
strip.setPixelColor(2, whiteColor);
}
if (value >= 4) {
// pixels.setPixelColor(3, whiteColor);
strip.setPixelColor(3, whiteColor);
}
if (value >= 5) {
// pixels.setPixelColor(4, whiteColor);
strip.setPixelColor(4, whiteColor);
}
if (value >= 6) {
// pixels.setPixelColor(5, whiteColor);
strip.setPixelColor(5, whiteColor);
}
if (value >= 7) {
strip.setPixelColor(6, whiteColor);
}
if (value = 8) {
strip.setPixelColor(7, blueColor);

}

strip.show();

}




void noPixels()
{
for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, offColor);
}
strip.show();
}


Par contre je rencontre un soucis, le programme ne fait pas de différence entre les notes midi, il les lit toute. Du coup le strip s’allume que ce soit la deck 1, 2 qui joue, ou que ce soit le bouton sync enclenché. Des qu’un événement midi intervient, le strip s’allume.

J’arrive pas à trouver comment faire, vous avez une idée ?

19
Bonjour,

il faut que tu définisses les conditions pour lesquelles telle ou telle LED doit s'allumer.
Pour cela, regardes de près cette partie de ton code :

Citation :
case 0x9:
noteOn(
rx.byte1 & 0xF, //channel
rx.byte2, //pitch
rx.byte3 //velocity


Le numéro de canal MIDI est contenu dans les 4 bits de poids faible du premier octet de rx, dans [rx.byte1 and $0F] (valeur comprise entre 0 et 15).
La hauteur de la note (pitch) est contenue dans le second octet de rx, dans [rx.byte2 and $7F] (valeur comprise entre 0 et 127).
La valeur de vélocité quant à elle est contenue dans le troisième octet de rx, dans [rx.byte3 and $7F] (valeur comprise entre 0 et 127).

A toi de décider quelles sont les valeurs reçue dans l'évènement MIDI NoteOn qui doivent mener à une action.

Par exemple, le code suivant fait allumer la LED #1 si la hauteur de la note est < Do3 et fait allumer la LED #2 si la hauteur de la note est > Do3 :

if (rx.byte2 < 63) {
// pixels.setPixelColor(1, whiteColor);
strip.setPixelColor(1, whiteColor);
}
if (rx.byte2 >= 63) {
// pixels.setPixelColor(2, whiteColor);
strip.setPixelColor(2, whiteColor);
}

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

20
Super Merci pour ces infos. J'arrive donc à mettre une condition en plus de la vélocité la compile passe

Citation :
if (rx.byte1 = 15 & velocity < 1) {
// pixels.setPixelColor(0, greenColor);
strip.setPixelColor(0, offColor);


Cependant ça ne fonctionne pas. J'ai tenté de me mettre sur différentes channel MIDI (le 16 et le 13) et les led s'allument quand même. Moi ce que je voudrais c'est que les LED s'allument uniquement quand la note A0 du channel 16 est jouée.

J'ai aussi tenté de mettre avec deux & comme ceci :

Citation :
if (rx.byte1 = 15 && velocity < 1) {
// pixels.setPixelColor(0, greenColor);
strip.setPixelColor(0, offColor);


Mais pareil ça change rien.

[ Dernière édition du message le 25/04/2022 à 08:40:18 ]

21
Bonjour,

essaie ceci :

if (rx.byte1 = 15) & (rx.byte 2 = 21) & (velocity < 1) 

A noter que

(velocity < 1)
(velocité = 0)

ne peut que correspondre à un évènement NoteOff.
Mais c'est peut-être ce que tu veux...

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

22
En effet c'est la ligne de la NoteOff
J'ai pris ça comme exemple parce que c'était la premiere ligne, mais après j'ai (velocity > 30) par exemple.

Sinon la compile passe pas comme tu l'as écrit.

Citation :
/Users/remybertrand/Documents/Arduino/NeoPixel_Vu/NeoPixel_Vu.ino:159:40: error: invalid operands of types 'uint8_t* {aka unsigned char*}' and 'bool' to binary 'operator&'
if (rx.byte1 = 15) & (rx.byte2 = 21) & (velocity > 30) {


J'ai ça comme erreur.

23
& est un operateur artihmetique, c'est le "et" binaire : 8 & 4 = 0
&& est l’opérateur logique : 8 && 4 = <pas zero>

Attention : "a = b" c'est a prend la valeur de b, et (a = b) peut valoir a peu près n'importe quoi, sans garantie (a, ou zero, ou 1, autre chose). On écrit normalement pas ce genre de chose.
"a == b" c'est un test qui vaut 0 si a n'a pas la même valeur que b, <pas zero> sinon.

La precedence des operateurs "if", "&" ... etc dans ton exemple fait que le code ne veut rien dire (heureusement il n'est pas non plus correct).

suggestion :
Citation :

if ((rx.byte1 == 15) && (rx.byte2 == 21) && (velocity > 30)) {



J'ai aussi rajoute des parenthèses, ça ne mange pas de pain.

[ Dernière édition du message le 25/04/2022 à 15:20:34 ]

24
Merci Zorks pour tes corrections.
Cela m'apprendra à donner un exemple dans un langage que je ne maîtrise pas, même si l'idée était là. :bravo:

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

25
Ça ne marche pas :(

les LED ne s'allument meme plus.
J'ai tenté "rx.byte2 == 21", les LED s'allument comme avant, c'est comme si j'avais rien mis.

J'arrive vraiment pas à comprendre comment limiter l'allumage des LED à Channel 16 note A0

Voilà ce que j'ai en entré de l'arduino pour être sûr que je me plante pas.
1jck.png

[ Dernière édition du message le 25/04/2022 à 21:11:46 ]