Ryosuke Nakagawaのブログ

まなびをシェア

RaspberryPiに赤外線LEDを組み合わせて自宅の照明をiPhoneから操作する 1.赤外線受信編

必要は発明の母

4月から新社会人になりまして2月に引っ越ししました.
新居のリビングの照明はリモコンor壁のスイッチで操作します.
リモコンスタンドが壁に備え付けられているので,普段はリモコンを挿しっぱなしにしてます.
ところが,これでは寝るときに不便です.布団に入るまえにリモコンホルダーからリモコンを持ち出しておかないと,
いざ寝ようとしたときにリモコンが遠くて布団をでなくてはいけまん.
この状況を打開するべく,iPhoneから照明を操作できるようにしました.

どんなものを作ったか

こんな感じ↓
f:id:ryosukeeeee:20190421222850p:plain

これから数回に分けて投稿していきます.

ロードマップ

  1. 照明のリモコンから送信される赤外線信号を解析する.
  2. 解析した赤外線信号を赤外線LEDから送信する.
  3. Node.jsとExpressで照明操作用APIを作る.
  4. iOSアプリでAPIを叩く

使ったデバイス

https://www.raspberrypi.org/app/uploads/2017/05/Raspberry-Pi-Model-B-1-462x322.jpg
もともと家で常時起動させてたラズパイがあったので,そいつを使いました.OSはRaspbianです.
なお,raspberry Piの初期設定の方法はここでは説明しません.

http://akizukidenshi.com/img/goods/C/I-00872.jpg
赤外線センサです.受信した赤外線の強度に応じて電圧が変化します.

http://akizukidenshi.com/img/goods/C/I-12612.jpg
次回以降の記事で使います.赤外線の送信ができます.赤外線は目に見えないのでデバッグ用に普通の(可視光領域の)LEDもあると便利です.

http://akizukidenshi.com/img/goods/C/I-09669.jpg
次回以降の記事で使います.GPIOから出力できる弱い電流で回路をオン・オフするために使います.

http://akizukidenshi.com/img/goods/C/K-05148.JPG
次回以降の記事で使います.raspberry Piの5Vピンの最大出力電流が足りなかったので,電源を追加するために使います.


リモコンの赤外線信号を受信する.

まずは赤外線を受信します.


赤外線送受信用の有名なライブラリにlircがあります.
lircについて知りたい方はこの記事がわかりやすくておすすめです.
nomunomu.hateblo.jp

lircは高機能なのですが設定が難しいです.無事にインストールして動かすことはできましたが,この記事のプログラムがシンプルでつかいやすかったのでこちらを採用しました.


赤外線リモコン受信モジュールのデータシートの4ページでピン配置を確認します.
Vcc, GND, Voutをraspberry PiのGPIOと接続します.raspberry PiのGPIOの配置は下の画像のとおりです.
https://www.bigmessowires.com/wp-content/uploads/2018/05/Raspberry-GPIO.jpg


私の環境では,raspberry Piのピンに直接つないでしまうとノイズが入ってうまく受信できませんでした.
こちらの記事を参考にコンデンサを追加したところノイズがなくなりました.
というわけで完成した回路がこちらです.
f:id:ryosukeeeee:20190421222853p:plain


このように回路を組んだらこの記事のプログラムをscan.cというファイル名で保存します.

//
//  scan.c
//  Copyright © 2018 Hiroki Kawakami. All rights reserved.
//

#include<stdio.h>
#include<stdlib.h>
#include<sys/time.h>
#include<wiringPi.h>

struct timeval sharedTimeval;
double current() {
    gettimeofday(&sharedTimeval, NULL);
    return sharedTimeval.tv_sec * 1e6 + sharedTimeval.tv_usec;
}

int main(int argc, char **argv) {

    // wiring pi setup
    if (wiringPiSetupGpio() < 0) {
        fprintf(stderr, "Failed to setup wiring pi\n");
        return 1;
    }

    // obtain read pin number
    int pin = 20;
    if (argc > 1) {
        pin = atoi(argv[1]);
    }
    fprintf(stderr, "GPIO Pin Number : %d\n", pin);

    // obtain wait interval (us)
    double wait = 4e4;
    if (argc > 2) {
        wait = atoi(argv[2]);
    }

    // set gpio pin mode
    pinMode(pin, INPUT);

    double buffer[1024];
    double currentTime;
    int currentState, lastState;
    int offset = 0;

    lastState = digitalRead(pin);

    fprintf(stderr, "Scanning begin\n");

    while(1) {
        currentTime = current();
        if (offset && currentTime > buffer[offset - 1] + wait) {
            break;
        }

        currentState = digitalRead(pin);
        if (currentState != lastState) {
            buffer[offset++] = currentTime;
            lastState = currentState;
        }
    }

    fprintf(stderr, "Scanning end\n");

    fprintf(stderr, "Output begin\n");

    int i;
    for (i = 1; i < offset; i++) {
        printf("%.0lf%s", buffer[i] - buffer[i - 1], (i & 1) ? "\t" : "\n");
    }

    fprintf(stderr, "Output end\n");

    return 0;
}

ファイルを保存したらコンパイルします.忘れずにwiringPiをリンクしましょう.

$ gcc scan.c -o scan -lwiringPi


まだwiringPiをインストールしてない方はここを参考にしてください.
tool-lab.com



コンパイルできたら,試しに以下のコマンドで実行してみます.
実行したら,赤外線リモコン受信モジュールに向けて適当なリモコンから信号を送ってください.

$ ./scan 20 > lightOn


うまくいけば,同じディレクトリにlightOnというファイルが作成されているはずです.



今回はここまで.次回は赤外線送信編です.