第14章 赤外線受信機RX2-Tプログラミング
■はじめに
赤外線受信機RX2-Tは無事に完成したでしょうか?
RX2-Tはインドアプレーンに搭載する赤外線受信機のファームウエア開発用基板です。RX2-Tでファームウェアが動作すればば、そのままインドアプレーン用2ch軽量赤外線受信機に搭載することが可能です。
RX2-Tには飛行機を制御するための小型モータとマグネット・アクチュエータを接続します。どちらもまだ製作していないので、かわりにモータ・マグネット・アクチュエータ動作確認用LEDユニット(以下、コイルLED)を使って、プログラミングを楽しみます。
RX2-Tは赤外線2ch送信機TX2-006pと同じPIC12F683を採用しています。12F683のプログラミングにも随分と慣れてきたと思います。今度は、赤外線受信機特有のプログラミングに挑戦しましょう。
14-1 課題1 右コイルLEDを200ms間隔で点滅する
課題5までは赤外線受信機能を使わずに、RX2-T単体で動作するプログラミングを行います。
赤外線2ch受信機RX2-Tの動作確認を兼ねて、エルロン用マグネット・アクチュエータ確認右コイルLEDを点滅させるプログラムを考えましょう。プログラミングに成功すると、エルロン確認用右コイルLEDが200ms間隔で点滅します。
ラジコン飛行機の習慣により、ラダーかエルロンのどちらか一つを装備している飛行機の場合、エルロン・スティックを動かして操縦します。2ch装備 のインドアプレーンの場合、エルロン・スティックを操作してラダーを動かします。本書ではラジコン飛行機の習慣に従って、"エルロン"と呼ぶことにします。
■初期設定
#fuses以下でPIC12F683の初期設定を行います。
INTRC_IO・・・内部オシレータ使用
NOWDT・・・ウオッチドック・タイマなし
PUT・・・パワーアップ・タイマ使用
NOPROTECT・・・プログラム・プロテクトなし
NOMCLR・・・リセット端子は使わない
NOBROWNOUT・・・ブラウンアウトなし
#use delay(CLOCK=8000000)・・・内部オシレータ8MHz駆動
#byte GP=5 ・・・5番地(各ポート)をGPと定義
#bit IRSIG=GP.3 ・・・ GP.3をIRSIGと定義(赤外線受光素子接続)
■コイル使用の定義
赤外線受信機RX2-TはPIC12F683を採用しています。各ポートに流すことができる電流は25mAです。マグネット・アクチュエータは100Ω程度のものを使用します。電源はリチウム・ポリマ電池1セルなので、3.7Vです。
流れる電流をIとすると、
I=V/R=3.7/100=0.037=37mA
37mAではポートの許容電流を超えてしまいます。そこで、左:GP0・GP1、右:GP4・GP5を一組にして使うことにより倍の50mAを流すことができる設計としました。
回路を簡単にするために、左を使うときには右を、右を使うときには左をグラウンドと接続するにする回路を構成としています。したがって、左右を同時にONにすることは絶対にしてはいけません。また、各組は同時にONまたはOFFにする必要があります。
そこで、左右のコイルをrcoil・lcoilという名前で定義し、間違いなく使えるようにしています。
#define rcoil 0x03 //GP0,GP1=ON
#define lcoil 0x30 //GP4,GP5=ON
#define motor 0x04; //GP2=ON・・・モータは今回は使用していません。
■コイルのON/OFF
左右のコイルをON/OFFするには初期設定で定義した名前を使います。
下の表を見てください。
右コイルをONするにはGP1・GP0を同時にONにします。左コイルを使用時にはGP4・GP5をONにします。動作確認用コイルLED使用時 には大丈夫ですが、左右コイルを同時にONにするプログラミングはPIC12F683のポートを破損する恐れあるので、絶対にやめてください。
rcoil・・・0x03
lcoil・・・0x30
を定義すればOKです。
GPポート |
5 |
4 |
3 |
2 |
1 |
0 |
定義値 |
使用 |
左コイル1 |
左コイル2 |
赤外線 |
モータ |
右コイル1 |
右コイル2 | |
| 右コイルON | 0 |
0 |
0 |
0 |
1 |
1 |
0x03 |
| 左コイルON | 1 | 1 | 0 | 0 | 0 | 0 | 0x30 |
実際にONにするには、定義したrcoil、lcoilをGPに出力します。
GP=rcoil・・・・右コイルがONになります。
GP=lcoil・・・左コイルがONになります。
GP=OFF・・・コイルがすべてOFFになります。
■PIC12F683特有の設定
setup_adc_ports(NO_ANALOGS)・・・A-Dコンバータは使わない
PIC12F683には4ch分のA-Dコンバータを搭載しています。TX2-006Pではジョイスティックの読み込みに使いましたが、RX2- TではA-Dコンバータは使用しません。12F683は、とくに使用宣言をしない場合、A-Dコンバータを使う設定になっています。そこで、A-Dコンバータ を使わない設定にする必要があります。
setup_oscillator(OSC_8MHz)・・・内部オシレータは8MHz
#fusesで内部オシレータを使用する宣言をしました。ここで、内部オシレータの周波数を指定します。周波数を明示しないと思った通りの動作にならずに苦労するので、必ず指定してください。
■ポート使用宣言
set_tris_a((その1));//GP3入力、ほかは出力
GPポート |
5 |
4 |
3 |
2 |
1 |
0 |
定義値 |
使用 |
左コイル1 |
左コイル2 |
赤外線 |
モータ |
右コイル1 |
右コイル2 | |
入出力 |
0 |
0 |
1 |
0 |
0 |
0 |
?? |
PIC12F683は、ほかのPICと同様に制約はありますが、入出力をプログラマが決めることができます。RX2-Tのポートの使用状況は上の表の通りです。この入出力を16進数で表すと、定義値を求めることができます。
■ 空欄を埋めてプログラムを完成してください。
// 赤外線2ch受信機 RX2&RX2-T対応
// ex1_rx2.c
// 右コイル(LED)を点滅
// for PIC12F683
#include<12f683.h>
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR,NOBROWNOUT
//ウオッチドック・タイマなし、パワーアップ・タイマ使用
//プロテクトなし、MCLRなし
#use delay(CLOCK=8000000) //8MHz駆動
#byte GP=5
#bit IRSIG=GP.3 //赤外線受光素子接続
#define ON 1
#define OFF 0
#define HI 1
#define LOW 0
#define rcoil 0x03 //GP0,GP1=ON
#define lcoil 0x30 //GP4,GP5=ON
#define motor 0x04; //GP2=ON
//メイン・ルーチン
main(){
int gcount;
set_tris_a( (その1) );//GP3入力、ほかは出力
setup_adc_ports(NO_ANALOGS);//A-Dコンバータは使わない
setup_oscillator(OSC_8MHz);//内部オシレータは8MHz
//GP 5 4 3 2 1 0
// lc2 lc1 ir mt rc2 rc1
// 0 0 1 0 0 0 =0x08
while(1){
GP= (その2) ;
delay_ms( (その3) );
GP=OFF;
delay_ms( (その4) );
}
}
■実行
右コイルLEDが200ms間隔で点滅すればプログラムは成功です。小さなRX2-T基板で自分の制作したプログラムが動作しているのは楽しいですね。
■ダウンロード
この課題のC言語ソース・ファイルおよびHEXファイルは【ex1_rx2.lzh】よりダウンロードできます。
■解答
(その1) 0x08
(その2) rcoil
(その3) 200
(その4) 200
長野県飯田工業高校 竹内浩一

赤外線制御で学ぶPICとC言語
PICマイコンでつくるインドア・プレーン
みんなで作ろうインドア・プレーン