Невозможно использовать GPIO PWM, когда доступно несколько потоков - PullRequest
0 голосов
/ 26 апреля 2019

Я работаю над проектом, который постоянно ожидает ввода пользователя на экране .Как только пользовательский ввод был обнаружен, механизм servo необходимо открыть, а затем закрыть.Все решение написано таким образом, что есть один основной поток и несколько других, которые разветвляются из основного, следующим образом:

enter image description here

Проблемас этой настройкой это:

  1. Если я выполняю только операции, обработанные в главном потоке -> BoxOpeningManager.py работает должным образом.Он открывает и закрывает сервопривод.
  2. Если я выполню один раз операцию, обработанную в главном потоке, а затем операцию, обработанную в разветвленном потоке, при следующей попытке выполнить операцию в основном потоке BoxOpeningManager.py не работает.Нет ошибок, нет ничего.Это просто не открытие сервопривода.Мне нужно перезапустить программу.
  3. Если сначала я выполняю операцию, обработанную в разветвленном потоке, а затем пытаюсь выполнить операцию, обработанную в главном потоке, основной поток снова не работает.

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