Функция отказа датчика переопределяет python

#python #raspberry-pi #sensors

Вопрос:

Я использую ультразвуковой датчик HC-SR04 для измерения расстояния между поверхностями. В соответствии с показаниями расстояния один шаговый двигатель(шаговый двигатель типа 28BYJ-48) ** изменяет направление вращения**. Проблема в том, что иногда ультразвуковые датчики не дают показаний, на этом этапе шаговый двигатель не работает. Есть ли какой-либо способ запрограммировать аппаратное обеспечение для устранения сбоя датчика? Здесь, в этой задаче, я использую python на плате версии RPi zero W. Моя версия python-это версия 2.7.x.

 import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM

ControlPin1 = [7, 8, 25, 24]

TRIGPIN = 9
ECHOPIN = 10

for pin in ControlPin1:
    GPIO.setup(pin, GPIO.OUT)
    GPIO.output(pin, 0)

seq = [[1, 0, 0, 0],
       [1, 1, 0, 0],
       [0, 1, 0, 0],
       [0, 1, 1, 0],
       [0, 0, 1, 0],
       [0, 0, 1, 1],
       [0, 0, 0, 1],
       [1, 0, 0, 1]]

seq2 = [[1, 0, 0, 1],
        [0, 0, 0, 1],
        [0, 0, 1, 1],
        [0, 0, 1, 0],
        [0, 1, 1, 0],
        [0, 1, 0, 0],
        [1, 1, 0, 0],
        [1, 0, 0, 0]]

seq3 = [[0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0]]

    def distancemeasure():
        ########################################Center position start#############################################################
        global distance
        time.sleep(2)
    
    #     print("Distance measuring in progress")
        GPIO.setup(TRIGPIN, GPIO.OUT)
        GPIO.output(TRIGPIN, False)
        GPIO.setup(ECHOPIN, GPIO.IN)
    #     print("Waiting for sensor to stabalize")
        time.sleep(0.2)
    
        GPIO.output(TRIGPIN, True)
        time.sleep(0.00001)
        GPIO.output(TRIGPIN, False)
    
        while GPIO.input(ECHOPIN) == 0:
            pulse_start = time.time()
    
        while GPIO.input(ECHOPIN) == 1:
            pulse_end = time.time()
    
        pulse_duration = pulse_end - pulse_start
        #print(pulse_duration)
        distance = pulse_duration * 17150
        distance = round(distance, 1)
        print(distance)
        #print("distance", distance, "cm")
        #time.sleep(2)
    
    
    def verticalstepperclockwise():
        for i in range(10):
            for halfstep in range(8):
                for pin in range(4):
                    GPIO.output(ControlPin1[pin], seq2[halfstep][pin])
                    time.sleep(0.001)
    
    
    def verticalsteppercounterclockwise():
        for i in range(10):
            for halfstep in range(8):
                for pin in range(4):
                    GPIO.output(ControlPin1[pin], seq[halfstep][pin])
                    time.sleep(0.001)

def horizontalstepperclockwise():
    for i in range(20):
        for halfstep in range(8):
            for pin in range(4):
                GPIO.output(ControlPin[pin], seq[halfstep][pin])
                time.sleep(0.001)


def horizontalsteppercounterclockwise():
    for i in range(20):
        for halfstep in range(8):
            for pin in range(4):
                GPIO.output(ControlPin[pin], seq2[halfstep][pin])
                time.sleep(0.001)


def horizontalsteppernomove():
    for i in range(0):
        for halfstep in range(8):
            for pin in range(4):
                GPIO.output(ControlPin[pin], seq3[halfstep][pin])
                time.sleep(0.001)  



def rotataion():

    distancemeasure()
    time.sleep(2)
    if distance < 5 and distance > 3:
        verticalstepperclockwise()
        time.sleep(2)
        verticalsteppercounterclockwise()
        time.sleep(0.5)


    if distance > 6 and distance < 10:
        verticalsteppercounterclockwise()
        time.sleep(2)
        verticalstepperclockwise()
        time.sleep(0.5)


    if distance > 5 and distance < 6:
        verticalsteppernomove()
        time.sleep(2)
    horizontalstepperclockwise()  ## horizontal clockwise rotation#####################################################
    time.sleep(0.5)
    
    distancemeasure()
    time.sleep(2)
    if distance < 5 and distance > 3:
        verticalstepperclockwise()
        time.sleep(2)
        verticalsteppercounterclockwise()
        time.sleep(0.5)

    if distance > 6 and distance < 10:
        verticalsteppercounterclockwise()
        time.sleep(2)
        verticalstepperclockwise()
        time.sleep(0.5)

    if distance > 5 and distance < 6:
        verticalsteppernomove()
        time.sleep(2)
    horizontalsteppercounterclockwise()  # horizonta rotation center position counterclockwise rotation#############
    time.sleep(1)
    horizontalsteppercounterclockwise()  # horizontal counterclockwise rotation######################################
    time.sleep(1)
    
    distancemeasure()
    time.sleep(2)
    if distance < 5 and distance > 3:
        verticalstepperclockwise()

        time.sleep(2)
        verticalsteppercounterclockwise()
        time.sleep(0.5)

    if distance > 6 and distance < 10:
        verticalsteppercounterclockwise()

        time.sleep(2)
        verticalstepperclockwise()
        time.sleep(0.5)

    if distance > 5 and distance < 6:
        verticalsteppernomove()

        time.sleep(2)
        time.sleep(0.5)
    horizontalstepperclockwise()  # horizontal clockwise rotation to center position#####################################################
    time.sleep(0.5)

    def processloop():
             while (1):
        
                rotation()
        
        

   t4 = threading.Thread(target=processloop)
   t4.start()
 

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

1. Что ж, это зависит от тебя. Если вы можете определить, когда ультразвуковой считыватель вышел из строя, то не двигайте проклятый двигатель. И мы ничего не можем сказать, не увидев ваш код.

2. Мне очень жаль, но вы можете проверить это сейчас.

3. И как вы можете определить, если ультразвук не считывает/