簡體   English   中英

Python龍卷風停止功能

[英]Python tornado stop function

我在Raspberry上運行了一個龍卷風Web服務器,並連接了一個超聲波傳感器。 我有一個帶有“開始”和“停止”按鈕的html頁面,當我單擊“開始”時,腳本會向服務器發送一條“開始”消息,並運行一個打印距離的函數。

現在,我試圖在單擊停止按鈕時停止該功能。 但是當功能正在打印距離時,當我單擊網站上的停止按鈕時,服務器不會收到“停止”消息。

在此處輸入圖片說明

代碼在這里: http : //pastebin.com/SVRZNXgH

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)

# Ta funkcja dokonuje pomiaru odleglosci
def pomiar():
  # Ustawienie pinow czujnika odleglosci
  GPIO_TRIGGER = 16
  GPIO_ECHO    = 18

  # Ustawienie pinu buzzera
  GPIO_BUZZER = 22

  # Ustawienie pinu serwomechanizmu
  GPIO_SERVO = 13

  # Ustawienie pinow
  GPIO.setup(GPIO_TRIGGER,GPIO.OUT)
  GPIO.setup(GPIO_ECHO,GPIO.IN)
  GPIO.setup(GPIO_SERVO,GPIO.OUT)

  # Ustawienie Trigget jako false (stan niski)
  GPIO.output(GPIO_TRIGGER, False)

  GPIO.setup(GPIO_TRIGGER,GPIO.OUT)
  GPIO.output(GPIO_TRIGGER, True)

  time.sleep(0.00001)
  GPIO.output(GPIO_TRIGGER, False)
  start = time.time()

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

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

  elapsed = stop-start
  distance = (elapsed * 34300)/2
  print "odleglosc :  %.1f" % distance
  time.sleep(2)

  return distance

# Funkcja dokonujaca sprawdzenia kata
def sprawdz_kat():
  GPIO_SERVO = 13
  GPIO.setup(GPIO_SERVO,GPIO.OUT)
  p = GPIO.PWM(GPIO_SERVO,50)

  katy = [10,12.5,5,2.5];
  start = 20.0;
  for x in katy:
      p.ChangeDutyCycle(x)
      time.sleep(0.5)
      odleglosc = pomiar()
      print "odleglosc :  %.1f" % odleglosc
      if(odleglosc>start):
          start=odleglosc
          kat = x
  if(kat==10):        
      return float(-45)
  if(kat==12.5):
      return float(-90)
  if(kat==5):
      return float(45)
  if(kat==2.5):
      return float(90)

# Funkcja do obrotu robota o zadany kat   
def obrot(kat):
  obrot=abs(kat/100)
  print(obrot)
  if(kat<0):
      GPIO.output(M1_EN, True) # True - do przodu, False - do tylu
      GPIO.output(M2_EN, True) # False - do przodu, True - do tylu
  else:
      GPIO.output(M1_EN, False) # True - do przodu, False - do tylu
      GPIO.output(M2_EN, False) # False - do przodu, True - do tylu
  LEWA_PWM.ChangeDutyCycle(25)
  PRAWA_PWM.ChangeDutyCycle(25)
  time.sleep(obrot)
  LEWA_PWM.ChangeDutyCycle(0)
  PRAWA_PWM.ChangeDutyCycle(0)
  GPIO.output(M1_EN, True)
  GPIO.output(M2_EN, False)   

# Program labiryntu
def labirynt():
  distance = pomiar()
  p.start(7.5)
  while True:
    distance = pomiar()
    GPIO.setup(GPIO_BUZZER,GPIO.OUT)
    GPIO.output(GPIO_BUZZER, False)
    time.sleep(0.08)
    GPIO.setup(GPIO_BUZZER,GPIO.IN)
    time.sleep(distance/500)
    LEWA_PWM.ChangeDutyCycle(10)
    PRAWA_PWM.ChangeDutyCycle(10)
    if(distance<50):
      LEWA_PWM.ChangeDutyCycle(0)
      PRAWA_PWM.ChangeDutyCycle(0)
      kat = sprawdz_kat()
      print kat
      obrot(kat)
      p.ChangeDutyCycle(7.5)
      time.sleep(0.5)
    GPIO.setup(GPIO_SERVO,GPIO.IN)
  GPIO.cleanup  

def stop_all():
  GPIO.output(GPIO_TRIGGER, False)
  GPIO.output(GPIO_ECHO, False)
  GPIO.cleanup()

# Ustawienie pinow czujnika odleglosci
GPIO_TRIGGER = 16
GPIO_ECHO    = 18

# Ustawienie pinu buzzera
GPIO_BUZZER = 22

# Ustawienie pinu serwomechanizmu
GPIO_SERVO = 13

# Ustawienie pinow
GPIO.setup(GPIO_TRIGGER,GPIO.OUT)
GPIO.setup(GPIO_ECHO,GPIO.IN)
GPIO.setup(GPIO_SERVO,GPIO.OUT)

# Ustawienie Trigget jako false (stan niski)
GPIO.output(GPIO_TRIGGER, False)

# Ustawienia dla serwa
p = GPIO.PWM(GPIO_SERVO,50) #Ustawienie czestotliwosci na 50Hz
 #poczatkowy kat serwa 90 stopni (neutralny)

# Ustawienia buzzera
GPIO.setup(GPIO_BUZZER,GPIO.IN)  

# -----------------------
# Ustawienia silnikow
# -----------------------

# Prawa strona
M1_PWM = 26
M1_EN = 24

# Lewa strona
M2_PWM = 23
M2_EN = 21

# Prawa strona ustawienia jako output
GPIO.setup(M1_PWM,GPIO.OUT)
GPIO.setup(M1_EN,GPIO.OUT)

# Lewa strona ustawienia jako output
GPIO.setup(M2_PWM,GPIO.OUT)
GPIO.setup(M2_EN,GPIO.OUT)

# Prawa strona ustawienie stanow niskich
GPIO.output(M1_PWM, False)
GPIO.output(M1_EN, True) # True - do przodu, False - do tylu

# Lewa strona ustawienie stanow niskich
GPIO.output(M2_PWM, False)
GPIO.output(M2_EN, False) # False - do przodu, True - do tylu

# Ustawienie PWM dla prawej strony
PRAWA_PWM = GPIO.PWM(26,50)

# Ustawienie PWM dla lewej strony
LEWA_PWM = GPIO.PWM(23,50)

# Poczatkowe ustawienia PWM silnikow
PRAWA_PWM.start(0)
LEWA_PWM.start(0)



from tornado.options import define, options
define("port", default=8080, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('index.html')

class WebSocketHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        print 'new connection'
        self.write_message("connected")

    def on_message(self, message):
        print 'message received %s' % message
        self.write_message('message received %s' % message)
        aaa = message
        if message == "gora":
          GPIO.output(M1_EN, True)
          GPIO.output(M2_EN, False)
          LEWA_PWM.ChangeDutyCycle(8)
          PRAWA_PWM.ChangeDutyCycle(8)
        if message == "dol":
          GPIO.output(M1_EN, False)
          GPIO.output(M2_EN, True)
          LEWA_PWM.ChangeDutyCycle(8)
          PRAWA_PWM.ChangeDutyCycle(8)
        if message == "stop":
          LEWA_PWM.ChangeDutyCycle(0)
          PRAWA_PWM.ChangeDutyCycle(0)
        if message == "lewo":
          GPIO.output(M1_EN, True)
          GPIO.output(M2_EN, True)
          LEWA_PWM.ChangeDutyCycle(20)
          PRAWA_PWM.ChangeDutyCycle(20)
        if message == "prawo":
          GPIO.output(M1_EN, False)
          GPIO.output(M2_EN, False)
          LEWA_PWM.ChangeDutyCycle(20)
          PRAWA_PWM.ChangeDutyCycle(20)
        while (aaa == "start_maze"):
          pomiar()
    def on_close(self):
        print 'connection closed'

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(
        handlers=[
            (r"/", IndexHandler),
            (r"/ws", WebSocketHandler),
            (r'/js/(.*)', tornado.web.StaticFileHandler, {'path': "/home/pi/js"}),
            (r'/css/(.*)', tornado.web.StaticFileHandler, {'path': "/home/pi/css"}),
            (r'/fonts/(.*)', tornado.web.StaticFileHandler, {'path': "/home/pi/fonts"}),
        ]
    )
    httpServer = tornado.httpserver.HTTPServer(app)
    httpServer.listen(options.port)
    print "Listening on port:", options.port
    tornado.ioloop.IOLoop.instance().start()

原因是您在第227行出現了一個無限循環。

一種可能的解決方案:

  1. 使您的pomiar函數成為websocket處理程序的方法
  2. 在websocket處理程序self.running上使用變量,並在啟動時將其設置為true。 並調用self.pomiar()
  3. 停止時將self.running設置為false
  4. 在結束pomiar刪除time.sleep它阻止完整的龍卷風服務器。 代替:

...

if self.running:
    tornado.ioloop.IOLoop.instance().add_timeout(time.time() + 2, self.pomiar)

add_timeout使龍卷風在兩秒鍾內再次調用您的pomiar函數。 首先檢查self.running是否仍然為true ,以確保僅在未調用stop的情況下才調用pomiar函數。

還有很多其他方法可以解決此問題。 您可能需要閱讀有關龍卷風及其提供的異步功能的更多信息,例如: http : //tornado.readthedocs.org/en/latest/gen.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM