俺なりの通信プロトコル
いままでは素直にデフォルトの通信プロトコルに従ってきたわけだが、
プレンのファームを改造してしまえば、そんなもの無視して自分の好きなようにプレンと通信できる。
プレンのファーム開発環境などについては以下のエントリを参考にしてほしい。
http://d.hatena.ne.jp/plen/20071107/1194407924
http://d.hatena.ne.jp/plen/20071111/1194797864
今回の例は独自の通信プロトコルを作ってうんぬんということではなくて、
単に1文字受け取ってモーションを再生しているだけ。
応用して俺なりの通信プロトコルを作って、デフォルトの仕様とはおさらばしよう(その後どうなってもぼくは知らない)。
ファームのソースファイルは以下のようにしてみた。
#include <Pirkus_R_RE002.h> #define UART_BAUD_RATE (u32)57600 u08 rxBuffer0[1024]; u08 txBuffer0[10]; u08 rxHID[16]; u08 txHID[8]; int main() { enableIRQ (); Rs0_Init( UART_BAUD_RATE , txBuffer0, sizeof( txBuffer0), rxBuffer0, sizeof( rxBuffer0 ) ); HID_Init( UART_BAUD_RATE , txHID, sizeof( txHID), rxHID, sizeof( rxHID ) ); Eeprom_Init( 500000 ); Servo_Init( 1 ); Servo_RTableLoad(); KeyFrame_Init(); MotionTask_Init(); MotionTask_MoveToOrigin( 10 ); Rs_DefaultChannelSet( 2 ); // O = BT module // 1 = UART 1 (TTL Level) // 2 = USB HID Emulater PCLink_Init(); u08 c; while(1){ // walk(); if( 0 < Rs0_DataIsIn() ){ c = Rs0_CharGet(); if ( c == '0' ) { MotionTask_Start_EEPROM( 0 ); Rs0_Printf( "playing motion 0" ); } else if ( c == '1' ) { MotionTask_Start_EEPROM( 1 ); Rs0_Printf( "playing motion 1" ); } while( MotionTask_IsRunning() ); //BT_CommandWait(); } if( 0 < Rs_DataIsIn()) { PCLink_CommandWait(); } } }
動作確認するために、さっき作ったpyplen.pyも使いもってごちゃごちゃしてみる。
下の内容でplen_operation.pyファイルを作る。
import pyplen p = pyplen.PyPlen() s = p.plen_connect() p.start_listener(s) while 1: c = raw_input() if c[0] == 'q': break else: s.send(c[0]) s.close
実行。
$ python plen_operation.py 1 . PLEN *** (**:**:**:**:**:**) 2 . ********* のコンピュータ (**:**:**:**:**:**) select a device: 1 selected PLEN *** connected 1 p laying motion 1 0 p laying motion 0 q $
connectedが出たら接続されているので、キーボードの1キー&リターンで1番目のモーションを再生して、
0キーで0番めのモーションを再生する。
qキーで終了する。
どうやら、listenerメソッドがうまく文字列を受信していない。
例えば、
playing motion 1
となるところが
p laying motion 1
となっている。
よくわからないので、また今度調べることにする。