(バグあり)結構苦労する送信部分+受信部分 4チャンネル - インドアプレーン

Posted by kyosuke at 04/03 2008
>>次の記事: (修整版)結構苦労する送信部分+受信部分 4チャンネル
>>前の記事: 赤外線通信の送信部のプログラム1



赤外線通信の送信部のプログラム1
http://toolible.net/monozukuri/articles/49<br />
で送信部した赤外線を受信してLEDで光らせることができました。

あとは、
送信する際に命令ごとにいくつかパターンを作って送信して、
受信したときに、そのパターンで何の命令かを判別するだけ。

楽勝だねー

と思っていたら、
結構苦労してしまいました。

そもそも7割くらい損壊しているオシロスコープしか持っていないのが原因だよ。
と八つ当たりしてみる。



とりあえず作り終わった実物。
4つの命令を区別できる。
Ir2

インドアプレーン的に、
スピードアップ(上昇)
スピードダウン(下降)
右行け
左行け

の4つの命令。
ラジコンとか作ったことないので分かりませんが、
これで十分かなーとか。







回路図
Ir2
あ、またコンデンサ入れるの忘れた。。
PICのVccとGNDには1uFくらいのコンデンサを入れましょう。



送信プログラム
500us、1000us、1500us、2000us
ぐらいで赤外線を発信する。

#include <pic.h>
#include "delay.h"
__CONFIG(0xFF94);

main(void){
	short cnt=0;
	TRISIO = 0xFE;
	CMCON = 0x07;
	GPIO0=0; /* IR OFF */
	while(1){
		if(GPIO2 == 1){
			for(cnt=0;cnt<18;cnt++){
				GPIO0 = 1;
				DelayUs(13);
				GPIO0 = 0;
				DelayUs(13);
			}
		}else if(GPIO3 == 1){
			for(cnt=0;cnt<37;cnt++){
				GPIO0 = 1;
				DelayUs(13);
				GPIO0 = 0;
				DelayUs(13);
			}
		}else if(GPIO4 == 1){
			for(cnt=0;cnt<56;cnt++){
				GPIO0 = 1;
				DelayUs(13);
				GPIO0 = 0;
				DelayUs(13);
			}
		}else if(GPIO5 == 1){
			for(cnt=0;cnt<76;cnt++){
				GPIO0 = 1;
				DelayUs(13);
				GPIO0 = 0;
				DelayUs(13);
			}
		}else{
			GPIO0=0;
		}
		DelayMs(250);
	}
}


受信プログラム

さて、ここで問題が発生した。
送信プロブラム通りなら赤外線を受信する時間が
500usならLED1をON、
1000usならLED2をON、
1500usならLED3をON
2000usならLED4をONにする。

でも、やってみると、
受信時間をほぼ倍にしないと命令が狂ってしまう。

うまくいく受信時間を
1000usならLED1をON、
2000usならLED2をON、
3000usならLED3をON
4000usならLED4をONにする。
#include <pic.h>
#include "delay.h"
__CONFIG(0xFF94);

main(void){
	short cnt=0;
	TRISIO = 0x08;
	CMCON = 0x07;
	GPIO0=0; /* LED1 ON */
	GPIO1=0; /* LED2 ON */
	GPIO2=0; /* LED3 ON */
	GPIO4=0; /* LED4 ON */
	while(1){
		if(GPIO3 == 0){
			DelayUs(100);
			cnt = cnt+1;
		}else{
			if(cnt < 9){
			}else if(cnt >= 9 && cnt <= 10){
				GPIO0=1;
				DelayMs(100);
				GPIO0=0;
			}else if(cnt >= 17 && cnt <= 18){
				GPIO1=1;
				DelayMs(100);
				GPIO1=0;
			}else if(cnt >= 26 && cnt <= 27){
				GPIO2=1;
				DelayMs(100);
				GPIO2=0;
			}else if(cnt >= 35 && cnt <= 36){
				GPIO4=1;
				DelayMs(100);
				GPIO4=0;
			}
			cnt = 0;
		}
	}
}


うーん、
for(cnt=0;cnt<76;cnt++)
あたりで26usの遅延プログラムが26usではなくなったのかな?

ちゃんと動くオシロがあればわかりやすいんですけどね。。


>>次の記事: (修整版)結構苦労する送信部分+受信部分 4チャンネル
>>前の記事: 赤外線通信の送信部のプログラム1





インドアプレーンのモノ作り記事

Ir_out_thumb
(修整版)結構苦労する送信部分+受信部分 4チャンネル
(バグあり)結構苦労する送信部分+受信部分 4チャンネル&lt;br /&gt; http://toolible.net/monozukuri/articles/55 &lt;br /&gt;&l...
続きを読む>>(修整版)結構苦労する送信部分+受信部分 4チャンネル
Posted by kyosuke at 04/16 2008

Ir2_thumb
(バグあり)結構苦労する送信部分+受信部分 4チャンネル
現在のページです
Posted by kyosuke at 04/03 2008

Ir2_thumb
赤外線通信の送信部のプログラム1
前回は、テレビのリモコンを使って&lt;br /&gt; 赤外線の受信テストを行ってみました。&lt;br /&gt; http://toolible.net/monozukuri/article...
続きを読む>>赤外線通信の送信部のプログラム1
Posted by kyosuke at 03/27 2008

Ir_thumb
インドアプレーンを作りたくなった
とりあえずテレビのリモコンで、 赤外線の受信を試してみるー。 (受信側だけ部品を組んでみる) 部品 以前アキバで買っといた赤外線受光素子 PL-IRM0101(おそらくこれ 200...
続きを読む>>インドアプレーンを作りたくなった
Posted by kyosuke at 03/25 2008