FC2ブログ

爪車

ヒト型ロボット 40 PCとデータのやりとり

LPC2388はRAMが64KBと余裕があるので、PCからサーボのポジションデータをシリアル通信で受信してRAMに保存しておけるようにしました。
RAMに保存してあるポジションデータを順次再生することにより、ロボットが動作します。
一応16KB程度をポジションデータ保存用として確保してみました。

PCからポジションデータの送信ですが、シリアル通信では1バイトずつしか送れないので、1つのポジションデータを1バイトのunsigned char型2つに分解します。

分解されたデータを複数まとめてパケット単位にして送受信します。
パケットの構成はこんな感じです

[STX][SIZE][CMD][data 1]...[data n][SUM][ETX]

[STX] 先頭コード
[SIZE] データサイズ
[CMD] コマンド
[data] 1~n個のデータ本体
[SUM] チェックサム
[ETX] エンドコード

チェックサムにより通信のエラーを検出できます。
ただ、エラーの検出はできるのですがエラーの処理を考えていません。
もし、エラーが発生したら送受信が停止するので、またリセットしてから初めからやり直しです。

LPC2388でデータを受信したら、1バイトずつに分解されたデータを元の型に復元してRAM上の配列に格納します。
サーボにICS2.0通信でポジションデータを送るときに、また1バイトずつに分解することになるのですが、ジャイロセンサなどの補正を加える際にデータの取り扱いが楽なので、元の型に戻してしまいます。

実際にはデータ本体を送受信する前後に、送受信の確認をする処理を入れ、ハンドシェイク方式で通信しています。
これを必要な回数繰り返します。

通信処理のプログラムの信頼性が低く、通信中に他のタイマなどの割り込みが発生すると、通信処理が止まってしまうので、通信の際はUART以外の割り込みは完全に停止させています。

20ms周期程度でPCとデータをやりとりすることができれば、PCからのリアルタイム制御が実現できるのですが、20ms程度の周期ではPCからデータを受信して、センサによる補正処理、ICS2.0サーボの制御、となるとマイコン側での処理が追いつかず、現状では難しいです。

ICS2.0サーボは、データ送信後に必ずサーボから返信があるので、複数のサーボに連続してデータを送ることができません。
割り込みなどを利用して1個ずつ処理する必要があるので、サーボの数が多いと処理にけっこう時間がかかってしまいます。

また、通信がうまくいかず、データがおかしくなったときのサーボの暴走が怖いので、サーボの電源を入れる前に、データをすべて受信し、データが正常か確認してから動作させるようにしています。

しばらくART-Linuxの出番はなさそうです。

Top

HOME

tsumehashi

Author:tsumehashi
FC2ブログへようこそ!

12 | 2010/01 | 02
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -