Pages: [1]   Go Down
Author Topic: Arduino Uno R3 + Modulo EasyVR + Libreria MIDI  (Read 609 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti, sono nuovo del forum e spero di aver postato nella sezione giusta! Mi presento, mi chiamo Angelo e sto lavorando ad un progetto in cui si auspica di controllare dispositivi MIDI tramite comandi vocali. Per fare ciò (come da titolo) mi sono munito di EasyVR e libreria MIDI: il problema è sorto quando ho tentato di far funzionare tutto insieme... Mi spiego meglio perché capisco che detto così non si capisce molto. Per addestrarmi all'uso di questi dispositivi ho creato due sketch, uno per il controllo vocale ed uno per il controllo MIDI. I due software presi separatamente funzionano benissimo: i comandi vocali vanno che è una bellezza così come i comandi MIDI forniti da Arduino al Controller. Quando, però, unisco i due software insieme in modo che a comando vocale corrisponde uno specifico comando MIDI succede l'impossibile: il controller sembra posseduto da un poltergeist (scherzi a parte comincia a muoversi in maniera irregolare, alza e abbassa i fader, manda in play il sequencer, taglia le tracce a suo piacimento... sembra a tutti gli effetti un MIDI-PANIC ma non permette il MIDI-Reset). L'unico modo per bloccare tutto è scollegare arduino, chiudere l'IDE, chiudere in maniera forzata il sequenze e (finalmente) posso spegnere il controller. Se dopo tutto questo trambusto rimonto tutto ed utilizzo o solo i comandi vocali o solo i comandi MIDI tutto funziona perfettamente come se nulla fossa accaduto.

Prima di postarvi il codice voglio darvi una lista dell'hardware e del software utilizzato:
-Arduino Uno R3
-EasyVR Shield
-Arduino IDE 1.0.2
-Scheda audio M-Audio Profire 610
-Controller Behringer BCF2000
-Cavo convertitore MIDI-USB
-Sequencer Logic Pro
-MacBook Pro

Il sistema è così assemblato: arduino manda fuori messaggi MIDI con una porta midi assemblata (alimentazione 5V con resistore 220 Ohm dal MIDI-pin 4 al pin 5V, GND dal MIDI-pin 2 al pin GND, flusso dati dal MIDI-pin 5 al pin TX) verso la porta MIDI-IN della scheda audio. Dalla porta MIDI-OUT della scheda audio entro nella porta MIDI-IN del Behringer e dalla porta MIDI-OUT del Behringer esco con il cavo MIDI-USB ed entro nel portatile. In questo modo qualsiasi comando MIDI generato da Arduino passa per il Behringer e si ripercuote sul Logic Pro! Questo è il normale funzionamento!

Di seguito il codice:
Code:

#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
  #include "SoftwareSerial.h"
  SoftwareSerial port(12,13);
#else // Arduino 0022 - use modified NewSoftSerial
  #include "WProgram.h"
  #include "NewSoftSerial.h"
  NewSoftSerial port(12,13);
#endif

#include "MIDI.h"
#include "EasyVR.h"

EasyVR easyvr(port);
EasyVRBridge bridge;

uint32_t mask = 0;
int8_t group = 0;
uint8_t train = 0;
char name[32];


void setup()
{
  // bridge mode?
  if (bridge.check())
  {
    cli();
    bridge.loop(0, 1, 12, 13);
  }

  Serial.begin(9600);
  port.begin(9600);
  
  if (!easyvr.detect())
  {
    Serial.println("EasyVR not detected!");
    for (;;);
  }
  
  easyvr.setPinOutput(EasyVR::IO1, LOW);
  Serial.println("EasyVR detected!");
  easyvr.setTimeout(31);
  easyvr.setLanguage(EasyVR::ITALIAN);
  
  MIDI.begin();//Launch MIDI with default options
}

void loop()
{
  int idx_cmd;  //variabile indicante l'indice numerico del comando
  int idx_grp=3;  //variabile indicante l'indice del gruppo
  
  easyvr.setPinOutput(EasyVR::IO1,HIGH); //LED ON (Ascolto ON)
  
  Serial.println("Inizia l'ascolto ");
  
  easyvr.recognizeCommand(idx_grp); //questo comando riceve il numero del gruppo ed effettua il controllo in quel gruppo
  while (!easyvr.hasFinished()); //aspetta che un comando venga fornito
  
  easyvr.setPinOutput(EasyVR::IO1,LOW); //LED OFF (Ascolto OFF)
  
  idx_cmd = easyvr.getCommand(); //immagazzina l'indice del comando trovato nella variabile precedentemente istanziata
  
  switch (idx_cmd) {
    
    case 0:
    {
      int cmd_grp_uno;
      
      do
      {
        easyvr.setPinOutput(EasyVR::IO1,HIGH); //LED ON (Ascolto ON)
        Serial.println("Inizia l'ascolto per il gruppo 1:");
        easyvr.recognizeCommand(1); //questo comando riceve il numero del gruppo ed effettua il controllo in quel gruppo
        while (!easyvr.hasFinished()); //aspetta che un comando venga fornito
        easyvr.setPinOutput(EasyVR::IO1,LOW); //LED OFF (Ascolto OFF)
  
        cmd_grp_uno = easyvr.getCommand();
      
        switch (cmd_grp_uno){
          
          case 0:
          {
            Serial.println("Hai selezionato il canale uno!");
            MIDI.sendNoteOn(24,127,1);
            break;
          }
          
          case 1:
          {
            Serial.println("Hai selezionato il canale due!");
            MIDI.sendNoteOn(25,127,1);
            break;
          }
          
          case 2:
          {
            Serial.println("Hai selezionato il canale tre!");
            MIDI.sendNoteOn(26,127,1);
            break;
          }
          
          case 3:
          {
            Serial.println("Hai selzionato il canale quattro!");
            MIDI.sendNoteOn(27,127,1);
            break;
          }
        }  
      }
      while (cmd_grp_uno != 4);
      break;
    }
    
    case 1:
    {
      int cmd_grp_due;
      
      do
      {
        easyvr.setPinOutput(EasyVR::IO1,HIGH); //LED ON (Ascolto ON)
        Serial.println("Inizia l'ascolto per il gruppo 2:");
        easyvr.recognizeCommand(2); //questo comando riceve il numero del gruppo ed effettua il controllo in quel gruppo
        while (!easyvr.hasFinished()); //aspetta che un comando venga fornito
        easyvr.setPinOutput(EasyVR::IO1,LOW); //LED OFF (Ascolto OFF)
  
        cmd_grp_due = easyvr.getCommand();
      
        switch (cmd_grp_due){
          
          case 0:
          {
            Serial.println("Hai selezionato il canale cinque!");
            MIDI.sendNoteOn(28,127,1);
            break;
          }
          
          case 1:
          {
            Serial.println("Hai selezionato il canale sei!");
            MIDI.sendNoteOn(29,127,1);
            break;
          }
          
          case 2:
          {
            Serial.println("Hai selezionato il canale sette!");
            MIDI.sendNoteOn(30,127,1);
            break;
          }
          
          case 3:
          {
            Serial.println("Hai selezionato il canale otto!");
            MIDI.sendNoteOn(31,127,1);
            break;
          }
        }  
      }
      while (cmd_grp_due != 4);
      break;
    }
    
    default:
    {
      Serial.println("Ritenta!!!");
      break;
    }
 }
}

a questo punto ho due perplessità:
- Possibile conflitto di BaudRate: MIDI va a 31250 mentre EasyVR a 9600 (con possibilità di diversi settaggi). Ho provato a forzare il MIDI su un   Baud diverso ma il controller a quel punto non riesce a ricevere più i comandi (come giusto che sia!!)
- Dal momento che EasyVR Shield in modalità Adapter (jumper SW sulla schedina) comunica con arduino tramite i pin 12 e 13 non è che il problema sia dovuto al fatto che continuo a collegare la porta midi sul pin TX?? In questo caso qualcuno mi illumina come faccio a far passare il flusso dati dal pin TX al pin 13?? (credo che il 13 corrisponda all'out)

Credo di aver detto tutto se necessitate di altri dettagli chiedete pure!

Spero possiate aiutarmi a risolvere questo problema!!

Grazie a tutti!!
    
Logged

Pages: [1]   Go Up
Jump to: