Messaggi: 45
Discussioni: 7
Registrato: Jul 2021
Reputazione:
5
04/10/2024, 09:17
(Questo messaggio è stato modificato l'ultima volta il: 04/10/2024, 09:18 da markolino.)
Ciao a tutti,
al momento sto usando Gordon's wiringPi (ho un Raspberry Pi 3B e sto programmando su QT Creator) ma ho un problema con le letture, perché nel mio thread di background (dove monitoro continuamente l'input estratto con la classica digitaRead(int pin) ) se corro troppo velocemente usando pochi ms di sleep (ad esempio 10ms) tra le letture, a volte la funzione di lettura digitale rileva un falso fronte di salita o discesa.
Monitoro continuamente un semplice input del raspberry in pull-up interno a 3.3v, che finisce in una resistenza e l'altro capo della resistenza finisce in un pin di un altro device che chiude verso massa quando il suo transistor commuta (open collector).
La tensione sul pin del raspberry, quando l'altro device commuta verso massa è di 0.6v (dovuta a masse diverse) mentre quando non commuta è ovviamente di 3.3v.
È necessario attendere ad esempio 500 ms tra le letture? Voi come vi comportate ?
Cambiando 10ms di wait con 500 il problema è sparito.
Grazie
Messaggi: 6,913
Discussioni: 262
Registrato: Mar 2015
Reputazione:
366
Non ho mai usato WiringPi, ma in generale, naturalmente ci sono dei limiti intrinseci, tra hardware e software.
Chiaramente tutto dipende dall'utilizzo, ma ti serve davvero fale la lettura così frequentemente?
Se la risposta è sì (ad esempio, leggo un sensore inerziale per tenere in equilibrio dinamicamente un robot bilanciato su due gambe o su due ruote) , allora dovrai usare un approccio completamente diverso, real tiime.
Ma se la risposta è no, come nella maggior parte degli utilizzi, aumenta il delay tra le letture e vivi felice.
Se il Raspberry è collegato elettricamente a un dispositivo, le masse devono essere messe in comune. Altrimenti interponi un optoisolatore.
Messaggi: 1,218
Discussioni: 4
Registrato: Apr 2016
Reputazione:
130
Ho utilizzato per diverso tempo WiringPi di Gordon su Raspberry Pi2b+ e RPi3; non ho mai avuto problemi con le temporizzazioni. E' forse più un problema di disponibilità del dato dopo X tempo e quindi la lettura sequenziale dopo intervalli di pochi millisecondi può essere errata. Se ricordo bene WirinPi dispone di alcune istruzioni per lavorare con gli interrupt; forse questa potrebbe essere la soluzione per evitare tempi di sleep lunghissimi.
Per quanto riguarda la massa in comune è molto probabile che già lo sia: almeno che tu non abbia adoperato un riduttore di tensione e/o step-down galvanicamente con ingresso ed uscita separati, i normali dispositivi hanno il negativo comune. Se hai un tester puoi facilmente verificare.
Considera che le resistenze di pull-up hanno valori di decine di Kohms; puoi eliminare la resistenza che collega il collettore al pin d'ingresso. Personalmente ho sempre preferito utilizzare resistenze esterne di 2-3 Kohms piuttosto che quelle di pull-up, ovvero far circolare qualche milliampere di corrente quando l'ingresso viene portato a livello low da un dispositivo esterno. La tensione di 0,6V è corretta ed è quella che si presenta (mediamente) tra collettore ed emettitore in un transistor al silicio quando in saturazione (l'open collector nel tuo caso)
Messaggi: 45
Discussioni: 7
Registrato: Jul 2021
Reputazione:
5
04/10/2024, 12:41
(Questo messaggio è stato modificato l'ultima volta il: 05/10/2024, 00:11 da Zzed.)
Grazie per la risposta.
Riguardo a WiringPi infatti non ne capisco il motivo, fatto sta che con uno sleep di 500ms non ho problemi invece se tra una lettura e l'altra sleeppo 10ms o giù di lì ogni tanto ho una falsa lettura.
Può magari essere un problema legato al fatto che il pullup non è esterno ma interno ?
Gli interrupt sono sicuramente una strada migliore ma non li ho mai usati.
Il riduttore di tensione che fa 12V DC - 5V DC ha ingresso e uscita separati, posso verificare con un tester se i due pin del meno sono in comune. Stasera verifico, però se mi trovo gli 0,6V del transistor come dici tu dovrebbe essere corretto che le masse siano in comune.
Messaggi: 1,218
Discussioni: 4
Registrato: Apr 2016
Reputazione:
130
Presubilmente la variazione del dato non è periodfica ed ha una durata di X msec. Su una interrogazione periodica può avvenire che il dato non ci sia o è in fase di "costruzione". Quindi con un time "sleep" di 500 msec hai la certezza che il dato sia "completo" e quindi "letto". Penso che provare con gli interrupt sia la soluzione più efficace. In particolare se l'applicazione lavora in background e quindi non "prioritaria". Se ricordo, vi sono su WiringPi diversi esempi di codice.
Il pull-up interno potrebbe anche influenzare la corretta lettura. Di fatto vi sono comunque delle capacità parassite.
Puoi facilmente accertarti di questo eliminando dal programma la resistenza di pull-up e collegando dalla +3,3V al pin di input una resistenza di 2,2Kohms. l'open collector dovrà essere collegato al pin senza alcuna resistenza.
Messaggi: 45
Discussioni: 7
Registrato: Jul 2021
Reputazione:
5
Inserito pullup esterno e disattivato quello interno.
Girato sw in test per diverse ore, nessun trigger falso al momento.