Ciao a tutti,
abbiamo scritto una libreria e un protocollo di comunicazione con il PC (tutto open source).
Grazie anche all'aiuto degli esperti di questo forum (vedere questo topic) ora funziona tutto perfettamente.
Nelle ultime versioni siamo riusciti a rendere la comunicazione indipendente da quello che si scrive nella funzione loop() e abbiamo reso più facile l'impostazione delle opzioni. Non è più necessario modificare il firmware e ricompilarlo, ma si modificano istantaneamente le opzioni, durante il funzionamento, con un click nella applicazione sul PC.
Siamo però incappati in due nuovi problemi, non gravi ma fastidiosi.
Primo problema
Alcuni Arduino utilizzano il chip FT232 per comunicare con l'USB, e questi chip non sopportano di interagire con applicazioni multithread. Il costruttore (FTDI) lo chiama "lockup" e dice “alcune applicazioni multithread possono bloccarsi durante la comunicazione con il dispositivo”.
Vedere la pagina: www.ftdichip.com/Support/Knowledgebase
FTDI suggerisce anche una soluzione, “To prevent lockup with a multithreaded application...”, che naturalmente abbiamo provato, ma che non risolve il problema.
Pertanto abbiamo dovuto aggiungere l'opzione “Polling mode”. Con questa opzione si utilizza il driver in “polling”, un metodo a singolo thread, quindi più lento, ma con il quale si possono far funzionare anche gli Arduino con il chip FT232.
Chissà che sia già capitato a qualcuno in questo forum, e che magari qualcuno conosca una soluzione migliore. L'ideale sarebbe sostituire il driver con uno alternativo, che sia Thread Safe e che funzioni bene come quelli dei chip CH340 e AtMega.
Secondo problema
La frequenza di comunicazione con gli Arduino che hanno il chip FT232 resta comunque bassa. Utilizzando l'opzione “Polling mode” si eliminano gli errori di comunicazione, ma si arriva al massimo a 70 fps.
Modificando le opzioni del driver dello FT232 è possibile incrementare questa velocità, non proprio a 350..400 come con i chip CH340 o AtMega, ma almeno a 170..200.
Per modificare le opzioni del driver si deve:
- Controllare che l'Arduino sia collegato alla USB
- Aprire “Gestione dispositivi”
- Nella sezione Porte (COM e LPT) aprire “USB Serial Port”
- Aprire “Impostazioni della porta”
- Premere il pulsante “Avanzate”
- Impostare “Tempo di latenza (msec)” con il valore “1”
Utilizzare "Gestione dispositivi" è fastidioso e scomodo anche per gli utenti esperti. Qualcuno conosce un metodo per impostare le opzioni di un driver da una applicazione sul PC?
O magari qualcuno conosce un driver alternativo a quello di FTDI, che risolva questi problemi senza bisogno del "Polling" e di modificare le opzioni del driver?
Approfondimenti
Può essere utile sapere che abbiamo provato vari modelli di Arduino con chip diversi dallo FT232. E abbiamo verificato che con i chip CH340 e AtMega questi problemi non esistono.
Chi volesse più informazioni su questi problemi, può leggere le pagine 7, 8, 9 e 18 di questo documento:
Theremino_ArduHAL_Help_ITA.pdf
Chi volesse controllare il software e il firmware che abbiamo scritto, può scaricarli da questa pagina:
www.theremino.com/downloads/foundations#arduhal