リモコンコンセントで家電をON/OFFする(スマホから電源ON/OFF)


PiMoteと いう製品を見つけました。
この製品は電波を使って、離れたところのコンセントをON/OFFできる製品ですが、日本には電波法があるので
国内で使えるかどうか不明です。

そこで、リモコンコンセント(OCR-05)を使ったリモート電源制御を紹介し ます。


赤外線発光部の回路図は以下の通りです(手書きですいません)


赤外線発光モジュールはeBayで10個85円で買ったメーカ不明、型番不明のものですが、スペックは以下の通りです。
Vf=1.5-2.2V
If=100mA

/boot/config.txtには以下を追加しています。
dtoverlay=lirc-rpi,gpio_in_pin=4,gpio_out_pin=14

こちらでリモコン の学習を行った後、以下のコマンドを実行すれば、リモコンコンセント電源の ON/OFFを行うことができます。
$ irsend SEND_ONCE OCR05 ON
$ irsend SEND_ONCE OCR05 OFF

スマホから「WebIOPi」を使ってGPIOをON/OFFし、Raspberry側ではそのピンの状態を監視して
ピンの状態に応じて、irsendコマンドを実行すれば、電源のON/OFFを行うことができます。
また、最近「Blynk」というスマホのアプリが発表されて話題になっていますが、
こちらでも簡単にGPIOをON/OFFすることができます。

「WebIOPi」はこ ちらのページに詳しく紹介されています。

参考までにGPIO23(16番ピン)を監視してリモコンコンセントをON/OFFするコードを以下に紹介します。
無駄に永久ループするのが嫌だったので、セマフォと割り込み処理を使っています。

このプログラムを動かした後、「WebIOPi」を使ってGPIO23(16番ピン)を出力モードに変更し、
GPIO23(16番ピン)をON/OFFするとリモコンコンセントがON/OFFします。





/*
cc -o ocr05 ocr05.c -lwiringPi
*/
#include <stdlib.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>
#include <signal.h>
#include <wiringPi.h>

// Define Button Pin
#define BUTTON    23      // rsp board pin:16

int semid;

//排他処理開始(ロック開始)
//自分よりも先にロックされていた場合にはロック解除されるまでスリープします
void lock(int semid){
    struct sembuf sb[1];
    sb[0].sem_num=0;
    sb[0].sem_op=-1;
    sb[0].sem_flg=0;
    if(EOF==semop(semid,sb,1)){
      printf("%s\n","lock ERR");
      exit(1);
    }
}

//排他処理終了(ロック解除)
void unlock(int semid){
    struct sembuf sb[1];
    sb[0].sem_num=0;
    sb[0].sem_op=1;
    sb[0].sem_flg=0;
    if(EOF==semop(semid,sb,1)){
      printf("%s\n","unlock ERR");
      exit(1);
    }
}

//セマフォ値のセット
void SemSetValue(int semid, int semnum, int semval) {
    union semun {
      int              val;     /* SETVAL の値 */
      struct semid_ds  *buf;    /* IPC_STAT, IPC_SET 用のバッファ */
      unsigned short   *array;  /* GETALL, SETALL 用の配列 */
    } ctl_arg;

    ctl_arg.val = semval;
    if((semctl(semid,semnum,SETVAL,ctl_arg))==EOF){
      printf("%s\n","semctl ERR");
      exit(1);
    }
}

//割り込み処理
void signal0(void){
    unlock(semid);
}

int main(int argc, char **argv) {
    int val;
    char on[40];
    char off[40];

    //セマフォを割り付けます
    semid=semget(IPC_PRIVATE,1,0666);
    if(semid==EOF){
      printf("%s\n","semget ERR");
      exit(1);
    }

    //セマフォに初期値を書き込みます
    SemSetValue(semid,0,0);

    //リモコンコマンド
    strcpy(on,"irsend SEND_ONCE OCR05 ON");
    strcpy(off,"irsend SEND_ONCE OCR05 OFF");

    if (wiringPiSetupGpio() == -1){
      printf("wiringPiSetup init error\n");
      exit(1);
    }
    pinMode(BUTTON, OUTPUT);

    //割り込みを設定します
    wiringPiISR( BUTTON, INT_EDGE_BOTH, signal0 );

    while(1){
      lock(semid); // Wait Unlock
      val=digitalRead(BUTTON);
      if (val == 0) system(off);
      if (val == 1) system(on);
    }

    //セマフォの削除
    if((semctl(semid,0,IPC_RMID,0))==EOF){
        printf("%s\n","semctl ERR");
        exit(1);
    }

    exit(0);
}





これでWifiが届く範囲にある家電はスマホなどからRaspberry経由で電源をON/OFFできるようになります。