#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. И как вы можете определить, если ультразвук не считывает/