テーマ Application Note Ref No: an2k-050 Last Modify 160428 Raspberry Pi でネットワークにアクセスする 使 用 機 器 MPC-2000 シリーズ, USB-RS,Raspberry Pi2 イメージ 名 刺 サイズのコンピュータ Raspberry Pi に Web サーバーを 乗 せて MPC の 状 態 を 取 得 変 更 します 小 型 で 安 価 な Raspberry Pi は IoT のソリューションのひとつです インターネット LAN パソコン タブレット など モデム ルーター WiFi ブラウザーで html にアクセス ハブ イーサネット ケーブル Or WiFi ドングル 時 計 のデータ 変 数 の 値 I/O の 状 態 時 計 の 調 整 変 数 の 変 更 RS-232 USB-RS Raspberry Pi2 USB OS は RASPBIAN(Linux raspberrypi 4.1.13) Web サーバーは Apache2 CGI は python で 作 成 この OS には 最 初 から FTDI のデバドラが 入 っている MPC RS-232 で Raspberry Pi と 通 信 USB-RS は FTDI のチップを 搭 載 している スレーブ 通 信 プログラムを 記 述 html 画 面 (Google Chrome) パソコンの 時 計 表 示 MPC の 時 計 表 示 と 調 整 (PC の 時 計 に 合 わせる ) MPC の 変 数 (SYSCLK) 表 示 と 設 定 MPC の 出 力 ポートの 状 態 ACCEL page 1/5
html ソース <HTML> <HEAD> <META charset="cp932" /> <TITLE>MPC 通 信 サンプル</TITLE> <SCRIPT src="http://code.jquery.com/jquery-1.11.1.min.js"></script> <SCRIPT src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.18/jquery.min.js"></script> <SCRIPT type="text/javascript"> cnt = 0; flg = 0; function main(){ document.form3.textarea1.value= String(cnt); cnt += 1; now = new Date(); str = addzero(now.gethours())+" 時 "; str+= addzero(now.getminutes())+" 分 "; str+= addzero(now.getseconds())+" 秒 "; document.form3.textarea2.value=str; send(); settimeout("main()",500); function addzero(i) { if (i < 10) { i = "0" + i; return i; function callback(json) { if( flg == 1)return; $("#result1").html(json.hoge1); $("#result2").html(json.hoge2); b=parseint(json.hoge3,10).tostring(2); h=parseint(json.hoge3,10).tostring(16) ; if( b.length < 8){ for( i = 0 ; 8 - b.length ; i++){ b= "0"+ b ; if( h.length < 2){ h= "0"+ h ; b = b + " [&H" + h.touppercase() + "]" ; $("#result3").html(b); // MPC Time // SYSCLK // binary string // hex string // IN(0) function send() { s.src = '/cgi-bin/test07.py'; flg = 0; return true; function send1() { flg = 1; var now = new Date(); var str = addzero(now.gethours())+" "; str+= addzero(now.getminutes())+" "; str+= addzero(now.getseconds())+" "; ACCEL page 2/5
s.src = '/cgi-bin/test07.py?-f '+ str return false; function send2() { flg = 1; var t = document.form3.textarea3.value; s.src = '/cgi-bin/test07.py?-d '+ t return false; </SCRIPT> </HEAD> <BODY onload="main();"> <FORM name="form3"> <CENTER> <TABLE cellspacing="1" cellpadding="2" border="2"> <TBODY> Count cols="20" name="textarea1" ></TEXTAREA> PC Time cols="20" name="textarea2"></textarea> MPC Time cols="20" name="textarea5" id="result1" ></TEXTAREA> <p></p> <input type="button" name="btn" value="adjust" onclick="return send1();" /> SYSCLK cols="20" name="textarea6" id="result2"></textarea> <p></p> <div style="display:inline-flex"> <form><textarea style="resize:none" rows="1" cols="5" name="textarea3" >0</TEXTAREA></form> </div> <input type="button" name="btn" value="set" onclick="return send2();" /> ACCEL page 3/5
IN(0) cols="20" name="textarea7" id="result3" ></TEXTAREA> </TBODY> </TABLE> </CENTER> </FORM> </BODY> </HTML> Python CGI スクリプト #!/usr/bin/python # -*- coding: cp932 -*- import argparse import sys import cgi import serial import time import cgitb cgitb.enable() argvs = sys.argv argc = len(argvs) # コマンドライン 引 数 を 格 納 したリストの 取 得 # 引 数 の 個 数 parser = argparse.argumentparser() # parser を 作 る parser.add_argument('-d', type=str ) # オプション 追 加 parser.add_argument('-f', type=str ) args = parser.parse_args() # コマンドラインの 引 数 を 解 釈 print "Content-Type:text/javascript" print con = serial.serial('/dev/ttyusb0',38400) if argc == 1 : con.write('b\r') rcv1 = con.readline() rcv1 = rcv1.strip() con.write('c\r') con.write('e\r') rcv3 = con.readline() rcv3 = rcv3.strip() else: if args.d : con.write('d'+ args.d + '\r') if args.f : con.write('f'+ args.f + '\r') #オプション 無 # Get TIME$ # Get SYSCLK # Get IN(0) # Set SYSCLK # RTC Adjust str= "callback({ 'hoge1' : '"+rcv1+"', 'hoge2' : '"+rcv2+"', 'hoge3' : '"+rcv3+"' );" print str ACCEL page 4/5
MPC プログラム QUIT_FORK 1 *main END *main QUIT_FORK 2 *IO rsch_=2 /* RS-232 Port No. CNFG# rsch_ "38400b8pns1NONE" INPUT# rsch_ CLR_BUF DO INPUT# rsch_ recv$ /* Raspberry Pi から 受 信 PR recv$ ptr_=recv$ arg$=ptr$(1) /* 先 頭 の 文 字 を 取 得 SELECT_CASE arg$ CASE "A" send$=date$(1) /* 年 月 日 CASE "B" send$=time$(1) /* 時 分 秒 CASE "C" send$=str$(sysclk) /* SYSCLK 値 CASE "D" SYSCLK=VAL(recv$) /* SYSCLK 設 定 CASE "E" send$=str$(in(0)) /* 出 力 の 状 態 CASE "F" SET_RTC VAL(recv$) VAL(0) VAL(0) /* 時 分 秒 設 定 CASE_ELSE END_SELECT PR send$ PRINT# rsch_ send$ "\r\n" /* Raspberry Pi に 返 信 LOOP *IO /* 出 力 のダミー 動 作 DO FOR i_=0 TO 255 OUT i_ 0 TIME 500 NEXT LOOP ACCEL page 5/5