2016-10-22 11 views
0

나는이 간단한 로봇을 LEGO를 사용하여 만들었으며 컴퓨터로 라즈베리 파이를 사용합니다. 필자가 작성한 코드는 Python으로 작성되었으며, 기본적으로 초음파 센서를 사용하여 거리를 측정합니다. 코드는 다음과 같습니다.여러 반복 루프 반복 후 라스베리 파이 초음파 센서 출력이 멈춤

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

# trig is the pin on the sensor which will emit a very fast pulse 
trig = 21 
# echo is the pin which will recieve the pulse from the trig 
echo = 20 

g.setup(trig, g.OUT) 
g.setup(echo, g.IN) 

def distance(dur): 
    global dis 
    start = 0 
    end = 0 
    g.output(trig, False) 
    t.sleep(0.01) 
    g.output(trig, True) 
    t.sleep(0.00001) 
    g.output(False) 
    while g.input(echo) == 0: 
     start = t.time() 
    while g.input(echo) == 1: 
     start = t.time() 
    duration = end - start 
    dis = duration * 17150 
    dis = round(dis,2) 
    print "Distance: " + dis 
    t.sleep(dur) 

while True: 
    # so the function is being called, and the time between outputs is 0.01 seconds so it is very 
    # fast and quickly showing on the screen. If the distance is less than 5, then the program 
    # will print out "Hi" to show that. s 
    distance(0.01) 
    if dis < 5: 
     print "Hi" 

꽤 똑바로 맞습니까? 그러나 당신은 거리를 보여주고, 코드가 완벽하게 실행,보고 내가 센서 근처에 내 손을 넣어 변수 창피 미만 5가되면, 프로그램은 "안녕"출력합니다 ...이 때까지

Ultrasonic Sensor Distance Output Picture. 출력 스트림이 그냥 멈추는 것을 볼 수 있습니다. 그것은 문자 적으로 멈추고 그것입니다. 오류 메시지가 없으며 아무것도 표시되지 않습니다. 그리고 그것에 관한 최악의 부분은 이것을 무작위로 수행한다는 것입니다. 그것은 단지 거리를 인쇄 할 때 실속 할 수 있습니다. "Hi"를 인쇄 할 때 실속 할 수 있습니다. 그러나 "Hi"를 인쇄 할 때 더욱 자주 멈추고 출력의 무작위 수 후에 실속합니다. 그래서 내가하는 다음 일은 프로그램을 멈추기 위해 Ctrl + C를 누르는 것입니다. 그리고 이것은 보이는 것입니다. like. 3 개의 초음파 센서가 하나로 연결되어 있고 GPIO 21과 GPIO 20 만 사용한다는 사실을 잊어 버렸습니다. 그래도 작동합니다. 그들 자신의 분리 된 쌍의 핀을 가지고 있었을지라도 그들은 여전히 ​​동일한 실속 문제를 가지고있어서 차이를 만들지 않습니다.

누군가가이 문제의 원인에 대해 아이디어를 갖고 있다면 해결하는데 많은 시간을 할애하므로 매우 행복 할 것입니다.

+0

'distance' 메소드 안에있는 두 개의 루프에 작은 수면을 추가 할 수 있습니다. 현재 그들은'g.input'을 끌어 와서 많은 사이클을 소비합니다. –

+0

음, 첫 번째 while 루프와 두 번째 루프 사이에 t.sleep (0.01)를 추가했는데 음수 값 0_o에 출력을 엉망으로 만들었습니다. –

+0

while 루프의 일부로, 루프. –

답변

0

짧은 답변 : 함수 후 while 루프에 .01이라는 잠자기를 추가하십시오. 문제는 Pi보다 센서가 빠르므로 오류가없고 시간 만 있습니다.

Tammo Heeren이 말한 것과 마찬가지로 잠을 자지 마십시오. 울트라 소닉 (Ultra-Sonic) 센서는 데이터를 너무 빨리 보내고 (소리의 속도는 빠름) Pi는 단지 천문학적으로 작은 양을 더 빨리 계산할 수 있지만 Pi와 센서가 동기화되지 않기 때문에 충분합니다. 처음에는 차이가 작지만 시간이 갈수록 커집니다. CPU가 최대 속도 (a.k.a. lag)가 없기 때문에 프로그램이 무작위로 중단되고 종료하는 데 약간 시간이 걸립니다.

+0

감사합니다. 트릭을하는 것처럼 보였습니다. –