2015年3月29日日曜日

フォトセンサテーブル作成

マイクロマウスのフォトセンサの出力は距離に対して比例しない.なんとなく走らせるのであれば単調でさえあればリニアかどうかは気にしなくても良いかもしれないが,それではすぐに限界が見える.左右の特性の差も気になる.

そこで,何かしらの方法でセンサの出力を距離に変換するわけであるが,壁との距離d,センサ出力sとすると,対数近似(d=log(s)) やべき乗関数近似 (d=s^n)がわりとよくフィットするので広く使われているようである.こじまうすでは昔は対数だったが,何年か前にべき乗に切り替えた.特に意味はなく,そちらの方がよく一致していたからである.

と・こ・ろ・が,である.ピーコのセンサは全然違う特性を持っているではないか.既出とはいえ,本当に全然違うからまいった.

とはいえ,結局テーブルを作るのでそもそも何かの関数で近似できる必要はない.そこで,無理矢理5次関数近似で間を補完してテーブルを作った.次数の高い多項式近似では外挿が全く役に立たないことが多いので,計測範囲外は補完しない.赤丸が計測値,緑線が5次近似の結果であり,LDは左横センサ,LFは左前センサである.

なんとも気持ちの悪い特性である.

2015年3月28日土曜日

INTの戦い:敗北

さて,ピーコのSH-7125にはFPUがないので,整数型で組むことを決めたわけであるが,早くもあきらめてしまった.

過去のプログラムを見返すと,2009年のこじまうす5までは整数型で全て組んでいたようである.2009年の大会後,12月にFPUのないSTM32F1でfloat型で組めるか試し,なんとかなることを確認した.それからずっとfloat型で制御を組んでいる.

それから5年以上経過しており,プログラムの骨格は変わっていないが様々な補正機能を導入してきた.これを整数型に書き換えるのは並大抵の作業ではない.よって,SH-7125の処理性能に期待してfloat型のまま移植を進めることにした.制御周期が1msは不可だとして,5msくらいまで長くなってしまったらどうしようかと危惧するところではあるが.

2015年3月20日金曜日

フォトセンサ修正

前回のはそのコメントも含め不満が出始めたが,長くやっているとハードウェアの不備を修正する技術は嫌でも身につくわけで,ベストを尽くすために修正を試みた.

まず,機体後端が接地したときに前方が浮いてセンサ光が上向きになる問題を解決するために,後端のテフロンシートをかさ上げした.

つぎに,実はマニュアルにもぼそっと意味のとれない日本語で書いてあるが,フォトセンサ用赤色LEDを基板と並行ではなく,下方に向けた.

さらに,壁切れを区画中央くらいで検出できるように横センサの水平方向の傾きを調整し,マニュアル通り前方センサは少し外側に開いた.シルクの位置なんて無視だ.

結果,まともに壁に光があたるようになった.

2015年3月15日日曜日

フォトセンサとの戦い

ピーコを使うにあたってハードウェア変更なしという拘束条件があるのはわかっていたが,まあ初心者が使ってあれだけ走れるのだからなんとかなるだろうと思っていた.

甘かった.

フォトセンサについてこちらの検討の結果を見ていたので大変なのだろうとは思っていたが,予想を超えていた.

まず,LEDから出る光は壁の上ぎりぎりにあたる.一部は壁にあたらないため,加速中と減速中,言い換えるとマウス先端と後端のどちらが接地するかによって返ってくる光の強度が変わる.後ろ重心で普段は後端が接地しており,この状態では半分くらい壁からはみ出てるので製作ミスしたのかもしれない.

次に,既報の通り壁が近くにあると距離の変化に対するセンサ値の変化がほとんどなくなる.LED発光時間を延ばせば値は大きくなるので飽和ではなく幾何学的な効果であると思われる.おそらくLEDとフォトトラの間に分厚い基板があるためだろう.ある程度壁が近くに来るとセンサ値から壁の距離を測ることができないことになる.一方,これはセンサ値が過剰に大きくなり制御が強くかかりすぎるのを防ぐ効果があると考えられるので初心者に対してはうまく働くのかもしれない.特に距離に対する線形化をせずにセンサ値をそのまま使ってフィードバック制御する場合には,なるほどうまい方法だと言える.しかし,上級者にとってはただの欠陥である.

また,どうやらなかなか優秀なフォトトラを使用しているようで意外と反応が速く,LED発光時間は10us程度で十分なようだ.しかし,ハイパスフィルタの時定数は100usと長すぎる.これでは1msに1回しかサンプリングできない.悪くはないが,コンデンサ容量を変えるだけでサンプリングレートを上げられるのに.残念.

やむを得ず不満が多く含まれる進捗報告になり販売元には痛いかもしれないが,初心者と上級者の観点の違いが見えるだろうから初心者がステップアップする上で何を考えればよいかのヒントになるのではないか.

2015年3月14日土曜日

INTの戦い

さて,ここに不吉な宣伝がありますが,うちのピーコはようやく各ハードウェアを動かす関数群ができあがったところです.プレ大会は完走ヤッター!のレベルではないのか?がんがん走らせている人もいるのでそうはいかないか.

最近はSTM32ばかり使っていたのでルネサスマイコンは慣れていません.とはいえ,H8を使っていたので概要はわかっているし,ドキュメントは日本語なのでサラーっと読めば使い方はわかる.問題は,FPUを持っていないのでfloat型を使うと遅いこと.こじまうす10の16MHzに比べればなんと3倍の48MHzというのは強力だがそれでも処理を加えていくと厳しくなると思われる.

仕方ないので整数型で全て書くわけであるが,オーバーフローなど気を配ることが増えるのでここからの制御プログラム構築は大変だろう.物理量ベースで制御を組むのがあたりまえになってきたマイクロマウスにおいて浮動小数点を扱えないのは時代遅れ感がある.

2015年3月9日月曜日

Linuxでシリアル通信

これを見て,ふと思い出したのでメモ.

LinuxでUSB-シリアル変換ケーブルを使うのは場合によっては非常に簡単である.FTDIのチップを使っていればUbuntuなどでははじめからドライバを持っているのでドライバのインストールという面倒な手順をスキップして挿すだけで使える.

かというと,実はそうでもなく,リンク先でも書かれているように一般ユーザには読み書き権限がない.Ubuntuの場合昔は普通に読み書きできたのだが,数年前のバージョンからできなくなったようだ.はじめにこの問題にぶつかったときは焦った.

結局chmodして権限付与すればよいわけだが,それよりも/dev/ttyUSB0などはdialoutグループでありグループに対しては読み書き権限があるので,自分をdialoutグループに入れるのがよいと思われる.例えば,kojimaというユーザをdialoutグループに追加するためには下記を実行する.
    $ sudo usermod -a -G dialout kojima
-aのオプションを忘れると痛い目を見るので注意.実際に追加されたか確認するために,下記コマンドで自分の所属グループを調べる.
    $ id
ちなみに,変換ケーブルをUSBポートに挿した後
    $ dmesg
で,どう認識されてどこに接続されたのか確認できます.

2015年3月1日日曜日

ステッパー

休日は真剣に休まないと体がもたないので,少しずつ進めている.特にマウスはやりはじめると抑えが効かなくなることがあるので危険.

今週はピーコのステッピングモータ用のタイマ設定とパルスレートを変更する関数を作成.たいして進んでいない...電流調整用のトリマの初期値がとんでもない位置にあったので電源装置から電流を供給できなくて焦った.10A/相くらいの設定になっていたようだ.

モータがこじまうす2のものと同じなので懐かしい音をたてて回る.無負荷で9000pps(400pulse/rev)くらいが限界のようだ.当時は30Vまで昇圧していたので,それよりは性能が低いと思われる.