• Benvenuti su RaspberryItaly!
Benvenuto ospite! Login Login con Facebook Registrati Login with Facebook


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
Tags
wiring fronti pi falsi rilevati

Wiring Pi falsi fronti rilevati
#1
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
Risposta
#2
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.
Risposta
#3
(04/10/2024, 10:12)Zzed Ha scritto: 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.

Grazie per la risposta. No, non sto facendo un PID quindi la rispostà è decisamente no. Volevo capire se è un limite di wiring pi oppure se visto che le masse non sono in comune poteva essere quello il problema.
In pratica, ho un alimentatore collegato alla 220v AC di casa che mi tira fuori una 12v DC. La 12v DC alimenta alcuni PIR ed entra anche in trasformatore che mi fa da 12v DC a 5v DC.
La 5v DCpoi si collega al raspberry.

Quindi, il rpi ha il pin di input a pullup +3.3v DC, collegato con resistenza all'output open collector (il cui transistor regge 70ma) del device alimentato a sua volta a 12v DC posso mettere la massa in comune o rischio di fare danni ?
Grazie.
Risposta
#4
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)
Risposta
#5
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.
Risposta
#6
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.
Risposta
#7
Grazie Ippogrifo.
Se dovesse servire a qualcuno segnalo il "nuovo" wiring pi che è la continuazione del Gordon. Io non l'ho provato, uso ancora il vecchio ma questo dovrebbe essere migliore e funziona anche su Rpi 5.
https://github.com/WiringPi/WiringPi
Risposta
#8
(04/10/2024, 13:58)ippogrifo Ha scritto: 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.
Ho verificato i due "meno" del riduttore di tensione 12v -5v e sono in comune.
Purtroppo capita ancora che ogni tanto lo stato del pin cambia anche se non è vero in realtà. 
Effettivamente in rari casi mi succede anche su altri pin di input con pullup interno, che sono collegati dal rasp alla morsettiera... il fatto è che se succede mi crea problemi perché sono pin che attivano o disattivano l'impianto.
Provo a togliere il pullup interno e a fare come mi hai detto. Vediamo che succede. Vi tengo informati.
Risposta
#9
(04/10/2024, 13:58)ippogrifo Ha scritto: 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.
Ho verificato i due "meno" del riduttore di tensione 12v -5v e sono in comune.
Purtroppo capita ancora che ogni tanto lo stato del pin cambia anche se non è vero in realtà. 
Effettivamente in rari casi mi succede anche su altri pin di input con pullup interno, che sono collegati dal rasp alla morsettiera... il fatto è che se succede mi crea problemi perché sono pin che attivano o disattivano l'impianto.
Provo a togliere il pullup interno e a fare come mi hai detto. Vediamo che succede. Vi tengo informati.
Risposta
#10
Inserito pullup esterno e disattivato quello interno.
Girato sw in test per diverse ore, nessun trigger falso al momento.
Risposta
  


Vai al forum:


Navigazione: 5 Ospite(i)
Forum con nuovi Post
Forum senza nuovi post
Forum bloccato
Forum Redirect