Отключить / включить GPIO Interrupt Raspberry Pi - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь использовать датчик вибрации для запуска двигателя. Я хочу, чтобы пи подождал, пока не почувствуется вибрация, затем запустил двигатель в течение некоторого времени, затем остановился и снова подождал. Я могу легко заставить работать вибрационный триггер, используя прерывания add_event_detect, но работающий двигатель также вызывает событие. Так что я могу сделать дебад, но по любой причине, он всегда создает цикл триггера. Я сделал отладку, например, 999999999, и через 10 секунд двигатель останавливается, но как только он достигает 10 секунд, он просто снова запускает работу.

Так что я подумал, может быть, если я уберу событие, когда оно запускается, запустит двигатель, а затем, когда оно закончится, добавит событие обратно, оно будет работать, но не повезло. Он запускается, запускает двигатель, останавливает двигатель через определенное время, а затем обнаружение событий не запускает двигатель снова. Еще кое-что, что может быть примечательным, - это то, что я «ждал вибрации», выполняя «Пока верно: пройти» вместо сна, но это дало мне тот же результат.

У кого-нибудь есть понимание этого? Мой код ниже.

import RPi.GPIO as GPIO
from time import sleep
import random
import decimal

# motor stuff
global Motor1
global Motor2
global Motor3
global p
global q
global dutyCycle
global channel
Motor1 = 16    # Input Pin
Motor2 = 18    # Input Pin
Motor3 = 22    # Enable Pin
GPIO.setmode(GPIO.BOARD)
GPIO.setup(Motor1,GPIO.OUT)
GPIO.setup(Motor2,GPIO.OUT)
GPIO.setup(Motor3,GPIO.OUT)
p = GPIO.PWM(Motor1,30)
q = GPIO.PWM(Motor2,30)
p.start(0)
q.start(0)

dutyCycle = 30

# vibration sensor stuff
channel = 40
GPIO.setup(channel, GPIO.IN)

def get_wait_time():
    waitTime = float(decimal.Decimal(random.randrange(1, 201))/100)
    return waitTime

def do_the_spin(channel):
    remove_event_detect()
    i=0
    global Motor1
    global Motor2
    global Motor3
    global p
    global q
    global dutyCycle

    timeToSpin = 10

    print "\n\nvibration detected! Run the motor!\n\n"

    while i<timeToSpin:
        try:
            print "FORWARD MOTION"
            q.ChangeDutyCycle(0)
            p.ChangeDutyCycle(dutyCycle)
            GPIO.output(Motor3,GPIO.HIGH)

            waitTime = get_wait_time()
            i+=waitTime
            sleep(waitTime)

            print "BACKWARD MOTION"
            p.ChangeDutyCycle(0)
            q.ChangeDutyCycle(dutyCycle)
            GPIO.output(Motor3,GPIO.HIGH)

            waitTime = get_wait_time()
            i+=waitTime
            sleep(waitTime)

            print "STOP"
            print 'i= '+str(i)
            GPIO.output(Motor3,GPIO.LOW)

        except KeyboardInterrupt:
            print "\nCleaning up and closing"
            p.stop()
            q.stop()
            GPIO.cleanup()
            quit()
    set_event_detect()

def remove_event_detect():
    print "remove_event_detect"
    GPIO.remove_event_detect(channel)

def set_event_detect():
    print "set_event_detect"
    GPIO.add_event_detect(channel, GPIO.BOTH, callback=do_the_spin, bouncetime=99)
    GPIO.add_event_callback(channel, do_the_spin)  # assign function to GPIO PIN, Run function on change
    go_to_sleep()

def go_to_sleep():
    #GPIO.add_event_detect(channel, GPIO.BOTH, callback=do_the_spin, bouncetime=15000)  # let us know when the pin goes HIGH or LOW
    print "\nWaiting for vibration..."
    sleep(150000)

try:
    #GPIO.add_event_detect(channel, GPIO.BOTH, callback=do_the_spin, bouncetime=15000)  # let us know when the pin goes HIGH or LOW
    #GPIO.add_event_callback(channel, do_the_spin)  # assign function to GPIO PIN, Run function on change

    #do_the_spin(channel)
    set_event_detect()

except:
    print "\nCleaning up and closing"
    p.stop()
    q.stop()
    GPIO.cleanup()
    quit()
...