水瓶座列車

どこまで行けるか、とりあえず発車します。

RaspberryPi(ラズパイ)で赤外線データを受信してLEDを点灯する手順

f:id:aquarius999:20201008184428j:plain

 

 

 

外出先から自宅のエアコンの電源を入れることをしたいのですが、

それには、赤外線データの受信、エアコンリモコンからの送信データ学習、赤外線データの送信と、

段階を踏む必要があります。

赤外線データを受信する手順について、ネットでもいろいろ調べてみたのですが、なかなか面倒なので、

以前に購入したOSOYOOのセンサーセットの説明書を参考にしていきたいと思います。

ただ、OSOYOOの説明書も記述が古いので、ここでは私が動作確認を行った手順を説明していきます。

使用しているラズパイのバージョンは3B+です。 

 

 

 

 

 

  1.赤外線の受信モジュール

 

赤外線データの受信モジュールは、

OSOYOOのセンサーセットに含まれている下記を使用します。 

f:id:aquarius999:20201008184529j:plain

接続は、

 ・左が、赤外線データを受信するためのGPIO

 ・真ん中が、GND(グランド)

 ・右が、5V電源

になっています。

 

ここでは、赤外線データを受信する線にGPIO18を使用します。

そして、OSOYOOの説明書では、電源は3.3Vとありますが、5Vに接続します。

何故かは、4項で説明したいと思います。

 

 

  2.ラズパイと赤外線モジュールの接続

 

ラズパイと赤外線受信モジュールとLEDの接続は、こんな感じです。

f:id:aquarius999:20201008184557j:plain

 

赤外線受信モジュールには、左からGPIO18、GND、5Vに接続し、

LEDの左側には抵抗を挟んでGPIO17に、右側はGNDに接続しています。 

 

  3.LIRCライブラリのインストールと設定

 

赤外線送受信をするためにLIRCライブラリをインストールします。

 

# sudo apt-get install -y lirc liblircclient-dev 

 

インストール後、/etc/lircというフォルダと設定ファイルが生成されます。

lircは、赤外線データを受信送信するデーモンで、

liblircclient-devは、受信した赤外線データをプログラム上でボタン判定したり、

赤外線データを送信したりするAPIがあるライブラリです。

 

次に、赤外線通信ができるようにする設定は、

/boot/config.txtファイルを下記のように修正します。 

f:id:aquarius999:20190804184310p:plain

 

左側が修正後で、右側が修正前ファイルです。 

もともとコメントされている箇所を有効にして、赤外線の受信送信で使用する、

GPIO番号を設定します。

ファイル修正後、ラズパイを再起動すると/dev/lirc0のデバイスファイルが生成されます。

 

OSOYOOのセンサーキットの説明書では、「/etc/modulesを修正する」と記載がありますが、

これは不要でした。 

 

 

 

 

  4.赤外線データの受信手順

 

LIRCライブラリをインストール直後から、lircdデーモンが起動していることを確認します。

 

まずは、デーモンを停止してデーモン経由ではなく、

mode2コマンドを使用してデータ受信できているかを確認します。

 

$ sudo /etc/init.d/lircd stop
$ mode2 -d /dev/lirc0

 

実行後、OSOYOOのリモコンを赤外線受信モジュールの受光部に向けて、

何かボタンを押すと、標準出力でデータが表示されることを確認します。 

f:id:aquarius999:20190804185659p:plain

 

ボタンを押下すると、space以下から出力されます。

コマンド実行直後は、ごみデータが出力される場合もありますが、

しばらく放置して、何も表示されないことを確認します。

それから、赤外線受信モジュールに向かって、リモコンのボタンを押します。

 

ここで、ハマったのが、赤外線受信モジュールに向かって何もしていないのに、

データが出力され続けている状態になりました。

原因は、電源が3.3Vにしていたことで、5Vにすることで少し軽減することができました。

 

  5.リモコンデータのダウンロードとボタン確認

 

本来は、赤外線受信データを学習したり、前項で出力されたデータを取得したりして、

受信データをデータファイルとして保存するのですが、

ここでは、OSOYOOから既に作成されているデータファイルをダウンロードします。

 

ダウンロードしたファイルを/etc/lirc/lircd.conf.dフォルダに保存します。

 

このデータファイルが有効になっているかを確認するために、

先ほど停止させたlircdデーモンを起動します。

 

$ sudo /etc/initd.d/lircd start

 

起動後、以下のコマンドを実行します。

 

$ irw

 

ここで、赤外線受光部に向かってOSOYOOのリモコンボタンを押すと、

こんな感じで該当するボタンのログが出力されます。

f:id:aquarius999:20190804190510p:plain

 

これで赤外線データの受信とボタンデータの確認が完了です。

 

 

  6.ボタンを押してLEDを点灯させる

 

ボタンを押してLEDを点灯させるプログラムは、OSOYOOのテストプログラムを参考にします。

このテストプログラムには、lircのクライアントAPIが使用されており、

APIの説明としては、LIRC libraries: Client APIのサイトが参考になると思います。

 

OSOYOOからテストプログラムをダウンロードしてきて、整理したものが下記になります。

 

#include <wiringPi.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <lirc/lirc_client.h>
#include <time.h>

void flipLED (int led);

#define LED1 0

#define ON 1
#define OFF 0

int main(int argc, char *argv[])
{
    struct lirc_config *config;
    char *code;

    //Timer for our buttons
    int buttonTimer = millis();

    if( wiringPiSetup () == -1 )
    {
        exit (1);
    }
    pinMode (LED1, OUTPUT);

    if( lirc_init("lirc",1) == -1 )
    {
        exit(EXIT_FAILURE);
    }
    if( lirc_readconfig(NULL,&config,NULL) == 0 )
    {
        //Do stuff while LIRC socket is open  0=open  -1=closed.
        while( lirc_nextcode(&code) == 0 )
        {
            if( code==NULL ) { continue; }

            if (millis() - buttonTimer  > 400)
            {
                if(strstr (code,"KEY_1"))
                {
                    printf("MATCH on KEY_1\n");
                    flipLED(LED1);
                    buttonTimer = millis();
                }
            }
            free(code);
        }
        lirc_freeconfig(config);
    }
    lirc_deinit();
    exit(EXIT_SUCCESS);
}

void flipLED (int led)
{
    if( digitalRead(led) == ON )
        digitalWrite(led, OFF);
    else
        digitalWrite(led, ON);
}

 

プログラムの流れを簡単に説明すると、大体こんな感じです。

1.LEDの点灯用にGPIO17を設定

2.GPIOを操作するのでwiringPi初期化とピンモードを設定

3.lirc_init()で初期化

4.lirc_readconfig()で前項でダウンロードしてきたファイルを読み込む

5.lirc_nextcode()で受信した赤外線データを400ms周期で読み込む

6.受信したデータが、4で読み込んだデータと比較する。

7.比較して同じだった場合、LEDを点灯もしくは消灯する。 

 

コンパイルは、下記のとおりになります。 

$ gcc -Wall -o irtest irtest.c -lwiringPi -llirc_client

 

コンパイル後、実行して、

1ボタンを押すごとに、LEDの点灯消灯を繰り返すことを確認します。 

 

  7.最後に

 

OSOYOOの説明書の内容が古かったり、3.3Vではなく5Vで安定することがわかったりと、

いろいろありましたが、これで赤外線データの受信とデータ処理のやり方がわかりました。

また、この記事で使用したリモコンのボタンデータは、OSOYOOのリモコンでしか対応していません。

テレビのリモコンやエアコンのリモコンなど市販されているリモコンの場合は、

そのデータを受信して、自分でデータファイルを作成する必要があります。

次は、エアコンのリモコンデータを学習して、赤外線送信をやってみようと思います。 

 

 

関連・おすすめ記事 

Raspberry Pi (ラズパイ)で役に立つ書籍のおすすめランキングベスト5 - 水瓶座列車

Bluetoothでマルチペアリング(複数台接続)できるマウスのおすすめランキングベスト5 - 水瓶座列車

仮眠可能なほぼフルフラットになるデスクチェアのおすすめランキングベスト5 - 水瓶座列車

RaspberryPi (ラズパイ)で使用できるカメラのおすすめランキングベスト5 - 水瓶座列車

Raspberry Pi OSのカーネルソースビルド手順解説 - 水瓶座列車