MIDI controller IN OUT Arduino UNO

Buongiorno a tutti,
mi sto affacciando al mondo midi con arduino. Ho acquistato tutti i pezzi e mi sono letto valanghe di tutorial in merito, ho scorso almeno 50 pagine in questo forum cercando risposte ai problemi che sto incontrando.

Sto cercando di fare un pedale per chitarra che svolga varie funzioni a partire da midi in e midi out basici.

Il problema è che seppur cablando i circuiti basilari di MIDI in & out (anche separatamente) non riesco ne a ricevere ne a trasmettere segnali. Ho alcune pagine di riferimento a cui mi sono rifatto prendendo schemi e sketch già pronti all'uso ma niente... Il problema sussiste.

Partiamo da qui:

MIDI OUT - da questo sito Notes and Volts: MIDI for the Arduino - Build a MIDI Output Circuit
ho preso schema e sketch, eseguo esattamente le istruzioni ma non riesco a spedire nessun messaggio..
Allego foto cablaggio e riporto lo sketch:

#include <MIDI.h>

#define LED 13

MIDI_CREATE_DEFAULT_INSTANCE();

void setup()
{
  pinMode(LED, OUTPUT);
  MIDI.begin(10);
}

void loop()
{
  digitalWrite(LED, HIGH);
  MIDI.sendNoteOn(67, 127, 10);
  delay(1000);		       
  MIDI.sendNoteOff(67, 0, 10);
  digitalWrite(LED, LOW);
  delay(1000);
}

molto semplice.. il dubbio è che non riesca a caricare la libreria midi. Io sono andato su Sketch -> #include libreria -> Aggiungi libreria da fille Zip e gli ho dato il file a questo indirizzo

Dopodiché ho semplicemente caricato il file .INO su Arduino Uno tramite CARICA su Arduino IDE (v.1.8.8). Devo fare nient'altro? O devo caricare anche la libreria su arduino? A quanto ho capito è automatico giusto?

Ho provato molti cablaggi, anche diversi che girano su internet, ma nessuno unito a questo sketch invia messaggi.
Il led TX si accende e anche il led 13 si accende ma non arrivano ai dispositivi (in questo caso una batteria elettronica con pad settati su canale 10 e note 67).

Sapreste aiutarmi?

Grazie in anticipo!

stefano

stecciu:
il dubbio è che non riesca a caricare la libreria midi.

Se quando fai Carica ti compila il programma, la libreria l'ha trovata. Se non trovasse la libreria ti darebbe errore la compilazione. Quindi la prima domanda è: ma ti compila correttamente e fa l'upload su Arduino con esito positivo? Devi vedere il riquadro che compare quando compili, eventualmente fai qui copia/incolla.

Il led TX si accende e anche il led 13 si accende ma non arrivano ai dispositivi (in questo caso una batteria elettronica con pad settati su canale 10 e note 67).

Beh non ho mai usato quela libreria, ma nella MIDI.begin() io non metterei 10 come canale IN (magari la libreria lo interpreta come "suo" e non lo manda in uscita) ma magari metti 1 o lascialo vuoto (default è 1) tanto non hai MIDI IN. Quindi dato che Arduino ha il MIDI OUT assicurati di aver collegato (col solito cavo standard MIDI a 5 poli) il MIDI IN del pad, e per me deve funzionare.

Ciao grazie intanto per l'aiuto!
In realtà il pedale avrà anche il MIDI in (che come il midi out non funziona..).
Arduino IDE compila correttamente e non mi da errori. Per verificare il corretto caricamento avevo impostato anche un led in PWM che va a impulsi e funziona correttamente.
Per quanto riguarda il MIDI.begin ho provato con 1 con MIDI_CHANNEL_OMNI e con MIDI_CHANNEL_OFF senza esiti positivi.
Non riesco proprio a capire..

Beh allora è curioso, ma un paio di cose che avrai già verificato ma giusto per conferma.
Primo, sei sicuro che hai collegato la porta MIDI OUT di Arduino a MIDI IN del pad? E che il pad abbia la porta correttamente attiva (ossia se mandi l'evento da un'altra periferica MIDI seriale, suona)? E che il cavo sia buono (ossia collegato ad altra periferica, funziona)?

Poi tu quando fai la prova STACCHI il connettore USB da Arduino? Non vorrei che con la USB collegata ci possano essere conflitti visto che di fatto va anche lì... Quindi: fai Carica, poi stacchi il cavo USB, colleghi il cavo MIDI al drum pad, accendi Arduino con un alimentatore o una pila 9V, e fammi sapere.

Se poi nel weekend riesco ad avere tempo e trovo a casa un connettore MIDI faccio una prova anche io e vediamo...

Primo, sei sicuro che hai collegato la porta MIDI OUT di Arduino a MIDI IN del pad? E che il pad abbia la porta correttamente attiva (ossia se mandi l'evento da un'altra periferica MIDI seriale, suona)? E che il cavo sia buono (ossia collegato ad altra periferica, funziona)?

eh.. purtroppo si sono sicuro, ho provato sia più cavi (ne ho 3 tutti e 3 nuovi) sia attaccando altre periferiche midi (e funziona).

Poi tu quando fai la prova STACCHI il connettore USB da Arduino? Non vorrei che con la USB collegata ci possano essere conflitti visto che di fatto va anche lì... Quindi: fai Carica, poi stacchi il cavo USB, colleghi il cavo MIDI al drum pad, accendi Arduino con un alimentatore o una pila 9V, e fammi sapere.

Ho provato adesso questo ma niente, però posso dirti che con alimentazione USB vedo il led TX accendersi e spegnersi, con il 9V da alimentatore no.. Può essere indicativo?

Inoltre ho riverificato tutti i collegamenti e sono tutti ok.

Ok, ho risolto.
Avevo dei problemi con le periferiche esterne e con una resistenza sul midi out.
Allego gli schemi funzionanti per chi ci legge così da marcare come testati i circuiti.

Adesso però mi ritrovo con un piccolo problemino lato codice.

Questo pedale ha queste funzioni:

  • Riceve messaggi midi (con circuito midi in) di tipo Control Change (CC) ed aziona in base al messaggio dei pin digitali su HIGH o LOW (serve per azionare dei footswitch di un Laney IRT30)

  • Trasforma il segnale di 5 pulsanti (footswitch momentary) e di un potenziometro in segnale midi (tramite un midi out)

Vorrei aggiungere un led che di base ha un effetto pulse (solo per controllare che al pedale arrivi corrente e sia acceso). Il problema è che se inserisco la funzione del led nel loop() mi sballa tutta la catena midi, alterando tutte le funzionalità (manda dei messaggi errati ed i pulsanti e il potenziometro non funziona). Ho provato a creare una funzione e farla girare nel setup() ma il risultato è il led acceso.. stop. Non pulsa.

Sapreste aiutarmi a capire il perchè? Riporto il codice.

Intanto grazie ancora per gli aiuti.

P.s: LED1 è il led che dovrebbe pulsare, LEDCONTROLLO è il 13 su Arduino e l'ho usato per il debugging
P.s.: Controller.h è una libreria reperibile in questo tutorial
P.p.p.s.: mi piacerebbe implementare al posto del led pulse (che attualmente è un led blu) un led RGB che pulsa di blu di base e che, al ricevere di segnali midi lampeggia di rosso, all'emettere di segnali midi lampeggia di arancio. Su questo vedremo se riusciamo in un secondo momento.

#include <MIDI.h>
#include "Controller.h"

// Define labels for the AMP's pins
#define RELAY1  4  // LEAD                         
#define RELAY2  5  // CLEAN                    
#define RELAY3  6  // REVERB                     
#define RELAY4  7  // BOOST

//Define LED's pin
const int LED1 = 3;
const int LEDCONTROLLO = 13;

//Create an instance of the library with default name, serial port and settings
MIDI_CREATE_DEFAULT_INSTANCE();

// Define labels for the POT & FOOTSWITCHES's pin
byte NUMBER_BUTTONS = 1;
byte NUMBER_POTS = 1;

//Pot (Pin Number, Command, CC Control, Channel Number)
Pot PO1(A0, 0, 24, 13);
Pot *POTS[] {&PO1};

//***DEFINE DIRECTLY CONNECTED BUTTONS*******************************
//Button (Pin Number, Command, Note Number, Channel, Debounce Time)
//** Command parameter 0=NOTE  1=CC  2=Toggle CC **

Button BU1(8, 2, 25, 13, 5 );
Button BU2(9, 2, 26, 13, 5 );
Button BU3(10, 2, 27, 13, 5 );
Button BU4(11, 2, 28, 13, 5 );
Button BU5(12, 2, 29, 13, 5 );
Button *BUTTONS[] {&BU1, &BU2, &BU3, &BU4, &BU5};

void setup() {
  pinMode(RELAY1, OUTPUT); //PIN in uscita LEAD       
  pinMode(RELAY2, OUTPUT); //PIN in uscita CLEAN
  pinMode(RELAY3, OUTPUT); //PIN in uscita REVERB
  pinMode(RELAY4, OUTPUT); //PIN in uscita BOOST
  pinMode (LED1, OUTPUT); //PIN in uscita LED
  pinMode (LEDCONTROLLO, OUTPUT); //PIN in uscita LED CONTROLLO
  
  MIDI.begin(13);
  //MIDI.begin(MIDI_CHANNEL_OMNI); // Initialize the Midi Library.
  // OMNI sets it to listen to all channels.. MIDI.begin(2) would set it
  // to respond to notes on channel 2 only.
  MIDI.setHandleControlChange(MyCCFunction); // This command tells the MIDI Library
  // the function you want to call when a Continuous Controller command
  // is received. In this case it's "MyCCFunction".

  //Richiamo il lampeggio del led
  LampeggioLed();
 
}

void loop() { // Main loop
  
  if (NUMBER_BUTTONS != 0) updateButtons();
  if (NUMBER_POTS != 0) updatePots();

  MIDI.read(); // Continuously check if Midi data has been received.
  
}


//*****************FUNZIONI******************

//LAMPEGGIO LED
void LampeggioLed() {
  float in, out;
  for (in = 0; in < 6.283; in = in + 0.001)
  {
    out = sin(in) * 127.5 + 127.5;
    analogWrite(LED1,out);
  delay(1);
  }
}


// MyCCFunction is the function that will be called by the Midi Library
// when a Continuous Controller message is received.
// It will be passed bytes for Channel, Controller Number, and Value
// It checks if the controller number is within the 22 to 27 range
// If it is, light up the corresponding LED with the PWM brightness equal to the Value byte
void MyCCFunction(byte channel, byte number, byte value) {
  switch (number) {
    case 20:
      if (value > 0)
    {
      digitalWrite(RELAY1,HIGH);
    }
    else
    {
      digitalWrite(RELAY1,LOW);
    }
      break;
  case 21:
      if (value > 0)
    {
      digitalWrite(RELAY2,HIGH);
    }
    else
    {
      digitalWrite(RELAY2,LOW);
    }
      break;
  case 22:
      if (value > 0)
    {
      digitalWrite(RELAY3,HIGH);
    }
    else
    {
      digitalWrite(RELAY3,LOW);
    }
      break;
    case 23:
      if (value > 0)
    {
      digitalWrite(RELAY4,HIGH);
    }
    else
    {
      digitalWrite(RELAY4,LOW);
    }
      break;
  }
}

//**********************BUTTONS*************************
void updateButtons() {

  // Cycle through Button array
  for (int i = 0; i < NUMBER_BUTTONS; i = i + 1) {
    byte message = BUTTONS[i]->getValue();

    //  Button is pressed
    if (message == 0) {
      switch (BUTTONS[i]->Bcommand) {
        case 0: //Note
          MIDI.sendNoteOn(BUTTONS[i]->Bvalue, 127, BUTTONS[i]->Bchannel);
          break;
        case 1: //CC
          MIDI.sendControlChange(BUTTONS[i]->Bvalue, 127, BUTTONS[i]->Bchannel);
          break;
        case 2: //Toggle
          if (BUTTONS[i]->Btoggle == 0) {
            MIDI.sendControlChange(BUTTONS[i]->Bvalue, 127, BUTTONS[i]->Bchannel);
            BUTTONS[i]->Btoggle = 1;
          }
          else if (BUTTONS[i]->Btoggle == 1) {
            MIDI.sendControlChange(BUTTONS[i]->Bvalue, 0, BUTTONS[i]->Bchannel);
            BUTTONS[i]->Btoggle = 0;
          }
          break;
      }
    }

    //  Button is not pressed
    if (message == 1) {
      switch (BUTTONS[i]->Bcommand) {
        case 0:
          MIDI.sendNoteOff(BUTTONS[i]->Bvalue, 0, BUTTONS[i]->Bchannel);
          break;
        case 1:
          MIDI.sendControlChange(BUTTONS[i]->Bvalue, 0, BUTTONS[i]->Bchannel);
          break;
      }
    }
  }
}

//***********************POTS*****************************
void updatePots() {
  for (int i = 0; i < NUMBER_POTS; i = i + 1) {
    byte potmessage = POTS[i]->getValue();
    if (potmessage != 255) MIDI.sendControlChange(POTS[i]->Pcontrol, potmessage, POTS[i]->Pchannel);
  }
}

midiin.jpg

MIDI_schem.png