ATtiny13Aで赤外線リモコン受信センサーを使う
ATtiny13Aで赤外線リモコン受信センサの利用を試してみました。
利用したセンサーは秋月電子で購入したPL-IRM2161-XD1です。
次のサイトを参考にしてATtiny13A(arduino IDE環境)で使えるコードを書いてみました。
参考サイト
・きむ茶工房ガレージハウス - 赤外線通信の実験パート2 (赤外線リモコンを送信器にして何か動かす)
・garretlab - Arduinoで遊ぶページ - 赤外線リモコンコード解析(NECフォーマット)
・Renesas Electronics - FAQ No. 1007798 (NECフォーマットの赤外線リモコン・フォーマット [共通])
自分もイメージをつかもうと、センサー出力をロジックアナライザで調べてみました。
NECフォーマットの場合、次のフォーマットをしています。
通常のデータ
ボタン長押し時のリピートデータ
赤外線リモコン受信センサはリモコンの信号を反転して受信します。
(最初これが分からずハマってしまいました)
リーダーコードの後に2バイトのカスタムコード(リモコンごとの固定値)、1バイトのデータ、
そのデータのエラーチェック用のビット反転データが続きます。
データは、ボタンごとに異なるデータとなります。
パルス幅の短い場合が"0"、長い場合が"1"と判定して"0"、"1"を得ます。
長押しするとリピートデータが送られてきます。
これで、直前のボタンが長押しされていると判断します。
このパルスのON/OFF、長さを判定してビットデータを取り出せばよいわけです。
試験用の回路はこんな感じ。
(前回のシリアル通信用回路に追加しただけですが)
ソースコード
コンパイル後のスケッチのサイズ(書込み)は884バイトでした。
2015/09/28 追記
動作確認のためのシリアル通信出力は、Nerd Ralphさんのライブラリを利用しています。
詳細については、私の過去の下記の記事を参照して下さい。
#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"); } }
手持ちの赤外線リモコンを押すと、ちゃんとデータが取れます。
試した赤外線リモコンの各ボタンのデータコード
リモコンは中華製品についていたもの。
中華製付属のリモコンはカスタムコードが00FF(未定義?)の場合があるみたいで、
リモコンの識別ができないかもしれません。
色々と応用出来そうです。
とりあえずこれで、パソコンと連携して何か出来そうです。
« Windows 8.1でPerlを使う | トップページ | Arduino IDE 1.0.6 では行番号が表示できりようになった »
「arduino」カテゴリの記事
- Arduino UNO R4 WiFiに関するメモ(2024.03.21)
- Arduino用 美咲フォントライブラリを更新しました(2024.03.21)
- Arduino用ライブラリの自作用のメモ(2024.03.18)
- 豊四季Tiny Basic for micro:bit のマニュアルを更新しました(2020.11.21)
- 豊四季タイニーBASIC for Arduino 機能拡張版 V0.08の更新(2020.07.27)
「AVR」カテゴリの記事
- Arduino用SJIS漢字フォントライブラリ SDカード版を作成しました(2018.10.30)
- ATtiny13AでI2C接続キャラクタLCDを利用する(4)(2018.04.16)
- ATtiny13Aで赤外線リモコン受信センサーを使う(2)(2018.04.15)
- ATtiny13AでHC-SR04を使った距離計測(2018.04.14)
- Arduino 1.8.5環境でATtiny13Aを利用する(2018.04.14)
「ATtiny13A」カテゴリの記事
- ATtiny13AでI2C接続キャラクタLCDを利用する(4)(2018.04.16)
- ATtiny13Aで赤外線リモコン受信センサーを使う(2)(2018.04.15)
- ATtiny13AでHC-SR04を使った距離計測(2018.04.14)
- Arduino 1.8.5環境でATtiny13Aを利用する(2018.04.14)
- Arduino IDEを使ったATtiny13用スケッチの開発について(2016.08.30)
コメント
« Windows 8.1でPerlを使う | トップページ | Arduino IDE 1.0.6 では行番号が表示できりようになった »
はじめまして。
ATtiny13Aで、赤外線リモコン受信センサの利用について、
掲載して、頂きまして、ありがとうございました。
あなた様より、ご親切に掲載して頂きました、C言語の、赤外線リモコンの
受信センサの、プログラムの中で、
#include が、ありますが、winavr compiler の中に、
basicserial3.h が、見当たりませんので、あなた様が、独自に、
開発された、ファイルと、思われますので、ファイルの内容を、
教えて頂けませんか。
以上です。
投稿: kawauchi | 2015年9月28日 (月) 19時21分
kawauchi さん、はじめまして
今読み返すと、記載内容が不十分ですね。ご迷惑お掛けしました。
basicserial3.hはATtiny13Aでシリアル通信を行うためのライブラリ用のヘッダーファイルです。
basicserial3.hについては、下記の過去のブログを参照して下さい。
・ 「ATtiny13Aでシリアル通信(UART)を行う」
https://nuneno.cocolog-nifty.com/blog/2014/11/attiny13aiuart-.html
自作ではなく、Nerd Ralphさんが公開しているライブラリを利用しています。
投稿: たま吉さん(管理者) | 2015年9月28日 (月) 21時16分