日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
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 |
« 2012年4月 | トップページ | 2012年6月 »
ロボット作ろう:シェーキー製作記
移動テストの動画を撮りました。
シェーキーにコマンドを送るには、パソコンからTeraTermで内蔵したネットタンサーのネットワークユニットに接続します。TeraTermはTCP接続にも対応しているので、こんなときには重宝します。
これは動画撮影のためにROLLTOコマンドでロボットを動かした様子です。
ロボットは最初 X=0 Y=0 においてあります。"ROLLTO 100 0"はX=100,Y=0へ移動しろというコマンドで、実行後、座標値と方向をタイプしてDONEを返します。この例では、99.6 0.0 0.0ですから、X=99.6、Y=0.0、方向0.0ということになります。このログは実際に動画でロボットに送ったコマンドです。動画とあわせてご覧ください。なお、座標の単位はcmです。
動画がこれです。床にテープで50cmごとに印がつけてあるので、移動精度の目安としてください。
気になる精度ですが、思った以上によいようです。実際のところ、数十回コマンドで動かしても大きくずれていくようなことは感じられませんでした。まあまあ目的の位置に素直に移動します。
近いうちにマップの作成機能の動画も撮ろうかと思っています。
ロボット作ろう:シェーキー製作記
以前、PSDの電圧出力を距離に変換する方法について投稿しました。その記事では変換式については説明しましたが、式の係数の求め方は、5球スーパーのトラッキング調整のように、近い距離、遠い距離で交互に調整していくという方法で、値は目の子で決めるようになっていました。
改めて考えてみると、未知のパラメータが二つの連立方程式なので、これを解けば一発で係数を決めることが出来るはずです。そこで、エクセルでこんな変換表を作ってみました。
おさらいをしておくと、浮動小数点での変換式は下記のようになっています。
距離(cm)=係数A / (電圧 + オフセットB)
つまり、PSDの電圧/距離のグラフを双曲線で近似しようという訳です。
PSDを動作させ、最近距離付近での電圧と距離の実測値と、最大距離の70%くらいでの距離と電圧の実測値を黄色のセルに入力すると、自動的にA,Bを計算し、変換式を完成させてくれます。PSDの種類は問いません。シェーキーではミドルレンジのGP2Y0A02YKとロングレンジのGP2Y0A710Kを使っていますが、いずれもこの表で変換式の係数を決めました。
実測するには写真のようにPSDをしっかり固定し、写真のようにPSDの最前面から対象物までの距離を測ります。
対象物は十分に大きなも白っぽい平面を用意します。写真ではノートパソコン用のトートを使っていますが、壁を使う手もあります。電圧はデジタルテスターで、距離はスチールメジャーなどで測定します。
先ほどの計算表の値は、実際に手持ちのGP2D12(GP2Y0A21の旧品番)を測定したものです。テストのセルに任意の距離での電圧を入れ、計算値と実測値をくらべたところ、おおむね0.5〜3cmくらいの誤差には入っているようでした。全体的に実際の距離より近めになるようです。また、近い方の距離の実測値がたとえば10cmだったとき、これを10.5cmなどと少し大きめに入力すると、距離の誤差が小さくなるという現象もみられました。
この計算式で別のGP2D12も試してみました。やはり個体差はあり、誤差は大きくなりますが、同じ計算式でも実用上は問題なさそうでした。
計算表のエクセルファイルはこれです。簡単ですがインストラクションも書いてあります。
「psd.xls」をダウンロード
浮動小数点の式だけではなく、mV入力でmm単位の距離を返す32bit整数版の式も同時に作れるようになっていますので、PIC16シリーズなど、浮動小数点演算が苦手のマイクロコントローラにも応用できます。
この計算表で作った変換式をプログラムに組み込んでおけば、距離が直接読めるので何かと便利です。
ただ、もともとPSDの測距結果は対象物によって精度はまちまちですから、この変換式も目安として使うべきでしょう。
ロボット作ろう:シェーキー製作記
【後日追加】下記トラブル対策は正しくありません。
こちらの投稿をご覧ください。
シェーキーのソフトウェアもだんだん格好がついてくると、今までなあなあにしていた問題点が浮上してくるもので、最近はそれを潰すのに時間を割かれるようになりました。
その中でも致命的なのがAD変換でおかしな値を読み込むトラブルです。今回の投稿はこれの対策のお話です。
本機では、4ch分のAD変換値をDMAで周期的にメモリに展開し、アプリケーションからはこのメモリを参照することでアナログデータを取得するようにしています。これはSTM32ではポピュラーな手法のようです。
今回問題になったのは、リセット後AD変換の結果として非常に大きな値が読み込まれることがあるということです。本機ではAD変換の分解能を12ビットに設定しているので、最大値でも4095のはずですが、変換値が11342とか23044とかというありえない値になってしまうのです。しかもこの現象は再度リセットするまで継続し、また、リセットしても間が悪い(?)とまた同じ結果になってしまうというタチの悪いものです。
おかしな値になっても、読み込むたびに若干変動するのでAD変換はしているようですが、何が起こっているのでしょう。
デバッガから起動した場合よりも、USBケーブルをはずしてスタンドアロンで起動した場合に高い確率で発生します。
これはかなり具合が悪い。なにか未設定のビットでもあるのかと調べましたが見つからずじまい。結局試行錯誤の結果、下記のように初期化シーケンスを組むことで何とかすることができました。
初期化シーケンス
電源投入(パワーオンリセット)
1・サーボパルス発生
2・100msほど(forループで)待つ
3・AD(DMA転送設定)開始
4・USART設定
5・GPIO設定
6・SysTick割り込み設定
最初にサーボを初期化するのは、速やかにサーボパルスを発生し、電源投入時にサーボが暴れるのを防ぐためです。そのあと、100msほどおいてからAD変換の設定をします。対策前はこの時間遅れがなく、即座にADを初期化していました。これを入れただけで現時点では問題は再発していません。
なお、時間遅れの部分は
uint32_t ii;
for(ii=0; ii<1000000; ii++){
}
という時間つぶしループで実装しています。
トラブルが起こってないかどうかは、シェーキーにバッテリ電圧読み出しコマンド"CHKBATT"を送ればわかります。正常なら12Vくらいの数値が返ってきますが、初期化に失敗していると200Vとかの値が返ってきてびっくりします。
うーむ、原因がわからないので気分が悪いけど、まあしょうがないですね。現時点ではこれでいきましょう。
管理人のページ:
先日来、ちょっと毛色の変わったホームロボットの企画を進めています。机上プランの検討や予備実験を済ませ、主要部品を集める段になってコレに気づきました。
カメラのスペースがあまり取れなさそうなので、以前試用した超小型Wi-Fiカメラ、プラネックスのCS-W07G-CYを使うことにしたのですが、なんとデスコンになってしまったみたいです。ホームページでは「終息」となっています。
技術的な問題があったのか、安い割にあまり売れなくて打ち切られたか、はたまた盗撮などのトラブルがあったのか、そこら辺はわかりませんが、ともあれ、使いやすい部品がまたひとつなくなってしまったのは確かです。
残念。他のカメラを探さなくてはなりませんね。