SSブログ

赤外線リモコン (送信) [Arduino]

赤外線リモコン解析スケッチはもう少し練り直してブログに載せてみたいと思っています。
今回は、以前受信できた東芝REGZA(NECフォーマット)のデータを送信してみます。
赤外線出力フォーマットはわかっているので、このフォーマットに則って出力します。
38kHzのキャリアをどうするか、、。タイマーとかPWMの関係を操作する方法があるようですが、自分の頭では理解ができませんでした。そういうものは使わないわかりやすい方法がありました。

Arduino 日本語リファレンス millis()
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2352
または「Arduinoをはじめよう(日本語版)」の141ページ millis() のところにあるサンプルスケッチがそのままです。

このスケッチを実行すると、だいたい tdelay が 7 くらいで38kHzに一番近い値がでました。
[ON] 7 μsec / [OFF] 7 μsec ということになります。

これを踏まえて作った赤外線リモコン出力のサンプルスケッチは、5秒おきにテレビのチャンネルを変更していくというものです。
一応 duty比が1/3 となっているので、[ON] 5 μsec / [OFF] 9 μsec くらいにしてみました。

// リモコン出力サンプル (東芝REGZA チャンネル変更)
#define IR_IN   2               // IR Receiver
#define IR_OUT  3               // IR LED

void setup()  { 
  pinMode( IR_IN,  INPUT  );
  pinMode( IR_OUT, OUTPUT );
}

void loop() {
  sendIrNEC( 0xE41BBF40 );      // REGZA 0x40 0xBF, 0x1B (Ch.Up)
  delay( 5000 );
}

void sendIrNEC( unsigned long d ) {
  irPulse( 9000, 4500 );        // リーダ
  for(int i=0; i<32; i++) irPulse( 562, (d>>i)%2 ? 1687:562 );  // データ
  irPulse( 562, 40000 );        // トレーラ
}

void irPulse( unsigned long lenH, unsigned long lenL ) {
    unsigned long irExp = micros() + lenH;  // 赤外線ONの期限
    while ( irExp > micros() ) {            // 時間までパルス出力
      digitalWrite( IR_OUT, HIGH );  delayMicroseconds(5);
      digitalWrite( IR_OUT, LOW  );  delayMicroseconds(9);
    }
    delayMicroseconds( lenL );
}

携帯のカメラやデジカメで赤外線がでているのが確認できます。
irout.jpg

写真は高出力タイプですが、テレビのリモコンくらいならArduinoに抵抗をはさんで直接赤外線LEDをつなぐだけで反応してくれました。



nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。