Curiosity開発ボードに赤外線受信モジュールとUSBシリアル変換器を取り付け、赤外線リモコンからの信号パルス幅を測定し、PCにUSB経由で送信します。

 

 

 

PCでCoolTermなどの通信ソフトを使いデータを受信すると、下図の様に、リモコンから送られてきた信号のパルス幅がus単位の一覧形式で表示されます。

 

 

1 使用部品

USBシリアル変換器

秋月電子通商の【P/N K-14652】絶縁USBシリアル変換モジュールを mikroBUSコネクターに取り付け羅れるよう作成したものを使用しました。 

 

赤外線リモコン受信モジュール

赤外線リモコンからの信号を受信し、そのパルス信号を負論理で出力するモジュールと RC7 に接続します。モジュールは秋月電子で購入した [OSRB38C9AA] を使用しています。

 

Curiosity開発ボード

マイクロチップ社のCuriosity開発ボードにPIC16F1619を挿して使用します。

 

 

シリアル通信ソフト

いろいろな通信ソフトが使用できますが、ここでは、CoolTermを使用しました。

 

2 MPLAB X プロジェクトの作成

この例では、「New Project...」から、IR_SMTという名称のプロジェクトを作成しました。

  • Device: PIC16F1619
  • MPLAB X; v5.40
  • MPLAB XC8; v2.20
  • MCC; v3.95.0

3 システムクロックの設定

MCCの設定から4MHz_HF を選択し、PLL Enabled のレ点を外します。
Current System Clock が、4 MHz になることを確認します。

 

 

4 EUSART Module のロード

Device Resources ウインド内の Libraries list にある EUSART icon を展開して EUSART icon をダブルクリックします。

 

 

モジュールがロードされると EUSART icon が、Project Resources に現れます。

 

5 EUSART の設定

表示される画面を見ながら、マウスでクリックして設定します。printf 関数を使用できるように、Redirect STDIO にレ点を入れます。他の設定はデフォルトでOKです。

  1. Baud Rate は 9600 を選択
  2. printf 関数を使用できるように、Redirect STDIO にレ点を入れる

 

6 SMT1 Module のロード

Device Resources ウインド内の Libraries list にある SMT icon を展開して SMT1 icon をダブルクリックします。

 

 

モジュールがロードされると SMT1 icon が、Project Resources に現れます。

 

7 SMT1 の設定

表示される画面を見ながら、以下の項目の設定変更をします。

  • Operation Mode : High and Low time
  • Data Acquisition : Repeat Data Acquisition
  • Clock Select : FOSC/4
  • Prescaler : 1:1 Prescaler
  • Period : 99999
  • Signal Select : SMTxSIG
  • Signal Input Polarity : low/falling edge enabled
 

8 入出力の指定

module がロードされると、Pin Manager に、利用できる 入出力pinが表示されます。
pin RB6 が Rx 入力に、RB7 が Tx 出力に指定されていることを確認します。また、赤外線受信モジュール が接続されている RC7 を SMT1SIG 入力に指定します。

 

 

9 Code 生成

Generate ボタンをクリックします。

 

10 処理ルーチンを main.c に記載

自動生成された main.c ファイルを開き、内容を下のリストの様に全面変更します。

なお、MPLAB X プロジェクトを下のリンクからダウンロードですることができます。また、プロジェクトをコンパイルした HEXファイル(IR _SMT.hex)も同梱しました。その HEXファイルを MPLAB IPE を使用しCuriosityボードに書き込んでも良いでしょう。

---> IR_SMT.X.zip

 

/*******************************************************
 * SMT Hight-Low mode で、赤外線リモコンのパルス幅をus単位で
 * 測定し、EUSART経由しUSBに変換してPCに送信する
 *******************************************************/

#include "mcc_generated_files/mcc.h"

#define maxdata 200         // 赤外線データー配列数

uint16_t PW[maxdata];       // Mark配列
int16_t PR[maxdata];        // Space配列
uint8_t  p_PW;              // Mark配列ポインタ
uint8_t  p_PR;              // Space配列ポインタ

void main(void)
{
    SYSTEM_Initialize();                // デバイス初期化

    while (1)                           // 赤外線信号受信 繰り返し
    {
        p_PW = 0;                       // データポインタ初期化
        p_PR = 0;
        SMT1PWAIF = 0;                  // フラッグクリア
        SMT1PRAIF = 0;
        SMT1IF = 0;
        SMT1CON1bits.SMT1GO = 1;        // 測定開始
        printf("\r\nready\r\n");        // 準備完了メッセージ送信
        // ---------- 赤外線信号を受信する -------------------------------
        while((p_PR < maxdata)){        // バッファ満杯まで繰返
            if(SMT1PWAIF){                          // mark終了なら
                SMT1PWAIF = 0;                      // フラグクリア
                PW[p_PW++]=SMT1CPW;                 // High時間を保存
            }
            if(SMT1PRAIF){                          // space終了なら
                SMT1PRAIF = 0;                      // フラグクリア
                if(SMT1CPR < 10000){                // 10ms未満なら
                    PR[p_PR++]=SMT1CPR;             //  そのままLow時間を保存
                }else{                              // 10ms以上なら
                    PR[p_PR++]=-(SMT1CPR / 1000);   //  msに変換し負数で保存
                }
            }
            if(SMT1IF){                             // 無信号が100ms続いたら
                SMT1IF = 0;                         // フラグクリア
                PR[p_PR++]=0;                       // 無信号記号「0」を保存
                break;
            }
        }
        //------------ 受信結果を送信する ------------------------------
        SMT1CON1bits.SMT1GO = 0;                    // 測定終了
        printf(" -  mark  space (us)\r\n");         // タイトル送信
        for(char i=0;i<p_PW;i++){                   // 保存した時間を送信
//        for(char i=0;i<20;i++){                   // 保存した時間を送信
            printf("%2d %5d",i,(uint16_t)PW[i]);    // mark時間
            if(PR[i]==0) {                          // 無信号なら
              printf("    ---\r\n");                //  「---」を送信
            }else if(PR[i] > 0){                    // 10ms未満なら
              printf("  %5d\r\n",PR[i]);            //   us単位で送信
            }else{                                  // 10ms未満なら
              printf("%7d ms\r\n",-PR[i]);          //   ms単位で送信
            }
        }
        if(p_PW >= maxdata){                        // バッファ万杯なら
            printf("-- Buffer Full --\r\n");        //  Buffer Full 送信
        }
    }
}
/** End of File **/

 

11 プロジェクトのコンパイルと書き込み

Program アイコンをクリックし、PICにプログラムを書き込みます。

 

 

12 動作の確認

書き込み終了後に、USBシリアル変換器とPCをUSBケーブルで接続し、CoolTermなどの通信ソフトを立ち上げます。通信ソフトの設定画面で

  • 9600 baud, 
  • 8 bit data, 
  • none parity, 
  • 1 stopbit 

に設定し接続を有効にします。

PICをリセットすると『Ready』表示され、信号待ちの状態になります。

赤外線リモコンのキーを押すとCoolTerm画面に受信したパルス幅が表示されます。 

 

初めの列は、受信パルスの受信順番号、パルス幅はus単位で計測し表示sします。受信した信号の情報はPICのメモリーに一時保存し、信号の終了後にまとめてPCに送信します。一時保存できるのは、200bitまででそれを超えると「-- Buffer Full --」と表示し、それ以降のデータは破棄され表示できません。

リモコンからのパルスはus単位で表示しますが、リモコンボタンを長く押し続けると同じデータコードが繰り返し送信されます。コードとコードの間には、8ms以上の無信号期間が挿入されますが、このソフトでは、10ms以上の無信号期間を、ms単位で表示します。

また、100ms以上の無信号時間は、「---」を表示します。これはリモコンキーを押していない状態を意味します。