プリント基板を作ったのに設計ミスでよけい使いにくくなったTVゲーム(「
PIC16F84AでTVゲーム ‐プリント基板を作成するも失敗‐」)を、いっそのこと無線化して、本体とコントローラーを分けてみようというテストをはじめた。
ゲーム基板そのものの回路や、特にプログラムをいじるほどの知識は無いので、タクトスイッチの押下を横取りしてリモコン化することにする。
それ専用にもうひとつPICを載せるのが手っ取り早いので、出来れば米粒PIC(PIC10F222)で出来ると都合がいい。
通信には以前買った謎の、しかし使い方は単純なFS1000A/XY-FSTとXY-MK-5Vのセットを使う。
送信側
受信側
欲をいえば切りが無いが、それを実現できるスキルにはさらに無いので、とりあえず左右のボタンの押下を伝えればいいやということで、発生させたパルスの幅を変えることで左右を表すことにした。
上が送信側、下が受信側。
何も問題なくちゃんと送受信できている。
このモジュールのいい点は、アンテナさえちゃんとつければただつなぐだけでよく、プロトコルもへったくれも無いってこと。
送信側のプログラムも、割り込みすら無い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 37 38 39 40 |
#include <xc.h> #include <stdlib.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 void makedelay(unsigned int dt){ unsigned int i; for(i=1; i<dt; i++){ __delay_us(100); } } 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 OPTION = 0b00000111; TRISGPIO = 0b00000011;//GP0,1 is In GP2,3 is Out unsigned int cnt = 0; while (1) { if(GP0==1) cnt = 100; if(GP1==1) cnt = 200; if(GP0==0 && GP1==0) cnt = 50; GP2 = 1; makedelay(cnt); TMR0 = cnt; GP2 = 0; makedelay(cnt); TMR0 = cnt; } } |
おおよそで、Highの長さが 5ms、10ms、20ms のデューティー比50%の矩形波が出ていて、受信側もusオーダーのズレで送った通りの矩形波を受信している。
あとは長さを計って右、左、押してないを判断させればいい。
「PIC16F84AでTVゲーム ‐ワイヤレス・リモコン化してみようか(受信側ソフト)‐」へ続く。