« Deek-RobotのData logging shield V1.0を使ってArduino Spyカメラ | Main | TWE-Lite 半完成品セミキットで通信が出来ないと思ったら・・・ »

05/03/2017

TVリモコンを使ってArduinoに喋らせる

Img_20170503_154904 Img_20170503_083736 家電用リモコンを利用して、Arduinoから音を発する装置を考えた。(左写真:試作完成品)
家電のリモコンは容易に入手できるし、コントローラを新たに製作する時間を短縮することが出来る。ただし、TVリモコンは赤外線式なので、見通し出来る場所でしか使えないが、5mぐらいの距離なら問題なく使う事が出来るだろう。


.
Img_20170503_210742 先ず、コントロールするには、赤外線リモコンの制御信号を入手する必要がある。それで、下記のブログを参考にして、リモコンの制御信号を確認した(上写真右側)。この装置は、下表の状況が分かれば要らなくなるが、各種リモコンのコードを解析するのには簡単に作成でき良いものだなぁと思う。

僕の手元にある東芝REGZAのデジタルTVリモコン(CT-90451)のコードは、次のようになっていた。


.

東芝REGZA デジタルTVリモコンコード

  受信コード                         ボタン名称
00000010111111011000000001111111 ( 40 BF 1 FE )   1
00000010111111010100000010111111 ( 40 BF 2 FD )   2
00000010111111011100000000111111 ( 40 BF 3 FC )   3
00000010111111010010000011011111 ( 40 BF 4 FB )   4
00000010111111011010000001011111 ( 40 BF 5 FA )   5
00000010111111010110000010011111 ( 40 BF 6 F9 )   6
00000010111111011110000000011111 ( 40 BF 7 F8 )   7
00000010111111010001000011101111 ( 40 BF 8 F7 )   8
00000010111111011001000001101111 ( 40 BF 9 F6 )   9
00000010111111010101000010101111 ( 40 BF A F5 )   10
00000010111111011101000000101111 ( 40 BF B F4 )   11
00000010111111010011000011001111 ( 40 BF C F3 )   12
00000010111111010100100010110111 ( 40 BF 12 ED ) 電源

したがって、受信したデータから読取る内容のデータ位置は 「3」 となる。


《Fritzingで描いた回路》

Tv 図中左が Arduino UNO で、
右側は、ブレッドボード上 中央部に配置した ATP3012F6-PU と関連する周辺部品である。

僕が製作した実物は、Arduinoユニバーサル プロトシールド基板の上に小型のブレッドボードを貼り付けたものに
ATP3012F6-PU を挿して配線したが、赤外線受光部はブレッドボード基板に載せきれなかったので、基板の上に半田付けしてある。

発生する音声は、上図にあるようなスピーカー直付けでは聞こえないほど音が小さいので、アクティブスピーカーを繋いで聞くのが良い。


《使い方》
TVリモコンをシステムの受光部に向けて、「1」~「6」及び「電源」のキーを押すと、Arduinoが、スケッチに書いた言葉を「女性の声で・・・」発する。
1:ただいま解析中
2:脈拍が上昇しています
3:ゆっくりしていってね
4:よろしいですか?

5:チャイム音J(ポンという音)
6:チャイム音K(ピンという音)
電源:連続チャイム音(JとKの組み合わせ音)

スケッチプログラムの中で、ローマ字で書いてある部分を
ATP3012F6-PUが読んでくれる。
番号に対応するところを、この使用者が変更すればいろいろな言葉で言い変えることが出来る。話す言葉の書き方は、音声合成LSIのデータシートの所に文法が書かれているので、これを参考にして記載するのが良い。

《使用部品》
①Arduino UNO互換品 : Arduino UNO R3 (keyestudio)互換品 1個
              Amazonで1020円ほどの値段で購入できる。

②赤外線受光器(1個): PL-IRM2121(38kHz)  秋月電子通商より購入
          データーシート Vcc=5V、220Ω抵抗と4.7μF コンデンサが必要

③音声合成LSI(1個): ATP3012F6-PU (女性の音声明瞭版) 秋月電子通商より購入
          データーシート 

 (注意) ATP3012 と ATP3011の主な違いがこのデータシート17ページに記載されている。動作クロックが外付けになり、セラミック振動子などの外付けデバイスが必要。また、AOUT/PMOD1の端子が入れ替わっているなど変更点があるので注意を要する。

④セラミック振動子(1個) : コンデンサ内蔵タイプ 20MHz ㈱村田製作所製 秋月電子通商より購入

⑤その他部品、
 1kΩ、220Ω抵抗(各1個)と 4.7μF コンデンサ(1個)、
Arduino用ユニバーサルプロトシールド基板(1枚)ピンソケット 1x6 (1枚)、1x8 (2枚)、1x10 (1枚)、ミニブレッドボード BB-601(1個)、ジャンパーケーブル用として 耐熱通信機用ビニル電線 導体系0.65mm 単芯


《Sketch》

// TV リモコンからチャネル番号を読み取り他の制御に使う
#define IR_PIN      2    // 赤外線受信モジュール接続ピン番号
#define DATA_POINT  3    // 受信したデータから読取る内容のデータ位置 東芝REGZA TV

#include <AquesTalk.h>
#include <Wire.h>        // ライブラリ内部で使用するので定義必要

AquesTalk atp;         // インスタンス定義

void setup()
{
    Serial.begin(9600) ;    // パソコン(ArduinoIDE)とシリアル通信の準備を行う
    pinMode(IR_PIN,INPUT) ;  // 赤外線受信モジュールに接続ピンをデジタル入力に設定
}

void loop()
{
    int ans ;
     
    ans = IRrecive() ;       // 赤外線リモコンのデータを受信する
        if (ans != 0) {
            Serial.println(ans,HEX) ; // REGZA TV リモコンからデータを受信し番号に準じて発音
            switch(ans) {
            case 0x01: 
                Serial.println("ただいま解析中") ;
                atp.Synthe("tadaima/kaisekichuu.");
                break ;
            case 0x02:
                Serial.println("脈拍が上昇しています") ;
                atp.Synthe("myakuhakuga/jyoushoushiteimasu.");
                break ;
            case 0x03:
                Serial.println("ゆっくりしていってね") ;
                atp.Synthe("/yukkuri_siteittene?");
                break ;         
            case 0x04:
                Serial.println("よろしいですか?") ;
                atp.Synthe("yorosi'ide_suka?"); 
                break ;
            case 0x05:
                Serial.println("チャイム音J") ;
                atp.Synthe("#J");
                break ;
            case 0x06:
                Serial.println("チャイム音K") ;
                atp.Synthe("#K");
                break ;
            case 0x12:
                Serial.println("連続チャイム音") ;
                atp.Synthe("#K");
                atp.Synthe("#K");
                atp.Synthe("#K");
                atp.Synthe("#J");
                break ;
           }
     }
}
// 赤外線リモコンのデータを受信する処理関数
int IRrecive()
{
     unsigned long t ;
     int i , j ;
     int cnt , ans ;
     char IRbit[64] ;

     ans = 0 ;
     t = 0 ;
     if (digitalRead(IR_PIN) == LOW) {
          // リーダ部のチェックを行う
          t = micros() ;                           // 現在の時刻(us)を得る
          while (digitalRead(IR_PIN) == LOW) ;     // HIGH(ON)になるまで待つ
          t = micros() - t ;                       // LOW(OFF)の部分をはかる
     }
     // リーダ部有りなら処理する(3.4ms以上のLOWにて判断する)
     if (t >= 3400) {
          i = 0 ;
          while(digitalRead(IR_PIN) == HIGH) ;     // ここまでがリーダ部(ON部分)読み飛ばす
          // データ部の読み込み
          while (1) {
               while(digitalRead(IR_PIN) == LOW) ; // OFF部分は読み飛ばす
               t = micros() ;
               cnt = 0 ;
               while(digitalRead(IR_PIN) == HIGH) {// LOW(OFF)になるまで待つ
                    delayMicroseconds(10) ;
                    cnt++ ;
                    if (cnt >= 1200) break ;       // 12ms以上HIGHのままなら中断
               }
               t = micros() - t ;
               if (t >= 10000) break ;             // ストップデータ
               if (t >= 1000)  IRbit[i] = (char)0x31 ;  // ON部分が長い
               else            IRbit[i] = (char)0x30 ;  // ON部分が短い
               i++ ;
          }
          // データ有りなら指定位置のデータを取り出す
          if (i != 0) {
               i = (DATA_POINT-1) * 8 ;
               for (j=0 ; j < 8 ; j++) {
                    if (IRbit[i+j] == 0x31) bitSet(ans,j) ;
               }
          }
     }
     return( ans ) ;
}

《参考にしたブログ》
①音声合成LSIの使い方
 「N.Yamazaki's blog」 Arduino用 音声合成LSIライブラリの利用方法記述部分から、「Arduino_AquesTalk_Library」をDownloadし、簡単な使い方を参考にスケッチ作成を行った。

②赤外線通信について
 「赤外線通信の実験パート2」
(赤外線リモコンを送信器にして何か動かす)
 ・赤外線受信のサンプル回路及びスケッチプログラムを参考に、こちらの状況に合わせて修正するための参考にさせて戴いた。


 ・赤外線受信の回路は、使っている素子が違うため、素子のデータシートを参考にして、使う抵抗とコンデンサを配置し、信号の解析を行った。
 そのためのスケッチは、
赤外線受信モジュール接続ピン番号は同じく「2」に設定し、シリアルポートを此方の状況に合わせただけで、エラー無く稼働させることが出来た。

 ・赤外線リモコンからのデータ受信では、ダウンロードさせて戴いたスケッチに対して、
 IRピンの番号は同じ、受信したデータから読取る内容のデータ位置を「3」に変更して使うことが出来た。

 ・switch文の分岐で、caseの後にSerial.print文を追記して分岐が正しく行われたか否かをシリアルモニタで確認できるようにした。


《参考資料》
①赤外線受光器 使用部品の行を参照の事。
②音声合成LSI ATP3012F6-PU 使用部品の行を参照の事。

« Deek-RobotのData logging shield V1.0を使ってArduino Spyカメラ | Main | TWE-Lite 半完成品セミキットで通信が出来ないと思ったら・・・ »

PC and PC troubles」カテゴリの記事

Comments

Post a comment

Comments are moderated, and will not appear on this weblog until the author has approved them.

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/540128/65229933

Listed below are links to weblogs that reference TVリモコンを使ってArduinoに喋らせる:

« Deek-RobotのData logging shield V1.0を使ってArduino Spyカメラ | Main | TWE-Lite 半完成品セミキットで通信が出来ないと思ったら・・・ »

May 2017
Sun Mon Tue Wed Thu Fri Sat
  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      

Recent Trackbacks

無料ブログはココログ