Hallo,
ich habe einen Motor, welcher laufend Interrupts bei einer Lichtschranke auslöst (Port 25).
Bei jedem Interrupt wird die "Interrupt"-Methode ausgeführt.
Das Problem ist, das der Motor nachläuft und somit parallel noch Interrupts auslöst.
Kann man die Interrupts irgendwie sperren oder im Notfall bei jedem Aufruf der Methode den GPIO "unsetupen", sodass während dem Ausfürhren der Methode nichts anderes passiert?
Danke im Vorraus
valbitz
Code
##!/usr/bin/env python
import RPi.GPIO as GPIO
import time, sys, signal
# SoC als Pinreferenz waehlen
GPIO.setmode(GPIO.BCM)
# Lichtschranken
GPIO.setup(25, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(24, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(4, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
# Shutter
GPIO.setup(9, GPIO.OUT)
red = GPIO.PWM(9, 24)
# Motor
GPIO.setup(23, GPIO.OUT)
forwards = GPIO.PWM(23, 100)
#GPIO.setup(23, GPIO.OUT)
#backwards = GPIO.PWM(23, 100)
Counter = 0
shutting = 0
start_time = time.time()
elapsed_time = 0
intervall = int(sys.argv[1])
blz = int(sys.argv[2])
weg = int(sys.argv[3])
interrupts = round(((weg/1.25)*8), 0)
# ISR
def Interrupt(channel):
global Counter
global interrupts
global blz
global intervall
global start_time
global shutting
if GPIO.input(25) and GPIO.input(4) and GPIO.input(24):
print "falscher Interrupt"
elif GPIO.input(25):
Counter = Counter + 1
print Counter
if (Counter >= interrupts) and (shutting == 0):
shutting = 1
print "Counter >= interrupts"
forwards.stop()
elapsed_time = time.time() - start_time
print elapsed_time
print intervall-elapsed_time-blz
print blz
time.sleep(intervall-elapsed_time-blz)
Camerashut()
Counter = 0
print "Counter = 0"
forwards.start(50)
start_time = time.time()
shutting = 0
else:
print "durch"
print Counter
def Camerashut():
global blz
global Counter
global interrupts
if Counter >= interrupts:
red.start(24)
time.sleep(.005)
red.stop()
time.sleep(blz)
def End(channel):
if GPIO.input(4) and not GPIO.input(24):
#forwards.stop()
#print 'End'
#GPIO.cleanup()
GPIO.output(23, False)
sys.exit(0)
if GPIO.input(24) and not GPIO.input(4):
#forwards.stop()
#print 'End'
#GPIO.cleanup()
GPIO.output(23, False)
sys.exit(0)
def Motor():
global start_time
forwards.start(50)
start_time = time.time()
def signal_handler(signal, frame):
print('Script Interrupted! (Control-C)')
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
GPIO.add_event_detect(25, GPIO.RISING, callback = Interrupt, bouncetime = 2)
GPIO.add_event_detect(24, GPIO.RISING, callback = End, bouncetime = 2)
GPIO.add_event_detect(4, GPIO.RISING, callback = End, bouncetime = 2)
# Endlosschleife
try:
Motor()
while True:
signal.pause()
except KeyboardInterrupt:
GPIO.cleanup()
Alles anzeigen