Küsimus:
Kuidas töötab pythoni GPIO põrkeaja parameeter?
TomG
2014-03-03 10:21:17 UTC
view on stackexchange narkive permalink

Mul on lihtne Pythoni skript, mis jälgib kahte GPIO tihvti. Olen määranud tagasipöördeaja parameetri väärtusele 500 ms, kuid mulle helistatakse mitu (peaaegu alati 2) kõnet tagasi helistades, tavaliselt 3 või 4 ms kaugusel. >

See on minu esimene Pythoni skript, nii et mul võib puududa mõni muu peensus kui GPIO käitlemine.

  #! / usr / bin / env python2.7import os, datetime, atexit , aeg, urllib2, sysimport RPi.GPIO kui GPIOGPIO.setmode (GPIO.BCM) GPIO.setup (17, GPIO.IN) GPIO.setup (27, GPIO.IN) def gate_moving_callback (kanal): kui GPIO.input (kanal ): print (str (datetime.datetime.now ()), "Värava sulgemine") urllib2.urlopen ("http: // <redacted> / prog / GateClose") .read () sys.stdout.flush () muu: print (str (datetime.datetime.now ()), "Värava avamine") urllib2.urlopen ("http: // <redacted> / prog / GateOpen"). read () os.system ('./gatepic') sys.stdout .flush () def shutdown_request (kanal): print "muutus GPIO27-s:", kanaliprint GP IO.input (kanal), kui GPIO.input (kanal): print str (datetime.datetime.now ()), "Shutdown request" sys.stdout.flush () os.system ('/ sbin / shutdown -h now' ) def cleanup (): #print ("Koristamine") GPIO.cleanup () atexit.register (puhastamine) GPIO.add_event_detect (17, GPIO.BOTH, tagasihelistamine = gate_moving_callback, bouncetime = 500) GPIO.add_event_detect (27, GPIO . MÕlemad, tagasihelistamine = shutdown_request, põrgatusaeg = 500) # Oodake lõputult ... print str (datetime.datetime.now ()), "Valmis!" Sys.stdout.flush () samas True: time.sleep (1); 

Siin on üsna tüüpiline näide logist:

  ('2014-03-02 12: 26: 42.196143', 'Värava avamine') ( '2014-03-02 12: 26: 42.200036', 'värava avamine') ('2014-03-02 12: 27: 49.946151', 'värava sulgemine')  

Pange tähele, et teine ​​värava avamise teade on kõigest 4 ms pärast esimest, kuigi olen määranud põrgeoleku aja = 500.

See teatab alati kahest avamisest ja ühest sulgemisest.

Neli vastused:
Fred
2014-03-04 03:46:43 UTC
view on stackexchange narkive permalink

Esimene asi, mida sellistes salapärastes olukordades kontrollida, on see, kas teil on GPIO teegi uusim versioon? Uusim peaks olema 0.5.4.

Teine probleem võib olla see, et te ei määra pull-up või pull-down. Ainult lülitiga elektrilülituses teate, mis see on, kui lüliti on suletud. Kui lüliti on avatud, pole füüsilist elektrilist ühendust ja nii tehniliselt võis Pi lugeda GPIO tihvtilt midagi. (See, mida see tegelikult loeb, on mingi imelik kombinatsioon teie külmkapi elektromagnetkiirgusest ja teie kampsuni staatilisest elektrist, selline asi.) "Tundmatu" oleku vältimiseks kasutatakse ülestõstetavat või alla tõmmatavat takistit. Sel moel, kui lüliti on avatud, läheb takisti mängu ja vooluahel on endiselt määratletud.

Kui lüliti on ühendatud maapinnaga ja GPIO tihvtiga, soovite ülestõstetakisti. Vaikimisi "tõmbab vooluahela üles", ühendades tihvti +3,3 V-ga, nii et tihvt näitab 1, kui lüliti pole suletud. Swtichil pole takistust, nii et see lühiseb (heas mõttes!) Takisti ja tihvt on nüüd 0. Lüliti avaneb uuesti üles, takisti tuleb uuesti mängu ja kõik on jälle 1 korral hea. Allatõmmatav takisti töötab sama, kuid täpselt vastupidi. See ühendab tihvti maapinnaga, nii et tihvt näitab alati 0. Lüliti ühendab tihvti +3,3 V. Kui lüliti on suletud, lühiseb pinge maandusühenduse ja tihvt näitab 1. Jne.

Takisteid saab lisada kahel viisil. Füüsilise takisti saab panna oma kohale või on Pi-l sisetakistid, mida saab kasutada. GPIO teegil on selleks tugi. Näiteks:

  GPIO.setup (PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP)  

See aktiveerib tõmbe ja minu lüliti sisse PIN on ühendatud maapinnaga.

Kui see ei paranda, võite tabada koodis kummalist servakäänet keermestusega, mida mul poleks ühe protsessori süsteemis siiski võimalik. Võimalik, et peate rakendama oma tarkvara kontrollimise tühistamise jaoks või proovima üle lüliti lisada väike kondensaator (0,1 uF). Põrkeaja edasine suurendamine võib aidata, kuid kui see nii pole, kahtlustaksin viga.

Täname meeldetuletuse eest teegi versiooni kontrollimise eest; versioonilt 5.2a versioonile 5.4, kuid vahet pole.
Mul on tõmbejõutakisti ja ma ei saa valesid päästikuid, välja arvatud teine ​​5-15 ms pärast esimest. Minu arvates on uudishimulik, et saan alati kaks kõnet avalikult ja ainult ühe lähedalt. Ma pole veel näinud, et see sellest mustrist erineks.
Olen proovinud teie koodi ja see töötab minu jaoks ideaalselt, kui lisan valiku pull_up_down. Siinkohal võin soovitada vaid seda, et saate selle tekitavas elektrisignaalis veidi närvitsemist. Prooviksin sisetakisti aktiveerida, isegi kui teil on sellel hetkel väline.
Kahjuks ei aidanud sisemise tõmbe lisamine. Olen valmis järele andma ja piirduma ühe aktiveerimisega sekundis.
Darn. Sel juhul võib olla parim keelata põrgeaeg ja rakendada see käsitsi, sest sisuliselt teete seda niikuinii.
user5740843
2016-06-11 22:16:26 UTC
view on stackexchange narkive permalink

Mul on pikka aega olnud sama probleem ja ma ei suutnud aru saada, milles probleem oli.

lisades väikese viivituse pärast sündmuse tuvastamist ja enne, kui kontrollite, millist, näiteks: datetime.now ()), "värava sulgemine") urllib2.urlopen ("http: // <redacted> / prog / GateClose") .read () sys.stdout.flush ()

Ma ei oska seletada, miks see töötaks, aga siiski. Ma kahtlustan, et kuigi sündmus on tuvastatud, vajab süsteem natuke rohkem aega, enne kui ta teab, kumb see on, tõuseb või langeb, või et see on kaks süsteemi ja ühte on aeglasem haarata, kui teist? Ma ei tea ...

Proovige järele!

Thanx, see lahendas ka minu jaoks!
See töötab, aitäh. Kuid oleks tore, kui keegi saaks seda seletada.
Ban Saie
2014-07-18 17:53:39 UTC
view on stackexchange narkive permalink

Ma arvan, et peaksite muutma GPIO.BOTH kas GPIO.RISING või GPIO.FALLING. Ma kahtlustan, et muidu võib tuvastada mis tahes närvitsemist kahe erineva katkestussündmusena, ühe kukkumise ja teise tõusuna.

Lugupidamisega

See on suurepärane punkt. Proovin GPIO jaoks eraldi sündmusi. RISING ja GPIO. Kukkumine, kuna tahan teada nii värava avanemisel kui ka sulgemisel.
joshuar500
2017-01-15 09:34:02 UTC
view on stackexchange narkive permalink

Mul oli sarnane olukord, kus sain mitu tagasihelistamist.

Tagasihelistamise seadistamise asemel loon lihtsalt silmuse, mis põhimõtteliselt ootas nupu vajutamist. Kui see lükati, eemaldasin nupu sündmusekäitlejast, ootasin natuke ja lisasin siis uuesti.

See nägi välja umbes selline:

  def setup ( ): GPIO.add_event_detect (btn, GPIO.RISING, bouncetime = 1) def loop (): samas True: time.sleep (0.25) kui GPIO.event_detected (btn): GPIO.remove_event_detect (btn) do_something () time.sleep (1) GPIO.add_event_detect (btn, GPIO.RISING, bouncetime = 1)  

Loodetavasti aitab see kõigil teistel, kes said ühe nupuvajutusega mitu tagasihelistamist.



See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...