Блокировка Gpio в многопоточном питоне - PullRequest
0 голосов
/ 10 января 2019

Для школьного проекта мне нужно сделать машину, которая проверяет цвета с помощью датчика, подключенного к GPIO на Raspberry Pi Zero W, используя библиотеку RPi.GPIO. В то же время я хочу водить машину также с четырьмя контактами gpio, используя библиотеку gpiozero. Контроллеры для перемещения отправляются на пи ноль через сервер сокетов python. Я поместил все эти процессы в разные темы, но теперь мне кажется, что я не могу водить машину. Похоже, что Gpiozero отключен, а Rpi.Gpio работает только.

ДАТЧИК ЦВЕТА


    import RPi.GPIO as GPIO
    import time

    S2 = 26 #select color / S2
    S3 = 21 #select color / S3
    wave = 20 #sine wave proportional to light frequency / OUT
    pulses = 1000 #pulses to check, more pulses increase accuracy but decreases speed

    def setup():
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(wave, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.setup(S2, GPIO.OUT)
        GPIO.setup(S3, GPIO.OUT)

    def getFrequency(color):
        if (color == 'red'):
            GPIO.output(S2, GPIO.LOW)
            GPIO.output(S3, GPIO.LOW)
        if (color == 'green'):
            GPIO.output(S2, GPIO.HIGH)
            GPIO.output(S3, GPIO.HIGH)
        if (color == 'blue'):
            GPIO.output(S2, GPIO.LOW)
            GPIO.output(S3, GPIO.HIGH)
        if (color == 'clear'):
            GPIO.output(S2, GPIO.HIGH)
            GPIO.output(S3, GPIO.LOW)

        startTime = time.time()
        for pulseCount in range(pulses):
            GPIO.wait_for_edge(wave, GPIO.FALLING)
        duration = time.time() - startTime
        frequency = wave / duration
        return frequency

    def endProgram():
        GPIO.cleanup()

    setup()

КОД ДВИЖЕНИЯ

    from gpiozero import Motor

    class Movement:
        #define pi zero pin numbers and pwm speed
        pin1 = 17 #forward
        pin2 = 18 #backward
        pin3 = 22 #left
        pin4 = 23 #right
        pwm = 1.0 #0.0 to 1.0

        motor = Motor(pin1, pin2, True)
        steer = Motor(pin3, pin4)

        # Set the pwm of the car
        def setPWM(self, pwm):
            self.pwm = pwm

        def forward(self):
            self.motor.forward(self.pwm)

        def backward(self):
            self.motor.backward(self.pwm)

        def halt(self):
            self.motor.stop()

        def right(self):
            self.steer.forward()

        def left(self):
            self.steer.backward()

        def straight(self):
            self.steer.stop()

В другом файле у меня есть эти функции


    def listen():
        print("Listening to commands")
        while True:
            msg = socket.receive()
            print("received: " + msg)
            try:    
                if(msg == something):
                    movement.forward() #ect
            except:
                print(msg)

    listening = Thread(target=listen)
    listening.start()

Я позволю коду для датчика цвета работать в главном потоке

Я ожидаю, что все работает как надо, и машина едет вперед, а датчик цвета считывает правильные значения

...