i-sobotを分解してみよう
タカラトミー発売のロボット「i-sobot」を分解し,サーボモータへの信号を解析するというコラムがRobot Watchで紹介されていたので,実際に検証してみる.最終目的は外部から信号を送り込んで自由に動かすことなので,検証というより追加調査という形に近いですかね.

というわけでとりあえず分解.ネジは6角レンチで外します.
外してみると固い固い.タッピングビスかと思いきや普通のビス.こういうところで費用を・・・いや何でもありません.



とりあえず分解完了.写真は背中側から見ています.ボードから出ている端子が直接各四肢部の接続部分に繋がっている.
今回は右腕に信号を送ってみるので,右腕のサーボを制御しているであろう端子部分に注目. 2ミリピッチのストレートピンヘッダでつながっているので,これを乗っ取ってしまおう.



4つの端子をオシロで調べてみたところ,本体に対して上から順にGND・信号・3.3V・4Vであると分かる. 2ミリピッチのストレートピンヘッダをつないで,電源とGNDはそのままつなぎます. シリアル入力信号線のみ分離させてボードには繋がず,PCからUSBで直接シリアル通信を行うことにします. USB-シリアル(TTL)変換は以前作ったFTDI232RLを使った基板です.TTLレベルであれば何でもいいと思います. ボーレートは2400bps,ストップビット1,パリティなし,フロー制御なしで接続.
これで準備完了.先述したコラムで紹介されていたプログラムを参考に,以下のプログラムを送り込む. なんかよくわからないのは,そのままで,8バイト目はチェックサムで1-7バイトの和の8ビット分のようです.
正常に動作してるのか分からなくなるので,printfで経過を見ておきましょう.

while(1){

for(i=0;i<30;i++){
cBuffer[0]=255;
cBuffer[1]=5;
cBuffer[2]=0;
cBuffer[3]=60;
cBuffer[4]=128;
cBuffer[5]=0;
cBuffer[6]=0;
cBuffer[7]=cBuffer[1]+cBuffer[2]+cBuffer[3]+cBuffer[4]+cBuffer[5]+cBuffer[6];
hCom->transmit( (BYTE*)cBuffer, 8 );
Sleep(10);
}
printf("%d,%d,%d,%d,%d,%d,%d,%d\n",cBuffer[1],cBuffer[2],cBuffer[3],cBuffe
r[4],cBuffer[5],cBuffer[6]);

for(i=0;i<30;i++){
cBuffer[0]=255;
cBuffer[1]=5;
cBuffer[2]=0;
cBuffer[3]=150;
cBuffer[4]=40;
cBuffer[5]=0;
cBuffer[6]=0;
cBuffer[7]=cBuffer[1]+cBuffer[2]+cBuffer[3]+cBuffer[4]+cBuffer[5]+cBuffer[6];
hCom->transmit( (BYTE*)cBuffer, 8 );
Sleep(10);
}
printf("%d,%d,%d,%d,%d,%d,%d,%d\n",cBuffer[1],cBuffer[2],cBuffer[3],cBuffer[4],cBuffer[5],cBuffer[6]);

}

このプログラムでは,右腕の肘サーボと肩サーボ(共にロール回転)の2軸が動作しました.
その様子がこちら.


cBuffer[4]のみを変化させると,コラムで紹介されていた通り,肘サーボのみが動作. このコラムが正しいとすれば,cBuffer[3],つまりサーボ2は肩のロール回転サーボであると推測できます.
しかしながら,入力数値によっては全く動作しなかったため,何か数値的な制約(可動範囲等の制約等)があると思われます.
また,適当な数値を適当に入れていた時に肩のピッチ回転サーボも動作したので,このまま検証していけばとりあえず腕だけでも自由に動かせるようになりそう.
とりあえず今日はここまで.時間もなかったから一旦終えてしまいましたが,B4のやる気溢れる学生さんがすぐにでも続きを完成させてくれそうです.
次回もお楽しみに!