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の出番はなさそうです。

« ヒト型ロボット 41 歩行成功|Top|ヒト型ロボット 39 制御ボードを制作しました »

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://tsumeguruma.blog46.fc2.com/tb.php/101-308dbee3

Top

HOME

tsumehashi

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

03 | 2020/04 | 05
- - - 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 - -