Я пытаюсь использовать датчик вибрации для запуска двигателя. Я хочу, чтобы пи подождал, пока не почувствуется вибрация, затем запустил двигатель в течение некоторого времени, затем остановился и снова подождал. Я могу легко заставить работать вибрационный триггер, используя прерывания 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()