atb
Posts: 4
Joined: Thu Feb 15, 2018 2:24 pm

Одновременное использование нескольких датчиков расстояния HC-SR04

Tue Mar 13, 2018 12:06 pm

Доброго времени суток,
встал вопрос как грамотно получить и обработать показания 2х и более датчиков препятствия.
В частности ультразвуковых HC-SR04.
по отдельности проблем нет с обработкой таким кодом

Code: Select all

#!/usr/bin/python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO   
import time
import datetime
GPIO.setmode(GPIO.BCM)
TRIG = 23  
ECHO = 24

GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN) 
 

while True:
    GPIO.output(TRIG, False)
    time.sleep(0.025)
    GPIO.output(TRIG, True)
    time.sleep(0.00001)
    GPIO.output(TRIG, False)


    while GPIO.input(D2)==0:
        p_start = time.time()
    while GPIO.input(D2)==1:
        p_end = time.time()

    p_duration = p_end - p_start

    d = p_duration * 17150
    d = round(d, 2)
     print "расстояние ",str(d)

как сюда добавить еще один датчик с учетом того что
while GPIO.input(D2)==0 или while GPIO.input(D2)==1 становится True и останавливает выполнения кода (ожидается выход из цикла)?

peppy.player
Posts: 58
Joined: Mon Mar 07, 2016 6:10 am

Re: Одновременное использование нескольких датчиков расстояния HC-SR04

Tue Mar 13, 2018 8:15 pm

Выхода из основного цикла (while True) у вас не происходит, поэтому
просто добавьте такой же код для другого датчика после 'print'. А ещё
лучше создайте отдельную функцию, например:
def get_distance(trigger_pin, echo_pin):
...
И вызывайте её из основного цикла:
while True:
get_distance(TRIG1, ECHO1)
get_distance(TRIG2, ECHO2)
...
По-моему в библиотеке GPIO есть такая вещь как GPIO callbacks, скорее
всего их можно здесь использовать. Callback позволит избавиться от
внутренних while циклов.

Удачи.

atb
Posts: 4
Joined: Thu Feb 15, 2018 2:24 pm

Re: Одновременное использование нескольких датчиков расстояния HC-SR04

Wed Mar 14, 2018 8:30 am

Попытался решить вопрос используя потоки
получилось такое

Code: Select all


#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import urllib2
from threading import Thread
import RPi.GPIO as GPIO
import datetime, time

GPIO.setmode(GPIO.BCM)


N1 = "Bход"
T1 = 22
D1 = 23

N2 = "Выход"
T2 = 17
D2 = 18

class couter(Thread):
    def __init__(self, sensor, triger, name):
        Thread.__init__(self)
        self.sensor = sensor
        self.triger = triger
        self.name = name

        GPIO.setup(self.sensor, GPIO.IN)
        GPIO.setup(self.triger, GPIO.OUT)

    def run(self):
        print "Запуск потока ", self.sensor, self.triger, self.name

        while True:
            GPIO.output(self.triger, False)
            time.sleep(0.025)
            GPIO.output(self.triger, True)
            time.sleep(0.00001)
            GPIO.output(self.triger, False)


            while (GPIO.input(self.sensor)==0):
                pulse_start1 = time.time()

            while GPIO.input(self.sensor)==1:
                pulse_end1 = time.time()

            pulse_duration1 = pulse_end1 - pulse_start1
            distance1 = pulse_duration1 * 17150
            distance1 = round(distance1, 2)

            if distance1 > 2 and distance1 < 80:
                print str(datetime.datetime.now()), self.name, distance1

def main():
    thread = counter(D1,T1,N1)
    thread.start()

    thread = counter(D2,T2,N2)
    thread.start()

if __name__ == "__main__":
    main()
    
всё бы хорошо,
работает... но при невыясненных обстоятельствах процесс начинает выжирать одно ядро процессора до 100%
и всё тупит. Может кто подскажет в чём может быть проблема?

peppy.player
Posts: 58
Joined: Mon Mar 07, 2016 6:10 am

Re: Одновременное использование нескольких датчиков расстояния HC-SR04

Wed Mar 14, 2018 3:06 pm

Скорее всего зацикливается в одном из внутренних циклов while (GPIO...
Добавьте в них принт:
print("на колу мочало начинай сначала")

Удачи.

Return to “Русский”

Who is online

Users browsing this forum: No registered users and 3 guests