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

(12/22追記)プログラムと回路を見直し、部品点数を減らしました→mbedからエアコンを操作 その3


C++の練習がてら前回のプログラムをクラス化し、汎用性を高めてみました。

今回やりたかったことは

TextLCD lcd(p24, p26, p27, p28, p29, p30);

のように、赤外線の送受信と変調用のPWM波の出力に使うピンを宣言すること。

クラスの作り方とかよく分かってないのでTextLCD.hなどを見つつどんな感じになっているの調べてみました。
そこでキーワードとして出てきたのが「初期化子リスト」という言葉。詳しいことはよく分かっていませんが見よう見まねで以下のような書き方をしたら目的のことが実現できました。

    public:
        // constructor
        IR(PinName inPin, PinName outPin, PinName pwmPin) : IRin(inPin), IRout(outPin), IRpwm(pwmPin)
        {
            float value;
            value = (1.0 / IR_MOD_FREQ_KHZ) * 1000.0;
        
            IRpwm.period_us(value);
            IRin.mode(PullNone);
        
        }

と、

    protected:
        DigitalIn IRin;
        DigitalOut IRout;
        PwmOut IRpwm;

ポイントは
IR(PinName inPin, PinName outPin, PinName pwmPin) : IRin(inPin), IRout(outPin), IRpwm(pwmPin)
という書き方とprotected:以下みたいですね。


ソースコード全体はこんな感じになりました。

  • main.cpp
#include "mbed.h"
#include "IR.h"

DigitalOut led1(LED1);
DigitalOut led2(LED2);
IR ir(p8, p9, p21);     // (in, out, pwm)

int main() {
    led1 = 1;
    
    ir.getData();
    
    led2 = 1;
    
    while(1) {
        ir.sendData();
        
        wait(1);
    }
}
  • IR.h
// IR.h
// 2010/12/16 ver1.0
// IR controller data read and send

#define IR_DATA_COUNT 10000
#define IR_SAMPLING_US 50
#define IR_MOD_FREQ_KHZ 38

// class IR
class IR
{
    private:
        bool data[IR_DATA_COUNT];
            
    public:
        // constructor
        IR(PinName inPin, PinName outPin, PinName pwmPin) : IRin(inPin), IRout(outPin), IRpwm(pwmPin)
        {
            float value;
            value = (1.0 / IR_MOD_FREQ_KHZ) * 1000.0;
        
            IRpwm.period_us(value);
            IRin.mode(PullNone);
        
        }
        
        // getData
        void getData(void)
        {        
            while(1) {
                if(IRin == 0) {
                    for(int i = 0; i < IR_DATA_COUNT; i++) {
                        data[i] = !IRin;
                        wait_us(IR_SAMPLING_US);
                    }
                
                    return;
                }
            }
        }
        
        // sendData
        void sendData(void)
        {
            IRpwm.write(0.5);       // start PWM
        
            for(int i = 0; i < IR_DATA_COUNT; i++) {
                IRout = data[i];
                wait_us(IR_SAMPLING_US);
            }
            
            IRpwm.write(0);         // end PWM
        }
        
    protected:
        DigitalIn IRin;
        DigitalOut IRout;
        PwmOut IRpwm;
};