Vumètre MIDI Arduino
- 27 réponses
- 5 participants
- 1 030 vues
- 7 followers

Ray-Me

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
- 1
- 2

Rémy M. (chimimic)

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

Ray-Me

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 ?

Rémy M. (chimimic)

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.
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

Ray-Me

Est-ce que ça pourrait fonctionner ça?
Sinon je regarde les LED si jamais je dois le monter de toute piece, avec un 74HC595. Le montage est pas sorcier. Après faut voir pour le code.
Je trouve des LED en 3v mais très peu en 5v. Je dois prendre du DC 5V c'est bien ça?
[ Dernière édition du message le 06/04/2022 à 16:37:01 ]

michel.29

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

Ray-Me


Rémy M. (chimimic)

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

Ray-Me

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)

Rémy M. (chimimic)

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...).
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

ahaa

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

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.
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 ]

Rémy M. (chimimic)

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.
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.
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

Ray-Me

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

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 ]

Rémy M. (chimimic)

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

Ray-Me

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

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

Ray-Me

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 ]

Ray-Me

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 ?

Rémy M. (chimimic)

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 :
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

Ray-Me

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 :
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 ]

Rémy M. (chimimic)

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

Ray-Me

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.
/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.

Zorks

&& 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 :
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 ]

Rémy M. (chimimic)

Cela m'apprendra à donner un exemple dans un langage que je ne maîtrise pas, même si l'idée était là.

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

Ray-Me


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.

[ Dernière édition du message le 25/04/2022 à 21:11:46 ]
- < Liste des sujets
- Charte
- 1
- 2