mbedからエアコンを操作 その1

(12/16追記)クラス化してより汎用性を高めてみました→mbedからエアコンを操作 その2
(12/22追記)プログラムと回路を見直し、部品点数を減らしました→mbedからエアコンを操作 その3


mbedで簡単な学習リモコンを作ってみました。

赤外線受光モジュール(PL-IRM0101)の出力はmbedのディジタル入力ピンに接続しています。ちなみにこの間出力がおかしかった問題はなぜか直りました(;´∀`)
リモコンの信号が入力され、受光モジュールの出力が変化するとそれを検出し一定時間、一定間隔で信号をサンプリングしていきます。今回使ったリモコンは三菱のエアコンのものでした。事前にオシロで信号を見てみたところ全信号長は300ms、最も変化が細かい部分の長さが350usだったので、サンプリング間隔50usで10,000回(計500ms)記録するようにしました。

同時にmbedのPWMピンから38kHz、デューティ比50%のPWM波を出力して変調しています。

こんな回路を作って実験。温湿度センサや音出力の実験もしてたので段々ごちゃごちゃしてきました^^;


出力波形はこんな感じ。下が記録した波形、上が変調をかけた赤外線LEDの出力波形です。

そしていざ赤外線LEDをエアコンに向けてみると・・・!


ピッ


というわけで無事mbedからの信号でエアコンを動かすことができました。
手元に他のリモコンがないので確認できませんが、恐らく38kHz近辺で変調されてるリモコンならなんでも使えると思います。


そういえばmbedが5Vトレラントなことを今回初めて知りました。受光モジュールからの出力はmax5Vなので抵抗で分圧しないとかなーとか思ってたのですが、ちょっと気になって「mbed トレラント」でググッてみるとなんと本当に入力トレラントだということが分かりました。これなら扱いやすくていいですね。


ソースコード

#include "mbed.h"

DigitalOut out(p9);
DigitalIn in(p8);
PwmOut pwm(p21);
DigitalOut led1(LED1);
DigitalOut led2(LED2);

int main() {
    bool data[10000];    // 信号格納用にbool型の配列を10,000個用意

    pwm.period_us(26.5);    // 38kHzのPWM波になるように周期を設定
    in.mode(PullNone);    // ディジタル入力はデフォルトでプルダウンなため無効化
    
    led1 = 1;
    
    // 立ち下がり検出で記録開始
    while(1) {
        if(in == 0) {
            for(int i = 0; i < 10000; i++) {
                data[i] = !in;    // 入力は反転した信号が入ってくるためinの否定を取る
                wait_us(50);    // 50us間隔でサンプリング
            }
            
            break;
        }
    }
    
    led2 = 1;
    
    pwm.write(0.5);    // デューティ比50%でPWMをON
    
    // 出力
    while(1) {
        for(int i = 0; i < 10000; i++) {
            out = data[i];
            wait_us(50);    // 入力と同じ間隔
        }
        
        wait(1);    // 1秒おきにひらすら送出
    }
}