« 2009年8月 | トップページ | 2009年11月 »

2009年9月26日 (土)

Engineer Award 2009 Beautoロボコングランプリ 番外編

エンジニアが集まるSNS「エンカフェ」
http://encafe.jp/

そのエンカフェが主催するEngineer Award 2009
http://www.engineeraward.jp/about/

ロボットコンテストや電子工作コンテストが開催されました。

ここではその中のロボットコンテスト「Beautoロボコングランプリ」に出場した話です。

番外編 ~KASSIN DCDスペック~

今回はKASSIN DCDで使用した、ライントレーサーロボットの目となるラインセンサー周りの回路とプログラムを紹介します。

Line_sence01
これが実際の回路図です。(回路図は1つのセンサー分で実際には5個あります。)

KASSIN DCDではラインセンサーの値を回路でデジタル化して黒いラインを検知していました。
センサー周りは5Vで動かして、NOTゲートIC(74VHC04)で3.3V化&デジタル化をしてます。
センサーの反応ぐあいはVR(半固定抵抗)で調整できるようになっています。
あとフォトリクレクタのLEDには若干多めに電流が流れるよう(発光量増やすため)をに抵抗R1を決めています。

センサーはマイコンのP50~53、P62につなげて、プログラムではセンサー値をビットに割り付けて読む込むように定数テーブルで変換してます。
(使ってるプログラムをそのまま載せてます。 ちなみにUBYTEはunsigned charです。)

const UBYTE hw_sence_chg[5][2] = /* センサー値変換テーブル */
{
#if 0 /* High Active */
    { 0 , 1  },    /* 0bit目 */
    { 0 , 2  },    /* 1bit目 */
    { 0 , 4  },    /* 2bit目 */
    { 0 , 8  },    /* 3bit目 */
    { 0 , 16 }    /* 4bit目 */
#else /* Low Active */
    { 1  , 0 },    /* 0bit目 */
    { 2  , 0 },    /* 1bit目 */
    { 4  , 0 },    /* 2bit目 */
    { 8  , 0 },    /* 3bit目 */
    { 16 , 0 }    /* 4bit目 */
#endif
};

UBYTE getLineSence(UBYTE masc_ub) //センサー状態読み込み
{
    UBYTE x=0;

    /* 各ポートより読込み */
    x  = hw_sence_chg[0][IO.PDR5.BIT.B0];
    x |= hw_sence_chg[1][IO.PDR5.BIT.B1];
    x |= hw_sence_chg[2][IO.PDR5.BIT.B2];
    x |= hw_sence_chg[3][IO.PDR5.BIT.B3];
    x |= hw_sence_chg[4][IO.PDR6.BIT.B2];

    /* 必要分だけマスク */
    x &= masc_ub;

    return x;
}

このあとセンサー値を数値化してモーターを制御するプログラムに入力してます。

読み込んだセンサー値をモーター制御値にするプログラムではPD制御っぽいことをやってます。
PD制御とは比例、微分制御の略です。
これに積分を足したPID制御というのは有名だと思うので詳しくはネットで調べてみてください。
私もこういう制御の知識には乏しいのでネットでいろいろ調べた結果、PD制御に至りました。

実際のプログラムでは15ms周期でセンサー値を読み込んでPD制御の計算をしてモーターを制御
してます。
プログラムの流れは下記の様になってます。

センサー値読み込み
   ↓
センサー値を合せたいセンサー値(つまり真中が反応してる状態)を0として±20の値にする。※1
   ↓
今のセンサー値と過去2回分のセンサー値からPD計算をする。※2
   ↓
PD計算結果を±40の値にする。
   ↓
±40の値を左右のモーター制御値(±127)にする。※3

という感じです。
(±20とか±40とかは感覚的に作った段階の数値でその範囲に制御的な意味はありません。)

※1の部分を例を挙げて説明しますと・・。

○:センサー反応無し
●:センサー反応有り(黒線検出)

としまして5個のセンサーを使っていたので
合せたいのは真中のみが反応している状態の下記になります。

○○●○○

このときの数値を0として、
たとえば一番外れてるとき

●○○○○

は20としてます。
その逆

○○○○●

は-20。

数値は左方向が+、右方向が-です。
実際の処理ではセンサーの値から定数テーブルで変換してます。
ビットのパターン的には32パターンしかありませんが、
外向きに向かって重みをつけてます。

※2の部分では下記の様な計算です。

X0:今のセンサーの値
X1:1回前のセンサーの値
X2:2回前のセンサーの値

P:比例定数
D:微分定数

PD計算結果= P×(X0-X2)+D×((X0-X1)-(X1-X2))

PD計算結果も左方向が+、右方向が-です。
実際の処理ではもうちょっと効率がいい計算式にして計算してます。
比例定数と微分定数は実際に走らせながら決めてます。
もっと論理的な決め方があるのでネットを参照下さい。

※3でも定数テーブルで変換してるだけです。

たとえば PD計算結果=40 ⇒ 左モーター:-40、右モーター:127

モーター制御値は±127で+方向が前、-方向が後です。
つまりこの場合は、左の方にずれているので左のモーターを逆転させて
センターに戻す方向に動きます。
ただ直角カーブや線を見失ったときはこれとは別な処理フェーズに
遷移するようになってます。

定数や定数テーブルの値は計算がめんどくさくなって、すべて非論理的
に決めてるので処理の流れだけ参考になればと思います。

| | コメント (0) | トラックバック (0)

2009年9月19日 (土)

Engineer Award 2009 Beautoロボコングランプリ 第5話

エンジニアが集まるSNS「エンカフェ」
http://encafe.jp/

そのエンカフェが主催するEngineer Award 2009
http://www.engineeraward.jp/about/

ロボットコンテストや電子工作コンテストが開催されました。

ここではその中のロボットコンテスト「Beautoロボコングランプリ」に出場した話です。

第5話 ~いよいよ東京大会~

いよいよ明日、東京大会!

結局、納得のいく調整はできませんでしたがプログラムはフィックス。
仕事が終わったらエージング&バッテリー充電&準備!。

トーナメント形式なので1回負けたら終わり。
完走&1回戦突破ぐらいは狙いたい!。

自分のロボットを走らせるのも楽しみですが、他の方のロボットを見るのが楽しみだ。

そして東京大会当日・・。
場所は高円寺にあるエンカフェのイベントスペース。
早めに着けば、トライアルコースで調整できるということなので、
ぴったり開場時間に到着!

参加者が8人になったということなので、トーナメントではなく総当りのリーグ戦
になったことを知らされ、これで1回で終わりという残念なことにはなりません。
しかしバッテリーが足りるかが心配。

そして早速、トライアルコースで試走・・・ぜんぜん走らない・・・。
コースアウトしまくり・・・。ヤヴァイ・・・。

大会が始まる時間まであと1時間程度・・・。必死で対策を考えます。
あっ!と思いついたのはバッテリー・・。
そういえば試走用のバッテリーのまま、しばらく交換してなかった!!
大慌てでバッテリーを交換し、トライアルコースを走らせたら普通に走った・・。
原因はバッテリーの電圧低下でセンサーが線をまともに捕らえてませんでした・・・。

そんなこんなでドタバタ(自分だけ)で始まった大会。
ドキドキしながら自分の出番を待ち、いよいよ初戦!
私のロボット名はKASSIN DCDです。↓

初戦はみごとに勝利!
そして・・総当りのリーグ戦
順調に勝ち星を取っていきます。
そしたらなんと優勝してしまいました。!!!
よし次は全国大会だ~!!

東京大会の様子はRobotWatchの記事になっています。
詳しくはそちらでどうぞ(自分で書けよ・・)

エンジニアアワード2009「ヴイストン Beautoロボコングランプリ東京大会」レポート

全国大会に進むことができたので次回へ続く・・。

| | コメント (0) | トラックバック (0)

2009年9月 5日 (土)

Engineer Award 2009 Beautoロボコングランプリ 第4話

エンジニアが集まるSNS「エンカフェ」
http://encafe.jp/

そのエンカフェが主催するEngineer Award 2009
http://www.engineeraward.jp/about/

ロボットコンテストや電子工作コンテストが開催されました。

ここではその中のロボットコンテスト「Beautoロボコングランプリ」に出場した話です。

第4話 ~故障~

目標は最大のスピードでコースアウト無く走らせることということで
まず前回(3話)での最大スピードのコースアウト理由を分析しながら
プログラムの改良を加えていきます。

しかし、どうしても直角カーブや線がクロスするところでコースアウトしてしまうので
それを正確に検出するためにラインセンサーを加えました。

Kassindcd02 前回の写真 を見ていただくとわかるとおもいますが、前の両サイドにセンサーを追加してます。

いい感じに直角カーブ、クロスラインを検出して走ってくれます。
ただ、まだ最大スピードにするとコースアウトすることがあるので、
ひたすらプログラム調整。

そんな中、2009年8月29日に最初の予選である大阪大会が開催されました。
この大会はインターネットとのコラボレーションも特徴であり、ロボット送って
大会当日にその場所に居なくても参加が可能で、大会の状況もUSTERAM
で見ることができます。

ロボットを送って、ためしに大阪大会に出場することも検討しましたが、
ロボットが完成状態に無いのであきらめました。

大会の状況をつかむため、USTREAMの中継を見ながら、やるぞ~っと
燃えながらロボットの調整をしていましたが、突然動かなくなりました・・。
最初はプログラムミスかなと思いましたが、どうやらCPUボードに付いてる
モータードライバが逝ってしまったようです。

大会を見ながらノリにノって居たのでショックが大きかったです。
出場予定の東京大会まで2週間なので凹んでもいられず。
解決案をいくつか考えました。

1.予備のCPUボードに取り替える。
2.違うモータードライバICを別に付ける。
3.前に作った、モータードライバ↓を付ける。
Motor_drive01

とりあえず案を考えて、検討します。
1は一番手っ取り早いですが同じことになる可能性がある。
2はちょっとスペックが上のを使えばいい感じかも。
3は定格的にはオーバースペックで、ゴテゴテしくなる。

最終的には2番を選んで、即、電子パーツ屋さんに走りました。

選んだのは東芝のTA8440HというモータードライバICで耐電流的にも
CPUボードのモータードライブより上です。
ただドライブの為の入力が5V以上なので3.3Vで動いてるCPUの
出力では直接つなげられません。
なのでフォトカプラを間に入れて回路を組みました。

そんなこんなでロボットはこうなりました。
Kassindcd03_2 ちょっとゴテゴテしくなりましたが、割とコンパクトにまとめられたと思います。

モータードライバを変えることによってモーターの応答性も上がったので
結果的に走りはよくなりました。
CPUボードのモータードライバは正転と逆転を切り替える際にデットタイム
というモーターに流す電流をOFFにする時間が自動で入るようになってます。
これはモータードライバの素子を保護するためには必要なのですが、
安全マージンも考慮されていて時間の調整もできないので、応答性の
低下につながっていた様です。

TA8440Hは単純なモータードライバなのでその様な機能は入ってません。
その辺、プログラムで調整可能なのでベストな値で動かすことができます。
逆に言うとモータードライバの素子を壊してしまうリスクもあるわけですが・・。

その走りは↓こうなりました。

まだ直角カーブがいまいちです。

東京大会まで1週間を切って、広いコースで走らせたくなりました。
いままでは自分の部屋の床を使っていたのですが、大会のコース
と比べると小さいので、本番と同じぐらいのコースで試さないと
納得がいかない・・。

ということでダイニングルームの床にコースを作成。
床にビニールテープを貼れば簡単にコースが作れるのもこの大会
のいいところです。

さらにプログラム調整をして大会直前の走りがこんな感じです。

そして、いよいよ大会当日です。
次回へ続く・・。

| | コメント (0) | トラックバック (0)

« 2009年8月 | トップページ | 2009年11月 »