Home Contact Sitemap

洛星ロボット研究部 開発日誌

洛星中学高等学校のロボット研究部・同好会のブログです。

    アーカイブ
    ブログロール
    • happybusy
    Amazonサーチ
«

RCXメッセージについてのメモ

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です。

By rakuseirea . 2006-08-27 . 14:19
コメントお待ちしております! Filed under: 未分類

コメントはありません »

コメントお待ちしております!

RSS feed for comments on this post. TrackBack URL

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>