« 2006年10月 | トップページ | 2006年12月 »

2006年11月30日 (木)

原因追求(2) --- タイマユニットのカウンタ説

マウスの動作がガクガクいってしまうことの原因究明の続きです。電源説はシロでした。で、ソフトウェアに起因する不具合は、なにも先日書いたような制御の遅れだけじゃなく、モータドライバICにステッピングモータを回すためのクロックを供給するタイマユニットのカウンタ値更新タイミングが悪いと、出てほしいタイミングでパルスがでなくてモータがガクガクいってしまうのではないか、と疑ってみました。

具体的には、現状ではH8/3052FのITU1とITU3を使ってそれぞれ通常モードでGRAのコンペアマッチでTIOCAからトグル出力を行ってステッピングモータを駆動するためのパルスを作っています。モータの速度を変えたいときはGRAの値を書き換えています。これでは、ITUのタイマカウンタであるTCNTがGRAの値に近づいたときにGRAの値を書き換えられてしまうとTCNTとGRAがコンペアマッチするタイミングが狙ったタイミングにならない虞があります。

対策です。ITU3, ITU4 はバッファモードがあり、TCNTとGRAのコンペアマッチ時にBRAの値をGRAに自動転送することができます。なので、速度を変えるためには直接GRAを書き換えるのではなくBRAに値を書き込んで、コンペアマッチのタイミングで自動的にGRAの値をBRAの値に差し替えることで、コンペアマッチのタイミングがずれてパルス出力がかけたりすることを防ぐことができます。

この対策をするために、回路図を少々修正。モータを駆動するためタイマユニットはITU3, ITU4を使うことになりました。回路変更後に調整用迷路内でマウスを走らせて見たところ、ガクガクが激減しました。ほとんどゼロといってもいいくらい。ただ、ちょっとだけ停止してから再度走り出す際にフラフラする感じがあります。そのフラフラの原因もなんとなく推測はできているので、これは明日以降に修正する予定です。

2006年11月29日 (水)

電源説はシロだった

11月27日 (月)の日記では、サンケンのSLA7052Mに電流制限機能がないと書いてしまいましたが、あれは間違いでした。電流制限できます。ドライバの説明書きを読むと、9番ピンにかける電圧と代表回路例にあるRsA, RsB の抵抗値で制御電流を設定できることが書いてあります。

そこで電流制限など気にせず作った回路図を見直して現状の制御電流が最大何Aになっているか計算してみたところ、モータ1個あたり0.66Aになっていることが分かりました。モータが2個なら 1.3A強なので、先日安定化電源をつないで測った結果と一致します。

対策としてモータドライバICの9番ピンにかかる電圧を作るための抵抗値を変えて、制御電流がモータ1個当たり0.35Aになるようにしました。回路を変更してから安定化電源を使ってモータ回転時に必要な電流を測ったところ、計算どおりモータ2個で 0.7A+マイコン分程度になっていました。

さて、これでモータのガクガクが消えたかどうか。容量700mAhの電池を使って調整用迷路内を走らせて見ると、まだ出ます。ガクガクが。根本的に直っていません。しかも、ガクガクがでる前後でバッテリの電圧低下は起きていないようです。ということは、ガクガクの原因は電流不足ではない、ということになります。(ニッケル水素電池は2C放電が可能なので、容量が700mAhと書いてあれば1400mA程度は一度に流せるはずです。)

そうなると考えられる残りの原因はソフトウェア的な話になってきます。モータを駆動するパルスが加減速時に乱れるかどうか、オシロスコープで観察できればよいのですが・・・

2006年11月27日 (月)

原因究明 --- 電源説

今年のマイクロマウス大会出走でリタイヤしてしまった原因を調査していきたいと思います。

リタイヤに結びつく直接の現象は、「直進距離のずれ、姿勢制御のずれ、旋回角度のずれ」でした。これらのずれは、走行中にモータがガクガクいうときに顕著に発生し、モータのガクガクは速度の変化があるときに発生しています。モータのガクガクは常に発生しているわけではなく、バッテリの電圧が下がってくるほど頻発するようです。

この「ずれ」が発生する理由として(1)ソフトウェア的な制御の遅れ (2)バッテリの電流不足が考えられます。

(1)については、ステッピングモータを駆動するためのパルスをH8のITUで作っているため、GRAの値を書き換えるタイミングによってはパルス発生のタイミングがずれることもあるのかな?という程度の推測です。デジタルオシロ(ストレージスコープ)があればこれを確認できるのですが、アナログオシロしかもっていない状況ではどうやって確認してよいのか分かりません。

(2)については、ステッピングモータがどれだけの電流を使っているのか考えずに回路を組んでしまったため、やや怪しいところです。現在の設定では SLA7052Mというドライバで1-2相励磁を使用しており、ドライバICの仕様書を読んでみたところ 3A程度の電流を流せるようです。これを確認するためにバッテリの変わりに安定化電源をマウスにつなぎ、モータを駆動したときに電流がどのように変わるか観察してみました。

観察の結果、電源電圧15Vのとき一定速度でモータを回して1.2A以上の電流が、20Vのとき0.9A以上の電流が流れていることが分かりました。(安定化電源の電流が最大1.2Aまでしか出せなかった) 今回使用したニッケル水素電池の容量は 700mAhですから、2C放電ができたとしても1.6A。モータ始動時はもっと大きな電流を必要とするので、あっというまに空っぽになってしまうことがわかります。電圧15Vで電流を最大0.8Aに制限すると確実にモータがガクガク言います。

このことから、単4電池を10本組み合わせて作った 12V 700mAh の電池では電流が足りなかったために脱調が発生したことが距離、姿勢制御のずれを引きおこした主要因であると結論付けました。(プログラムのことは棚に上げたまま。)

対策です。(a) モータドライバ側で電流を制限する (b) バッテリの容量を増やす (c)バッテリの電圧を上げる という手が取れそうです。しかし、(a)はSLA7052Mには電流制限機能がないため実現できません。(SLA7033Mなどには電流制限があった) (b)は秋月電子などでここら購入すれば対応できそうです。 (c)は電圧を上げるとステッピングモータに入る信号のパルスが鋭くなるためトルクを稼ぐことができ、結果として電流が減ると言う理屈です。しかし、私が持っている充電器が最大10セルまでしか対応していないので、(昇圧回路でも使わない限り)この方法は採用できません。 (a)を実施するためにモータドライバICを変えようとするとメイン基板を全部帰ることになるので、これも却下。結局、単3で組電池を作り直すことになりそうです。

今年も完走できず

11/24, 25, 26とマイクロマウスの全国大会があって山形県長井市まで行ってきました。車で片道8時間ちょっと。かなり遠かった。忘れないうちに反省をしておこうと思ってこれを書いています。

さて今年のマイクロマウスの戦績です。リタイアでした。24日の午前0時の時点では出走できない状態だったのが、24日夜に宿で徹夜でプログラムを作りこんで何とか出走できる状態になったのは奇跡に近い。迷路探索アルゴリズムを検証するためのシミュレーションプログラムが移植に耐えられるつくりになっていたことが幸いでした。

出走してみて、5回ともかなり安定した動作でしたが、迷路の壁や柱にぶつかってしまい、5回ともほとんど同じ場所で動けなくなってしまいました。原因は移動距離の誤差、スピン(その場旋回)動作の精度などいろいろ考えられますが、バッテリ電圧が下がってくるとガクガクっとモータの回転が乱れることがあるので、これも含めて後日調査するつもりです。

ハード面や開発環境などいろいろ大幅刷新したいところですが、ここはぐっと我慢して、今年のマウスがきっちり走れるようになることを優先したいと思います。

2006年11月22日 (水)

どうにかこうにか

昨日は会社から帰ってきたらすでに体力切れで、マウス進捗ほとんど無し。24時には寝たおかげで、今朝は目覚めがよく、仕事も集中してできました。

今日は、というか今頃こんなことやってて間に合うの?てきなレベル。N区画前進の姿勢制御はOKだが、距離の精度がいまいち。スピン(その場旋回)は実装と動作確認を完了。右スピンと左スピンで90°回ったときの誤差が違うのがちょっと気になってます。3区画前進->180°スピン->3区画前進の動作確認もOK。

走行速度が変わるところでまばらにガツガツっという音がすることがあって、これも気になってます。バッテリが空に近づくほど頻発するような気もするのでちょっと厄介です。

明日は新しい組電池を2組作って、走行コマンドが終わったらレスポンスを返すようにして、シミュレーションで動作を確認したナビゲーション部を移植する予定。い、いけるのか??

大会が開かれる山形県長井市までは車で行けば8時間ちょっと、新幹線なら5時間+αくらいかかるらしい。車なら調整用迷路を積み込んでいって、宿で夜中に調整ってこともできるんだろうなぁ。前日が徹夜になることを考えると、運転8時間はきついだろうなぁ。

2006年11月20日 (月)

ギリギリいっぱい

先週金曜日(11/17)に年休を取って、土日をあわせて3日間プログラム漬けでした。外に出たのは土曜日の夜にスポーツクラブに行ってきたくらい。

システムコントローラの構造ができて、HWチェックを行う仕組みを作り変えて、走行コマンドチェックを行う仕組みを盛り込んで、なんとかNブロック前進コマンドを実装して、まだ姿勢制御と衝突回避を実装していない程度の進捗です。テストもまだ。スピン(その場旋回)はNブロック前進と構造的には一緒で衝突回避や姿勢制御がいらないだけなので、これはやればすぐに実装できる見込み。

ナビゲーション部(迷路探索部)の基本的なところは以前シミュレータで確認しているとはいえ、移植を3日で(しかも仕事から帰ってきてから)片付けようと言うのはかなり厳しい。

でも、まだ時間はあります。最終バッファは11/23(木)の祝日。11/24(金)は試走会があるので、これには参加したい。というのは、ここでフルサイズの迷路を走っておかないと、他にフルサイズの迷路を走ってテストする機会が無いからです。試走会は21:00までと書いてあるので、それ以降は宿でデバッグする時間が取れるはず。(試走用の4×6サイズの迷路を持っていけばの話)

ちなみに、大会当日 11/25(土)は9:00~9:40参加者受付、10:00~フレッシュマン競技開始です。

まだ午前3時になっていないのでもう少しやりたいのですが、バッテリが全て空になってモータがまともに回せなくなってきたので、今夜はこの辺にしておきます。

2006年11月17日 (金)

失態リカバー

先日の大失態、なんとかリカバーできました。メモリ周りの設定を以前のものと完全に同じにしても不具合が出ていたので「もしやプロジェクトファイルが壊れたのでは?」という推測の元に、「プロジェクトファイルそのまま、ヘッダファイルとソースファイルを完全差し替え」という手段をとったところちゃんと動きました。動いたからいいかなってことで、真因追究は行っていません。そこに時間使ってると終わりそうに無いので。

今日は年休を取得してマウスのプログラムに没頭・・・するはずだったのが、PS2でAce Combat ZeroをやったりPCでSim City 4 をやったり。いまいち集中できておらず、ちょっとプログラムを書いて壁に突き当たっては現実逃避を繰り返していました。乗り始めたのは21時を回ってから。

バッテリの消耗が目に見えて早くなってきたので、そろそろ別の電池パックを作る必要がありそうです。

2006年11月16日 (木)

大失態

やってしまいました。昨日まで動いていたプログラムが、動かなくなってしまいました。正確に言うと、プログラムが特定の場所でフリーズするか、勝手に再起動を繰り返す症状が出ています。

考えられる理由を挙げられるだけ挙げてみます。

  • スタックを壊している
  • メモリ周りの設定にミスがある
  • バッテリがない
  • CPU自体が壊れた

まずCPUについて確認。以前のプログラムをダウンロードしたら動いたので、CPUは壊れてなさそう。次にバッテリ。以前のプログラムが動いたし、他のバッテリに変えても動くのでこれもシロ。メモリ周りの設定は今日いじった後に上記の症状が出ているのでかなり怪しい。その結果としてスタックを壊して、プログラムが暴走しているものと推測。メモリ周りの設定を11/9のバックアップと同じ設定に戻してもプログラムの暴走は変わらず。困ったな。

メモリ周りの設定、必要なスタックサイズを見積もるのってすごく大変なんです。単純に引数の数とサイズ、関数内で使われているローカル変数の数とサイズから求まるかというとそうはいきません。というのは、そこで使われている(既製品の)関数が消費するスタックサイズが分からないからです。例えば、strcpy という関数を使っているとします。この関数のスタック消費量が分からない。仕方が無いからエイヤアで大きめに128Byteとっておくと、タスクに割り当てるスタックサイズが必然的に大きくなってRAMが足りなくなります。

今後の選択肢。

  • A案:今日更新したプログラムを1行ずつ丹念に追う。
  • B案:11/9分バックアップに戻して、少しずつ最新版の変更を加えていく。
  • C案:いっそのことRTOSをやめる。

RTOSを止めて書き直している時間はもうありません。A案も捨てがたいのですが、デバッグ環境があまりにも貧弱なため、CPU上でステップ実行するようなことができません。ここはB案でいくことにします。

2006年11月13日 (月)

実力は土壇場で身につける

先週末から長泉町のA-1スポーツクラブに通い始めました。昨年の健康診断から+2kgになってしまった体を引き締めるためです。剣道再開すればいいのはわかっているのですが、一度中断してしまうとなかなか行き辛いものがあるでしょう?

マイクロマウス。制御プログラムがぜんぜん進んでいません。先週末はこれじゃまずいなと思って、走行コマンド系を実装しようとしたら、テストする仕組みを作りこむ必要に迫られて、で、システム制御系とシリアル通信を介した操作を大きく作り変えることになりました。それで設計しなおしていたらソースコードを1行も書かずに週末が終わり。さらに、昨日今日はエラー処理系を大幅に見直して、これは設計からコーディングまでして、(テストはほとんどしてないけど)一応動いてる感じ。

土日と昨日今日で修正したところを要求仕様書にフィードバックしてみました。

マイクロマウスソフトウェア要求仕様書(第2版)

以下、大会までにやること。

  1. PCからシリアル通信を介してメニュー操作を行い、走行コマンドを呼び出せるようにする。
  2. 走行コマンドを実装して、メニュー呼び出しでテストする。
  3. ナビゲーション系を設計する。
  4. ナビゲーション系を実装して、シミュレータ上で動作を確認する。
  5. システムコントロール系に探索走行モードのシナリオを実装・テストする。
  6. 探索走行後に迷路情報を確認できるようにする。
  7. システムコントロール系にトライアル走行モードのシナリオを実装・テストする。

実質、あと4日程度、開発に使えます。

今日の格言  「実力は土壇場で身につくものだ」

2006年11月 5日 (日)

紅葉と温泉の旅 in 長野

会社の気の会う仲間で、蓼科~諏訪方面に旅行に行ってきました。1泊の予定が2泊になり、小さな予定外も多少ありましたが、充実したよい旅になったと思います。

夜しっかり寝たので帰ってきた今もあまり疲れていません。土曜日の夜に「チャングムの誓い」を見たかったのがみれなくなったり、日曜日に洗濯をする予定だったのができなくなったりしたのはちょっと予定外。ま、いっか。

« 2006年10月 | トップページ | 2006年12月 »

最近の写真