Как подключить 2 ультразвуковых датчика одновременно, используя многопроцессорный процесс Python?

#python

#python

Вопрос:

Я новичок в Python, но я работаю над проектом, в котором мне нужно подключить 3 или более ультразвуковых датчика одновременно. Я прочитал все о потоках, и многопроцессорная обработка успешно выполнила пару примеров. Я знаю, что код должен быть запущен из командной строки или терминала PI2. Однако многопроцессорный код, который я написал, не работает, и я не могу понять, почему. Кто-нибудь, пожалуйста, может мне помочь.

  from multiprocessing import Process
 from gpiozero import DistanceSensor

 ultrasonic = DistanceSensor(echo=18, trigger=23)
 ultrasonic_B = DistanceSensor(echo=25, trigger=24)
 ultrasonic_C = DistanceSensor(echo=12, trigger=16)

 ultrasonic.max_distance = 1
 ultrasonic_B.max_distance = 1
 ultrasonic_C.max_distance = 1

 def A(name):
    while True:
        ultrasonic.wait_for_in_range()
        print('Distance')

        if ultrasonic.wait_for_out_of_range():
            print('Out of range')

def B(name):
    while True:
        ultrasonic_B.wait_for_in_range()
        print('Distance_B')

        if ultrasonic_B.wait_for_out_in_range():
            print('Out of range_B')

def C(name):
    while True:
        ultrasonic_C.wait_for_in_range()
        print('Distance_B')

        if ultrasonic_C.wait_for_out_in_range():
            print('Out of range_B')

if __name__ == "__main__":

    p = Process(target=A)
    p1 = Process(target=B)
    p2 = Process(target=C)

    p.start()
    p1.start()
    p2.start()
  

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

 from multiprocessing import Process
from gpiozero import DistanceSensor

ultrasonic = DistanceSensor(echo=18, trigger=23)
ultrasonic_B = DistanceSensor(echo=25, trigger=24)
ultrasonic_C = DistanceSensor(echo=12, trigger=16)

ultrasonic.max_distance = 1
ultrasonic_B.max_distance = 1
ultrasonic_C.max_distance = 1

def A():
    while ultrasonic.wait_for_in_range():
        print('Distance')

        if ultrasonic.wait_for_out_of_range():
            print('Out of range')

def B():
    while ultrasonic_B.wait_for_in_range():
        print('Distance_B')

        if ultrasonic_B.wait_for_out_in_range():
            print('Out of range_B')

def C():
    while ultrasonic_C.wait_for_in_range():
        print('Distance_B')

        if ultrasonic_C.wait_for_out_in_range():
            print('Out of range_B')

if __name__ == "__main__":

    p = Process(target=A)
    p1 = Process(target=B)
    p2 = Process(target=C)

    p.run()
    p1.run()
    p2.run()
  

Результат приходит из первого цикла
Расстояние
Вне зоны действия
Расстояние
Вне зоны действия

Хорошо, это то, что у меня есть

 from multiprocessing import Process
from gpiozero import DistanceSensor

ultrasonic = DistanceSensor(echo=18, trigger=23)
ultrasonic_B = DistanceSensor(echo=25, trigger=24)
ultrasonic_C = DistanceSensor(echo=12, trigger=16)

ultrasonic.max_distance = 1
ultrasonic_B.max_distance = 1
ultrasonic_C.max_distance = 1

def A():
    while ultrasonic.wait_for_in_range():
        print('Distance')

        if ultrasonic.wait_for_out_of_range():
            print('Out of range')

def B():
    while ultrasonic_B.wait_for_in_range():
        print('Distance_B')

        if ultrasonic_B.wait_for_out_in_range():
            print('Out of range_B')

def C():
    while ultrasonic_C.wait_for_in_range():
        print('Distance_B')

        if ultrasonic_C.wait_for_out_in_range():
            print('Out of range_B')

if __name__ == "__main__":

    p = Process(target=A)
    p1 = Process(target=B)
    p2 = Process(target=C)

    p.start()
    p1.start()
    p2.start()
  

Комментарии:

1. В чем ошибка / проблема? Код, который я написал, не работает , очень общий

Ответ №1:

Вы не говорите, что вы имеете в виду под «не работает», поэтому я беру несколько предположений здесь.

Очевидной ошибкой здесь было бы:

TypeError: A() принимает ровно 1 аргумент (задано 0)

Поскольку функции A , B и C все принимают аргумент name , и вы не предоставляете его в Process(target=A) . Это работает, если вы просто удалите параметр из функций, поскольку вы даже не используете его.

Вы также можете указать аргумент в вызове следующим образом:

 p = Process(target=A, args=('ultra_a',))
  

Другим может быть ошибка отступа, по крайней мере, в вашей вставке кода у вас есть один дополнительный пробел в каждой строке до определения B.

Комментарии:

1. Большое вам спасибо, Теему Рисикко, я постараюсь применить ваши предложения.

2. @Manny Нет проблем, и добро пожаловать в Stackoverflow! Если ответ решит вашу проблему, не забудьте пометить его как принятый, чтобы другие тоже выиграли от этого!

3. Эй, я внес некоторые изменения и смог заставить один цикл работать, но другие 2 цикла не дают результатов. Не могли бы вы помочь мне, если можете. Спасибо

4. Это не работает, потому что вы изменили p.start() на p.run() . Например, он продолжает запускать только первый процесс. Измените их обратно, и это должно сработать.

5. Я просто сделал то, что вы сказали, и ничего не произошло (никаких ошибок, это просто пустое). Извините, я знаю, что это должно быть легко, но я просто не понимаю, почему это не работает :(.

Ответ №2:

 import multiprocess
from gpiozero import DistanceSensor


def A():

    ultrasonic = DistanceSensor(echo=18, trigger=23)
    ultrasonic.max_distance = 1

    while ultrasonic.wait_for_in_range():
        print('Sensor_1' ultrasonic.distance, 'm')

        if ultrasonic.wait_for_out_of_range():
            print('0')

def B():

    ultrasonic_B = DistanceSensor(echo=25, trigger=24)
    ultrasonic_B.max_distance = 1

    while ultrasonic_B.wait_for_in_range():
        print('Sensor_2', ultrasonic_B.distance, 'm')

        if ultrasonic_B.wait_for_out_in_range():
            print('0')

def C():
    ultrasonic_C = DistanceSensor(echo=12, trigger=16)
    ultrasonic_C.max_distance = 1

    while ultrasonic_C.wait_for_in_range():
        print('Sensor_3',ultrasonic_C.distance, 'm')

        if ultrasonic_C.wait_for_out_in_range():
            print('0')

if __name__ == "__main__":

    p = multiprocess.Process(target=A)
    p1 = multiprocess.Process(target=B)
    p2 = multiprocess.Process(target=C)

    p.start()
    p1.start()
    p2.start()
  

Комментарии:

1. * Обратите внимание, что библиотека gpiozero нуждается в этом!