èšäºãžã®ã³ã¡ã³ãã§ã¯ããã®ãããªãœãªã¥ãŒã·ã§ã³ãFirefoxã§æ©èœããªãããšãåŸæããããã®ããšãåºã«ããHTMLåºåã䜿çšããŠåçŽãªWebãµãŒããŒãäœæã§ããããšããèããè¡šæãããŸããã ãã®ã¢ã€ãã¢ã¯ç§ãã倢äžã«ãããããã°ãŒã°ã«ã§ã®ç°¡åãªæ€çŽ¢ã§ã¯æ¢æã®ãœãªã¥ãŒã·ã§ã³ãæäŸã§ããªãã£ãã®ã§ãèªåã§ã¢ã€ãã¢ãå®è£ ããããšã«ããŸããã ãããŠããããããããçãŸããŸããã
èŠåïŒ ãããªãå Žåã§ããææ¡ããããœãªã¥ãŒã·ã§ã³ãå®å šã§ãããšèŠãªãããã¹ãã§ã¯ãããŸããã Amperkaã®Serial Projectorãšã¯ç°ãªããããã¯ã³ã³ã»ããã§ãããå¯èœãªã¢ãããŒãã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã§ãããè©Šäœåã§ããããã以äžã®ãã®ã§ã¯ãããŸããã
ãã°ããåã«ãAndroidã¹ããŒããã©ã³ã«çµã¿èŸŒãŸããå é床èšã䜿çšããŠãArduinoã«æ¥ç¶ãããŠãããµãŒããŒãå¶åŸ¡ãããããžã§ã¯ããå®è¡ããŠããŸããã 次ã«ããããã®ç®çã®ããã«ããããžã§ã¯ãScripting Layer for AndroidïŒSL4AïŒããã³RemoteSensorsãå©çšããŸãã ã BaseHTTPServerããã±ãŒãžã¯æšæºã®pythonã©ã€ãã©ãªã«å«ãŸããŠãããããã䜿çšããŠpythonã§WebãµãŒãã¹ãäžããããšãã§ããŸããããã¯æ°è¡ã®ã³ãŒãã®ã¿ã¹ã¯ã§ãã
Arduinoã«ã¯æå ã«ã»ã³ãµãŒããªãã£ãã®ã§ã衚瀺ãããæ å ±ã®ãœãŒã¹ãšããŠArduino Unoã«å èµãããå éšæž©åºŠèšã䜿çšããŸããã ç§ã®ç¥ãéããããã¯ããŸãæ£ç¢ºã§ã¯ãªããåšå²æž©åºŠã枬å®ããããšãæå³ããŠããŸãããããããã¿ã€ãã³ã°ã«ã¯æå¹ã§ãã
çãã°ãŒã°ã«ã®åŸã«ããã®ã¹ã±ããã¯Arduinkaã«ç»å ŽããŸããã
// source: https://code.google.com/p/tinkerit/wiki/SecretThermometer long readTemp() { long result; // Read temperature sensor against 1.1V reference ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3); delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Convert while (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH<<8; result = (result - 125) * 1075; return result; } void setup() { Serial.begin(115200); } int count = 0; void loop() { String s = String(count++, DEC) + ": " + String( readTemp(), DEC ); Serial.println(s) delay(1000); }
ãã®ã¹ã±ããã¯COMããŒããéãã115200ããŒã¬ãŒãã«èšå®ããŠãããå èµæž©åºŠèšã®çŸåšã®å€ãæ¯ç§æžã蟌ã¿ãŸãã ïŒæž©åºŠãçºè¡ãããåäœãå°ããªãã§ãã ãã-ããã¯ã説æãããŠããåé¡ã«ãšã£ãŠéèŠã§ã¯ãããŸããïŒã å€ã¯ããŸãã¢ã¯ãã£ãã«å€åããªããããããŒã¿ã®å€åãèŠãããããããã«ã枩床ã®åã«è¡çªå·ã衚瀺ãããŸãã
WebãµãŒããŒãCOMããŒãããèªã¿åãè¡ã®äžéšã§ã¯ãªããè¡å šäœã®ã¿ãåºåããããšã確èªããã«ã¯ãè¡
Serial.println(s)
ã«çœ®ãæããããŸãã
for(int i=0; i < s.length(); i++ ){ Serial.print( s.charAt(i) ); delay( 200 ); } Serial.println("");
ã€ãŸã çæãããæååã¯å®å šã«ã·ãªã¢ã«ããŒãã«åºåãããã®ã§ã¯ãªããæåããšã«200ããªç§ã®äŒæ¢ã§åºåãããŸãã
æåã«ãWebãµãŒããŒã®éåžžã«åçŽãªãããã¿ã€ããäœæããŸããïŒä»¥äžã§éšåçã«å解ãããŠããŸãïŒã
# -*- coding: utf-8 -*- #-- based on: https://raw.githubusercontent.com/Jonty/RemoteSensors/master/remoteSensors.py SERIAL_PORT_NAME = 'COM6' SERIAL_PORT_SPEED = 115200 WEB_SERVER_PORT = 8000 import time, BaseHTTPServer, urlparse import serial ser = None def main(): global ser httpd = BaseHTTPServer.HTTPServer(("", WEB_SERVER_PORT), Handler) #-- workaround for getting IP address at which serving import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('google.co.uk', 80)) sData = s.getsockname() print "Serving at '%s:%s'" % (sData[0], WEB_SERVER_PORT) ser = serial.Serial(SERIAL_PORT_NAME, SERIAL_PORT_SPEED, timeout=0) httpd.serve_forever() class Handler(BaseHTTPServer.BaseHTTPRequestHandler): # Disable logging DNS lookups def address_string(self): return str(self.client_address[0]) def do_GET(self): self.send_response(200) self.send_header("Content-type", "application/x-javascript; charset=utf-8") self.end_headers() try: while True: new_serial_line = get_full_line_from_serial() if new_serial_line is not None: self.wfile.write(new_serial_line) self.wfile.write("\n") self.wfile.flush() except socket.error, e: print "Client disconnected.\n" captured = '' def get_full_line_from_serial(): """ returns full line from serial or None Uses global variables 'ser' and 'captured' """ global captured part = ser.readline() if part: captured += part parts = captured.split('\n', 1); if len(parts) == 2: captured = parts[1] return parts[0] return None if __name__ == '__main__': main()
ã¹ã¯ãªãããéšåçã«åæããŸãããã
ããã¯ãããã¿ã€ãã§ãããããäœæ¥ã®ãã¹ãŠã®äž»èŠãã©ã¡ãŒã¿ãŒïŒCOMããŒãåããã®é床ãããã³WebãµãŒããŒãæ©èœããTCPããŒãçªå·ïŒã¯ãœãŒã¹ããã¹ãã§çŽæ¥ç€ºãããŸãã
SERIAL_PORT_NAME = 'COM6' SERIAL_PORT_SPEED = 115200 WEB_SERVER_PORT = 8000
ãã¡ãããã³ãã³ãã©ã€ã³ãããããã®ãã©ã¡ãŒã¿ãŒã®èªã¿åããæŽçã§ããŸãã ããšãã°ãargparseã¢ãžã¥ãŒã«ã䜿çšãããšãããã¯éåžžã«è¿ éã«ãç°¡åãã€æè»ã«è¡ãããŸãã
ãã®å ŽåãWindowsãŠãŒã¶ãŒã¯ãããã€ã¹ãããŒãžã£ãŒã§Arduinãæ¥ç¶ãããŠããCOMããŒãã®ååãèŠã€ããå¿ èŠããããŸãã ãCOM6ãã§ããã ä»ã®OSã®ãŠãŒã¶ãŒã¯ãOSã®æ段ã䜿çšããå¿ èŠããããŸãã MacOSã®çµéšã¯ãŸã£ãããªããLinuxã§ã¯COMããŒãã䜿çšããŸããã§ããããã/ dev / ttySnãã®ãããªãã®ã«ãªãã§ãããã
次ã¯ãSerialã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ããã€ã³ããããã°ããŒãã«å€æ°ã®å®çŸ©ã§ããããã¯ãPythonã§COMããŒããæäœãã圹å²ãæãããŸãã
ser = None
䞊ãã§
httpd = BaseHTTPServer.HTTPServer(("", WEB_SERVER_PORT), Handler)
æå®ãããããŒãWEB_SERVER_PORTã§ãªã¯ãšã¹ãããªãã¹ã³ããWebãµãŒããŒãäœæãããŸãã ãããŠã以äžã§èª¬æããHandlerã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ã¯ãããã®ãªã¯ãšã¹ããåŠçããŸãã
次ã®è¡ã¯ãå®è¡äžã®WebãµãŒããŒãå®éã«åäœããIPã¢ãã¬ã¹ã衚瀺ã§ããå°ããªãããã¯ãã§ãã
#-- workaround for getting IP address at which serving import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('google.co.uk', 80)) sData = s.getsockname() print "Serving at '%s:%s'" % (sData[0], WEB_SERVER_PORT)
ç§ãç解ããŠããããã«ããã®IPãèŠã€ããä»ã®æ¹æ³ã¯ãããŸããã ãããŠããã®ç¥èãªãã§ãã©ãŠã¶ãããµãŒããŒã«ã¢ã¯ã»ã¹ããæ¹æ³ã¯ïŒ
ãããã£ãŠããã®ãœã±ããã®å±æ§ããç¬èªã®IPã¢ãã¬ã¹ã«é¢ããæ å ±ãæœåºããã«ã¯ããœã±ãããéããŠGoogleãµã€ãã«æ¥ç¶ããå¿ èŠããããŸãã
ããå°ãäœãã®ã¯ãCOMããŒãã®éå£éšãšWebãµãŒããŒã®å®éã®èµ·åã§ãã
ser = serial.Serial(SERIAL_PORT_NAME, SERIAL_PORT_SPEED, timeout=0) httpd.serve_forever()
次ã«ãå®è¡äžã®WebãµãŒããŒãåä¿¡ãããªã¯ãšã¹ãã®åŠçãæ åœããã¯ã©ã¹ã®èª¬æã«åŸããŸãã
class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
ããã¯BaseHTTPServerã¢ãžã¥ãŒã«ã«çµã¿èŸŒãŸããã¯ã©ã¹ã®åå«ã§ãããdo_GETã¡ãœããã®ã¿ããªãŒããŒã©ã€ãããã®ã«ååã§ãã
ããã¯ãŸã ãããã¿ã€ãã§ããããããµãŒããŒã¯ããããèŠæ±ã«ãæºè¶³ãããŸããã©ã®URLããèŠæ±ãããå Žåã§ããCOMããŒãããèªã¿åã£ããã¹ãŠã®ããŒã¿ãã¯ã©ã€ã¢ã³ãã«æäŸããŸãã ãããã£ãŠãHandler.do_GETã§ã¯ãæåã³ãŒããšå¿ èŠãªããããŒã§ããã«å¿çããŸãã
self.send_response(200) self.send_header("Content-type", "application/x-javascript; charset=utf-8") self.end_headers()
ãã®åŸãç¡éã«ãŒããéå§ãããCOMããŒãããè¡å šäœã®èªã¿åããè©Šè¡ããããã®è©Šè¡ãæåããå ŽåãWebã¯ã©ã€ã¢ã³ãã«æž¡ãããŸãã
while True: new_serial_line = get_full_line_from_serial() if new_serial_line is not None: self.wfile.write(new_serial_line) self.wfile.write("\n") self.wfile.flush()
åºç€ãšããŠãšããããããžã§ã¯ãã§ã¯ããã®ç¡éã«ãŒãã¯è©Šè¡ã§ãã©ããããããŸãã...ãããã¯ãé€ãããã®å©ããåããŠãæ¥ç¶ã®åæãæ éã«åŠçããããšã«ãªã£ãŠããŸãã ããããAndroidïŒåºæ¬ãããžã§ã¯ãã¯ãã®ããã«éçºãããïŒã§ãããã¯æ£åžžã«åäœããŸãããWindows XPã§ã¯åäœããŸããã§ãã-æ¥ç¶ãåæããããšãããã£ããããããšãåŠãã ããšããªãä»ã®äŸå€ããããŸãã ãããã幞ããªããšã«ãããã¯WebãµãŒããŒãæ£åžžã«åäœãã次ã®ãªã¯ãšã¹ããåãå ¥ããããšã劚ããŸããã§ããã
COMããŒãããè¡å šäœãååŸããæ©èœã¯ãã·ãªã¢ã«ãããžã§ã¯ã¿ãŒã®äœæè ãšåãåçã§æ©èœããŸãã
- COMããŒãããèªã¿åããããã¹ãŠãæ ŒçŽããã°ããŒãã«ãããã¡ããããŸã
- é¢æ°ã«ã¢ã¯ã»ã¹ãããã³ã«ãCOMããŒãããäœããèªã¿åãããšããŸã
- 圌女ãæåããã
- æå®ãããã°ããŒãã«ãããã¡ã«èªã¿åããè¿œå ããŸã
- è¡æ«æåã§ã°ããŒãã«ãããã¡ãæ倧2ã€ã®éšåã«åå²ããããšããŸã
- æåããå Žåãæåã®éšåãåŒã³åºãå ã®ããã·ãŒãžã£ã«è¿ãã2çªç®ã®éšåãã°ããŒãã«ãããã¡ã®æ°ããå€ãšããŠäœ¿çšããŸãã
- COMããŒãã«æ°ããããŒã¿ããªãå ŽåããŸãã¯è¡æ«èšå·ãèŠã€ãããªãå Žåãé¢æ°ã¯Noneãè¿ããŸãã
captured = '' def get_full_line_from_serial(): """ returns full line from serial or None Uses global variables 'ser' and 'captured' """ global captured part = ser.readline() if part: captured += part parts = captured.split('\n', 1); if len(parts) == 2: captured = parts[1] return parts[0] return None
çµæã¯æ¬¡ã®ãšããã§ãã
COMããŒãããèªã¿åãããè¡ããã©ãŠã¶ãŒã«è¡šç€ºãããããšãããããŸãã ãŠã§ãããã³ããšã³ãã«ã€ããŠã¯äœãããããŸãããJavaScriptãAjaxãCSSãDOMã¯ç§ã«ãšã£ãŠæã森ã§ãã ããããWebã€ã³ã¿ãŒãã§ãŒã¹ãäœæããããã°ã©ããŒã«ãšã£ãŠãããã¯ãã®åºåãAmperkaã®Serial Projectorãçæããã®ãšåãçŸããç»åã«å€æããã®ã«ååãªã¯ãã§ãã ç§ã®æèŠã§ã¯ãã¿ã¹ã¯ã¯ãWebãµãŒããŒã«ã¢ã¯ã»ã¹ããããããã¹ããªãŒã ãèªã¿åããèªã¿åã£ãæåŸã®è¡ãWebããŒãžã®é©åãªå Žæã«è¡šç€ºããJavaScriptã¹ã¯ãªãããäœæããããšã§ãã
念ã®ãããç§ã¯ãããå®å šã«ãã¬ã€ããããšã«ããèªåã§æåã®è¿äŒŒå€ãäœæããããšããŸããã ããã»ã©æ·±ããªãGoogleæ€çŽ¢ã§ã¯ãå®éã«ã¯ãå°ãªããšã以åã¯WebSocketsãŸãã¯Server-Sent Eventsããã®ãããªç®çã§äœ¿çšãããŠããããšã瀺åãããŸããã ã©ããã ããµãŒããŒéä¿¡ã€ãã³ãã®äœ¿çšã«é¢ããè¯ããã¥ãŒããªã¢ã«ãèŠã€ããã®ã§ããã®ãã¯ãããžãŒã䜿çšããããšã«ããŸããã
æ³šïŒ ãã®ãã¯ãããžãŒã¯Internet Explorer 8ãŸãã¯Android 2.3.5ã«çµã¿èŸŒãŸãããã©ãŠã¶ãŒã®ãããã§ãæ©èœããªãã£ããããããã¯æé©ãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãªãããã§ãã ãããã圌女ã¯å°ãªããšãFirefox 39.0ãç²åŸããŠããã®ã§ãç§ã¯ãã以äžãæãäžãããŸããã§ããã
æå®ãããæç§æžãšãã·ã¢èªã®å¥ã®æç§æžãèªãã åŸãç§ã¯simpl.info/eventsourceãããžã§ã¯ããåºç€ãšããŸãã ã
Pythonã¹ã¯ãªããã®èŠ³ç¹ããèŠããšãServer-Sent Eventsã®äžã®å€æŽã¯å®å šã«ãã€ããŒã§ãã
- ã¯ã©ã€ã¢ã³ãã«éä¿¡ãããããŒã¿ã®ã¿ã€ãã眮ãæããå¿
èŠããããŸãã
è¡
self.send_header("Content-type", "application/x-javascript; charset=utf-8")
ã«çœ®ãæãã
self.send_header("Content-type", "text/event-stream")
- ãŸããCOMããŒãããèªã¿åãããè¡ã®åã«ãæ¥é èŸãdataïŒããæ¿å
¥ããå¥ã®æ¹è¡æåãè¿œå ããŸãã
ã²ã
self.wfile.write(new_serial_line) self.wfile.write("\n")
ã«çœ®ãæãã
self.wfile.write('data: ' + new_serial_line) self.wfile.write("\n\n")
ä»ã®ãã¹ãŠã¯ããããå€æŽãããªããŸãŸã§ããã...
ãŸãã次ã®ã³ã³ãã³ããå«ãindex.htmlãã¡ã€ã«ãäœæããŸããã
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body> <h1></h1> <p id="data"></p> <script> var dataDiv = document.querySelector('#data'); var source = new EventSource('http://192.168.1.207:8000/') source.onmessage = function(e) { dataDiv.innerHTML = e.data; }; </script> </body> </html>
ãã®äžã§æãèå³æ·±ãã®ã¯ã©ã€ã³ã§ã
<p id="data"></p>
COMããŒããã次ã®è¡ãåºåããå ŽæãšãJavaScriptã¹ã¯ãªããã圢æããŸã
<script> var dataDiv = document.querySelector('#data'); var source = new EventSource('http://192.168.1.207:8000/') source.onmessage = function(e) { dataDiv.innerHTML = e.data; }; </script>
å®éã«WebãµãŒããŒããã¹ããªãŒã ãèªã¿åããæå®ããå Žæã«èªã¿åãæ å ±ã衚瀺ããŸãã
ããšãã°ããã£ã¹ã¯ãŸãã¯ä»ã®WebãµãŒããŒãããã©ãŠã¶ã§ãã®ãã¡ã€ã«ãéãããšãæå³ããŠããŸããããããã¯æ©èœããŸããã§ããïŒãã£ã¹ã¯ããããŒãžãéããšãjavascriptã¹ã¯ãªãããå®è¡äžã®Python WebãµãŒããŒã«äžåºŠã¢ã¯ã»ã¹ããŠããåæãããŸããã ç§ã¯ãªããããèµ·ãã£ãŠããã®ãç解ã§ããããããããŸããŸãªæ»æããã®ãã©ãŠã¶ä¿è·ã®äœããã®åœ¢ã§ãããããããªããšç€ºåããŸããã 圌ã¯ãããããããŒãžèªäœã1ã€ã®ãœãŒã¹ããéãããŠããŠãã¹ã¯ãªãããå¥ã®ãœãŒã¹ããããŒã¿ãèªã¿åãããšã奜ãŸãªãã§ãããã
ãã®ããããã®htmlããŒãžãã¬ã³ããªã³ã°ããããã«Python WebãµãŒããŒãå€æŽããããšã決å®ãããŸããã 次ã«ãããŒãžãšã¹ããªãŒã ã®äž¡æ¹ã1ã€ã®ãœãŒã¹ããèªã¿åãããããšãå€æããŸãã ã»ãã¥ãªãã£ã«é¢ããç§ã®ä»®å®ãæ£ããã®ããä»ã®äœããå€æããã®ãã¯ããããŸãããããã®å®è£ ã§ã¯ãã¹ãŠæ£åžžã«æ©èœããŸããã
ãã¡ããããã³ãã©ãŒãªã¯ãšã¹ããã³ãã©ãŒã¯ã©ã¹ãå€æŽããã ãã§ãã
class Handler(BaseHTTPServer.BaseHTTPRequestHandler): # Disable logging DNS lookups def address_string(self): return str(self.client_address[0]) def do_GET(self): if self.path == '/' or self.path == '/index.html': self.process_index() elif self.path == '/get_serial': self.process_get_serial() else: self.process_unknown() def process_index(self): self.send_response(200) self.send_header("Content-type", "text/html; charset=utf-8") self.end_headers() self.wfile.write(open('index.html').read()) self.wfile.write("\n\n") self.wfile.flush() def process_get_serial(self): self.send_response(200) self.send_header("Content-type", "text/event-stream") self.end_headers() try: while True: new_serial_line = get_full_line_from_serial() if new_serial_line is not None: self.wfile.write('data: ' + new_serial_line) self.wfile.write("\n\n") self.wfile.flush() except socket.error, e: print "Client disconnected.\n" def process_unknown(self): self.send_response(404)
ãã®ãªãã·ã§ã³ã§ã¯ãWebãµãŒããŒãã/index.htmlãïŒããŒãžã®htmlã³ãŒããäžããïŒãšã/ get_serialãïŒCOMããŒãããèªã¿åã£ãè¡ã®ç¡éã¹ããªãŒã ãäžããïŒã®2ã€ã®èŠæ±ã®ã¿ã«å¿çããããšãåæãšããŠããŸãã 圌ã¯ä»ã®ãã¹ãŠã®ãªã¯ãšã¹ãã«404ã®ã³ãŒãã§å¿çããŸãã
index.htmlã¯Python WebãµãŒããŒã«ãã£ãŠæäŸããããããCOMããŒãããã®è¡ã®ã¹ããªãŒã ã®çµ¶å¯Ÿã¢ãã¬ã¹ã®ä»£ããã«æå®ããããšã§ããããã«å€æŽã§ããŸãã
è¡
var source = new EventSource('http://192.168.1.207:8000/')
ã«çœ®ãæãã
var source = new EventSource('/get_serial')
ãã®çµæã次ã®ããã«ãªããŸããã
ããã§ç§ã¯ãããããšã«ããã ããŒãžã®ãã¶ã€ã³ã¯çŸããããã«æããŸã-ãã§ã«éåžžã«ã·ã³ãã«ãªã¯ãã§ãã ããããç§ã¯HTMLãCSSãææããŠããªãã®ã§ãä»ã®äººã«ããããããŠãã ããã COMããŒãããããŒã¿ãéä¿¡ããWebãµãŒãã¹ãäœæããããšã¯ããŸã£ããé£ããããšã§ã¯ãªãããšã瀺ãããšã«ç§ã®ã¿ã¹ã¯ãèŠãŸããã
ãã¹ãŠã®ãœãŒã¹ã¯githubã§ååŸã§ããŸãã
ç¹°ãè¿ããŸãããæ瀺ãããã³ãŒãã¯ãçç£ã«æå ¥ãã§ããå®å šãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããã ããã¯ãåé¡ã解決ããããã®åºæ¬çãªã¢ãããŒãã瀺ããããã¿ã€ãã«ãããŸããã
ããã§ä»ã«ã§ããããšïŒ
- ãŸããPythonã¹ã¯ãªããã®COMããŒãããããŒã¿ãèªã¿åãã®ã¯éåžžã«ãé¢åãã§ããå®éããäœãæ°é®®ãªãã®ã¯ãããŸããïŒããšãã絶ãéãªãããŒãªã³ã°ããããŸãã ãã¡ããããã®ã¢ãããŒãã¯ããã»ããµãŒãããŒãããã³ã³ãã¥ãŒã¿ãŒäžã®1ã€ã®ã³ã¢ã100ïŒ
å æãããŸãã
解決çãšããŠãã¿ã€ã ã¢ãŠãä»ãã®ãããã¯èªã¿åãã䜿çšã§ããŸãã ãããè¡ãã«ã¯ãCOMããŒããéããšãã«ãã¿ã€ã ã¢ãŠããšããŠãŒã以å€ã®å€ïŒç§åäœïŒãæå®ããã ãã§ååã§ãã次ã«äŸã瀺ããŸãã
ser = serial.Serial(SERIAL_PORT_NAME, SERIAL_PORT_SPEED, timeout=0.03)
ããã«ãpySerialã¢ãžã¥ãŒã«ã®èª¬æã«ã¯ããTCP / IP-ã·ãªã¢ã«ããªããžãããã·ã³ã°ã«ããŒãTCP / IP-ã·ãªã¢ã«ããªããžïŒRFC 2217ïŒããããã³ããã«ãããŒãTCP / IP-ã·ãªã¢ã«ããªããžïŒRFCïŒ 2217ïŒã-å°é家ããã®ãããªåé¡ãã©ã®ããã«è§£æ±ºããããèŠãããšãã§ããŸãã - 次ã«ã1ã€ã®ã¯ã©ã€ã¢ã³ãã®ã¿ãããŒã¿ãåä¿¡ã§ããŸãã æåã®ã¯ã©ã€ã¢ã³ãã§ããŒãžãéãããããŸã§ããã®ãµãŒããŒã«æ¥ç¶ããŠ2çªç®ã®ã³ã³ãã¥ãŒã¿ãŒã§å€ãåãåãããšã¯ã§ããŸããã äžæ¹ã§ãããã¯ããããæ£ããã§ããCOMããŒãã¯1ã€ã ãã§ãè€æ°ã®ã³ã³ã·ã¥ãŒãããããŸãããã®ãã¡ã®ã©ããèªã¿åãè¡ãæäŸããå¿
èŠããããŸããïŒ ãã®è³ªåãžã®çããããã¹ãŠãã§ããã¹ãã ãšæããªãããã®åé¡ã«é¢ããç§ã®èããããã«ãããŸãã ãã®è³ªåã¯ãè€æ°ã®Webã¯ã©ã€ã¢ã³ãã®èŠæ±ãåæã«åŠçã§ãããæ£çŽãªããã«ãã¹ã¬ããWebãµãŒããŒïŒããšãã°ãTornadoãFlaskãªã©ïŒã䜿çšããã ãã§ã¯è§£æ±ºã§ããªãããã«æããŸãã åã¹ã¬ããããCOMããŒããéããŠèªã¿åãããšã¯ã§ããªãããããã®å ŽåãCOMããŒãããã®ããŒã¿ã¯1ã€ã®ã¹ã¬ãã/ããã»ã¹ã®ã¿ã«éãããŸãã ãããã£ãŠãç§ã®æèŠã§ã¯ããµãŒããŒéšåã2ã€ã®éšåã«åããå¿
èŠããããŸãã
- COMããŒãã§åäœããzmqãµãŒããŒã¯ãããããè¡ãèªã¿åããPUBãœã±ãããä»ããŠãã¹ãŠã®é¢å¿ã®ããã³ã³ã·ã¥ãŒããŒã«éä¿¡ããŸã
- COMããŒãã«æ¥ç¶ãã代ããã«Python WebãµãŒããŒãzmqãµãŒããŒã«æ¥ç¶ããããããããŒã¿ãåä¿¡ãã
ZMQã©ã€ãã©ãªïŒZeroMQïŒã«æ £ããŠããªãå Žåã¯ã代ããã«éåžžã®TCP / IPãŸãã¯UDPãœã±ããã䜿çšã§ããŸããããã®ã©ã€ãã©ãªã䜿çšãããšãã®ãããªåé¡ãç°¡åã«è§£æ±ºã§ãããããZMQã«ã€ããŠç¥ãããšã匷ããå§ãããŸãã ZMQã®å©ããåããŠããœãªã¥ãŒã·ã§ã³ã¯æ倧20è¡ã«åãŸãããã«æããŸãã ïŒç§ã¯å©ããããšã¯ã§ããŸããããèšè¿°ãããåé¡ã解決ããäºå®ã¯ãããŸããããããªãã®ä»äºã¯ã¹ã¬ãã/ããã»ã¹éã§ããŒã¿ã亀æãããã«ãã¹ã¬ãã/ãã«ãããã»ã¹ããã°ã©ãã³ã°ã«é¢é£ããŠããå Žåã§ãããã®ã©ã€ãã©ãªãèŠãŠãã ãã-å€åããã¯ããªãããã£ãšè©±ããŠããããšã§ã倢èŠãïŒ - ãããŸã§ã®ããŒã¿ã¹ããªãŒã ã¯ãCOMããŒãããWebãã©ãŠã¶ãŸã§ã®åæ¹åã§ãã ãã©ãŠã¶ããArduinoã«ãŸã ããŒã¿ãéä¿¡ããããšã¯ã§ããŸããã ãã®ã¿ã¹ã¯ãããã»ã©é£ããã¯ãªãããã§ãåã®ã¿ã¹ã¯ãšã¯ç°ãªãã解決ããããšããã§ããŸãã
- ãã«ãã¹ã¬ãããµãŒããŒã䜿çšãã
- Handler.do_GETã¡ãœããããã¡ã€ãã©ã€ãºããŠããã©ã¡ãŒã¿ãŒä»ãã®GETãªã¯ãšã¹ããåãå ¥ããç¹å®ã®å€ãCOMããŒãã«éä¿¡ãã
ç§ã®æèŠã§ã¯ãArduino IDEã«çµã¿èŸŒãŸããWebããŒã¹ã®ã·ãªã¢ã«ããŒãã¢ãã¿ãŒã®æ¬æ Œçãªã¢ããã°ãæžãããã®ã§ããã°ãããã»ã©é£ãããããŸããã ç§ã«ãšã£ãŠã¯ãéåžžã®ããã³ããšã³ããäœæããããšã ããé£ãããšæããŸãã
- ãã©ãŠã¶ãä»ããŠãCOMããŒãã®ååãšãã®æäœãã©ã¡ãŒã¿ãŒãèšå®ããããšã¯ãŸã ã§ããŸããã äžæ¹ã§ãããã¯è«ççã«æããŸããç§ãã¡ã®ææã®å察åŽã®ãŠãŒã¶ãŒã¯ãã©ã®COMããŒããšã©ã®é床ã§Arduinãæ¥ç¶ãããŠããããã©ã®ããã«ããŠç¥ãããšãã§ããŸããïŒ ããããåãã³ã³ãã¥ãŒã¿ãŒã§å®è¡ãããŠããPython WebãµãŒããŒãæ£ç¢ºã«èªèããŠããŸãã ãã ããCOMããŒãã®ååãäœæ¥ã®ãã©ã¡ãŒã¿ãŒãå€æŽããæ©äŒããŠãŒã¶ãŒã«äžããããšãäŸç¶ãšããŠæãŸããå Žåã¯ãHandler.do_GETã¡ãœããããã¡ã€ãã©ã€ãºããããšã§ç°¡åã«è§£æ±ºã§ããŸãã
- ãµãŒããŒãèµ·åããã«ã¯ãpythonãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã ããã¯äžè¬çã«é£ããããšã§ã¯ãããŸããããäœããã®çç±ã§ãããå®è¡ã§ããªãå ŽåãæãŸãªãå Žåã¯ãpyInstallerãå©ãã«ãªããŸãã ããã䜿çšããŠãPythonã¹ã¯ãªããã1ã€ã®å®è¡å¯èœãã¡ã€ã«ïŒWindowsã®å Žåã¯.exeïŒã«çµåããarduinkaãæ¥ç¶ãããŠããã³ã³ãã¥ãŒã¿ãŒã«ç°¡åã«ã³ããŒã§ããŸãã
ããããæåã®è§£æ±ºçã¯ããã®å Žåã«Goèšèªã䜿çšããããšã§ãã ç§ã®ç¥ãéãããã®äžã§ãé åžãçšã®ãã¡ã€ã«ãäœæããã¿ã¹ã¯ã¯ãããã解決ãããŸãã
çµè«ãšããŠããæ¢æã®ã¯ã©ãŠãã䜿çšããŠãã®åé¡ã解決ããã®ã¯ç°¡åã§ã¯ãªãã§ããããïŒããšããçåãçãããããããŸããã ã¯ã©ãŠãã®COMããŒãããèªã¿åã£ãããŒã¿ãå ¬éããŠãã¯ã©ã€ã¢ã³ãäžã§ã¯ã©ãŠãã®å¯Ÿå¿ãããµãŒãã¹ã«ã¢ã¯ã»ã¹ããã ãã§ã¯ã©ãã§ããïŒ ããããããã®ãããªãœãªã¥ãŒã·ã§ã³ã«ã¯ååšããæš©å©ããããŸããããã®ãããªãœãªã¥ãŒã·ã§ã³ãé©çšããåã«ã次ã®è³ªåã«çããå¿ èŠããããŸãã
- å¿ èŠãªé床/é »åºŠã§ããŒã¿ãå ¬éã§ããæ¢è£œã®WebãµãŒãã¹ã¯ãããŸããïŒ ãããã®äžã«ç¡æã®ãã®ããããŸããããŸãã¯å¯Ÿå¿ãããéãæ¯æãæºåãã§ããŠããŸããïŒ
- ã¯ã©ãŠããŸãã¯ã¯ã©ãŠããžã®æ¥ç¶ãèœã¡ãå ŽåãããŒã¿ãªãã§æŸçœ®ããããšããäºå®ã®æºåãã§ããŠããŸãã
- ããéšå±ããå¥ã®éšå±ã«ããŒã¿ã転éããããã«ãæµ·ãŸãã¯å€§éžã®ååã2å暪æããã®ã¯é¢åã§ããïŒ