「PIC16F84AでTVゲーム ‐ワイヤレス・リモコン化してみようか(送・受信ハードと送信側ソフトまで)‐」の続き。
上のリンク先で、__delay_us();を使って矩形波を作ったところまで書いた。
信号がちゃんと送受信されているか確認のためにロジアナを使ったので、その測定値から矩形波のHighの部分の時間をメモっておく。
順に、5.5ms、11.0ms、22.1ms だった。
受信側で長さを計るのもPIC10F222で行うこととして、単純にこんなことにした。
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 31 32 33 34 35 36 |
#include <xc.h> #include <pic10F222.h> // CONFIG #pragma config IOSCFS = 8MHZ // Internal Oscillator Frequency Select bit (8 MHz) #pragma config MCPU = ON // Master Clear Pull-up Enable bit (Pull-up enabled) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config CP = OFF // Code protection bit (Code protection off) #pragma config MCLRE = OFF // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD) #define _XTAL_FREQ 8000000 int main(void) { ADCON0bits.ANS0 = 0;//GP0/AN0 configured as digital I/O ADCON0bits.ANS1 = 0;//GP1/AN1 configured as digital I/O OSCCALbits.FOSC4 = 0;//GP2/T0CKI applied to GP2 TRISGPIO = 0b00001100;//GP0,1 is Out GP2,3 is In unsigned short cnt = 0; while (1) { cnt = 0; while(GP2 == 1) cnt++; GP0 = 0; GP1 = 0; if(cnt>1526 && cnt<1866){ GP0 = 1; GP1 = 0; } if(cnt>3058){ GP0 = 0; GP1 = 1; } while(GP2 == 0); } } |
while(GP2 == 1) cnt++; と書いて、GP2 が High な間だけカウンターを増加させ、後でその数によって点灯させるLEDを変える。
GP0、GP1にLED、GP2に受信モジュールからの信号が接続されている。
上にはすでに条件文に使う値が書いてあるが、実際に矩形波のHighの長さによってカウント値がいくつになるかを知るにはSimulationで while(GP2 == 1) cnt++; の実行時間を計ってみなければならない。
「MPLAB X のSimulatorで実行時間を確認する」とか「MPLAB X のSimulatorでピンの状態を指定する」とかを参照のこと。
6.5μsとなった。
上に書いた時間をこれで割って、カウント値を求め、10%程度のマージンを加えてIf文の条件式に使ってある。
紫のコイルが送信側のアンテナで、緑が受信側のアンテナ。
2つのタクトスイッチのどちらかを押すと、受信部のLEDの対応する方が点灯する。
撮影のために並べて置いてあるが、数メートル離しても問題なく動作する。
先日作った、コネクタ位置が何だかなあという失敗作のゲームボードに、ICクリップでつないでみた。
ゲームボードの方はボタンの押下げを感知するピンはプルアップされているので、ボタンを押すとLowになる。
上のプログラムでは逆になっているので、その点だけを変更して、難なくワイヤレス化が完了してしまった。
おかしなものだが、ワイヤレスになっただけで、何かこう、新鮮さが出て、思わず熱中して遊んでしまった。
ケーブルから開放されるってのは気分まで変わるもんなんだとあらためて感心した。
プリント基板を作成した。
「PIC16F84AでTVゲーム ‐無線リモコン化してプリント基板を作成した‐」