DataTransferWebRaspberryArduino: Unterschied zwischen den Versionen

Aus Hackerspace Ffm
Wechseln zu: Navigation, Suche
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 
Hier wird beschrieben wie man Daten in Echtzeit und Duplex von einer WebSeite über den Raspberry Pi zum Arduino schicken kann.
 
Hier wird beschrieben wie man Daten in Echtzeit und Duplex von einer WebSeite über den Raspberry Pi zum Arduino schicken kann.
  
Als erstes brauchen wir einen WebServer. Da wir Python verwenden wollen nehmen wir [http://www.tornadoweb.org/en/stable/ Tornado].
+
Als erstes brauchen wir einen WebServer auf dem Raspi. Da wir Python verwenden wollen nehmen wir [http://www.tornadoweb.org/en/stable/ Tornado].
  
 
<pre>sudo pip install tornado</pre>
 
<pre>sudo pip install tornado</pre>
Zeile 39: Zeile 39:
 
</html>
 
</html>
 
</pre>
 
</pre>
 +
Das ist die Seite
 +
[[File:DataTransferWebRaspberryArduino_ui.PNG|border]]
  
 
Danach eine Python-Datei mit dem Server-Code erstellen /server/server.py
 
Danach eine Python-Datei mit dem Server-Code erstellen /server/server.py
Zeile 58: Zeile 60:
 
                 print 'from Arduino: ', data
 
                 print 'from Arduino: ', data
 
                 # received from Arduino written to all WebSocket clients
 
                 # received from Arduino written to all WebSocket clients
                 [con.write_message(data) for con in WebSocketHandler.connection$
+
                 [con.write_message(data) for con in WebSocketHandler.connections]
  
  
Zeile 71: Zeile 73:
 
         def on_message(self, message):
 
         def on_message(self, message):
 
                 print 'from WebSocket: ', message
 
                 print 'from WebSocket: ', message
                 ser.write(message);    # received from WebSocket writen to ard$
+
                 ser.write(message);    # received from WebSocket writen to arduino
  
 
         def on_close(self):
 
         def on_close(self):
Zeile 81: Zeile 83:
 
     def get(self):
 
     def get(self):
 
         self.render("index.html")
 
         self.render("index.html")
 
  
 
class Application(tornado.web.Application):
 
class Application(tornado.web.Application):
Zeile 104: Zeile 105:
 
     tornado.ioloop.IOLoop.instance().start()
 
     tornado.ioloop.IOLoop.instance().start()
 
</pre>
 
</pre>
 +
Zum Schluss noch ein Unterverzeichniss server/root erstellen. Hier können bei späteren Erweiterungen alle statischen Web-Inhalte rein.
 +
 +
Dann den Server mit python server.py starten.
  
 
Für den Arduino diesen Code verwenden.
 
Für den Arduino diesen Code verwenden.
 
<pre>
 
<pre>
 
+
void setup() {
 +
  Serial.begin(9600);
 +
  Serial1.begin(9600);
 +
}
 +
void loop() {
 +
  if(Serial.available()) {
 +
      Serial1.write(Serial.read());
 +
  }
 +
  if(Serial1.available()) {
 +
      Serial.write(Serial1.read());
 +
  }
 +
}
 
</pre>
 
</pre>
 +
 +
Die Verkabelung zwischen Raspi und Arduino ist in diesem Artikel beschrieben [[RaspberryGPIOSerial]].
 +
 +
Über den seriellen Monitor sind die ankommenden Daten zu sehen und können an die WebSeite geschickt werden.

Aktuelle Version vom 31. Juli 2017, 18:25 Uhr

Hier wird beschrieben wie man Daten in Echtzeit und Duplex von einer WebSeite über den Raspberry Pi zum Arduino schicken kann.

Als erstes brauchen wir einen WebServer auf dem Raspi. Da wir Python verwenden wollen nehmen wir Tornado.

sudo pip install tornado

Dann ein Verzeichniss für den Server anlegen /server/.

Dort ein Unterverzeichniss mit dem namen /server/templates anlegen und ein index.html Datei mit folgendem Inhalt erstellen.

<!DOCTYPE html>
<html>
<head>
    <title>Tornado WebSockets</title>
    <script>
        var ws;

        function onLoad() {
            ws = new WebSocket("ws://raspberrypi:9090/websocket");

            ws.onmessage = function(e) {
               //alert(e.data);
                document.getElementById('out').value += e.data;
            };
        }

        function sendMsg() {
            ws.send(document.getElementById('msg').value);
        }
    </script>
</head>
<body onload="onLoad();">
    Send:<input type="text" id="msg" maxlength="25" size="30" />
     <input type="button" onclick="sendMsg();" value="Send" />
<br>
Received:<br>
<textarea id="out" rows="4" cols="50"></textarea>
</body>
</html>

Das ist die Seite DataTransferWebRaspberryArduino ui.PNG

Danach eine Python-Datei mit dem Server-Code erstellen /server/server.py

import tornado.web
import tornado.websocket
import tornado.httpserver
import tornado.ioloop
import serial
import thread

ser = serial.Serial('/dev/ttyS0', 9600)
print(ser.name)

def readSerial():
        while True:
                data = ser.read();
                print 'from Arduino: ', data
                # received from Arduino written to all WebSocket clients
                [con.write_message(data) for con in WebSocketHandler.connections]


class WebSocketHandler(tornado.websocket.WebSocketHandler):
        connections = set()

        def open(self):
                self.connections.add(self)
                print 'new connection was opened'
                pass

        def on_message(self, message):
                print 'from WebSocket: ', message
                ser.write(message);     # received from WebSocket writen to arduino

        def on_close(self):
                self.connections.remove(self)
                print 'connection closed'
                pass

class IndexPageHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html")

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r'/', IndexPageHandler),
            (r'/websocket', WebSocketHandler),
            (r'/(.*)', tornado.web.StaticFileHandler, {'path': './root'})
        ]

        settings = {
            'template_path': 'templates'
        }
        tornado.web.Application.__init__(self, handlers, **settings)

if __name__ == '__main__':
    ser.flushInput()
    thread.start_new_thread(readSerial, ())
    ws_app = Application()
    server = tornado.httpserver.HTTPServer(ws_app)
    server.listen(9090)
    tornado.ioloop.IOLoop.instance().start()

Zum Schluss noch ein Unterverzeichniss server/root erstellen. Hier können bei späteren Erweiterungen alle statischen Web-Inhalte rein.

Dann den Server mit python server.py starten.

Für den Arduino diesen Code verwenden.

void setup() {
   Serial.begin(9600);
   Serial1.begin(9600);
}
void loop() {
   if(Serial.available()) {
      Serial1.write(Serial.read());
   }
   if(Serial1.available()) {
      Serial.write(Serial1.read());
   }
}

Die Verkabelung zwischen Raspi und Arduino ist in diesem Artikel beschrieben RaspberryGPIOSerial.

Über den seriellen Monitor sind die ankommenden Daten zu sehen und können an die WebSeite geschickt werden.