Sujet DIY MIDI CONTROLLER USB Plug & Play (UPGRADE NEOPIXEL RING)
- 13 réponses
- 7 participants
- 4 382 vues
- 13 followers
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
Sujet de la discussion Posté le 07/03/2019 à 14:52:38DIY MIDI CONTROLLER USB Plug & Play (UPGRADE NEOPIXEL RING)
DIY MIDI CONTROLLER Usb Plug & Play
C'est avec plaisir que je me permets de partager avec vous une petite interface que j'ai réaliser
grâce a l'inspiration et à l'aide,entre autre, de membre de la communautée
https://fr.audiofanzine.com/les-mains-dans-le-cambouis/forums/t.684547,diy-midi-usb-controleur-project-arduino-uno-besoin-d-aide,post.9866350.html
Un projet qui me trotter dans la tête depuis un moment déjà
Surtout depuis que j'ai vu l'interface de Mr Stephan Bodzin et ces performances en Live
Je l'ai trouvé très ergonomique
C'est certes pour l'instant qu'un sorte de prototype élaboré ,si je puis dire, et qui fera l'objet de pas mal de modification au fil du temps ( code et interface )
Liste du Matériel :
1 x Microcontrôleur Arduino UNO R3 ATmega328P ATMEGA16U2
2 x Button Pad 2x2 LED Compatible https://coolcomponents.co.uk/products/button-pad-2x2-led-compatible
2 x Button Pad 2x2 Breakout PCB https://coolcomponents.co.uk/products/button-pad-2x2-breakout-pcb
8 x LED Yellow 5mm https://coolcomponents.co.uk/products/led-yellow-5mm
2 x Tête de bouton RN-99A https://www.conrad.fr/p/tete-de-bouton-rotatif-sci-rn-99a64mm-noir-blanc-x-h-45-mm-x-203-mm-1-pcs-1304026
2 x Tête de bouton RN-99C https://www.conrad.fr/p/tete-de-bouton-rotatif-sci-rn-99c64mm-noir-blanc-x-h-33-mm-x-16-mm-1-pcs-1304027
2 x Tête de bouton RN-99E https://www.conrad.fr/p/tete-de-bouton-rotatif-sci-rn-99e64mm-noir-blanc-x-h-229-mm-x-127-mm-1-pcs-1304029
6 x Potentiomètre 10Kohm Alpha M7 https://www.conrad.fr/p/potentiometre-rotatif-10-k-lineaire-potentiometer-service-9305-mono-02-w-1-pcs-450034
8 x Résistance carbone 220R https://www.conrad.fr/p/resistance-a-couche-carbone-405175-220-sortie-axiale-0411-05-w-1-pcs-405175
8 x Résistance 10 KR https://www.conrad.fr/p/resistance-a-couche-carbone-yageo-cfr25j10kh-10-k-sortie-axiale-0207-025-w-1-pcs-1417697
8 x Diode 1N4148TA https://www.conrad.fr/p/diode-standard-on-semiconductor-1n4148ta-do-204ah-100-v-200-ma-1-pcs-1262769
1 x Cable USB 2,0 Haute Vitesse C A vers B 15 cm
1 x USB 2.0 type B femelle vers USB 2.0 type A femelle Cliff
https://www.conrad.fr/p/adaptateur-usb-20-type-b-femelle-vers-usb-20-type-a-femelle-cliff-cp30207nmb-1-pcs-1419593
Pour la boite j'ai découpé des Morceaux de Plexiglass de 5 mm collés avec un colle Pattex Tous Materiaux transparente
http://www.pattex.fr/Pattex/produits-pattex/one-for-all/one-for-all-crystal.html
Ainsi qu'une Plaque d'aluminium de 2 mm d’épaisseur
Le plus ennuyant a été de réaliser des trous carrés ( Perceuse et lime ) mais vu le coté très tendre de la matière
cela n'est pas très difficile
Le mieux étant de faire faire la plaque par un professionnel avec une découpe laser (ceci fera l'objet d'un prochain prototype)
Schéma de Câblage :
La library Midi.h a copier dans C:\Program Files (x86)\Arduino\libraries"
https://sourceforge.net/projects/arduinomidilib/
Le code
J'ai laissé les résistances Push Pull car j'ignorai que cette fonction pouvait se réaliser via le code
Un foi le code inséré il faut insérer un firmware modifié avec le logiciel FLIP
Pour flasher le ARDUINO afin qu’il soit reconnu comme interface Midi Plug & Play en USB
Vous trouverez le nécessaire pour effectuer cette opération su le site : https://dartmobo.com/midi-over-usb/
Le seul inconvénient est qu'il faille flasher le microcontrôleur pour pouvoir effectuer une modification du code
Le contrôleur et ses fonctions on été testé sur le DAW Bitwig
C'est avec plaisir que je me permets de partager avec vous une petite interface que j'ai réaliser
grâce a l'inspiration et à l'aide,entre autre, de membre de la communautée
https://fr.audiofanzine.com/les-mains-dans-le-cambouis/forums/t.684547,diy-midi-usb-controleur-project-arduino-uno-besoin-d-aide,post.9866350.html
Un projet qui me trotter dans la tête depuis un moment déjà
Surtout depuis que j'ai vu l'interface de Mr Stephan Bodzin et ces performances en Live
Je l'ai trouvé très ergonomique
C'est certes pour l'instant qu'un sorte de prototype élaboré ,si je puis dire, et qui fera l'objet de pas mal de modification au fil du temps ( code et interface )
Liste du Matériel :
1 x Microcontrôleur Arduino UNO R3 ATmega328P ATMEGA16U2
2 x Button Pad 2x2 LED Compatible https://coolcomponents.co.uk/products/button-pad-2x2-led-compatible
2 x Button Pad 2x2 Breakout PCB https://coolcomponents.co.uk/products/button-pad-2x2-breakout-pcb
8 x LED Yellow 5mm https://coolcomponents.co.uk/products/led-yellow-5mm
2 x Tête de bouton RN-99A https://www.conrad.fr/p/tete-de-bouton-rotatif-sci-rn-99a64mm-noir-blanc-x-h-45-mm-x-203-mm-1-pcs-1304026
2 x Tête de bouton RN-99C https://www.conrad.fr/p/tete-de-bouton-rotatif-sci-rn-99c64mm-noir-blanc-x-h-33-mm-x-16-mm-1-pcs-1304027
2 x Tête de bouton RN-99E https://www.conrad.fr/p/tete-de-bouton-rotatif-sci-rn-99e64mm-noir-blanc-x-h-229-mm-x-127-mm-1-pcs-1304029
6 x Potentiomètre 10Kohm Alpha M7 https://www.conrad.fr/p/potentiometre-rotatif-10-k-lineaire-potentiometer-service-9305-mono-02-w-1-pcs-450034
8 x Résistance carbone 220R https://www.conrad.fr/p/resistance-a-couche-carbone-405175-220-sortie-axiale-0411-05-w-1-pcs-405175
8 x Résistance 10 KR https://www.conrad.fr/p/resistance-a-couche-carbone-yageo-cfr25j10kh-10-k-sortie-axiale-0207-025-w-1-pcs-1417697
8 x Diode 1N4148TA https://www.conrad.fr/p/diode-standard-on-semiconductor-1n4148ta-do-204ah-100-v-200-ma-1-pcs-1262769
1 x Cable USB 2,0 Haute Vitesse C A vers B 15 cm
1 x USB 2.0 type B femelle vers USB 2.0 type A femelle Cliff
https://www.conrad.fr/p/adaptateur-usb-20-type-b-femelle-vers-usb-20-type-a-femelle-cliff-cp30207nmb-1-pcs-1419593
Pour la boite j'ai découpé des Morceaux de Plexiglass de 5 mm collés avec un colle Pattex Tous Materiaux transparente
http://www.pattex.fr/Pattex/produits-pattex/one-for-all/one-for-all-crystal.html
Ainsi qu'une Plaque d'aluminium de 2 mm d’épaisseur
Le plus ennuyant a été de réaliser des trous carrés ( Perceuse et lime ) mais vu le coté très tendre de la matière
cela n'est pas très difficile
Le mieux étant de faire faire la plaque par un professionnel avec une découpe laser (ceci fera l'objet d'un prochain prototype)
Schéma de Câblage :
La library Midi.h a copier dans C:\Program Files (x86)\Arduino\libraries"
https://sourceforge.net/projects/arduinomidilib/
Le code
#include <MIDI.h> // INlcude MIDI library
int mem[] = { 0, 0, 0, 0, 0, 0, 0 ,0};
void setup()
{
Serial.begin(9600); // default midi speed rate
// initialize the LED pin as an output:
pinMode(2, INPUT_PULLUP); // initialize the pushbutton pin as an input:
pinMode(3, INPUT_PULLUP);
pinMode(4,INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6,INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
MIDI.begin();
}
static int iAn0Val, iAn1Val, iAn2Val, iAn3Val, iAn4Val, iAn5Val;
void loop()
{
{
int sensorVal[] =
{
!digitalRead(2), !digitalRead(3),
!digitalRead(4), !digitalRead(5),
!digitalRead(6), !digitalRead(7),
!digitalRead(8), !digitalRead(9),
};
for (int j = 0; j < 8; j++)
{
if (sensorVal [j] != mem [j])
{
mem [j] = sensorVal [j];
if (mem[j])
{
MIDI.sendNoteOn(j + 48, 64, 1);
}
else
{
MIDI.sendNoteOff(j + 48, 64, 1);
}
}
}
}
//Pot 01
static int iAn0ValPrev;
iAn0ValPrev = 0 ;
iAn0ValPrev = iAn0Val ; // previous value
iAn0Val = analogRead(A0); // Divide by 8 to get range of 0-127 for midi
if (abs (iAn0Val - iAn0ValPrev)>3)
analogPinMidiTX(1,iAn0Val,iAn0ValPrev); //TX value
delay(10);
//Pot 02
static int iAn1ValPrev;
iAn1ValPrev = 0 ;
iAn1ValPrev = iAn1Val;
iAn1Val = analogRead(A1);
if (abs (iAn1Val - iAn1ValPrev)>3)
analogPinMidiTX(2,iAn1Val,iAn1ValPrev);
delay(10);
//Pot 03
static int iAn2ValPrev;
iAn2ValPrev = 0 ;
iAn2ValPrev = iAn2Val;
iAn2Val = analogRead(A2);
if (abs (iAn2Val - iAn2ValPrev)>3)
analogPinMidiTX(3,iAn2Val,iAn2ValPrev);
delay(10);
//Pot 04
static int iAn3ValPrev;
iAn3ValPrev = 0;
iAn3ValPrev = iAn3Val;
iAn3Val = analogRead(A3);
if (abs (iAn3Val - iAn3ValPrev)>3)
analogPinMidiTX(4,iAn3Val,iAn3ValPrev);
delay(10);
//Pot 05
static int iAn4ValPrev;
iAn4ValPrev = 0 ;
iAn4ValPrev = iAn4Val;
iAn4Val = analogRead(A4);
if (abs (iAn4Val - iAn4ValPrev)>3)
analogPinMidiTX(5,iAn4Val,iAn4ValPrev);
delay(10);
//Pot 06
static int iAn5ValPrev;
iAn5ValPrev = 0;
iAn5ValPrev = iAn5Val;
iAn5Val = analogRead(A5);
if (abs (iAn5Val - iAn5ValPrev)>3)
analogPinMidiTX(6,iAn5Val,iAn5ValPrev);
delay(10); //here we add a short delay to help prevent slight fluctuations, knocks on the pots etc. Adding this helped to prevent my pots from jumpin up or down a value when slightly touched or knocked.
}
void analogPinMidiTX(int iChan, int iVal, int iValPrev)
{
// TX Value only if it has changed
if(iValPrev != iVal)
{
iValPrev != iVal ;
iVal = iVal >> 3 ;
MidiTX(176,iChan,iVal); // 176 = CC command, 1 = Which Control, val = value read from Potentionmeter
}
}
void MidiTX(unsigned char MESSAGE, unsigned char CONTROL, unsigned char VALUE) //Valeur en Midi Command
{
Serial.write(MESSAGE);
Serial.write(CONTROL);
Serial.write(VALUE);
}
J'ai laissé les résistances Push Pull car j'ignorai que cette fonction pouvait se réaliser via le code
Un foi le code inséré il faut insérer un firmware modifié avec le logiciel FLIP
Pour flasher le ARDUINO afin qu’il soit reconnu comme interface Midi Plug & Play en USB
Vous trouverez le nécessaire pour effectuer cette opération su le site : https://dartmobo.com/midi-over-usb/
Le seul inconvénient est qu'il faille flasher le microcontrôleur pour pouvoir effectuer une modification du code
Le contrôleur et ses fonctions on été testé sur le DAW Bitwig
[ Dernière édition du message le 29/09/2019 à 20:23:03 ]
- 1
- 2
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
2 Posté le 29/09/2019 à 20:21:13
L'idée de cet upgrade était de faire fonctionner des cercles de led en fonction de la position des potentiomètres
Mais aussi d’amélioré la conception de la boite
La boite est réalisé cette fois ci avec des morceaux de plexiglas de 8mm plus pratique pour le perçage et le vissage et il faut l'avouer ça a bien plus de gueule
Pour éviter de me pencher sur le multiplexage pour l'instant je me suis tourné vers un ARDUINO 2650
Le nombre d'entrées et de sorties étant suffisantes
Un petit schéma de principe
Le projet en 3D
La plaque en Aluminum (découpage LASER pas a la lime
Les pieces en impression 3D (PLA)
1- Le Support des NEOPIXELS
2- La plaque transparente
LE CODE
J'ai repris la programmation en C depuis peu donc désolé pour la longueur du code en un seul bloc
car il serait interressant d'integrer les sous programmes comme des bibliotheques
PROJET FINI
PRESENTATION ET TEST
https://youtu.be/c_BEFl-kEec
Mais aussi d’amélioré la conception de la boite
La boite est réalisé cette fois ci avec des morceaux de plexiglas de 8mm plus pratique pour le perçage et le vissage et il faut l'avouer ça a bien plus de gueule
Pour éviter de me pencher sur le multiplexage pour l'instant je me suis tourné vers un ARDUINO 2650
Le nombre d'entrées et de sorties étant suffisantes
Un petit schéma de principe
Le projet en 3D
La plaque en Aluminum (découpage LASER pas a la lime
Les pieces en impression 3D (PLA)
1- Le Support des NEOPIXELS
2- La plaque transparente
LE CODE
J'ai repris la programmation en C depuis peu donc désolé pour la longueur du code en un seul bloc
car il serait interressant d'integrer les sous programmes comme des bibliotheques
// Read analog potentiometer on Circuit Playground Express or other board with changes
#include <MIDI.h> // INlcude MIDI library
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
// Which pin on the microcontroller board is connected to the NeoPixels?
#define PIN8 8// 12 For Circuit Playground Express
#define PIN9 9 // 12
#define PIN10 10 //24
#define PIN11 11 // 16
#define PIN12 12
#define PIN13 13
// How many NeoPixels are attached to the board?
#define NUMPIXELS 24
#define NUMPIXELS2 24
#define NUMPIXELS3 16
#define NUMPIXELS4 16
#define NUMPIXELS5 12
#define NUMPIXELS6 12
// When we setup 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 pixels = Adafruit_NeoPixel(NUMPIXELS, PIN8, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(NUMPIXELS2, PIN9, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels3 = Adafruit_NeoPixel(NUMPIXELS3, PIN10, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels4 = Adafruit_NeoPixel(NUMPIXELS4, PIN11, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels5 = Adafruit_NeoPixel(NUMPIXELS5, PIN12, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels6 = Adafruit_NeoPixel(NUMPIXELS6, PIN13, NEO_GRB + NEO_KHZ800);
int delayval = 10; // delay for half a second
int brightness = 10;
int delayval2= 10; // delay for half a second
int brightness2 = 10;
int delayval3 = 10; // delay for half a second
int brightness3 = 10;
int delayval4 = 10; // delay for half a second
int brightness4 = 10;
int delayval5 = 10; // delay for half a second
int brightness5 = 10;
int delayval6 = 10; // delay for half a second
int brightness6 = 10;
const int buttonPin = 42 ;
const int buttonPin2 = 38 ;
const int buttonPin3 = 44 ;
const int buttonPin4 = 40 ;
const int buttonPin5 = 43 ;
const int buttonPin6 = 45 ;
const int buttonPin7 = 41 ;
const int buttonPin8 = 39 ;
const int buttonPin9= 52 ;
const int buttonPin10 = 46 ;
const int buttonPin11 = 48 ;
const int buttonPin12 = 50 ;
int buttonState = 0;
int lastButtonState = 0;
int toggleState = 0;
int buttonState2 = 0;
int lastButtonState2 = 0;
int toggleState2 = 0;
int buttonState3= 0;
int lastButtonState3 = 0;
int toggleState3 = 0;
int buttonState4 = 0;
int lastButtonState4 = 0;
int toggleState4 = 0;
int buttonState5 = 0;
int lastButtonState5 = 0;
int toggleState5 = 0;
int buttonState6 = 0;
int lastButtonState6 = 0;
int toggleState6 = 0;
int buttonState7= 0;
int lastButtonState7 = 0;
int toggleState7 = 0;
int buttonState8 = 0;
int lastButtonState8 = 0;
int toggleState8 = 0;
int buttonState9 = 0;
int lastButtonState9 = 0;
int toggleState9 = 0;
int buttonState10 = 0;
int lastButtonState10 = 0;
int toggleState10 = 0;
int buttonState11= 0;
int lastButtonState11 = 0;
int toggleState11 = 0;
int buttonState12 = 0;
int lastButtonState12 = 0;
int toggleState12 = 0;
// the number of the pushbutton pin
const int ledPin = 24; // the number of the LED pin
const int ledPin2 = 27;
const int ledPin3 = 26; // the number of the LED pin
const int ledPin4 = 25;
const int ledPin5 = 28; // the number of the LED pin
const int ledPin6 = 30;
const int ledPin7 = 29; // the number of the LED pin
const int ledPin8 = 31;
const int ledPin9 = 33; // the number of the LED pin
const int ledPin10 = 34;
const int ledPin11 = 32; // the number of the LED pin
const int ledPin12 = 35;
static int iAn0Val;
static int iAn1Val;
static int iAn2Val;
static int iAn3Val;
static int iAn4Val;
static int iAn5Val;
void setup()
{
Serial.begin(9600);
pinMode(39, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
pinMode(41, INPUT_PULLUP);
pinMode(ledPin2, OUTPUT);
pinMode(43, INPUT_PULLUP);
pinMode(ledPin3, OUTPUT);
pinMode(45, INPUT_PULLUP);
pinMode(ledPin4, OUTPUT);
pinMode(38, INPUT_PULLUP);
pinMode(ledPin5, OUTPUT);
pinMode(40, INPUT_PULLUP);
pinMode(ledPin6, OUTPUT);
pinMode(42, INPUT_PULLUP);
pinMode(ledPin7, OUTPUT);
pinMode(44, INPUT_PULLUP);
pinMode(ledPin8, OUTPUT);
pinMode(46, INPUT_PULLUP);
pinMode(ledPin9, OUTPUT);
pinMode(48, INPUT_PULLUP);
pinMode(ledPin10, OUTPUT);
pinMode(50, INPUT_PULLUP);
pinMode(ledPin11, OUTPUT);
pinMode(52, INPUT_PULLUP);
pinMode(ledPin12, OUTPUT);
pixels.begin(); // This initializes the NeoPixel library.
pixels2.begin(); // This initializes the NeoPixel library.
pixels.setBrightness(brightness);
pixels2.setBrightness(brightness);
pixels3.begin(); // This initializes the NeoPixel library.
pixels4.begin(); // This initializes the NeoPixel library.
pixels3.setBrightness(brightness);
pixels4.setBrightness(brightness);
pixels5.begin(); // This initializes the NeoPixel library.
pixels5.setBrightness(brightness);
pixels6.begin(); // This initializes the NeoPixel library.
pixels6.setBrightness(brightness);
MIDI.begin();
}
void loop()
{
affiche () ;
ring1();
ring2();
ring3();
ring4();
ring5();
ring6();
button();
}
void affiche ()
{
static int iAn0ValPrev;
iAn0ValPrev = 0 ;
iAn0ValPrev = iAn0Val ; // previous value
iAn0Val = analogRead(A0); // Divide by 8 to get range of 0-127 for midi
if (abs (iAn0Val - iAn0ValPrev)>3)
analogPinMidiTX(1,iAn0Val,iAn0ValPrev); //TX value
pixels.show(); // This sends the updated pixel color to the hardware.
digitalWrite(8,HIGH);
delay(1); // petit délai pour l'oeil
pixels.show(); // This sends the updated pixel color to the hardware.
digitalWrite(8,LOW);
static int iAn1ValPrev;
iAn1ValPrev = 0 ;
iAn1ValPrev = iAn1Val;
iAn1Val = analogRead(A1);
if (abs (iAn1Val - iAn1ValPrev)>3)
analogPinMidiTX(2,iAn1Val,iAn1ValPrev);
pixels2.show(); // This sends the updated pixel color to the hardware.
digitalWrite(9,HIGH);
delay(1); // petit délai pour l'oeil
pixels2.show(); // This sends the updated pixel color to the hardware.
digitalWrite(9,LOW);
static int iAn2ValPrev;
iAn2ValPrev = 0 ;
iAn2ValPrev = iAn2Val;
iAn2Val = analogRead(A2);
if (abs (iAn2Val - iAn2ValPrev)>3)
analogPinMidiTX(3,iAn2Val,iAn2ValPrev);
//delay(5);
pixels3.show(); // This sends the updated pixel color to the hardware.
digitalWrite(10,LOW);
delay(1); // petit délai pour l'oeil
pixels3.show(); // This sends the updated pixel color to the hardware.
digitalWrite(10,HIGH);
static int iAn3ValPrev;
iAn3ValPrev = 0 ;
iAn3ValPrev = iAn3Val;
iAn3Val = analogRead(A3);
if (abs (iAn3Val - iAn3ValPrev)>3)
analogPinMidiTX(4,iAn3Val,iAn3ValPrev);
pixels4.show(); // This sends the updated pixel color to the hardware.
digitalWrite(11,LOW);
delay(1); // petit délai pour l'oeil
pixels4.show(); // This sends the updated pixel color to the hardware.
digitalWrite(11,HIGH);
static int iAn4ValPrev;
iAn4ValPrev = 0 ;
iAn4ValPrev = iAn4Val;
iAn4Val = analogRead(A4);
if (abs (iAn4Val - iAn4ValPrev)>3)
analogPinMidiTX(5,iAn4Val,iAn4ValPrev);
pixels5.show(); // This sends the updated pixel color to the hardware.
digitalWrite(12,HIGH);
delay(1); // petit délai pour l'oeil
pixels5.show(); // This sends the updated pixel color to the hardware.
digitalWrite(12,LOW);
static int iAn5ValPrev;
iAn5ValPrev = 0 ;
iAn5ValPrev = iAn5Val;
iAn5Val = analogRead(A5);
if (abs (iAn5Val - iAn5ValPrev)>3)
analogPinMidiTX(6,iAn5Val,iAn5ValPrev);
pixels6.show(); // This sends the updated pixel color to the hardware.
digitalWrite(13,HIGH);
delay(1); // petit délai pour l'oeil
pixels6.show(); // This sends the updated pixel color to the hardware.
digitalWrite(13,LOW);
}
void button ()
{
{// PAD 1
buttonState = digitalRead(buttonPin);
if(buttonState != lastButtonState && buttonState == 1 && toggleState == 0) {
digitalWrite(ledPin,HIGH);
MIDI.sendControlChange(51, 127, 1);
toggleState = 1;}
else if(buttonState != lastButtonState && buttonState == 1 && toggleState == 1) {
digitalWrite(ledPin, LOW);
MIDI.sendControlChange(51,0, 1);
toggleState = 0; }
lastButtonState = buttonState; }
{
buttonState2 = digitalRead(buttonPin2);
if(buttonState2 != lastButtonState2 && buttonState2 == 1 && toggleState2 == 0) {
digitalWrite(ledPin2,HIGH);
MIDI.sendControlChange(52, 127, 1);
toggleState2 = 1; }
else if(buttonState2 != lastButtonState2 && buttonState2 == 1 && toggleState2 == 1) {
digitalWrite(ledPin2, LOW);
MIDI.sendControlChange(52,0, 1);
toggleState2 = 0; }
lastButtonState2 = buttonState2; }
{
buttonState3 = digitalRead(buttonPin3);
if(buttonState3 != lastButtonState3 && buttonState3 == 1 && toggleState3 == 0) {
digitalWrite(ledPin3,HIGH);
MIDI.sendControlChange(53, 127, 1);
toggleState3 = 1; }
else if(buttonState3 != lastButtonState3 && buttonState3 == 1 && toggleState3 == 1) {
digitalWrite(ledPin3, LOW);
MIDI.sendControlChange(53,0, 1);
toggleState3 = 0; }
lastButtonState3 = buttonState3; }
{
buttonState4 = digitalRead(buttonPin4);
if(buttonState4 != lastButtonState4 && buttonState4 == 1 && toggleState4 == 0) {
digitalWrite(ledPin4,HIGH);
MIDI.sendControlChange(54, 127, 1);
toggleState4 = 1; }
else if(buttonState4 != lastButtonState4 && buttonState4 == 1 && toggleState4 == 1) {
digitalWrite(ledPin4, LOW);
MIDI.sendControlChange(54,0, 1);
toggleState4 = 0; }
lastButtonState4 = buttonState4 ; }
{//PAD 2
buttonState5 = digitalRead(buttonPin5);
if(buttonState5 != lastButtonState5 && buttonState5 == 1 && toggleState5 == 0) {
digitalWrite(ledPin5,HIGH);
MIDI.sendControlChange(55, 127, 1);
toggleState5 = 1; }
else if(buttonState5 != lastButtonState5 && buttonState5 == 1 && toggleState5 == 1) {
digitalWrite(ledPin5, LOW);
MIDI.sendControlChange(55,0, 1);
toggleState5 = 0; }
lastButtonState5 = buttonState5; }
{
buttonState6 = digitalRead(buttonPin6);
if(buttonState6 != lastButtonState6 && buttonState6 == 1 && toggleState6 == 0) {
digitalWrite(ledPin6,HIGH);
MIDI.sendControlChange(56, 127, 1);
toggleState6 = 1; }
else if(buttonState6 != lastButtonState6 && buttonState6 == 1 && toggleState6 == 1) {
digitalWrite(ledPin6, LOW);
MIDI.sendControlChange(56,0, 1);
toggleState6 = 0; }
lastButtonState6 = buttonState6; }
{
buttonState7 = digitalRead(buttonPin7);
if(buttonState7 != lastButtonState7 && buttonState7 == 1 && toggleState7 == 0) {
digitalWrite(ledPin7,HIGH);
MIDI.sendControlChange(57, 127, 1);
toggleState7 = 1; }
else if(buttonState7 != lastButtonState7 && buttonState7 == 1 && toggleState7 == 1) {
digitalWrite(ledPin7, LOW);
MIDI.sendControlChange(57,0, 1);
toggleState7 = 0; }
lastButtonState7 = buttonState7; }
{
buttonState8 = digitalRead(buttonPin8);
if(buttonState8 != lastButtonState8 && buttonState8 == 1 && toggleState8 == 0) {
digitalWrite(ledPin8,HIGH);
MIDI.sendControlChange(58, 127, 1);
toggleState8 = 1; }
else if(buttonState8 != lastButtonState8 && buttonState8 == 1 && toggleState8 == 1) {
digitalWrite(ledPin8, LOW);
MIDI.sendControlChange(58,0, 1);
toggleState8 = 0; }
lastButtonState8 = buttonState8 ; }
{//PAD 3
buttonState9 = digitalRead(buttonPin9);
if(buttonState9 != lastButtonState9 && buttonState9 == 1 && toggleState9 == 0) {
digitalWrite(ledPin9,HIGH);
MIDI.sendControlChange(59, 127, 1);
toggleState9 = 1; }
else if(buttonState9 != lastButtonState9 && buttonState9 == 1 && toggleState9 == 1) {
digitalWrite(ledPin9, LOW);
MIDI.sendControlChange(59,0, 1);
toggleState9 = 0; }
lastButtonState9 = buttonState9; }
{
buttonState10 = digitalRead(buttonPin10);
if(buttonState10 != lastButtonState10 && buttonState10 == 1 && toggleState10 == 0) {
digitalWrite(ledPin10,HIGH);
MIDI.sendControlChange(60, 127, 1);
toggleState10 = 1; }
else if(buttonState10 != lastButtonState10 && buttonState10 == 1 && toggleState10 == 1) {
digitalWrite(ledPin10, LOW);
MIDI.sendControlChange(60,0, 1);
toggleState10 = 0; }
lastButtonState10 = buttonState10; }
{
buttonState11 = digitalRead(buttonPin11);
if(buttonState11 != lastButtonState11 && buttonState11 == 1 && toggleState11 == 0) {
digitalWrite(ledPin11,HIGH);
MIDI.sendControlChange(60, 127, 1);
toggleState11 = 1; }
else if(buttonState11 != lastButtonState11 && buttonState11 == 1 && toggleState11 == 1) {
digitalWrite(ledPin11, LOW);
MIDI.sendControlChange(60,0, 1);
toggleState11 = 0; }
lastButtonState11 = buttonState11; }
{
buttonState12 = digitalRead(buttonPin12);
if(buttonState12 != lastButtonState12 && buttonState12 == 1 && toggleState12 == 0) {
digitalWrite(ledPin12,HIGH);
MIDI.sendControlChange(61, 127, 1);
toggleState12 = 1; }
else if(buttonState12 != lastButtonState12 && buttonState12 == 1 && toggleState12 == 1) {
digitalWrite(ledPin12, LOW);
MIDI.sendControlChange(61,0, 1);
toggleState12 = 0; }
lastButtonState12 = buttonState12 ; }
}
void ring1 ()
{
int i; // loop variable
static int value ; // analog read of potentiometer
int display_value; // number of NeoPixels to display out of NUMPIXELS
value = analogRead(A0 );
display_value = int( value * NUMPIXELS / 1024);// Read PIN value and scale from 0 to NUMPIXELS -1
// number of NeoPixels to display out of NUMPIXELS
// For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one
for(int i=0;i<NUMPIXELS;i++)
{
if(i<7 or i==NUMPIXELS-1)
{
pixels.setPixelColor(i, 050, 050, 050); //blanc
}
}
for(int i=0;i<NUMPIXELS;i++)
{
if(i>=7 or i==NUMPIXELS-1)
{
pixels.setPixelColor(i, 255, 255, 000); // jaune
}
}
for(int i=0;i<NUMPIXELS;i++)
{
if(i>=15 or i==NUMPIXELS-1)
{
pixels.setPixelColor(i, 255, 000, 000); //rouge
}
}
for(i=display_value; i<NUMPIXELS; i++)
{
pixels.setPixelColor(i, 0, 0, 0);
}
value = map(value, 0, 1023, 15 , 50); //sets brightRead to a value between 1 and 100
if (brightness != value)
{ // only update brightness if changed
brightness = value ;
pixels.setBrightness(brightness);
}
delay(delayval); // Delay for a period of time (in milliseconds).
}
void ring2 ()
{
int i;
static int value2;
int display_value2;
value2 = analogRead(A1);
display_value2 = int(value2 * NUMPIXELS2 / 1023);
for(int i=0;i<NUMPIXELS2;i++)
{
if(i<7 or i==NUMPIXELS2-1)
{
pixels2.setPixelColor(i, 050, 050, 050); //blanc
}
}
for(int i=0;i<NUMPIXELS2;i++)
{
if(i>=7 or i==NUMPIXELS2-1)
{
pixels2.setPixelColor(i, 255, 255, 000); // jaune
}
}
for(int i=0;i<NUMPIXELS2;i++)
{
if(i>=15 or i==NUMPIXELS2-1)
{
pixels2.setPixelColor(i, 255, 000, 000); //rouge
}
}
for(i=display_value2; i<NUMPIXELS2; i++)
{
pixels2.setPixelColor(i, 0, 0, 0);
}
value2 = map(value2, 0, 1023, 1, 50);
if (brightness2 != value2)
{
brightness2 = value2;
pixels2.setBrightness(brightness2);
}
delay(delayval2);
}
void ring3 ()
{
int i; // loop variable
static int value3; // analog read of potentiometer
int display_value3; // number of NeoPixels to display out of NUMPIXELS
value3 = analogRead(A2);
display_value3 = int(value3 * NUMPIXELS3/ 1023);
int MaxPixelID = NUMPIXELS3;
int MinValue3 =min(abs(MaxPixelID-display_value3),MaxPixelID);
for(int i=0;i<NUMPIXELS3;i++)
{ //turn all off
pixels3.setPixelColor(i,0,0,0);
}
if(display_value3>=0)
{
for(int i=16; i>= MinValue3;i--)
{
pixels3.setPixelColor(i, 050,050,050);
}
}
for(int i=10; i>= MinValue3;i--)
{
pixels3.setPixelColor(i, 255,255,000);
}
for(int i=5; i>= MinValue3;i--)
{
pixels3.setPixelColor(i, 255,000,000);
}
value3 = map(value3, 0, 1023, 1, 50);
if (brightness3 != value3)
{
brightness3 = value3;
pixels3.setBrightness(brightness3);
}
delay(delayval3);
}
void ring4 ()
{
int i;
static int value4;
int display_value4;
value4 = analogRead(A3);
display_value4 = int(value4 * NUMPIXELS4 / 1023);
int MaxPixelID1 = NUMPIXELS4;
int MinValue4 =min(abs(MaxPixelID1-display_value4),MaxPixelID1);
for(int i=0;i<NUMPIXELS4;i++)
{ //turn all off
pixels4.setPixelColor(i,0,0,0);
}
if(display_value4>=0)
{
for(int i=16; i>= MinValue4;i--)
{
pixels4.setPixelColor(i, 050,050,050);
}
}
for(int i=10; i>= MinValue4;i--)
{
pixels4.setPixelColor(i, 255,255,000);
}
for(int i=5; i>= MinValue4;i--)
{
pixels4.setPixelColor(i, 255,000,000);
}
value4 = map(value4, 0,1023, 1, 50);
if (brightness4 != value4)
{
brightness4 = value4;
pixels4.setBrightness(brightness4);
}
delay(delayval4);
}
void ring5 ()
{
int i; // loop variable
static int value5; // analog read of potentiometer
int display_value5; // number of NeoPixels to display out of NUMPIXELS
value5 = analogRead(A4);
display_value5 = int(value5 * NUMPIXELS5 / 1023);
for(int i=0;i<NUMPIXELS5;i++)
{
if(i<4 or i==NUMPIXELS5-1)
{
pixels5.setPixelColor(i, 050, 050, 050); //blanc
}
}
for(int i=0;i<NUMPIXELS5;i++)
{
if(i>=4 or i==NUMPIXELS5-1)
{
pixels5.setPixelColor(i, 255, 255, 000); // jaune
}
}
for(int i=0;i<NUMPIXELS5;i++)
{
if(i>=7 or i==NUMPIXELS5-1)
{
pixels5.setPixelColor(i, 255, 000, 000); //rouge
}
}
for(i=display_value5; i<NUMPIXELS5; i++)
{
pixels5.setPixelColor(i, 0, 0, 0);
}
value5 = map(value5, 0, 1023, 1, 50);
if (brightness5 != value5)
{
brightness5 = value5;
pixels5.setBrightness(brightness5);
}
delay(delayval5);
}
void ring6 ()
{
int i; // loop variable
static int value6; // analog read of potentiometer
int display_value6; // number of NeoPixels to display out of NUMPIXELS
value6 = analogRead(A5);
display_value6 = int(value6 * NUMPIXELS6 / 1023);
for(int i=0;i<NUMPIXELS6;i++)
{
if(i<4 or i==NUMPIXELS6-1)
{
pixels6.setPixelColor(i, 050, 050, 050); //blanc
}
}
for(int i=0;i<NUMPIXELS6;i++)
{
if(i>=4 or i==NUMPIXELS6-1)
{
pixels6.setPixelColor(i, 255, 255, 000); // jaune
}
}
for(int i=0;i<NUMPIXELS6;i++)
{
if(i>=7 or i==NUMPIXELS6-1)
{
pixels6.setPixelColor(i, 255, 000, 000); //rouge
}
}
for(i=display_value6; i<NUMPIXELS6; i++)
{
pixels6.setPixelColor(i, 0, 0, 0);
}
value6 = map(value6, 0, 1023, 1, 50);
if (brightness6 != value6)
{
brightness6 = value6;
pixels6.setBrightness(brightness6);
}
delay(delayval6);
}
void analogPinMidiTX(int iChan, int iVal, int iValPrev)
{
if(iValPrev != iVal) // TX Value only if it has changed
iValPrev != iVal ;
iVal = iVal >> 3 ;
MidiTX(176,iChan,iVal); // 176 = CC command, 1 = Which Control, val = value read from Potentionmeter
}
void MidiTX(unsigned char MESSAGE, unsigned char CONTROL, unsigned char VALUE) //Valeur en Midi Command
{
Serial.write(MESSAGE);
Serial.write(CONTROL);
Serial.write(VALUE);
}
PROJET FINI
PRESENTATION ET TEST
https://youtu.be/c_BEFl-kEec
Rémy M. (chimimic)
14193
Modérateur·trice thématique
Membre depuis 22 ans
3 Posté le 30/09/2019 à 17:58:00
Bravo pour tout cela !
Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com
Chris Kazvon
17116
Drogué·e à l’AFéine
Membre depuis 13 ans
4 Posté le 06/10/2019 à 15:57:51
C'est beau !!!!!
Chris Kazvon
-------------------------------------------------
Introduction à Hornresp et Tutoriels - Tutoriels Vidéo pour Room EQ Wizard
Anonyme
1096
5 Posté le 07/10/2019 à 15:09:14
Salut.
Ca fait plaisir de voir que les informations recueillies ici t'ont été utiles, c'est du sacré boulot tout ça.
Petits question curieuse, tu alimentes avec quoi? j'ai commencé à manipuler les neopixels récemment et ça consomme encore plus que ce que j'imaginais:
Apparement pour les néopixels tu as 2x12 + 2x 16 + 2x24 qu'on multiplie par 3 (chaque composant comprend 3 leds RGB) = 312 leds.
Chaque Led consommant à 20mA (je surdimensionne volontairement la valeur de 18mA annoncée par le fabricant) ça nous donne donc 6,240 Ampères rien que pour les rings, sincèrement ça fait beaucoup. C'est un point auquel tu as fait attention?
Question subsidiaire: où as tu fait découper ton aluminium au laser? Toutes les boutiques que je connais se cantonnent aux papiers, plastiques ou autres PMMA.
Ca fait plaisir de voir que les informations recueillies ici t'ont été utiles, c'est du sacré boulot tout ça.
Petits question curieuse, tu alimentes avec quoi? j'ai commencé à manipuler les neopixels récemment et ça consomme encore plus que ce que j'imaginais:
Apparement pour les néopixels tu as 2x12 + 2x 16 + 2x24 qu'on multiplie par 3 (chaque composant comprend 3 leds RGB) = 312 leds.
Chaque Led consommant à 20mA (je surdimensionne volontairement la valeur de 18mA annoncée par le fabricant) ça nous donne donc 6,240 Ampères rien que pour les rings, sincèrement ça fait beaucoup. C'est un point auquel tu as fait attention?
Question subsidiaire: où as tu fait découper ton aluminium au laser? Toutes les boutiques que je connais se cantonnent aux papiers, plastiques ou autres PMMA.
[ Dernière édition du message le 07/10/2019 à 15:12:29 ]
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
6 Posté le 15/10/2019 à 15:37:58
Salut
Oui très utiles même Big Thanks
King C pour l'alimentation j'utilise un alimentation 5v 4A
https://www.amazon.fr/gp/product/B07PM41CNR/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1
D’après cette article https://wiki.mchobby.be/index.php?title=NeoPixel-UserGuide-Alimenter
60ma par led en luminosité maximale mais sachant que toutes les leds ne sont pas allumees en permanence
au maximum
Je suis a 50% de la luminosité,Je fais une variation de 10 a 50%
A 100% c'est simplement impossible de regarder le cercle
Sans l'alimentation externe et sans que l’Arduino s'emballe et en utilisant l'astuce de la persistance rétinienne sur chaque cercle de led ça fonctionnait à 10%
Mais je suis d'accord sur le fait que j'aurai voir ça à l'ampèremètre lors des tests
Je n'avais pas en fait idée que ça consommé autant pour des led j'entends
Concernant la plaque je l'ai fait découpé dans une boite qui s'appelle Icome inox a Toulon
Ils font du bon boulot
Je suis en train de regarder maintenant pour réaliser un step sequencer c'est pas la même histoire car il y a une grosse partie de programmation et d'autre composants numérique (registre à décalage)
Je me base sur ça https://www.instructables.com/id/Sugarcube-MIDI-Controller/
J'ai réussi à faire fonctionné la matrice led / button (1 button = 1 led = 1 note Midi)
Mais lorsque j'implante le programme complet comme c'est expliqué dans le tutoriel il n'y a rien qui se passe
Oui très utiles même Big Thanks
King C pour l'alimentation j'utilise un alimentation 5v 4A
https://www.amazon.fr/gp/product/B07PM41CNR/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1
D’après cette article https://wiki.mchobby.be/index.php?title=NeoPixel-UserGuide-Alimenter
60ma par led en luminosité maximale mais sachant que toutes les leds ne sont pas allumees en permanence
au maximum
Je suis a 50% de la luminosité,Je fais une variation de 10 a 50%
A 100% c'est simplement impossible de regarder le cercle
Sans l'alimentation externe et sans que l’Arduino s'emballe et en utilisant l'astuce de la persistance rétinienne sur chaque cercle de led ça fonctionnait à 10%
Mais je suis d'accord sur le fait que j'aurai voir ça à l'ampèremètre lors des tests
Je n'avais pas en fait idée que ça consommé autant pour des led j'entends
Concernant la plaque je l'ai fait découpé dans une boite qui s'appelle Icome inox a Toulon
Ils font du bon boulot
Je suis en train de regarder maintenant pour réaliser un step sequencer c'est pas la même histoire car il y a une grosse partie de programmation et d'autre composants numérique (registre à décalage)
Je me base sur ça https://www.instructables.com/id/Sugarcube-MIDI-Controller/
J'ai réussi à faire fonctionné la matrice led / button (1 button = 1 led = 1 note Midi)
Mais lorsque j'implante le programme complet comme c'est expliqué dans le tutoriel il n'y a rien qui se passe
[ Dernière édition du message le 15/10/2019 à 16:21:41 ]
Anonyme
1096
7 Posté le 15/10/2019 à 16:55:36
Citation de Mat :
Big Thanks
You' re welcome.
Citation de Mat :
Je suis en train de regarder maintenant pour réaliser un step sequencer c'est pas la même histoire car il y a une grosse partie de programmation et d'autre composants numérique (registre à décalage)
Ce sont des choses que j'ai également testé, j'ai bien aimé manipuler les "Shift Register", c'est formateur. Par contre il me semble quand même que tu peux t'en passer:
- Si tu utilises des néopixels alors tu n'as besoin que d'un unique I/O pour commander 16 leds
- pour les switchs tu peux matricer l'ensemble. Tu dois pouvoir checker 16 switches avec 8 I/O (voir 20 switchs avec 9I/O). C'est quelque chose qui ressemble au schéma suivant, tu peux te passer de résistance (grâce à à la fonction INPUT_PULLUP). C'est un sujet à creuser il y a aussi une astuce avec des diodes dans certain cas.
Ici un exemple qui comporte une forme de step séquencer:
https://www.youtube.com/watch?v=UO5aa68ijFg
Dans ce cas j'ai utilisé une Due qui comporte énormément d'IO, donc pas la peine de s'embêter avec les registres à décalage. Ma seule vraie connerie sur ce circuit concerne l'alimentation des LEDs bicolores: elles sont alimentées directement depuis les pins de la Due (limitées à 15ma je crois).
Je suis passé sur ESP32 récemment et un step séquencer à touches capacitives/néopixels fait justement partie de mes envies. C'est un sujet que je pourrais détailler si ça t'intéresse, je précise: si ça t'intéresse vraiment, je concevrais que l'ESP32 te fasse un peu peur.
https://fr.audiofanzine.com/les-mains-dans-le-cambouis/forums/t.697829,microcontroleurs-passage-de-l-arduino-a-l-esp32-vos-experiences-avis.html
Par rapport à Icome inox, c'est typiquement le genre de choses qui serait cool de voir apparaître ici:
https://fr.audiofanzine.com/les-mains-dans-le-cambouis/forums/t.698500,le-coin-des-bricoleurs-fabrication-electronique-diy-les-bons-plans-les-bonnes-adresses.html
Et encore bravo pour ton boulot!
[ Dernière édition du message le 15/10/2019 à 17:27:52 ]
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
8 Posté le 19/10/2019 à 23:41:03
Je vais fabriquer un sugarcube avec Sparkfun 4x4 pour l'instant
https://www.instructables.com/id/Sugarcube-MIDI-Controller/
Mais son code est très dur pour moi a exploiter je souhaiterai exploiter uniquement la partie sequenceur
Son programme semble appeler un programme qui en appelle un autre qui en appelle un autre qui en appelle un autre....
Et puis il n'y a pas de boucle
En passant Ça c'est de la séquence
https://youtu.be/OfFyvh_BGN8?t=24
WHAT A SCROLL !
a plus petite échelle bien sur pour sroller sur les notes avec gros rotary
L'Arc Diy doit pas être mal également en utilisant des neopixels
https://johannesneumann.net/index.php?page=arc
https://www.instructables.com/id/Sugarcube-MIDI-Controller/
Mais son code est très dur pour moi a exploiter je souhaiterai exploiter uniquement la partie sequenceur
Son programme semble appeler un programme qui en appelle un autre qui en appelle un autre qui en appelle un autre....
Et puis il n'y a pas de boucle
En passant Ça c'est de la séquence
https://youtu.be/OfFyvh_BGN8?t=24
WHAT A SCROLL !
a plus petite échelle bien sur pour sroller sur les notes avec gros rotary
L'Arc Diy doit pas être mal également en utilisant des neopixels
https://johannesneumann.net/index.php?page=arc
[ Dernière édition du message le 22/10/2019 à 17:48:07 ]
Mat Martigan
105
Posteur·euse AFfiné·e
Membre depuis 12 ans
9 Posté le 19/10/2019 à 23:43:09
Concernant L'EPS32 je suivrais l'histoire
xavierbzh
1637
AFicionado·a
Membre depuis 19 ans
10 Posté le 03/06/2020 à 22:23:45
Je me suis fait un contrôleur plus basique :
https://fr.audiofanzine.com/les-mains-dans-le-cambouis/forums/t.713340,diy-midi-controller-joystick-2-molettes,post.10345430.html
Par contre, c'est pénible pour trouver des infos pour la programmation des NeoPixel.
Xavier
https://fr.audiofanzine.com/les-mains-dans-le-cambouis/forums/t.713340,diy-midi-controller-joystick-2-molettes,post.10345430.html
Par contre, c'est pénible pour trouver des infos pour la programmation des NeoPixel.
Xavier
- < Liste des sujets
- Charte
- 1
- 2