ho realizzato un progetto che tramite un lettore rfid (RC522) collegato ad un arduino permette l'apertura di 2 motori lineari collegati a dei relè optoisolati che comando con l'arduino alla lettura della scheda. La lettura della scheda aziona i relè e fa chiudere i motori, mentre per l'apertura degli stessi, l'arduino riceve comandi seriali da un pc (il collegamento tra pc e arduino è tramite la USB). Visto che i motori sono 2 ho utilizzato un modolu a 4 relè che a seconda delle condizioni switchano da NO a NC
Tutto funziona, ma quando alimento i motori lineari tutto il procedimento funziona un paio di volte e poi sembra bloccarsi. Questo avviene però solo quando il pc invia comandi all'arduino, se inglobo tutto (apertura e chiusura dei motori) nello skech tutto funziona correttamente.
La libreria del RC522, tramite il metodo PCD_Init(), permette di reinizializzare la scheda. Quando il sistema smette di funzionare (come su descritto), se chiamo questo metodo tutto riprende a funzionare correttamente.
Ora vorrei sapere secondovoi se :
Il problema è di natura elettrico?
La chiamata al metodo PCD_Init() ogni volta che leggo una scheda (così da resettare tutto) ha controindicazioni a lungo andare?
Se come dici tutto funziona senza problemi finché non invii dati da PC allora possiamo escludere interferenze elettromagnetice et simila (ma non le escluderei del tutto comunque a priori) e focalizzarci sull'annoso problema dell'uso della classe String, sul forum s'è ne parlato un sacco di volte.
Per quanto possibile, evita sempre la classe "String" ... difatti NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe "String", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!!
Che come desxrivi potrebbe essere proprio il tuo problema blocchi improvvisi e senza apparente spiegazione.
Come prima cosa eliminerei tutte le varibili con classe String per sostituirle con le stringhe classiche del C (vettori di caratteri, array di char tanto per darti due termini con cui ricercare) e riproverei il tutto.
Tra l'altro sembra che nel codice postato tu non usi un sacco di cose che dichiari, semplicemente ti limiti a leggere un carattere quindi se anche per il progetto finito ti arriverà un solo carattere con cui dovrai intraprendere svariate azioni allora la conversione è semplicissima.
Ma sono quasi pronto a scommettere che in futuro vorrai fare più cose assieme (Es. mentre l'attuatore si distende vorrai fermarlo, farlo ttornare in posizione iniziale, ecc.) e quel delay ti causerà non pochi problemi
Assolutamente si, di solito si consiglia di alimentare le schede relè con alimentatore separato.
Resta comunque il problema delle stringhe che tanto alla lunga di daranno problemi se il dispositivo è attivo 24h 7/7, vari escamotage come reset software o hardware sono delle porcherie a cui Windows ha abituato gli utenti quindi secondo me ti conviene pensare seriamente a rimuovere tutto ciò che usa la classe String
fabpolli:
Assolutamente si, di solito si consiglia di alimentare le schede relè con alimentatore separato.
Resta comunque il problema delle stringhe che tanto alla lunga di daranno problemi se il dispositivo è attivo 24h 7/7, vari escamotage come reset software o hardware sono delle porcherie a cui Windows ha abituato gli utenti quindi secondo me ti conviene pensare seriamente a rimuovere tutto ciò che usa la classe String
Grazie,
per il discorso string ho già sistemato. Appena possibile provo anche a isolare l'alimentazione del rele.
marcomorgia:
allora ho avuto modo di alimentare il modulo relè dall'esterno, ma il problema si presenta ancora, in modo però meno frequente.
Puoi mettere lo schema esatto di come hai fatto QUESTO collegamento ? Perché occorre separare "completamente" (nulla in comune, neanche i GND) le schede relè da Arduino ... :
Io metterei un condensatore ad 0.1 μF in parallelo a ciascun motore, assieme ad un diodo messo in antiparallelo (il tuttoper eliminare i disturbi all'apertura e chiusura dei contatti del relè) ... dovrebbe essere sufficiente :