爪車

ヒト型ロボット 22 サブマイコン

LPC2388をメインの制御にして、サブにAKI-7125(SH7125)を使用してみようと思います。

サブのAKI-7125で行う処理は、PWMサーボ16個制御、AD変換等です。
これらの処理は、以前のロボットから行ってきたことなのでプログラムがそのまま使い回せます。
問題は、LPC2388との通信処理です。
もともとマイコンを変更したのも、SH7125では通信速度の点で問題があったからです。
AKI-7125には12.5MHzのクリスタルが搭載されているので、周辺クロックは25MHzで動作させていますが、25MHzだと115.2kbpsなどでの比較的高速な通信では大きな誤差が出てしまいます。
その点、LPC2388には通信速度の誤差補正機能があるので、通信速度で悩むことはないです。

と言う事で、LPC2388の通信速度誤差補正機能を生かしてAKI-7125と調歩同期式で高速通信してみました。
AKI-7125の周辺クロック25MHzで通信できる調歩同期式モードの最高速度は781250bpsです。
この速度は一般的ではないので、PCなんかと通信する際は通常使用しません。
今回の通信相手はLPC2388なのでこの速度で通信してみます。
AKI-7125側の設定
ボーレートジェネレータ入力クロックは周辺クロックPΦ=25MHzを使用。
ボーレートジェネレータのSCBRRの設定値N=0で781250bps、ビットレート誤差0で通信できます。

LPC2388の設定
通信誤差補正機能の使い方はInterface 2009年6月号のp41に載っていますので、詳しくはそちらを参照してください。NXP社から提供されているLPC2000 Baundrate CalculatorというEXCELファイルで各種パラメータを求めます。
UART clock[Hz] = 72MHz
Requested UART baudrate = 781250
と設定すると
Best available fit for enhanced UARTとして
UART baudrate = 780000.00
Relative error = -0.16%
で通信できることがわかります。誤差はわずか-0.16%です。
各レジスタに設定する値は
UDLM = 0
UDLL = 5
DivAddVal = 2
MulVal = 13
となります。

実際に781250bpsで通信できることが確認できました。
LPC2388は+3.3V駆動、SH-7125は+5V駆動ですが、LPC2388は5Vトレラントで,SH-7125の方は入力ハイレベル電圧が+2.2Vなので、直接接続しても大丈夫でした。
いっそのこと、RS-485で接続してしまえば、サブボードをたくさんぶら下げて機能拡張もできそうです。

ヒト型ロボット 21 LPC2388の検討

ここ一週間くらいInterface付属ARM基板LPC2388を試していました。

とりあえずできたこと
・921.6kbpsでPCとシリアル通信
・KRS-4014のICS2.0制御の一部(ポジション設定の送信のみ)
サーボを動作させることはできたのですが、サーボからの返信がうまく受信できないです。

まだうまくできないこと
・割り込み関係
タイマー割り込み、UART割り込み、AD変換割り込みを試したのですが、割り込みが重なると動作がおかしくなる。
・AD変換
複数まとめて変換したいのに1チャネルずつしか変換できない。
変換終了の割り込みがうまくいかない。割り込み処理から抜け出せなくなる。

まだできないことも多いですが、ロボットに搭載するマイコンはLPC2388にしようと思います。
LPC2388は周辺機能が豊富で、UARTが4チャネルもあります。これはかなり魅力的です。また、LPC2388にはUARTの通信速度の誤差補正機能が付いています。この機能のおかげで、かなり自由な通信速度の設定ができます。1.25Mbpsでも921.6kbpsでも115.2kbpsでも誤差1%以下で通信できます。
現在使用しているサーボはKRS-4014ですが、ICS2.0の115.2kbpsでもICS3.0の1.25Mbpsでも問題なく通信できるので、将来他のシリアル制御サーボを使うことになっても対応できそうです。

ただ、問題なのは、LPC2388でのPWMサーボの制御です。LPC2388は3.3V駆動ですが、たいていのPWMサーボは5V系です。汎用I/Oが5Vトレラントなので入力は3.3Vでも5Vでも大丈夫ですが、出力は3.3Vになります。3.3Vの信号だとサーボによっては動かないかもしれません。単に3.3Vの出力信号を5Vにプルアップするのはあまりよくなさそうです。
全部シリアル制御サーボにすればいいのでしょうが、PWMサーボが勿体ないです・・・
サブのPWMサーボを制御するボードを用意して、サブボードとシリアル通信して制御することも検討してみます。

ICS2.0通信の実験中
LPC2388

ヒト型ロボット 20 ICS USBアダプターHS

ICS USBアダプターHSには、FTDIのUSBシリアル変換ICが入っているので、TTLレベルの双方向シリアル機器として汎用的に使えそうです。
PCに接続してTeraTermでテストしてみたところ、何も接続していないのに送信したコマンドが返ってきました。内部でRXとTXが繋がっているようです。
単体でループバックのテストができるので、各種の通信速度を試したところ、TeraTermで設定できる110bpsから上限の921600bpsまで正常に通信できました。
ICS3.0の通信速度1.25Mbpsは速度の設定ができなかったので試せなかったです。

KRS-4014のICSの設定のために購入したUSBアダプターHSですが、シリアルマネージャーでの利用だけでなく、他にもいろいろ使えそうです。

ヒト型ロボット 19 シリアル制御の準備

近藤科学のICS USBアダプターHSを購入してKRS-4014の設定をしました。

IDの書き換えと、原点位置の調整、PWM動作禁止の設定をしたのですが、ロボットをバラしてひとつずつ設定をしていったので、けっこう時間がかかり、半日使ってしまいました。

KRS-401Xをシリアルで制御する際は必ずPWM動作を禁止しておいたほうがいいです。
以前シリアル制御の実験をした際に、PWMモードになってしまいシリアルで制御できなくなったことがありました。

ロボットに搭載するマイコンとして、Interface 2009年5月号の付属ARM基板LPC2388と、アルファプロジェクトのSH7136搭載基板AP-SH2F-11Aを比較検討中。

ヒト型ロボット 18 マイコンの検討

ロボットに搭載する制御マイコンの検討をしています。

今回のロボットでは外部PCと接続してPCでリアルタイム処理することを考えています。
そのため、ロボットに搭載するマイコンと外部PC間で高速通信できることが望ましいのですが、今まで使っていたAKI-7125ではクロックの問題で高速でのシリアル通信ができません。外部クロックを接続する方法もあるのですが、水晶の扱いが良くわからなく面倒なのと、他のマイコンも試してみたいという思いもあり、今回は採用を見送ります。

要求として、115.2kbps,・1.25Mbpsでの通信可能、UARTが複数ある、タイマが強力、できるだけ小型、安価、などを満たしていれば良いのですが、ちょうど良いものがなかなか見つからないです。

二輪倒立振子ロボット 7 一応倒立しました

一応、ロボットが倒立しました。

といっても10秒間くらいです。初めは安定していますが、指で押したり、ちょっとした外乱ですぐに不安定になってしまいます。
角度と角速度の二つのセンサの値を制御に用いていますが、ノイズがひどく、手でロボットを垂直に支えていてもピクついてしまいます。そのため、振動が振動を呼ぶという感じになっています。

でもまあ一応倒立したのでこれでいいかなと・・・
安定して倒立するには至っていませんが、ある程度満足したので二輪倒立振子ロボットの製作はしばらく保留します。
そのうちPC上で倒立振子のシミュレーションでもしてみようかなと思っています。

二輪倒立振子ロボット 6 角度センサ

ロボットにポテンショメータを利用した角度センサを取り付けました。

通常のロボットならジャイロ(角速度)センサを積分して角度を求めますが、AD変換のノイズが酷く、ジャイロセンサから得られる値を用いると積分で求める角度の誤差が大きくなりそうなので、ポテンショメータで直接地面との角度を求めます。
おそらくAD変換のノイズは、電源に使用しているスイッチング電源のせいだと思います。

ポテンショメータはフタバのS3003サーボから取り出したものを使用しました。
ピンヘッダを取り付け、センサとして使いやすくしてみました。


地面と接する部分はプラ板で適当に作りました。
ロボットへの取り付けもテープで適当につけています。見た目は悪いですが、これでも立派な角度センサです。
DSCN0916.jpg

ART-Linuxでリアルタイム処理プログラミング

ART-Linuxを利用する環境か整ったので、リアルタイム処理プログラムの作成と実行です。

プログラムの作成と実行は

http://www.dh.aist.go.jp/jp/research/humanoid/ART-Linux/

ロボコンマガジン49号、HRP-2m Chorometで動かすロボットプログラミング 第1回 ARTLinuxを用いた実時間処理プログラミング

ロボコンマガジン53号、HRP-2m Chorometで動かすロボットプログラミング 第5回 実践! ART Linux


を参考にしています。

1.リアルタイム処理プログラムの作成
テストプログラムの作成です。テストプログラムはロボコンマガジン53号、第5回 実践! ART Linuxのサンプルプログラム(リスト1)を参考にしたものです。
このプログラムはリアルタイム処理として1秒ごとにビープ音を鳴らすプログラムです。
Ctrl+Cを押すか、ビープ音を10回鳴らしたら終了します。
実時間処理部分で時間のかかる処理をするなど、リアルタイム処理プログラムとしてはあまり適切ではないのですが、ART-Linuxの動作の確認ができると思います。

"art_test.c"

#include <stdio.h>
#include <signal.h>
#include "linux/art_task.h" // ART-Linuxのシステムコールが定義されてるヘッダ

#define PERIODIC_TIME 1000000 // 実行周期 μs

int exit_loop = 0;

// シグナル処理関数の定義
void sig_handler(int sig)
{
exit_loop = 1;
}

int main(void)
{
int i = 0;

if (art_enter(ART_PRIO_MAX, ART_TASK_PERIODIC, PERIODIC_TIME) != 0) {
perror("art_enter");
return -1;
}

// Ctrl+Cが押されたときに生成されるシグナルを補足する関数のセットアップ
(void) signal(SIGINT, sig_handler);

while (!exit_loop) {
art_wait();

puts("\a"); // ビープ音を鳴らす

i++;
if (i == 10) exit_loop = 1;
}

art_exit();

return 0;

}

リアルタイム処理プログラムに必要なことは
ART-Linuxのシステムコールが定義されてるヘッダのインクルード
#include "linux/art_task.h"
とART-Linuxのシステムコールの使用です。システムコールの詳細については、http://www.dh.aist.go.jp/jp/research/humanoid/ART-Linux/system_call.php、ロボコンマガジン49号、第1回 ARTLinuxを用いた実時間処理プログラミングを確認してください。
テストプログラムではart_enter,art_wait,art_exitの三つのシステムコールを使用しています。少なくともこの三つを使用すればリアルタイム処理が実現できます。
art_enterは非実時間プロセスを実時間タスクに変換します。
art_waitは周期的実時間タスクで呼び出されると、次の周期実行開始時刻まで実行を停止します。
art_exitは実時間タスクを非実時間プロセスに変換します。
プログラム中の
#define PERIODIC_TIME 1000000 // 実行周期 μs
で処理周期を定めています。単位はマイクロ秒です。一応1000の倍数で指定してください。
リアルタイム処理を終了する際は必ずart_exitを実行してください。また、周期的処理をするため、whileでループしていますが、無限ループには注意してください。

2.プログラムのコンパイル
Linuxでのプログラミングについては、書籍「ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道」がわかりやすいので、そちらを参考にしてください。
コンパイラはGCCを使います。プログラムのコンパイル時にart_syscalls.oをスタティックリンクします。
$gcc -Wall -o art_test art_test.c /usr/lib/art_syscalls.o
上記はUbuntu8.04の例です。環境によっては異なるかもしれません。

3.プログラムの実行
うまくコンパイルできたらプログラムを実行します。
$./art_test
プログラムが暴走して強制終了の可能性もありますので、他のファイルは保存しておいたほうがいいです。
うまくいけば1秒ごとにビープ音が鳴ります。Ctrl+Cを押すか、10回ビープ音を鳴らすと終了します。
もしかしたら1秒ごとにビープ音が鳴らず、タイミングがずれるかもしれませんが、たぶんputs("\a")の処理の問題だと思います。
プログラム中の#define PERIODIC_TIME 1000000の値をいろいろ変えてみてください。

以上でART-Linuxの簡単な動作確認は終わりです。ロボコンマガジン49,53の記事ではマルチスレッド処理にも触れられているので、是非そちらも参照してください。

余談ですが、Interface2009年10月号にUbuntu Linuxのリアルタイム拡張であるRealTime/Ubuntuについての記事がありました。いつかそちらのほうも試してみたいです。

ART-Linuxのインストール

ART-Linuxを導入してみました。

ART-Linuxはユーザー空間でのリアルタイム処理を実現するリアルタイムLinuxです。
詳しくはわからないのですが、、リアルタイム処理のプログラミングを特別なことをしなくても通常のプログラミングと同様に扱えるみたいです。
ロボットの制御に利用するべく導入してみました。

以下はART-Linuxの導入のメモです。
筆者はLinuxに関しては初心者で、ほとんど無知の状態なので、内容の正確性は保障できません。
閲覧によって生じたいかなる損害にも責任を負いかねますので、十分に注意の上、参考程度にしてください。

1.パソコンの用意
ART-Linux専用として使用するため、中古のパソコンを用意しました。
CPU: Pentium4 2.4GHz
メモリ: 512MB
HDD: 80GB
OSなしで5000円くらいでした。できるだけ専用のパソコンを用意したほうがいいと思います。

2.ベースとなるLinuxディストリビューションのインストール
ART-LinuxのベースとなるLinuxディストリビューションをインストールします。
現在、ART-Linux 2.6カーネルパッケージはUbuntu 8.04用 、Debian GNU/Linux 4.0用 の二つが用意されています。
はじめはDebian GNU/Linux 4.0をベースにしてみたのですが、ART-Linuxの起動ができなく、うまくいかなかったのでUbuntu 8.04をベースにします。
こちらを参考にして普通にUbuntu 8.04をダウンロード、インストールしてください。

3.ART-Linuxのインストール
UbuntuのインストールができたらART-Linuxのインストールです。
デジタルヒューマン研究センターのART-Linuxのページから
http://www.dh.aist.go.jp/jp/research/humanoid/ART-Linux/
ART-Linux 2.6カーネルパッケージのUbuntu 8.04用をダウンロードします。
linux-image-2.6.24.6-art_20090803_i386.deb
linux-headers-2.6.24.6-art_20090803_i386.deb
linux-source-2.6.24.6-art_20090803_all.deb

適当なディレクトリに置いたら上記のページを参考にして、Ubuntuの端末から次のコマンドでART-Linux 2.6カーネルをインストールします。
root権限で
# dpkg -i linux-image-2.6.24.6-art_20090803_i386.deb
もしくは
$ sudo dpkg -i linux-image-2.6.24.6-art_20090803_i386.deb
でインストールします。

Ubuntuでは、はじめsuコマンドが使えないので
$ sudo passwd root
でrootのパスワードを設定すると、suコマンドでroot権限になれます。

無事にインストールできたら再起動します。

再起動したら、正しくインストールできたかコマンドを実行して確認します。
$ uname -r
「2.6.24.6-art」と表示されれば正しくインストールされています。これでART-Linuxのインストールは完了です(たぶん)。

4.開発環境のインストール
UbuntuにC言語の開発環境をインストールします。
$ sudo apt-get install build-essential
でC言語の開発環境一式がインストールできます。

以上で、ART-Linuxでリアルタイム処理をするための準備が整いました。
次回はリアルタイム処理プログラムの作成と実行です。

ヒト型ロボット 17 上半身

ロボットに上半身を取り付けました。

頭なし、腕から先なしの中途半端な上半身ですが、これで一応完成です。
ロボットの図体が大きいので、転ぶと上半身の受けるダメージが大きく、腕など簡単に壊れてしまいそうなので、簡素な上半身にしています。
ロボットを歩行させることを優先させて、安定して動作できるようになったら、ちゃんとした上半身を作る予定です。
いつになるかはわからないですが、物をつかめるようにロボットハンドも制作してみたいです。

ほぼ機体が完成したので、身長と体重を量ってみました。
身長は約55cm、体重は2kg弱でした。身長の割には軽いほうだと思います。
後は制御関係を載せるだけです。電源は外部の安定化電源を使用するので、電池は搭載しません。



片腕は3個の4024で構成しています。

ヒト型ロボット 16 新型

倒立振子ロボット製作と平行してヒト型ロボットの方も進めています。
新たに部品を購入して新型を組みました。まだ下半身だけですが、上半身も今後取り付ける予定です。

脚のリンク長を100mmから150mmに変更して大型化してみました。



以前のものと大きな変更は腰周りの変更です。脚の付け根のヨー軸を4024から4014に変更し、剛性を上げました。また、腰にロール、ピッチ、ヨー軸の3自由度を追加しています。

DSCN0899.jpg

アームサポーター4000Aを用いてブラケットを面で受けれるようにしています。
下部はブラケットと干渉するのでカットしています。ネジ2本だけでの固定となりますが問題ないです。

DSCN0876.jpg

今までのSH7125だと16個のサーボまでにしか対応していないので、制御系は新規に制作する予定です。

二輪倒立振子ロボット 5 マイコンの変更

制御用マイコンをH8 3694からSH 7125に戻すことにしました。
3694のタイマではステッピングモータの制御がうまくいかなかったからです。

ステッピングモータの制御には1Hz~数kHzのパルスが必要になるのですが、3694のタイマでは1Hz~数kHzのパルスを自由に出力できないです。プログラムを工夫すれば何とかなりそうですが、処理が重くなりそうなのと、ただ面倒なのでSH7125を使用することにします。
SH7125では1Hz~数kHzの範囲のパルスを直接的に出力することができます。

Top

HOME

tsumehashi

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

09 | 2009/10 | 11
- - - - 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