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