2022-04-22

マイクロマウス2021

マイクロマウス2021に参加してきました

遅ればせながら、2021年度のマイクロマウス全日本大会に参加してきた記録を残しておきます。

結果

先に結果から。

公式の結果

エントリーしたのはマイクロマウスのファイナル。
5回トライしましたが、残念ながら完走できませんでした。
前日の試走会の時点でまともに走れず本番当日も諦め気味だったんですが、案の定の結果です。

原因はおそらく壁センサが会場の明るさに耐えられなかったことと、迷路の段差に弱かったことと思われます (後述)。

出走機体

新作、ぷちぷち3号です。

リアル大会を開催すると聞いて去年の11月から急遽作り始めました。
コンセプトは「前作の幅狭マウスにサイクロン吸着を乗せる」です。

以下、いくつかトピックを書いてみます。

壁センサ

リタイアの原因その1。

前作から地味に変更していて、1つの LED 駆動回路で4つの LED を時分割駆動したり、ソフトの介在なしにマイコンペリフェラルのみで LED 点灯から AD、DMA まで出来るようにしたり、などが変更点です。

で、問題の受光回路。4つの PD の出力を 1つのトランスインピーダンス回路で増幅しているのは前作と同じなのですが、諸事情により DC カットコンデンサを外しています。
4つの PD の電流が全部アンプに流れてくるので飽和しやすい回路になっています。テストして大丈夫だと思ったんですがどうやら駄目だったようです…

会場でセンサ値を見る限りは飽和している様子はなく今一納得し切れていないのですが、陰を作ったりサンバイザーを付けたりすると多少マシになったので、やっぱりそういうことなのかなあと。

段差対策

リタイアの原因その2。

これは完全に油断してたんですが、今作めちゃくちゃ段差に弱かったようです…
ロータリーエンコーダが紙製の手作り光学式で、A相しかありません。ハードは前作と一緒なのですが、アルゴリズムを変えたのが裏目に…

 サイクロン吸着

この機構の呼び方はサイクロン吸着でいいのだろうか?よく分からないのでk峰さんが youtube で使ってた呼び方で行きます。

従来の吸引と違ってスカートが要らないということで、小型軽量でモータートルクが最小限しかないマシンとの相性が良いだろうということで採用しました。
また底面の気圧が低い中でファンを回すのでモーターの負荷が小さい→低電流というのもメリットだと思います。

悩ましいのが、原理をよく理解してないのでどんな形状がいいのか全く分からんということ。3Dプリンタでとにかく作っては試してを繰り返しました (本番とは精度が違うのであくまで雰囲気だけの相対比較)

しかばね達…

で、試した中ではどうやらこの形が良いようだということで、断面が矩形でいい感じにカーブさせた形状を採用しました。

右回り。これも3Dプリンタだけど DMM のアクリルなので精度は良い

ガバガバ測定ですが、これで車重の80%弱ぐらいは貼り付けているようです。自宅迷路での最短走行では効果は一応あるように思いました。

で、スカートなしの機構で実力としてはまあこんなもんだろうと思っていたのですが、会場にはもっとずっとすごいマシンがいました…。確かにそっちの作り方のほうが良さそう…(会場で聞いた)。

まとめ

ということで結構頑張って新作を作ったんですが、今回は残念な結果になりました。

今度こそ、大会後のモチベーションをこのまま保って次の大会に臨みたいところです。
と言いつつすでに何もせず1か月が経過…

2020-12-16

ログを使いやすくした話

はじめに

この記事は MicroMouse Advent Calendar2020 の 16 日目の記事です。

昨日は sshun さんの「HALがビミョーである理由の考察と改善案」でした。
いつも文句を言いながらも何となくで HAL  使ってますが、解説されるとなるほどー (理解できてない) という感じです。去年の「依存を考えて設計する」も参考になりました。

今回はマウスのログにまつわるお話です。21日の qtfdl94q さんが似たテーマっぽいですが、いつもすごいツールを作られてます。自分のノウハウなど後出しでは恥ずかしくて出せないので、先に書いてしまう作戦です。

ログを使いやすくする

マウスの調整作業で走行ログを取るとき、シリアルターミナルから Excel にログをコピペしてグラフ表示するのは誰もが通る道だと思います。

ですが何度もやってるとこれがやはり面倒なわけです。あるとき大会会場で Matlab つよつよ人がログをグラフ表示してるのを見かけて、かっこいいなー便利そうだなーと思って自分もやってみたというのが今回の話になります。
あ、自分は Matlab 使えないです。あとマイコンのプログラムはC言語です。

次の3つに分けて説明します。
自分はソフトのセンス・知識が足りてないのでいろいろアレな部分もあると思いますが、そういうところはやさしく突っ込んでくれるとうれしいです。

  1. ログの取得
  2. ログの受信と保存
  3. ログの表示

ログの取得

多くの人がそうだと思いますが、自分もマイコンの内蔵RAMに巨大配列としてログを保存し、それを UART で PC に送信しています。

欲しいログとして、ここでは次のようなログを取得することを考えます。

$LogStart
$CommentStart
drivePrmt.velocityMax =  1.299999, drivePrmt.velocityMaxDiagonal =  1.100000, drivePrmt.centrifugalMax =  2.700000, drivePrmt.accelMax =  4.300000
$CommentEnd
time[ms], velocityTarget ,velocity ,angleVelTarget ,anglVel ,position.X ,position.Y 
0,0,-0.000012,174.026153,-0.061883,0,-12.000012
10,0,0.00008,41.964691,27.368331,-0.000004,-11.998698
20,0,-0.000004,3.931732,46.66851,-0.000016,-11.996617
中略
6720,0,0.000427,0,-0.028064,718.998779,359.140747
6730,0,0.000258,0,0.00283,719.001831,359.140747
6740,0,0.000401,0,0.019516,719.005126,359.140747
$LogEnd

後半が csv の時系列データです。前半にもごちゃごちゃなんか書いてありますね。こんな特徴があります。

  • ログ全体を$LogStart と $LogEnd で挟む
  • 時系列データは変数名も記録する
  • 走行パラメータもコメントとして残す ($CommentStart, $CommentEnd で挟んだ部分)

ログをたくさん取ってると「このログ一体何のログだ…?」ということが起きてしまいます。そういうことがないように、ログの変数名と走行パラメータを一緒に残すようにしています。

ログを取る変数ってちょこちょこを変えたくなりますよね。私のマウスではどの変数を保存するかがハードコーディングされてるんですが、そのたびにソースコードを編集する箇所が多いと大変だしミスもしてしまいます。いじるコードは出来るだけ一か所にまとめたいです。数値データのほかに変数名も一緒に記録するには一工夫必要になる…ということで次のようなことをしています。

#define L(x)            (#x), ((float)x)
void saveLog(int16_t num, ...);

こんなマクロ関数とログ取り関数を作っといて、制御関連のコードの中で 1 制御周期に 1 回、例えばこんな感じで関数を呼び出します。

saveLog(6, L(velocityTarget), L(velocity), L(angleVelTarget), L(anglVel), L(position.X), L(position.Y));

saveLog は可変長引数の関数になっています。最初の 6 は保存する変数の数です。

L(x) という怪しいマクロの中身ですが、(#x) で引数xを文字列として取得することができます。怪しいですね。同時に ((float)x) で変数の中身も渡しています (全部 float にしちゃう)。L(velocity) なら、"velocity" (文字列) と (float)velocity の二つの引数になるわけです。そこはかとなくバッドノウハウ臭がしますが、気にしないことにします。

あとは saveLog 関数の中に、文字列と数値をそれぞれの配列に入れていくコードを書けばOKです。変数名は何回も保存する必要ないので、最初の一回だけでいいです。
これで saveLog の引数 (L() の中身) を書き換えるだけで保存する変数を変えられるようになりました。

仕上げに、UART で出力するときに走行パラメータを一緒に出したり、$LogStart とかを付ければ冒頭に書いたログの出来上がりです。

ログの受信と保存

Tera Term でログを受信するんですが、こんな感じの Tera Term マクロを実行します。ここでさっきの $LogStart、$LogEnd が出てきます。

while 1
getdir dir        ; マクロファイルのディレクトリを取得
changedir dir     ; カレントディレクトリをマクロファイルの場所に移動
wait "$LogStart"  ; ログのスタートを検知
getdate logname "%y%m%d-%H%M.csv"      ; ログの日時をファイル名に
logopen logname 0 0
wait "$LogEnd"    ; ログ終わりを検知
logclose
logViewer = "C:\hogehoge\LogViewer.exe"    ; ログビューワーの実行ファイル
strconcat logViewer " -f "       ; コマンドライン引数でログファイルを指定する
strconcat logViewer logname      ; ログファイル
exec logViewer
endwhile

これで $LogStart と $LogEnd で挟まれた部分が csv ファイルとして自動で PC に 保存されます。このマクロ実行して wait 状態のまま COM ポート切断すると大変なことになります。。。誰かたすけて。

問答無用でログは全部保存されるので鬱陶しいかなと最初は思いましたが、意外と後から「さっきのどうだったっけ?」と見たくなることがあったので、これはこれでという感じです。

ログの表示

ようやく一番ドヤりたいところまで来た…

csv で保存したログを表示するためのログビューアーを作りました。GUI の作成には Qt  (C++) を使いました。GUI フレームワーク何使うのがいいのか正直分かってません。

時間軸をズームしたり、複数のグラフにまたがってカーソルを出して現在値を表示したりできます。
位置座標をXYプロットとか、一つのグラフに2つ重ねてプロットなども可能です。どの変数をどのパターンでプロットするかは別途 config ファイルを作って指定しています。

先ほどの Tera Term マクロの後半には、csv ファイルをログビューアーに投げて開く処理が書いてあって、全部つなぐとこんな感じです。

ログを取得してから PC に保存してグラフ表示するところまで自動化することができました。これでログを使った調整作業がだいぶ快適になりました。

今の時点でも結構便利に使えてますが、あとは探索結果の壁情報を一緒に表示してもよさそうですね。

さいごに

ログの活用について自分のケースを紹介しました。ここは各人色々な工夫がありそうなので、色んな人の話が見たいなぁ。

明日はらっちさんの記事です。カレンダー2つも書くなんてすごい!

2020-01-12

プログラム用コネクタを洗濯ばさみにした話

この記事 の続きです。前回はタクトスイッチを無くしました。今回はプログラム用のコネクタを無くします。

---
多ピンのコネクタは場所を取りますし、物によっては抜き差しが固かったり壊れやすかったりします。できれば無くしたい部品です。


ということで無くしました。代わりにテストポイントを並べています。念のため金フラッシュ仕上げにしています (が実際必要だったかどうかは不明)。

ここにばねの入ったテストピンを当てることで PC と接続してプログラムします。自分はこれ↓を使いました。
https://www.amazon.co.jp/dp/B00SAVOMUA
IC や基板の製造工程で繰り返し使われることも想定している部品だと思うので、マウスに使うには信頼性も十分そうです。


で、こんな感じの小さい洗濯ばさみっぽい治具を作って…


こんな感じです。
治具の材質は DMM のアクリル (エクストリーム) です。なんかこれ熱に強いですよね。半田付けするとき、コテが触れてしまってもなんともなくて助かりました。

こんなん使えるんかいなと思われるかもしれませんが、結構安定して使えています。
とはいえ位置合わせには課題があります。今は外形で位置合わせしているのですが、正直これだとずれやすいです。ずれてしまったときでもピンがテストポイントを跨いでショートしてしまわないように、少し広めの 0.85mm ピッチにしています。
位置決めピンを使うなどしてずれを防止すればさらに狭ピッチにすることも出来そうです。

ぴったりの既製品のコネクタが見つからず選定に疲れたときはこんな方法を検討してみてもいいんじゃないでしょうか。自由度高いですよ。
2019-12-09

マイクロマウス2019

今年もお疲れさまでした。

この季節は Advent Calendar で色んなマウスブログが更新されて面白いですね。
このブログは今年もほぼ大会の結果を描くだけのものになりましたが、来年の自分のために今回も書いておきます。

機体

まずマシンのことを。
去年のマシンにカーボンのフレームを付けました。前後にお部屋が2つ増えたということでぷーちん号ぷち2 改め、ぷーちん号ぷち2LDK です。
シュッとして多少イケメンになった気がします。

  • 長さ:60mm
  • 幅:20mm
  • 高さ:13.7mm
  • 重量:3.7g

去年の段階で思いのほか速く走ってくれたので、色気を出してそれなりのタイムを狙った機体になっています。加減速時のピッチ方向のがたつきを抑え、直進で安定させることを意図しています。段差にも少し強くなった気がします。
代わりに当初の「ハーフサイズの半分のマイクロマウス」というコンセプトは半分失われてしまいました。

大会

初めての 32x32 迷路への挑戦です。
すでに記憶があやふやになってますがとりあえず結果を。(公式結果が公開されたら直すかも。)
1走目:まあまあ探索が進んだところでクラッシュ。探索失敗。
2走目:重ね探索。初めての 32x32 迷路完走。
3走目:安定パラメータで最短成功。帰りに探索。多分タイマで途中でストップ。
4走目:ちょっと速めの安定パラメータのつもりだったが直線でクラッシュ。
5走目:少し速度を落として完走。17秒464 で記録。

結果は 9位 でした。
4走目の失敗は想定外でした。10月の中部時点で直線の壁制御にバグがあったのですが、今回はそれを直して直進はもう大丈夫と思ってたのに。。。要修正。
あと探索でコケるのは相変わらずですねー。何とかしたいですが、今のところノーアイデア。

表彰式ではまさかのニューテクノロジー賞を頂きました。ニューテク賞はけり君だと思ってて完全に油断していたので、式ではキョドってしまいましたが。
ネタ機体にしては速く走ったね賞(意訳)とのことで、ありがとうございます。まあ実際ネタなんですけど、でも幅を狭くするのは一考の価値ありと思いますよ?単純に壁に当たりにくくなるし、攻めたターンもできるかもしれませんし、自由なライン取りもできるかもしれないし?

ということで

お疲れさまでした。近年は運営が非常にスムーズでありがたいです。工芸大のスタッフの皆様には頭が下がる思いです。

それと今年度は3月にD杯があるということで、なかなかシーズンが終わりませんね。この全日本直後のモチベーションを生かしてもう一つレベルアップしたいところ。
それでは皆さん、ひとまずはよいお年を。
2019-10-28

中部地区大会

中部地区大会に参加してきました。
前回の北信越大会でポイントは獲得しているので今回は気楽なもんだ。

と思っていたらモーターが壊れたり直ったりで不調に。全く動かないわけではなかったのでパラメータ調整で出来る範囲のことをしつつ、頼む動いてくれーーーということで本番。

で、地区大会では稀にみる高難易度迷路。「ぼくのかんがえたさいきょうのめいろ」感がある。
某氏のつぶやき。
今年最後の地区大会、ポイントが取れず倒れていく方を見るのは心が痛い。

1走目、全面探索の終盤でおそらくタイヤのほこりが原因と思われるクラッシュ。櫛歯に近いところだったのでうまい具合に櫛歯を避けた最短経路が出てくれるかなと思いきや、壁の読み間違いがあって2, 3走目リタイア。
4走目に探索しなおして、5走目の最短中にタイムアップ。
最終的には探索のみの記録となりました。

探索終盤のほこり対策は難しい。手作りの光学式エンコーダのせい?である一定の速度より遅く走るのが安定せず、探索速度を遅くする手が使いにくいんだよね。。。

あと、長い直線での安定性がやっぱり怪しい。デカい迷路が欲しい。。。会社で買ってるところが妬ましい。

全日本まであと一か月。頑張りましょう。
2019-09-25

東日本&北信越大会

東日本

月初めにあった東日本大会に出場してきました。
探索が安定せず、重ね探索を重ね続けてタイムアップ後にようやくゴール。
結果はリタイア。
はい次。

北信越

東日本ではポイントが取れず。
自分的例年どおりだと次は中部だが、中部は今年最後の地区大会なのでそこでミスると後がない。下手すると今年も全日本を見学するだけになってしまう、ということで急遽翌週にあった北信越大会に参戦。

一週間で細かい調整して、探索は大分安定するようになりました。1走目で探索を終わらせて、2走目の 7.078秒 がタイムとなって結果 2位 でした。
3,4,5走目の上のパラメータは全部16区画直進の姿勢制御が安定せずクラッシュ。家じゃ試せないよ。。。

とりあえずポイントはとれたのでよかったよかった。

鞄の用意してなかったのでお米 (3kg) 持ち帰るの重かった。。。
H川君の 10kg は予定されていたのかばっちりキャリーバッグに収まっていた。
2019-09-06

タッチセンサ


今更ながら自分のマウスのちょっと変わってるインターフェース周り(スイッチとかコネクタとか)の話を書いてみようと思います。
2年ぐらい前からやってることなので、会場でお話しした方も多いと思います。

---
以前の自分のマウスにはブートモード切替と決定ボタン兼用でタクトスイッチが最低1個は付いてました。でもタクトスイッチって小さいのは押しにくいし、壊れやすいし、小型といっても言うほど小さくないし、出来れば無くしたい部品です。

今作のマウスではマイコンの書き込みはSWDでやってるのでブートモードの切替スイッチは必要なくなりました。
決定ボタンは6軸センサや壁センサで代用しようと思えばできるでしょうが、誤爆のリスクが怖いです。環境が変わるとミスもしやすいもの、大会本番で操作ミスして1トライを無駄にすることもあるかもしれません。やはり決定ボタンは欲しいです。

誤爆しにくく、実装面積が小さく、操作しやすく、信頼性のあるインターフェースということで、静電容量式のタッチセンサを使うことにしました。
タッチセンサ回路を内蔵したマイコンであれば追加部品なしで簡単にできますし、そうでない場合も原始的なタッチセンサであればGPIO2本、抵抗1個で出来ます。自分がやったのは後者です。

これは自己容量式のタッチセンサですね。

さて、追加の部品は抵抗1個といっても、ある程度の面積の電極は必要です。電極サイズが小さすぎると容量変化が小さく、マイコンでうまくON/OFFを読み取れません。
実装面積を削減しようとしてるのに、そんな大きな電極を置くスペースなんてあるわけ…

あったーー!!! (yakudo風)

ということで、スライドスイッチ(電源スイッチ)のケースがタッチセンサの電極になってます。結構しっかり目に触れないと反応しないようにした(なった)ので、スライドスイッチ操作時に不意にタッチ入力してしまうことも起きていません。
モーターのケースも電極候補になりそうです。自分の場合はモーターはバッテリーの下に隠れてしまうので試しませんでしたが、もしかしたら使えるかもしれません。誰か試したら結果を教えてください。

あと上図のタッチセンサですが、マウスがアースされているかどうか(ケーブルでPCと繋がっているかどうか)で容量の変化の仕方が変わります。ケーブル接続の有り無しどちらでも使えるように調整には注意が必要です。

---
思ったより長くなったので、今回はタッチセンサの話だけ。
次回はプログラミングケーブルのコネクタについて。