2013-01-06 42 views
16

Về cơ bản, những gì tôi hy vọng đạt được là giao diện web dựa trên canvas để điều khiển một Arduino, thông qua số Raspberry Pi. use case là người dùng điều hướng đến raspberrypi:8080 hiển thị canvas. Sau đó, khi di chuyển một thanh trượt, một tin nhắn websocket được gửi đến máy chủ Tornado trên Raspberry Pi. Tornado sau đó gửi một tin nhắn nối tiếp đến Arduino thay đổi giá trị RGB của LED. Cho đến nay rất tốt, tôi đã có thể thực hiện việc này với sự trợ giúp của tài liệu của nhà phát triển, Raspberry Pi Android HTML5 Realtime Servo Control.Tornado trên Raspberry Pi để sử dụng websockets cũng như màn hình cổng nối tiếp Giao tiếp Arduino

Tuy nhiên, giao tiếp chỉ là một chiều từ Raspberry Pi đến Arduino. Tôi muốn Tornado cũng theo dõi cổng nối tiếp để lấy lại bất kỳ dữ liệu cảm biến nào về mặt trước. Đây là nơi tôi không chắc chắn về cách tiến hành. Tôi đã có thể thực hiện một cái gì đó như thế này bằng cách sử dụng Node.js, mà theo dõi cho cả tin nhắn websocket cũng như các thông điệp nối tiếp không đồng bộ.

Nếu một quá trình không đồng bộ được sinh ra thường xuyên giám sát cổng? Tôi đã nhìn thấy một vài lựa chọn cho loại giải pháp này.

  1. Một số người đề xuất tornado.gen.Task, nhưng đối với yêu cầu HTTP đơn, không phải cho dữ liệu nối tiếp liên tục.
  2. tornado.ioloop.PeriodicCallback mà tôi có thể thiết lập để kiểm tra dữ liệu nối tiếp sau mỗi mili giây, nhưng có vẻ như rất nhiều chi phí.
  3. Tôi cũng đã thấy các công cụ riêng biệt như Swirl. (Swirl là lỗi thời theo it's Github repo)

Hoặc tôi nên thiết lập một ứng dụng riêng biệt Python mà màn hình nối tiếp và sau đó truyền đạt đến các ứng dụng Tornado trên một cái gì đó nó có thể hiểu như sau?

  1. điệp WebSocket sử dụng một websocket client
  2. ZeroMQ (làm việc Ví dụ: pyzmq/examples/eventloop/web.py)

Vì vậy, có rất nhiều lựa chọn ... một số kiến ​​nghị là gì và một số lý do để thử hoặc tránh bất kỳ tùy chọn nào ở trên?

Dưới đây là những gì tôi có và cần phải bổ sung giám sát nối tiếp để:

import tornado.httpserver 
import tornado.ioloop 
import tornado.options 
import tornado.web 
import tornado.websocket 

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) 

    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) 
     ] 
    ) 
    httpServer = tornado.httpserver.HTTPServer(app) 
    httpServer.listen(options.port) 
    print "Listening on port:", options.port 
    tornado.ioloop.IOLoop.instance().start() 
+0

1 cho ý tưởng tốt đẹp! – Rafa

Trả lời

10

Tôi đã tìm ra giải pháp liên quan đến việc sử dụng thư viện đa xử lý của Python.Tôi chỉ viết lên một bài đăng blog chi tiết về nó:

Raspberry Pi + Tornado + Arduino

Hope người khác tìm thấy nó hữu ích ...

+1

Liên kết của bạn đã chết:/ – Outpox

+0

Đây là bản sao lưu trữ.org http://web.archive.org/web/20160521032515/http://niltoid.com/blog/raspberry-pi-arduino-tornado/ –

0

Dưới đây là 2 cent của tôi. Tôi sẽ ủng hộ cho Python -> websockets-client route. Phần mềm máy chủ Tornado được tạo và điều chỉnh để xử lý các yêu cầu của máy khách web. Hãy để nó làm công việc của nó. Bất kỳ nỗ lực nào để shoehorn nó vào vai trò khác (như giám sát phần cứng cục bộ) sẽ gây ra nhiều chi phí hơn một cái gì đó (a) được thiết kế để thực hiện công việc đó (như chương trình C/C++) hoặc (b) đủ linh hoạt để xử lý một nhiệm vụ như vậy với khá ít chi phí (như một kịch bản Python).

Trải nghiệm có liên quan: Đã lập trình cho cả Raspberry Pi và Arduino. Cán bộ trong câu lạc bộ robot địa phương.

+0

Cảm ơn bạn đã đề xuất. Tôi đồng ý rằng tốt nhất là giữ com nối tiếp trong một chương trình riêng biệt. Xem giải pháp cuối cùng của tôi trong câu trả lời nếu bạn tò mò. – niltoid

Các vấn đề liên quan