2016-04-07 35 views
0

Bir sensörü manipüle ediyorum: HC SR04 bir mesafeyi yakalamak için. Python ve RPI’da yeni başlayan bir kişiyim. Kodum iş, ben ... Bir süre ama bir an komut durak sırasında mesafeyi yakalamakRaspberry Pi Python döngü çalışmayı durdurmak

Kodum:

GPIO.setmode(GPIO.BCM) 

GPIO_TRIGGER = 23 
GPIO_ECHO = 24 

GPIO.setup(GPIO_TRIGGER, GPIO.OUT) 
GPIO.setup(GPIO_ECHO, GPIO.IN) 

def main(): 
    global state 
    print("ultrasonic") 
    while True: 
     print "1s second refresh.." 
     time.sleep(1) 

     i = 0 
     datas = [] 
     average = 0 

     while i< 1: 
      GPIO.output(GPIO_TRIGGER, False) 

      time.sleep(C.time['count']) 
      GPIO.output(GPIO_TRIGGER, True) 
      time.sleep(0.00001) 
      GPIO.output(GPIO_TRIGGER, False) 

      while GPIO.input(GPIO_ECHO) == 0: 
       start = time.time() 

      while GPIO.input(GPIO_ECHO) == 1: 
       stop = time.time() 

      distance = (stop-start) * 17000 

      print "Distance : %.1f" % distance 

     average = F.getAverage(datas) 
     print "Average: %.1f" % average 

    GPIO.cleanup() 

burada

while GPIO.input(GPIO_ECHO) == 0: 
       start = time.time() 

ÇÖZÜM kodu durak: Bir ile örnek zaman aşımı:

now = time() 

while GPIO.input(self.gpio_echo) == 0 and time()-now<waitTime: 
    pass 
+0

Bu soruya yardım edebilmek için çok geniştir .... ancak bazı olası nedenler şunlardır: Multimetre alınız ... kod çalışırken pimi ve toprağı ölçünüz, kod çalışırken, üzerinde herhangi bir osidasyon var mı? ya da her zaman sıfır mı? '(X == 0 iken)' her zaman doğru gibi görünüyor. Ardından, [ahududu mikroişlemcileri] için ayrılmış stackoverflow forumunu kontrol edin (http://raspberrypi.stackexchange.com/) – Bonatti

cevap

0

İstediğinize eminim

while GPIO.input(GPIO_ECHO)==GPIO.LOW: 
    start = time.time() 

while GPIO.input(GPIO_ECHO) == GPIO.HIGH: 
    stop = time.time() 

GPIO.input'un doğal olarak sıfır veya sıfır döndürdüğünü sanmıyorum, ancak bunu sınayabilirsiniz.

0

gerçekten, ben, ben programımın bir sinyal süresiz beklemek düşünüyorum

while GPIO.input(GPIO_ECHO)==GPIO.LOW: 
    start = time.time() 

bir zaman aşımı çalışacağım ama 0

1

ben de duyuyorum kalmak sinyali kaybetti düşünüyorum Değil bu sensör ile ilgili olarak mucking. Benim kodum sizinkine benziyor ve çalışabilmesi için zaman aşımı gerekmiyor. bulabilirim tek fark şudur:

while i< 1: 
     GPIO.output(GPIO_TRIGGER, False) 

     time.sleep(C.time['count']) 

Ben uyku süresi burada ne kadar süreceğini bilmiyorum, ama o kadar soruna neden olduğunu olabilir. Tetikleyicinin yanlış ayarlanması benimkiyle aynı olacaksa, bunun yerine giriş/çıkış pimlerinin kurulumundan hemen sonra olacaktır ve daha sonra gürültüyü ortadan kaldırmak için iki saniye bekleyecektir. Bekleme süreniz daha düşük olabilir, anlatamam. Nabzını göndermeden hemen önce tetiği tekrar tetiklemeye gerek yoktur ve bilmiyorum, ama yanlış bir başlangıca neden olabilir. Benimkiyle benzer şekilde çalışmak için bunu değiştiririm ve sonra ayarı while döngüsünde false olarak kaldırırdım.

GPIO.setup(GPIO_TRIGGER, GPIO.OUT) 
GPIO.setup(GPIO_ECHO, GPIO.IN) 
GPIO.output(GPIO_TRIGGER, False) 
print("Waiting for sensor to settle\n") 
time.sleep(2) 

Bu durumun zaman aşımı gerekmeden sorunu çözüp çözemeyeceğinden emin değilim, ancak bir taneye ihtiyacım yok gibi görünüyor.

Sensörün bir nesnesini yapmak için bir modül yazdım ve ardından daha okunabilir bir komut dosyası oluşturulmasına izin verdim. Ben bu kadar eğlenceli hatalar bir yerde olabilir ayrıca tüm deneyimli programcı de piton ve oldukça yeniyim ama bunu kullanmak istiyorsanız aşağıdaki burada ya da sadece kod karşılaştırmak:

#! /usr/bin/python3 

# dist.py this is a module for objectifying an ultrasonic distance sensor. 

import RPi.GPIO as GPIO 
import time 


class Distancer(object): 
    #init takes an input of one GPIO for trigger and one for echo and creates the object, 
    #it searches for a calibration file in the working directory (name)Const.txt, if none 
    #is found it will initiate a calibration 
    def __init__(self, trig, cho, name): 
     self.trigger = trig 
     self.echo = cho 
     self.name = name 
     self.filename = self.name + 'Const.txt' 
     GPIO.setup(self.trigger, GPIO.OUT) 
     GPIO.setup(self.echo, GPIO.IN) 
     GPIO.output(self.trigger, False) 
     print("Waiting for sensor to calm down") 
     time.sleep(2) 

     try: 
      with open(self.filename, "r") as inConst: 
       self.theConst = int(inConst.read()) 
     except (OSError, IOError) as e: 
      print("Not calibrated, initializing calibration") 
      self.calibrate() 
      with open(self.filename, "r") as inConst: 
       self.theConst = int(inConst.read()) 


    #Returns the echo time 
    def measureTime(self): 
     GPIO.output(self.trigger, True) 
     time.sleep(0.00001) 
     GPIO.output(self.trigger, False) 

     while GPIO.input(self.echo) == 0: 
      pulse_start = time.time() 
     while GPIO.input(self.echo) == 1: 
      pulse_end = time.time() 

     pulse_duration = pulse_end - pulse_start 
     return pulse_duration 


    #Returns a distance in cm   
    def measure(self): 
     return self.measureTime() * self.theConst 


    #Makes you set up the sensor at 3 different distances in order to find the 
    #relation between pulse time and distance, it creates the file (name)Const.txt 
    #in the working directory and stores the constant there. 
    def calibrate(self): 

     ten = [] 
     thirty = [] 
     seventy = [] 

     print("Make distance 10 cm, enter when ready") 
     input() 
     for i in range(30): 
      ten.append(10/self.measureTime()) 
      time.sleep(0.2) 

     print("Make distance 30 cm, enter when ready") 
     input() 
     for i in range(30): 
      thirty.append(30/self.measureTime()) 
      time.sleep(0.2) 

     print("Make distance 70 cm, enter when ready") 
     input() 
     for i in range(30): 
      seventy.append(70/self.measureTime()) 
      time.sleep(0.2) 

     allTime = ten + thirty + seventy 
     theOne = 0.0 
     for i in range(90): 
      theOne = theOne + allTime[i] 
     theOne = theOne/90 

     with open(self.filename, "w") as inConst: 
       inConst.write(str(round(theOne))) 


    #Will continually check distance with a given interval until something reaches the 
    #treshold (cm), takes an argument to set wether it should check for something being 
    #nearer(near) or farther(far) than the treashold. Returns True when treshold is reached. 
    def distWarn(self, nearfar, treashold): 
     if nearfar.lower() == "near": 
      while True: 
       if self.measure() < treashold: 
        return True 
        break 
       time.sleep(0.2) 

     if nearfar.lower() == "far": 
      while True: 
       if self.measure() > treashold: 
        return True 
        break 
       time.sleep(0.2)    


    #Will measure with a second interval and print the distance 
    def keepGoing(self): 
     while True: 
      try: 
       print(str(round(self.measure())) + ' cm') 
       time.sleep(1) 
      except KeyboardInterrupt: 
       print("Won't keep going") 
       break 

Ben yönetebilirim ettik Bunu test etmek için aşağıdaki kodla ve her şey işe yarıyor gibi görünüyor. İlk kez çalıştırıldığında, sensörü bir şeyden farklı mesafelere yerleştirerek kalibre etmenizi isteyecektir.

#! /usr/bin/python3 

import RPi.GPIO as GPIO 
import time 
import dist as distancer 

GPIO.setmode(GPIO.BOARD) 
TRIG = 16 
ECHO = 18 

dist = distancer.Distancer(TRIG, ECHO, 'dist') 

def main(): 
    global dist 
    print(str(round(dist.measureTime(),5)) + ' s') 
    print(str(round(dist.measure())) + ' cm') 

    dist.distWarn('near', 10) 
    print('Warning, something nearer than 10 cm at ' + time.asctime(time.localtime(time.time()))) 

    dist.distWarn('far', 10) 
    print('Warning, something further than 10 cm at ' + time.asctime(time.localtime(time.time()))) 


    dist.keepGoing() 
    GPIO.cleanup() 
    print('Fin') 


if __name__ == "__main__": 
    try: 
     main() 
    except KeyboardInterrupt: 
     GPIO.cleanup() 
     print("Exiting") 
     time.sleep(1) 
0

Bunun eski bir soru olduğunu biliyorum.Sorunun nedeni bu soruya https://raspberrypi.stackexchange.com/questions/41159/...

çözüm OP yaptığı gibi while için, bir zaman aşımı eklemektir tarif edilmiştir buna benzer döngüler:

# If a reschedule occurs or the object is very close 
# the echo may already have been received in which case 
# the following will loop continuously. 
count=time.time() 
while GPIO.input(GPIO_ECHO)==0 and time.time()-count<0.1: 
    start = time.time() 

...

# if an object is not detected some devices do not 
# lower the echo line in which case the following will 
# loop continuously. 
stop = time.time() 
count=time.time() 
while GPIO.input(GPIO_ECHO)==1 and time.time()-count<0.1: 
    stop = time.time() 
İlgili konular