赤外線信号を送信し、家電のコントロールを行うためのプログラム。 動作には、赤外線LEDとコントロール用のHTMLが必要です。 注:今のところ安定して動作していません。 朝に電源を入れて、夕方にはサーバが死んでいる状況が続いています。 とりあえず、公開していますが原因究明している段階のモノです。

Dependencies:   EthernetNetIf HTTPServer RPCInterface RemoteIR mbed

注:今のところ安定して動作していません。 朝に電源を入れて、夕方にはサーバが死んでいる状況が続いています。 とりあえず、公開していますが原因究明している段階のモノです。

回路図(Circuit)

Ethernetのコネクタの周りが適当です。 自分はスイッチサイエンスさんのmbed用イーサネット接続キットを使用して回路を作りました。

HTML

このプログラムを使用する際に必要なHTMLです。 mbedにプログラムを書き込む際に同じフォルダ下に入れてください。

html

<html>
    <head>
        <script src="mbedRPC.js" language="javascript"></script>
        <script type="text/javascript">
            mbed = new HTTPRPC();
            light1 = new RPCFunction(mbed,"light1");
            light2 = new RPCFunction(mbed,"light2");			
			aircon = new RPCFunction(mbed,"aircon");
        </script>
    </head>
    <body>
         <br>
		<input type="button" name="Light1 ON" value="Light1 ON" onClick="buttonClicked()"><br>
		<input type="button" name="Light2 ON" value="Light2 ON" onClick="buttonClicked2()"><br>
		<input type="button" name="Air-Con ON" value="Air-Con ON" onClick="buttonClickedAir()"><br>
        <script language="javascript">
			function buttonClicked(){
				/*alert("送信")*/
				light1.run(" ");
			}
			
			function buttonClicked2(){
				/*alert("送信")*/
				light2.run(" ");
			}
			
			function buttonClickedAir(){
				/*alert("送信")*/
				aircon.run(" ");
			}
        </script>
    </body>
</html>
Revision:
0:79a0104e2c51
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Mar 02 13:34:04 2014 +0000
@@ -0,0 +1,152 @@
+/**
+ * RPC Remote
+ * 
+ * 赤外線信号の送信をRPCを介して送信するプログラム
+ * (2014年3月2日公開) 
+ * Takumi Okamoto 
+ * 注意:現在の所、安定した動作をしていません。
+ * 朝電源を入れて、夕方頃には動作をしていないことが多々あります。
+ */
+
+
+#include "mbed.h"
+#include "EthernetNetIf.h"
+#include "HTTPServer.h"
+#include "TransmitterIR.h"
+#include "RPCFunction.h"
+#include "RPCVariable.h"
+
+TransmitterIR ir_tx(p21);
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+LocalFileSystem fs("webfs");
+
+
+/*
+EthernetNetIf   m_Ether(
+    IpAddr( 192,168,  0, 7 ), // IP Address
+    IpAddr( 255,255,255,  0 ), // Mask
+    IpAddr( 192,168,  0,  1 ), // Default Gateway
+    IpAddr( 192,168,  0,  1 )  // DNS
+);
+*/
+EthernetNetIf eth;
+
+HTTPServer svr;
+
+
+/**
+ * RPCに登録する関数野プロトタイプ宣言
+ * RPCに登録できる関数は
+ * void funtion(char * input, char * output)
+ * の形
+ */
+void irSend(char * input, char * output);
+void irSignalSend(char * input , char * output);
+void turnONLight1(char * input, char * output);
+void turnONLight2(char * input, char * output);
+void turnONAirConditioner(char* input,char* output);
+
+/**
+ * RPCへの関数の登録
+ * RPCFunction rpc_TurnONLight1(関数アドレス,"コールする際のテキスト");
+ * TODO sscanf等を使用して、汎用的な赤外線信号の送信関数を作る
+ */
+RPCFunction rpc_TurnONLight1(&turnONLight1,"light1");
+RPCFunction rpc_TurnONLight2(&turnONLight2,"light2");
+RPCFunction rpc_turnONAirConditioner(&turnONAirConditioner,"aircon");
+
+void turnONLight1(char * input, char * output){
+    
+    RemoteIR::Format format = RemoteIR::NEC;
+    uint8_t buf[] = { 0x82, 0xE8, 0x80, 0x7F };//結局ベタ書きしてます。
+    int bitcount = 32;
+    for(int i=0; i<3 ;i++){
+        if (ir_tx.getState() == TransmitterIR::Idle) {
+            bitcount = ir_tx.setData(format, buf, bitcount);
+        }
+    }
+    led4=1;
+    wait(0.5);
+    led4=0;
+    
+    printf("light1");
+}
+
+void turnONLight2(char * input, char * output){
+    RemoteIR::Format format = RemoteIR::NEC;
+    uint8_t buf[] = { 0x82, 0xE8, 0x81, 0x7E };//
+    int bitcount = 32;
+     for(int i=0; i<3 ;i++){
+        if (ir_tx.getState() == TransmitterIR::Idle) {
+            bitcount = ir_tx.setData(format, buf, bitcount);
+        }
+    }
+    led4=1;
+    wait(0.5);
+    led4=0;
+    
+    printf("light2");
+}
+
+void turnONAirConditioner(char* input,char* output){
+    RemoteIR::Format format = RemoteIR::AEHA;
+    uint8_t buf[] = {
+         0x23, 0xCB, 0x26, 0x01,
+         0x00, 0x20, 0x08,0x0A, 
+         0x30, 0x40, 0x00, 0x00, 
+         0x00, 0x00, 0x00, 0x00, 
+         0x00, 0xB7 };//
+    int bitcount = 144;
+    for(int i=0; i<3 ;i++){
+        if (ir_tx.getState() == TransmitterIR::Idle) {
+            bitcount = ir_tx.setData(format, buf, bitcount);
+        }
+    }
+    led4=1;
+    wait(0.5);
+    led4=0;
+    
+    printf("aircon");
+}
+
+/**
+ * メイン関数
+ * 
+ */
+int main()
+{
+    Base::add_rpc_class<DigitalOut>();
+    Base::add_rpc_class<AnalogIn>();
+    Base::add_rpc_class<PwmOut>();
+
+    printf("Setting up...\n");
+
+    EthernetErr ethErr = eth.setup();
+    if(ethErr) {
+        printf("Error %d in setup.\n", ethErr);
+        return -1;
+    }
+    printf("Setup OK\n");
+    IpAddr ip = eth.getIp() ;             //IP Address Read
+    printf(" [%d.%d.%d.%d]\r\n", ip[0], ip[1], ip[2], ip[3] ) ;
+
+    FSHandler::mount("/webfs", "/files"); //Mount /webfs path on /files web path
+    FSHandler::mount("/webfs", "/"); //Mount /webfs path on web root path
+
+    svr.addHandler<RPCHandler>("/rpc");// /rpcをRPCのパスとして設定
+    svr.addHandler<FSHandler>("/files");
+    svr.addHandler<FSHandler>("/"); //Default handler
+    svr.bind(80);//
+
+    printf("Listening...\n");
+
+    led1 = 0;
+    while(true) {
+        Net::poll();
+    }
+}
+