Messaggio midi non inviato

Salve, avrei in mente di realizzare un midicontroller a 12 pulsanti da connettere a vari multieffetti midi per basso o chitarra, in modo che alla pressione di un pulsante arduino dovrà inviare al multifx il messaggio midi corrispondente al numero della patch che a sua volta corrisponderà ad un suono ben preciso e per farla breve ho iniziato ad usare Arduino UNO + USB Host Shield con cui poi caricherò il codice adeguato. Qui il codice

#include <SPI.h>
#include <Usb.h>
#include <usbhub.h>
#include <usbh_midi.h>



USB  Usb;
USBH_MIDI  Midi(&Usb);


void setup()

{

if (Usb.Init() == -1)
{while(1);}

}

///////////////////////////////////////////////////////////////

void loop()

      {

Usb.Task();
 if( Usb.getUsbTaskState() == USB_STATE_RUNNING )

{
byte Message[2];
Message[0]=0xC0;
Message[1]=1;
Midi.SendData(Message); delay(10);
}

}

>jaz56: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice (... anche se si tratta di poche righe) dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie. :slight_smile:

Guglielmo

... emmm ... io lo avevo anche ben specificato ... dovevi EDITARE il tuo post iniziale e NON crearne uno nuovo :wink:

Guglielmo

Wow ce l'ho fatta. Adesso helpatemi

(qui il prosecco è buono )

gpb01..c'è per caso ancora qualcosa che non ho rispettato ?

Edit

adesso a casa mi sono accorto che ho dimenticato qualcosina nel codice. Lo correggo

Bho adesso funziona, anche se ho capito che qualcosa che non mi servirà posso escluderla ( vedi codice allegato).

#include <usbmidi.h>
#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE ();


Serial.begin(115200);

A proposito, visto che per collegare Arduino al multieffetto userei la porta usb dell' USB Host Shield, posso approfittare che i due pin digitali per Tx e Rx rimangono inutilizzati per mettere due led o due pulsanti o possono esserci problemi ?

jaz56:
gpb01..c'è per caso ancora qualcosa che non ho rispettato ?

No, tutto a posto, ma ... NON aspettarti risposte in tempi brevi ... specie di Sabato e Domenica e d'Estate ... :smiley:

Guglielmo

no problem

jaz56:
Bho adesso funziona, anche se ho capito che qualcosa che non mi servirà posso escluderla ( vedi codice allegato).

Hm, il codice che hai postato contiene solo 4 istruzioni, dov'è il resto?

A proposito, visto che per collegare Arduino al multieffetto userei la porta usb dell' USB Host Shield, posso approfittare che i due pin digitali per Tx e Rx rimangono inutilizzati per mettere due led o due pulsanti o possono esserci problemi ?

Non ho mai usato una USB Host Shield (che comunque ho letto che non producono più) ma direi nessun problema, a patto che tu non usi la seriale (D0-D1) in alcun altro modo e che la USB Host Shield non usi a sua volta quei pin per le sue operazioni.

Ma se sei in "crisi" di pin, visto che parli di 12 pulsanti, perché non usi gli analogici? Si possono usare come normali pin digitali...

docdoc:
Non ho mai usato una USB Host Shield (che comunque ho letto che non producono più) ...

... quella ufficiale aveva anche SERI problemi hardware tanto che, una volta montata, NON potevi più usare null'altro che usava il bus SPI !!! :o

Guglielmo

docdoc:
Hm, il codice che hai postato contiene solo 4 istruzioni, dov'è il resto?

il resto non c'è ancora, volevo solo verificare se il messaggio midi lo inviava oppure no e non lo invia perchè pare che l'istruzione

if( Usb.getUsbTaskState() == USB_STATE_RUNNING )

fallisca

docdoc:
Non ho mai usato una USB Host Shield (che comunque ho letto che non producono più) ma direi nessun problema, a patto che tu non usi la seriale (D0-D1) in alcun altro modo e che la USB Host Shield non usi a sua volta quei pin per le sue operazioni.

grazie

docdoc:
Ma se sei in "crisi" di pin, visto che parli di 12 pulsanti, perché non usi gli analogici? Si possono usare come normali pin digitali...

sì quello lo sapevo, basta definirli come input. Al limite userò Arduino MEGA che ne ha in abbondanza, modificando probabilmente il futuro codice.

A proposito, leggevo anche che si può semplicemente usare l' ATMEGA328P con 2 condensatori e un quarzo ma ho anche letto che quel chip il quarzo dovrebbe avercelo già internamente. Confermate ?

jaz56:
il resto non c'è ancora, volevo solo verificare se il messaggio midi lo inviava oppure no e non lo invia perchè pare che l'istruzione

if( Usb.getUsbTaskState() == USB_STATE_RUNNING )

fallisca

Beh innanzitutto tra le righe che hai postato non c'è neanche la setup() (e c'è invece una Serial.begin "orfana"), quindi come faresti a verificare che faccia qualcosa?

Se hai fatto uno sketch, sempre utile postare quello (e per intero), se invece parli di uno degli sketch di esempio della libreria (è questo che stavi provando?), non solo sarebbe meglio postare tutto quel codice, ma dovresti anche specificare esattamente quale libreria stai usando perché esistono quantomeno sia la MIDIUSB di Arduino, sia la USBMIDI di tal BlokasLabs. Non è che hai qualche "mix" di librerie ad esempio?

Una volta che ci avrai chiarito questo, prendi uno degli esempi e provalo, e vedi che cosa succede, e se dovesse fallire posta lo sketch e l'errore esatto.

sì quello lo sapevo, basta definirli come input. Al limite userò Arduino MEGA che ne ha in abbondanza, modificando probabilmente il futuro codice.

Se non ti bastano altre 6 porte (o 4 se hai qualche device I2C come ad esempio un display), meglio la Mega. Ma stando a quanto hai detto finora, secondo me ti bastano.

docdoc:
Beh innanzitutto tra le righe che hai postato non c'è neanche la setup()

hai guardato il codice nel primo post ?

docdoc:
(e c'è invece una Serial.begin "orfana"),

quella l'avevo messa per usarla con il Monitor seriale ma la tolgo subito, anzi tolgo anche la libreria usbmidi.h tanto non serve.

docdoc:
Se hai fatto uno sketch...

... minimale solo per vedere se con quelle 4 istruzioni riuscivo ad attivare un program change che però non si attiva e la compilazione non dà alcun errore.

docdoc:
Se non ti bastano altre 6 porte (o 4 se hai qualche device I2C come ad esempio un display), meglio la Mega. Ma stando a quanto hai detto finora, secondo me ti bastano.

per lo scopo del momento, potrei farcela solo con le porte di Arduino UNO.

jaz56:
hai guardato il codice nel primo post ?

Certo, ma se poi dici "Bho adesso funziona" per me hai cambiato qualcosa, e postare solo quattro righe di codice (ed io mi riferivo ovviamente a quelle) non aiuta molto a capire.

... minimale solo per vedere se con quelle 4 istruzioni riuscivo ad attivare un program change che però non si attiva e la compilazione non dà alcun errore.

Non so, se il codice è come quello del primo post, tu stavi mandando 100 Program Change al secondo: se ne vuoi mandare solo uno, metti le istruzioni nel setup() magari dopo un delay(5000) per mandarlo dopo 5 secondi dall'accensione.

Se hai poi tolto librerie non utili o comunque modificato il programma, posta quello nuovo, per intero così magari vediamo. E comunque non ho ancora capito bene se alla fine ti funzioni o meno (ma anche se funzionasse postare il codice corretto sarebbe un modo per aiutare eventualmente altri con il tuo stesso problema o dubbio...).

docdoc:
Certo, ma se poi dici "Bho adesso funziona" per me hai cambiato qualcosa, e postare solo quattro righe di codice (ed io mi riferivo ovviamente a quelle) non aiuta molto a capire.

no, non ho cambiato niente e non so perchè ha funzionato, ma in quel frattempo avevo spento il pc e quando l'ho riavviato ho ricaricato il codice e il messaggio midi lo ha invato tant'è che nel multieffetto si è attivata la patch del suono inviata.

docdoc:
Non so, se il codice è come quello del primo post, tu stavi mandando 100 Program Change al secondo: se ne vuoi mandare solo uno, metti le istruzioni nel setup() magari dopo un delay(5000) per mandarlo dopo 5 secondi dall'accensione.

sì lo so che il codice andrebbe modificato ma per quello che era il mio scopo, cioè verificare rapidamente se il messaggio midi arrivasse fino al multieffetto, mi andava bene cosi :wink:

docdoc:
Se hai poi tolto librerie non utili o comunque modificato il programma, posta quello nuovo, per intero così magari vediamo. E comunque non ho ancora capito bene se alla fine ti funzioni o meno (ma anche se funzionasse postare il codice corretto sarebbe un modo per aiutare eventualmente altri con il tuo stesso problema o dubbio...).

ho solo tolto quello che ho scritto in un mio post precedente e quelle 4 righe di codice funzionano. Non ho aggiunto altro codice perchè adesso non ho tempo e devo preparare due esami ma se invece avessi tu un codice completo che fa quello di cui ho bisogno e che spiego nel primo post, passalo pure qui perchè in giro non ho trovato niente che faccia questo.

[/quote]

La settimana scorsa ho smanettato un pomeriggio intero e ho finalmente completato il tutto con 5 pulsanti e funziona tutto bene MA non ho capito come mai devo dargli un "aiutino" iniziale io altrimenti subito dopo il power on il controller sembra freezzato, per cui prova che ti prova ho scoperto che se comincio a premere a caso i pulsanti un pò di volte, dopo qualche secondo il tutto funziona bene e si normalizza senza mai interrompersi. Aggiungo che nel frattempo l'ho usato per una decina di ore circa senza problemi, tranne quello della spinta iniziale cioè della pressione random dei pulsanti.

Magari sbaglio ipotesi ma, se i dati midi devono viaggiare sulla usb e non ci vanno, secondo me potrebbe voler dire che la usb potrebbe avere qualche problema hardware o software, o no ? In ogni caso, i dati midi vengono inviati con questo codice

void SendMIDI(byte number)                          
{
  Usb.Task();

if( Usb.getUsbTaskState() == USB_STATE_RUNNING ) // LA USB NOT RUNNING 

    { 
 Serial.println("USB RUNNING"); // se USB si attiva stamperà USB RUNNING

    byte Message[2];                 
    Message[0]=0xC0;                  
    Message[1]=number;               
    Midi.SendData(Message);
    delay(10); 
    }
}

il controllo mi stampa "USB RUNNING" sul serial monitor solo se premo i pusanti a caso altrimenti ho aspettato fino a oltre un'ora e sembrava tutto congelato. e pare che il problema risiederebbe all'interno di Usb.task().

Alla ine della fiera potrei tenermelo anche cosi ma se funzionasse autonomamente sarebbe meglio. Ma secondo voi, per renderlo funzionante e autonomo, quindi senza pressione random dei pulsanti, si deve modificare qualche costante/variabile in qualche file della libreria da qualche parte ? Oppure è un problema della scheda Usb Host Shield ?

Sempre grazie

Nel frattempo ho anche fatto caso che tutte le volte che lo avvio, devo sempre pushare 8 volte (sempre 8 volte) a caso sui pulsanti, e succede sempre che al 5° push (sempre al 5°) si sblocca e trasmette il messaggio midi, ma già al 6° ritorna a bloccarsi nuovamente fino a quando non arrivo all'ottavo push pulsante. Questa scena si ripete tutte le volte.

Ho provato a togliere la libreria SPI.h e il funzionamento rimane invariato, mentre io pensavo che non avrebbe funzionato del tutto.

Anime pie già in vacanza ? Alternative a utilizzare la Usb.task() che sembra quella che causa il blocco ?

Se metti il codice
Completo
Che compila
E bene indentato

Ci guardo

Altrimenti la situazione rimane invariata: io sono in ferie e tu hai il problema

Scusa se sembro brusco ma ti hanno già chiesto varie volte delucidazioni, adesso è il momento di darle...

Rilassati, il mio non è un problema ma solo una curiosità. Amen e buone ferie.

Plonk