別件シリーズでコンピュータ上で赤外線リモコン波形を生成。こちらでは実際に赤外線LEDを駆動して「送信」できる筈の波形をPIC16マイコンで作成してみたいと思います。とりあえずの今回は0と1の波形が生成されていることをオシロで確認するところまで。過去回で練習済のTIMER、PWM、DSMの合わせ技、応用課題か?
※『PIC三昧』PIC関係の記事総目次はこちら
※作業はMicroChip社の統合開発環境 MPLAB X IDEと、その上で走るコンフィギュレーションツールMCC Classic を使用して行っています。ターゲット・マイコンはPIC16F18855です。
赤外線リモコンの「波形」
赤外線リモコンの波形をScilab(MATLABみたいなものです、フリーの)で生成してみたのは以下の別シリーズ記事です。
手習ひデジタル信号処理(105) Scilab、comm_tbx、赤外線リモコンの波形
上記で作成した波形で赤外線LEDを駆動できれば「多分」通信できるんじゃないかと思ってるのですが、残念ながらパソコンから直接駆動は「今のところ」できないデス。そこで、今回はPIC16マイコンで波形を生成してみることに。なお、上記の記事で生成したのはNECフォーマットの波形ですが、今回は、「0」と「1」を駆動するところまで。
生成方法は以下です。
-
- TIMER2を使用、サブキャリアの38kHzの元になる信号を生成する。
- TIMER2出力をPWM6に接続、デューティ3分の1のサブキャリア38kHz波形を生成する。
- PWM6出力をDSMのハイ側キャリアとして接続。ロー側キャリアは0固定、DSMでOOK(ON-OFF-Keying)変調する。モジュレータ信号はソフトウエア制御。
既に以下の過去回にて「練習済」のものを組み合わせるだけ。
PIC三昧(2) MCCでPIC16F1xxxx。TMR2+PWM6でPWM出力
PIC三昧(11) DSM(データ信号変調器)を使ってみる、PIC16F18855
MCC Classicでコンフィギュレーション
まず、タイマの精度もあるのでSystem Moduleのクロック設定もデフォルト値から変更します。
本当は 38kHz≒26.32us なので、上記は0.3%程誤差あり。許して。
High Carrier をPWM6から貰うのは良いのだけれど、Low Carrierは固定値0で良いです。しかし、そんな定数ソースが見当たらないです。仕方がないので使っていないピンにしてます(ロウに落としておかないとダメ。)そういうときは使わない内蔵ペリフェラルをロウ固定にコンフィグした方が良いのか。。。
最後にピンの設定。
いつものようにPA0端子(出力指定)はLチカ用です。
今回実験用のコード
MCCが自動生成してくれた main.c ファイル内に書き加えたコードは以下のとおりです。「0」の波形と「1」の波形を交互にダラダラと出力しつづけるだけのもの。
void main(void) { int oval = 0; // initialize the device SYSTEM_Initialize(); DSM_ManualModulationClear(); while (1) { DSM_ManualModulationSet(); __delay_us(T_INTVL); DSM_ManualModulationClear(); if (oval == 1) { oval = 0; __delay_us(T_INTVL * 3); } else { oval = 1; __delay_us(T_INTVL); } } }
実機で確認
黄色で「べた」に見える部分がサブキャリアが元気よく出力されている期間です。黒のロウ部分の時間長さで0と1を判断します。0の場合は黄色が1T、黒色分が1T、1の場合は黄色が1T、黒色が3Tです。1Tは562μsです。
さて、時間軸を拡大してサブキャリアの38kHz、デューティ3分の1を確認してみます。こんな感じ。
まあ、波形としてはそれらしいな。次はLEDを駆動して実際に赤外線で何か送信してみるしかない。940nmの赤外LEDの在庫はどこだ?