Se connecter
Se connecter

ou
Créer un compte

ou

Sujet DIY MIDI CONTROLLER USB Plug & Play (UPGRADE NEOPIXEL RING)

  • 13 réponses
  • 7 participants
  • 4 278 vues
  • 13 followers
1 DIY 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 :aime:
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)

les-mains-dans-le-cambouis-2552962.jpg
les-mains-dans-le-cambouis-2552963.jpg
les-mains-dans-le-cambouis-2552964.jpg

Schéma de Câblage :

les-mains-dans-le-cambouis-2552965.jpg

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

les-mains-dans-le-cambouis-2553112.jpg
les-mains-dans-le-cambouis-2553113.jpg
les-mains-dans-le-cambouis-2553114.jpg
les-mains-dans-le-cambouis-2553115.jpg
les-mains-dans-le-cambouis-2553116.jpg



[ Dernière édition du message le 29/09/2019 à 20:23:03 ]

2
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
les-mains-dans-le-cambouis-2749750.jpg

Le projet en 3D
les-mains-dans-le-cambouis-2749725.jpg
les-mains-dans-le-cambouis-2749726.jpg
les-mains-dans-le-cambouis-2749727.jpg
les-mains-dans-le-cambouis-2749728.jpg

La plaque en Aluminum (découpage LASER :aime: pas a la lime :mdr:
les-mains-dans-le-cambouis-2749722.jpg
les-mains-dans-le-cambouis-2749723.jpg
les-mains-dans-le-cambouis-2749724.jpg

Les pieces en impression 3D (PLA)
1- Le Support des NEOPIXELS
les-mains-dans-le-cambouis-2749729.jpg
les-mains-dans-le-cambouis-2749730.png
2- La plaque transparente
les-mains-dans-le-cambouis-2749731.png

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

les-mains-dans-le-cambouis-2749752.jpg
les-mains-dans-le-cambouis-2749755.jpg
les-mains-dans-le-cambouis-2749751.jpg

PRESENTATION ET TEST

https://youtu.be/c_BEFl-kEec
3
Bravo pour tout cela ! :bravo:

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

4
C'est beau !!!!! :)

Chris Kazvon

-------------------------------------------------

Introduction à Hornresp et Tutoriels  -  Tutoriels Vidéo pour Room EQ Wizard

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


[ Dernière édition du message le 07/10/2019 à 15:12:29 ]

6
Salut

Oui très utiles même Big Thanks :bravo:

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

les-mains-dans-le-cambouis-2766544.jpg

[ Dernière édition du message le 15/10/2019 à 16:21:41 ]

7
Citation de Mat :
Big Thanks :bravo:


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.
4x4-Keypad-Schematic.png


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

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 ]

8
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

[ Dernière édition du message le 22/10/2019 à 17:48:07 ]

9
Concernant L'EPS32 je suivrais l'histoire ;)
10
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