RCX Messageに関する情報をまとめます。
(参考文献:http://graphics.stanford.edu/~kekoa/rcx/)
RCXとの赤外線での通信は
http://graphics.stanford.edu/~kekoa/rcx/protocol.htmlより
The IR protocol associated with sending a “message” to the RCX is pretty
simple. Bit encoding is 2400 baud, NRZ, 1 start, 8 data, odd parity, 1
stop bit. A ‘0’ is coded as a 417us pulse of 38kHz IR, a ‘1’ bit is 417us
of nothing.
At the packet level, all packets look like this:
0x55 0xff 0x00 D1 ~D1 D2 ~D2 … Dn ~Dn C ~C
where D1…Dn are the message body, and C = D1 + D2 + … Dn.
The data for sending an IR message is F7 followed by the 8 bit “message”.
For example:
55 ff 00 f7 08 12 ed 09 f6
is a packet sending the message “0x12” to the RCX.
2400bps 8bit 奇数パリティ ストップビット1
です。
今回はこのデータとマイコンのタイマーで生成した38KHzのPWMをAND回路で合成し赤外線LEDを点滅させることにします。
実際に送信するデータは上の情報より
ヘッダ「0x55 0xff 0x00」
命令(RCXMessageの場合)「0xf7」
命令のビット反転したデータ「0x08」(0xff-0xf7)
送りたいRCXMessage(例:5)「0x05」
反転データ「0xfa」(0xff-0x05)
チェックサム
チェックサムの反転データ
これを関数にしたものがこれです。(H8/3694で動作確認済み)
SCI3_OUT_DATAは各マイコンで書き換えてください。
またシリアルの初期化は別に行ってください、
/*———————————————–*/
/* RCXメッセージ送信 */
/*———————————————–*/
void Send_RCX_Message(char Message)
{
int Check_Sam;
if(Message>0x08)
{
Check_Sam=Message-0x09;
}else{
Check_Sam=Message+0xf7;
}
SCI3_OUT_DATA(0x55);
SCI3_OUT_DATA(0xff);
SCI3_OUT_DATA(0x00);
SCI3_OUT_DATA(0xf7);
SCI3_OUT_DATA(0x08);
SCI3_OUT_DATA(Message);
SCI3_OUT_DATA(0xFF-Message);
SCI3_OUT_DATA(Check_Sam);
SCI3_OUT_DATA(0xFF-Check_Sam);
}
一応mainも含めて作成したプログラムが以下です。
#include <3694.h> // H8 Tinyの内部I/O定義
char txb[10], rxb[10];
/*———————————————–*/
/* RCXメッセージ送信 */
/*———————————————–*/
void Send_RCX_Message(char Message)
{
int Check_Sam;
if(Message>0x08)
{
Check_Sam=Message-0x09;
}else{
Check_Sam=Message+0xf7;
}
SCI3_OUT_DATA(0x55);
SCI3_OUT_DATA(0xff);
SCI3_OUT_DATA(0x00);
SCI3_OUT_DATA(0xf7);
SCI3_OUT_DATA(0x08);
SCI3_OUT_DATA(Message);
SCI3_OUT_DATA(0xFF-Message);
SCI3_OUT_DATA(Check_Sam);
SCI3_OUT_DATA(0xFF-Check_Sam);
}
void main(void)
{
// 通信ポートを初期化 ボーレートは2400[bits]
rs_init (64, txb, sizeof(txb), rxb, sizeof(rxb));
SCI3.SMR.BYTE=0x31;
IO.PCR8 = 0x00;
//———————–
// タイマW設定
//———————–
TW.TMRW.BIT.CTS = 0; // TCNTカウント停止
TW.TCRW.BIT.CCLR = 1; // コンペアマッチAによりTCNTをクリア
TW.TCRW.BIT.CKS = 2; // 内部クロック
// 1ch = FTIOB設定
TW.TMRW.BIT.PWMB = 1; // FTIOB端子の出力モード = PWM
TW.TCRW.BIT.TOB = 1; // 最初のコンペアマッチAが発生するまでの端子出力値 = High
TW.TCNT=0x0000; /* TCNの初期化 */
TW.GRA = 65;
TW.GRB = 32;//38KHz
TW.TMRW.BIT.CTS = 1; // Wタイマ TCNTカウント開始
// 通信は割り込みで処理されます
// 初期化後は必ず割り込みを許可状態にしてください
EI;
while(1)
{
//ここに実際にしたい処理を記述
//RCXMessageを送るときはSend_RCX_Message(送りたいメッセージ(1〜255));
}
}
すいません。まだ途中の投稿です。回路図や細かい説明はまたすぐに書き込みます。
それとH8マイコンやC言語の基本的な知識が必要となります。
またコンパイル環境はGCC Developer Liteです。
コメントお待ちしております!
RSS feed for comments on this post. TrackBack URL