多线程可用时无法使用GPIO PWM

2024-05-18 11:05:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个项目,它不断地等待screen上的用户输入。一旦检测到用户输入,servo机制需要打开然后关闭。整个解决方案的编写方式是这样的:有一个主线程,很少有其他线程从主线程派生出来,如下所示:

enter image description here

此设置的问题是:

  1. 如果我只执行主线程中处理的操作->;盒子打开管理器.py按预期工作。它打开和关闭伺服。你知道吗
  2. 如果我执行一次在主线程中处理的操作,然后在分叉线程中处理操作,那么下次我尝试在主线程上执行操作盒子打开管理器.py不起作用。没有错误,什么都没有。只是没有打开伺服。我需要重新启动程序。你知道吗
  3. 如果我首先执行一个在分叉线程中处理的操作,然后尝试执行一个在主线程中处理的操作,那么主线程同样不工作。你知道吗

长话短说,每次我在分叉的线程上执行某些操作时,我都不能使用盒子打开管理器.py在主线程中。你知道吗

以下是两个脚本的代码:

from servoManager import ServoManager
from proximitySensorManager import ProximitySensorManager
from configurationWrapping import GlobalConfigurationWrapper
from loggingManager import Logger

import time

class BoxOpeningManager():

    def __init__(self):
        self.configuration = GlobalConfigurationWrapper()
        self.timeToKeepTheBoxOpen = self.configuration.box_time_to_keep_the_box_open()
        self.logger = Logger()

        self.servoManager = ServoManager()      
        self.proximitySensorManager = ProximitySensorManager();

    def start_box_opening_procedure(self):
        try:
            self.servoManager.open()

            t_end = time.time() + (int)(self.timeToKeepTheBoxOpen)
            while time.time() < t_end:
                continue

            while True:
                if not self.proximitySensorManager.object_in_front() :         
                    self.servoManager.close()
                    break;
                else :
                    time.sleep(1)
        except BaseException as e:
            self.logger.log_critical('<BoxOpeningManager.start_box_opening_procedure> => ' + str(e))

伺服管理器:

import RPi.GPIO as GPIO
from time import sleep

from patternImplementations import Singleton
from loggingManager import Logger

class ServoManager():
    __metaclass__ = Singleton

    __OUTPUT_GPIO_PIN_NUMBER = 12

    def __init__(self):
        GPIO.setmode(GPIO.BOARD)#Numbers GPIOs by physical location
        GPIO.setup(self.__OUTPUT_GPIO_PIN_NUMBER, GPIO.OUT)

        self.pwm=GPIO.PWM(self.__OUTPUT_GPIO_PIN_NUMBER,50)
        self.pwm.start(0)

        self.logger = Logger()

    def open(self):
        try:
            self.__set_angle(13)
        except BaseException as e:
            self.logger.log_critical('<ServoManager.open> => ' + str(e))

    def close(self):
        try:
            self.__set_angle(185)
        except BaseException as e:
            self.logger.log_critical('<ServoManager.close> => ' + str(e))

    def __set_angle(self, angle):
        duty = (angle/18 + 2)

        GPIO.output(self.__OUTPUT_GPIO_PIN_NUMBER, True)
        self.pwm.ChangeDutyCycle(duty)

        sleep(1)

        GPIO.output(self.__OUTPUT_GPIO_PIN_NUMBER, False)
        self.pwm.ChangeDutyCycle(0)

Tags: fromimportselfnumber管理器outputgpiotime