« TWE-Lite 半完成品セミキットで通信が出来ないと思ったら・・・ | Main | 肩を温める USB電源(5V)を使った自作ヒーター »

05/14/2017

Arduino用mp3シールドを使い TVリモコンで指定したMP3ファイル再生

Mp3tf16p_controlled_by_tv_ir_remote Img_20170514_112430 MP3-TF-16Pを使って、MP3形式で保存したファイルを、TVリモコンを使って再生する方法。
ブレッドボードを使った回路図は左側、実際に組んだ回路は右側のようになる。



Mp3tf16p_controlled_by_tv_ir_remo_2左は、Fritzingで記載した回路図。


MP3-TF-16Pで使うマイクロSDカードに保存するファイルは、ファイルを保存した順番とファイル(番号)名を合わせておく必要がある。すなわち「0001.mp3」「0002.mp3」・・・「0013.mp3」のように、ファイル(トラック)番号を書かなければいけない。

sketchでは、赤外線受信で受け取ったREGZA TVリモコンの信号を、switch-case制御文を使って条件分岐させて、各条件(ここではTVチャンネル番号)に合わせたmp3音源ファイルを1つだけ再生するようにしている。
(注記)僕が使っている東芝のREGZA TV の赤外線コントローラー信号は、ここで受信したものを使っている。

TVリモコンの10チャンネルを赤外線受信で受け取ると、16進数で「0A」、11チャンネルは「0B」、12チャンネルは「0C」となるので、case分ではその16進数を使う必要があるので、間違えないように・・・。

mp3の音源ファイルを1つ、例えば3番目のファイル(0003.mp3)を演奏するには、case文 0x03 のところに、
  myDFPlayer.play(3); と書けばよい。

また、11番目のファイル(0011.mp3)を演奏する場合には、case文 0x0B のところに、
  
myDFPlayer.play(11); と書けばよい。


《sketch》

/*************************************************************************************** 
MP3-TF-16P(DFPlayer) - A Mini MP3 Player for Arduino controlled by TV-remote
****************************************************************************************/
#include "Arduino.h"
#include <SoftwareSerial.h>
#include "DFRobotDFPlayerMini.h"
#define IR_PIN      2             // 赤外線受信モジュール接続ピン番号
#define DATA_POINT  3             // 受信したデータから読取る内容のデータ位置 東芝REGZA TV
SoftwareSerial mySerial(10,11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
#include <Wire.h>                 // ライブラリ内部で使用するので定義必要

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

    if (!myDFPlayer.begin(mySerial)) {  // Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("MP3-TF-16P(DFPlayer Mini) online."));
  myDFPlayer.volume(25);               //Set volume value. From 0 to 30
  Serial.println("起動しました") ;
}
void loop()
{
    int ans ;
    ans = IRrecive() ;                 // 赤外線リモコンのデータを受信する
        if (ans != 0) {
            Serial.println(ans,HEX) ; // REGZA TV リモコンからデータを受信し番号に準じて発音

            switch(ans) {
            case 0x01: 
                Serial.println("覚悟を決めましょう") ;
                myDFPlayer.play(1);
                break ;
                
            case 0x02:
                Serial.println("神の裁きを") ;
                myDFPlayer.play(2);
                break ;
                
            case 0x03:
                Serial.println("ベートーベンの運命") ;
                myDFPlayer.play(3);
                break ;
                      
            case 0x04:
                Serial.println("運命") ;
                myDFPlayer.play(4);
                break ;
                
            case 0x05:
                Serial.println("スキ有り") ;
                myDFPlayer.play(5);
                break ;
                
            case 0x06:
                Serial.println("悔い改めよ") ;
                myDFPlayer.play(6);
                break ;
                
            case 0x07:
                Serial.println("こいつは厄介そうじゃな") ;
                myDFPlayer.play(7);
                break ;
                
            case 0x08:
                Serial.println("ついに迎えが") ;
                myDFPlayer.play(8);
                break ;
                
            case 0x09:
                Serial.println("大勢で拍手") ;
                myDFPlayer.play(9);
                break ;
                
            case 0x0A:
                Serial.println("学校のチャイム") ;
                myDFPlayer.play(10);
                break ;
                                
            case 0x0B:
                Serial.println("うっそお!") ;
                myDFPlayer.play(11);
                break ;
                                
            case 0x0C:
                Serial.println("ぱんぱかぱ~ん") ;
                myDFPlayer.play(12);
                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 ) ;
}


《参考資料》

①MP3-TF-16Pを使ったArduinoとの結線・mp3ファイルの再生方法
 「Electronic Circuit Projects」の中の「
Mp3 Player Using Arduino and DFPlayer 」より
 ここにあるDFPlayerは、私が使ったMP3-TF-16Pと基本的に同じもののようだ。
 僕は、RX,TXの接続部分を参考にさせてもらった。

②IR TVリモコンの解析
 赤外線通信の実験パート2
 (赤外線リモコンを送信器にして何か動かす)
 ここに書かれている赤外線受信のサンプル回路はシンプルなので、実験もやり易い。
 赤外線受信解析のスケッチも、ここのスケッチを使わせてもらった。


③コントロール方法
 DFPlayer Mini SKU:DFR0299
 ここでは「DFPlayerMini」を使ってArduino用のMP3プレーヤーのコントロール方法について記載されているが、私が使った「MP3-TF-16P」もほぼ同じなので、スケッチなどは大変参考になった。一部のコードを、私のスケッチへコピーして使わせてもらっている。

④MP3音声ファイル(著作権フリー素材)

 効果音ラボ よりdownloadし、使わせて戴きました。

 

« TWE-Lite 半完成品セミキットで通信が出来ないと思ったら・・・ | Main | 肩を温める USB電源(5V)を使った自作ヒーター »

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/65274736

Listed below are links to weblogs that reference Arduino用mp3シールドを使い TVリモコンで指定したMP3ファイル再生:

« TWE-Lite 半完成品セミキットで通信が出来ないと思ったら・・・ | Main | 肩を温める USB電源(5V)を使った自作ヒーター »

June 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  

Recent Trackbacks

無料ブログはココログ