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です。
- Baud Rate は 9600 を選択
- 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以上の無信号時間は、「---」を表示します。これはリモコンキーを押していない状態を意味します。












