フォト
2017年8月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
無料ブログはココログ

« Windows 8.1でPerlを使う | トップページ | Arduino IDE 1.0.6 では行番号が表示できりようになった »

2014年11月15日 (土)

ATtiny13Aで赤外線リモコン受信センサーを使う

ATtiny13Aで赤外線リモコン受信センサの利用を試してみました。
利用したセンサーは秋月電子で購入したPL-IRM2161-XD1です。

次のサイトを参考にしてATtiny13A(arduino IDE環境)で使えるコードを書いてみました。
 参考サイト
   ・きむ茶工房ガレージハウス - 赤外線通信の実験パート2 (赤外線リモコンを送信器にして何か動かす) 
   ・garretlab  - Arduinoで遊ぶページ - 赤外線リモコンコード解析(NECフォーマット) 
   ・Renesas Electronics - FAQ No. 1007798 (NECフォーマットの赤外線リモコン・フォーマット [共通])

上記サイトでデータ構造・処理を参考にし、ATtiny13A用に軽量化するため自作しました。

自分もイメージをつかもうと、センサー出力をロジックアナライザで調べてみました。
NECフォーマットの場合、次のフォーマットをしています。

通常のデータ
01_2
ボタン長押し時のリピートデータ
02_2

赤外線リモコン受信センサはリモコンの信号を反転して受信します。
(最初これが分からずハマってしまいました)

リーダーコードの後に2バイトのカスタムコード(リモコンごとの固定値)、1バイトのデータ、
そのデータのエラーチェック用のビット反転データが続きます。
データは、ボタンごとに異なるデータとなります。

パルス幅の短い場合が"0"、長い場合が"1"と判定して"0"、"1"を得ます。
長押しするとリピートデータが送られてきます。
これで、直前のボタンが長押しされていると判断します。

このパルスのON/OFF、長さを判定してビットデータを取り出せばよいわけです。

試験用の回路はこんな感じ。
(前回のシリアル通信用回路に追加しただけですが)

03_2

ソースコード
コンパイル後のスケッチのサイズ(書込み)は884バイトでした。

2015/09/28 追記
動作確認のためのシリアル通信出力は、Nerd Ralphさんのライブラリを利用しています。
詳細については、私の過去の下記の記事を参照して下さい。
  ATtiny13Aでシリアル通信(UART)を行う
  http://nuneno.cocolog-nifty.com/blog/2014/11/attiny13aiuart-.html

#define BAUD_RATE 38400
#include <basicserial3.h>

// for I/O Port
#define IR    4
#define UART  3
#if !defined(PORTD) 
 #define IR_DDR    DDRB
 #define IR_PORT   PORTB
 #define IR_PININ  PINB
#else
 #define IR_DDR    DDRD
 #define IR_PORT   PORTD
 #define IR_PININ  PIND
#endif

#define IRbitRead()    (IR_PININ&_BV(IR))
#define RC_RDH_TS      9000    // リーダコードOFF間隔  9ms判定用
#define RC_RDL_TS      3800    // リーダコードON間隔   4.5ms判定用
#define RC_BITLOW_TS   1000    // ビットデータON間隔   1.69ms判定用  
#define RC_TMOVER      8000    // タイムオバー

//
// 赤外線リモコンコード取得
// 4バイトのデータを返す
// CCCCDDdd
//    CCCC カスタムコード
//    DD   データコード
//    dd   データコードのビット反転(データチェック用)
// ただし、
//    リピートコードの場合  0
//    エラーの場合          0xFFFFFFFF
//  を返す.
//
uint32_t Read_IR() {
  uint8_t  repeat = 0;  // リピートコード検出フラグ
  uint32_t  dt    = 0;  // 赤外線リモコン読み取りデータ
  unsigned long t ;     // 信号長計測用

  // リード部の取得
  // 受信データはH/L反転で読まれる
  while(1) {
    while(IRbitRead());  // OFF検出受信待ち   
    t = micros();        // OFF検出時刻取得
    while(!IRbitRead()); // ON受信検出待ち 
    t = micros() -t;     // OFF->ONの時間間隔取得
    if (t > RC_RDH_TS) { // 9ms以上ならリーダコードとみなす
        t = micros();      // ON検出時刻取得
        while(IRbitRead());// OFF検出待ち
        t = micros() -t;   // ON->OFF時間間隔取得
        break;
    }
  }
  
  // データ部取得
  if (t < RC_RDL_TS) {
    // 0N->OFF がリピートコードの場合、データ取得はスキップ
    repeat = 1;          
  } else {
    // 0N->OFF がリダーコードの場合、データを取得
     for (uint8_t i = 0; i <32; i++) {  //32ビット分取得ループ
        // ビット開始待ち
        while(!IRbitRead());  // ON待ち
        t = micros();
        while(IRbitRead());  // OFF待ち
        t = micros() -t;
        if (t>RC_TMOVER)
          return 0xFFFFFFFF;  // エラー
        dt<<=1;
        dt |= (t>RC_BITLOW_TS) ? 1:0;     
    }
  }
  // ストップビットの待ち
  while(IRbitRead());  // OFF待ち  
  if (repeat)
    return 0;
  return dt;
}

// 文字列出力
void serOut(const char* str) {
   while (*str) TxByte (*str++);
}

// 整数を16進数で出力
void serOutHex(uint16_t h) {
  uint8_t c;
  for (int8_t i=12; i>=0; i-=4) {
    c = h>>i & 0xf; 
    c = c >9 ? c+'A'-10: c+'0';
    TxByte ((uint8_t)c);
  }
}

void setup() {
  IR_DDR &= ~_BV(IR);  // IRピンのみ入力設定する
}

void loop() {
  uint32_t rc =  Read_IR();  // IR受信
  if (rc) {
    if (rc != 0xFFFFFFFF) {
      serOut("custom="); serOutHex(rc>>16);serOut(" ");
      serOut("data=");serOutHex(rc>>8&0xff);serOut("\n\r");
    }
  } else {
    //serOut("Repeat\n\r");
  }
}

手持ちの赤外線リモコンを押すと、ちゃんとデータが取れます。

04_2

試した赤外線リモコンの各ボタンのデータコード

05_2

リモコンは中華製品についていたもの。
中華製付属のリモコンはカスタムコードが00FF(未定義?)の場合があるみたいで、
リモコンの識別ができないかもしれません。

色々と応用出来そうです。
とりあえずこれで、パソコンと連携して何か出来そうです。

 

« Windows 8.1でPerlを使う | トップページ | Arduino IDE 1.0.6 では行番号が表示できりようになった »

arduino」カテゴリの記事

ATtiny13A」カテゴリの記事

AVR」カテゴリの記事

コメント

はじめまして。

ATtiny13Aで、赤外線リモコン受信センサの利用について、
掲載して、頂きまして、ありがとうございました。

あなた様より、ご親切に掲載して頂きました、C言語の、赤外線リモコンの
受信センサの、プログラムの中で、
#include が、ありますが、winavr compiler の中に、
basicserial3.h が、見当たりませんので、あなた様が、独自に、
開発された、ファイルと、思われますので、ファイルの内容を、
教えて頂けませんか。 
 以上です。

kawauchi さん、はじめまして
今読み返すと、記載内容が不十分ですね。ご迷惑お掛けしました。

basicserial3.hはATtiny13Aでシリアル通信を行うためのライブラリ用のヘッダーファイルです。
basicserial3.hについては、下記の過去のブログを参照して下さい。
・ 「ATtiny13Aでシリアル通信(UART)を行う」
http://nuneno.cocolog-nifty.com/blog/2014/11/attiny13aiuart-.html

自作ではなく、Nerd Ralphさんが公開しているライブラリを利用しています。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/60657584

この記事へのトラックバック一覧です: ATtiny13Aで赤外線リモコン受信センサーを使う:

« Windows 8.1でPerlを使う | トップページ | Arduino IDE 1.0.6 では行番号が表示できりようになった »