Vumètre MIDI Arduino
- 27 réponses
- 5 participants
- 878 vues
- 7 followers
Ray-Me
4687
Squatteur·euse d’AF
Membre depuis 18 ans
Sujet de la discussion Posté le 04/04/2022 à 19:17:28Vumè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
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
ahaa
290
Posteur·euse AFfamé·e
Membre depuis 7 ans
11 Posté le 09/04/2022 à 00:23:55
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
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
4687
Squatteur·euse d’AF
Membre depuis 18 ans
12 Posté le 09/04/2022 à 06:19:59
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.
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)
14208
Modérateur·trice thématique
Membre depuis 22 ans
13 Posté le 09/04/2022 à 07:24:11
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
Ray-Me
4687
Squatteur·euse d’AF
Membre depuis 18 ans
14 Posté le 09/04/2022 à 13:35:20
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 ]
Rémy M. (chimimic)
14208
Modérateur·trice thématique
Membre depuis 22 ans
15 Posté le 09/04/2022 à 13:57:37
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
Ray-Me
4687
Squatteur·euse d’AF
Membre depuis 18 ans
16 Posté le 09/04/2022 à 18:48:28
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
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
4687
Squatteur·euse d’AF
Membre depuis 18 ans
17 Posté le 10/04/2022 à 18:38:56
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.
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
4687
Squatteur·euse d’AF
Membre depuis 18 ans
18 Posté le 23/04/2022 à 22:45:38
J’ai fini par prendre un strip NeoPixels. Ça fonctionne nickel avec ce code
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 ?
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 ?
Rémy M. (chimimic)
14208
Modérateur·trice thématique
Membre depuis 22 ans
19 Posté le 24/04/2022 à 10:50:31
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 :
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);
}
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
Ray-Me
4687
Squatteur·euse d’AF
Membre depuis 18 ans
20 Posté le 25/04/2022 à 08:24:31
Super Merci pour ces infos. J'arrive donc à mettre une condition en plus de la vélocité la compile passe
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 :
Mais pareil ça change rien.
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 ]
- < Liste des sujets
- Charte