Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[python] iets herhalen

Pagina: 1
Acties:

  • c-nan
  • Registratie: Juni 2008
  • Laatst online: 23:42
Ik heb eerlijk gezegd zo goed als geen python ervaring, enkel wat PHP/MySQL ervaring maar dat vind ik totaal niet op python lijken.

Toch heb ik door wat googlen en proberen het ongeveer werkend gekregen wat ik wilde.

Situatie:
Ik heb een Raspberry Pi, hier een Servo op aangesloten.
De Servo moet kwartslag draaien en vervolgens weer terugdraaien, op het moment dat 2 GPIO pins de verbinding met elkaar verliest.

Dat werkt, maar de script sluit zich ook automatisch weer af. Wat ik eigenlijk wil is dat de script constant draait. Dus wanneer de verbinding tussen de 2 GPIO pins de servo draait en vervolgens weer opnieuw 'luisterd' op een volgende verbreking.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import RPi.GPIO as GPIO
import time

GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(7,GPIO.OUT)

p = GPIO.PWM(7,50)
p.start(7.5)

print "De kabels moeten op dit moment elkaar aanraken, dus in contact zijn\n"
print "Zodra de verbinding wordt verbroken zal de Servo draaien en weer terugdraaien"

try:
        GPIO.wait_for_edge(23, GPIO.RISING)
        print "\nVerbinding verbroken"
        print "Nu moet de Servo draaien."

        p.ChangeDutyCycle(2.5)
        time.sleep(1)
        p.ChangeDutyCycle(7.5)
        time.sleep(1)

except KeyboardInterrupt:
        GPIO.cleanup()
GPIO.cleanup()


Ben ik een beetje duidelijk?

EU DNS: 86.54.11.100


  • Razr
  • Registratie: September 2005
  • Niet online
Als de GPIO.wait_for_edge een blocking-call is, kun je dan niet simpelweg alles wrappen in een while (true) loop?

  • c-nan
  • Registratie: Juni 2008
  • Laatst online: 23:42
Razr schreef op donderdag 27 november 2014 @ 11:04:
Als de GPIO.wait_for_edge een blocking-call is, kun je dan niet simpelweg alles wrappen in een while (true) loop?
Bedoel je zo:
code:
1
2
3
4
5
6
7
8
9
10
try:
        while True:
                GPIO.wait_for_edge(23, GPIO.RISING)
                print "\nVerbinding verbroken"
                print "Nu moet de Servo draaien."

                p.ChangeDutyCycle(2.5)
                time.sleep(1)
                p.ChangeDutyCycle(7.5)
                time.sleep(1)


Hiermee blijft de script inderdaad draaien, maar wat het probleem hierbij is dat de servo ook draait op het moment dat de pins elkaar weer aanraken. Dat moet alleen gebeuren wanneer de verbinding wordt verbroken, niet wanneer de verbinding weer 'ok' is.

EU DNS: 86.54.11.100


  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Hoe schakel je? Als je met de hand een draadje verbindt dan is de kans groot dat je niet in één keer een goede verbinding hebt en je signaal dus een paar keer tussen 0 en PUD_UP schakelt. Je GPIO.wait_for_edge triggert dan ook.

Iaw: wat in de documentatie staat onder "Switch debounce":
Switch debounce
You may notice that the callbacks are called more than once for each button press. This is as a result of what is known as 'switch bounce'. There are two ways of dealing with switch bounce:
  • add a 0.1uF capacitor across your switch.
  • software debouncing
  • a combination of both
To debounce using software, add the bouncetime= parameter to a function where you specify a callback function. Bouncetime should be specified in milliseconds. For example:
code:
1
2
# add rising edge detection on a channel, ignoring further edges for 200ms for switch bounce handling
GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback, bouncetime=200)

or
code:
1
GPIO.add_event_callback(channel, my_callback, bouncetime=200)