Я работаю над проектом, который постоянно ожидает ввода пользователя на экране .Как только пользовательский ввод был обнаружен, механизм servo необходимо открыть, а затем закрыть.Все решение написано таким образом, что есть один основной поток и несколько других, которые разветвляются из основного, следующим образом:
Проблемас этой настройкой это:
- Если я выполняю только операции, обработанные в главном потоке -> BoxOpeningManager.py работает должным образом.Он открывает и закрывает сервопривод.
- Если я выполню один раз операцию, обработанную в главном потоке, а затем операцию, обработанную в разветвленном потоке, при следующей попытке выполнить операцию в основном потоке BoxOpeningManager.py не работает.Нет ошибок, нет ничего.Это просто не открытие сервопривода.Мне нужно перезапустить программу.
- Если сначала я выполняю операцию, обработанную в разветвленном потоке, а затем пытаюсь выполнить операцию, обработанную в главном потоке, основной поток снова не работает.
Короче говоря, каждый раз, когда я выполняю что-то в разветвленном потоке, я больше не могу использовать 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)