ロボットンのDCマウス製作記

マイクロマウス(クラシック)についての備忘録です。

今年の振り返りと迷路シミュレータ紹介

この記事はマイクロマウスアドベントカレンダー23日目の記事です。

 

昨日はhmsnさんの学生大会の報告と今季の取り組みの紹介でした。モーターの音を測定して,逆起電力定数を測定する手法の紹介でした。自分は1717モーターなど,すでに逆起電力定数がデータシートに乗っているようなモーターしか使ったことがないですが,今後データシートがないモータを使う場合に試してみようと思います。

 

自己紹介

アドベントカレンダーでブログを書くのは初めてなので自己紹介をしたいと思います。

 

名前 こみ(@krmtnkm)

所属 東京理科大 Mice

学年 B4

参加競技 クラシックマウス

クラシックマウス競技は去年始めて今年で2年目となります。

学生大会の感想

マイクロマウス全日本学生大会に参加させていただきました。運営の工芸大からくり工房の皆さんありがとうございました。

自分の結果はクラシック部門で5位(37台参加)でした。タイムは5.040でした。当初の目標であった吸引走行での最短の成功は達成することはできましたが,長い斜めを走れず大きくロスしたり,せっかく作った1.7m/sパラメータがうまく動いてくれなかったりと悔しい結果となりました。安定性,速度ともにまだまだ学生上位陣には遠そうです。

Miceのほかの方々は,吸引や斜めに手を出していました。後輩も出場してましたが,完走にはなりませんでした。直前は自分のことで手一杯になってしまい,まともに見れず申し訳ありませんでした。また,Miceのトコロ君はいつも通り安定した走りでまだまだ勝てそうにありません。

今年作成した迷路シミュレータについて

去年は探索,最短共に足立法のみだったので,今年はアルゴリズムに本格着手するため迷路シミュレータを作成しました。シミュレータの製作にはDXライブラリを使用しました。

 

 

探索走行と最短走行が可能となっています。表示されている壁はボタンになっており,クリックすると壁を立て,もう一度クリックすると壁を消すことができます。

迷路に表示されている数字は歩数マップの数字です。

1ステップごとにマウスを動かすような機能はありませんが,代わりに一時停止でマウスの座標と向いている方角を調べることができます。この機能は探索アルゴリズムのデバックの役に立ちました。

マウスや壁の画像はedgeでテキトーに作成しました。

 

最短走行の様子です。最短走行ではダイクストラ法を使用しています。

最短時に表示されている数字はノードのコストです。

最短走行では斜め走行ができるようになっています。動きはちょっとかくかくしてますが,ベジェ曲線を使ってターンのアニメーションを作ってみました。

 

迷路シミュレータを作ってよかった点は新しいアルゴリズムの実装が楽になったことです。部室の迷路は16×7なので,探索はもちろん,最短走行も一本道になってしまいアルゴリズムデバッグが困難でした。迷路シミュレータを作ってからは,シミュレータ上でいくつか迷路を試してバグがないかを確認してからコードをコピペで実機でも動きました。

 

シミュレータの今後の機能追加としては,パラメータによってターンの重みを変えて,違う経路になる経路導出をやりたいと思っています。もっと賢いマウスになりたいです。

 

最後に今年のマウス活動を簡単に振り返ろうと思います。

今年の振り返り

  (1~2月)

dcマウスの機械設計を始める。

足回りの雑さは後々後悔することとなる。

 

(2~3月)

回路の設計を行う。回路設計も雑で様々な問題を引き起こした。

 

(4月~6月)

機体が完成し,制御のコードを書き始める。また,このあたりから制御のプログラムと並行して,迷路探査シミュレータを作り始めた。

6月には非常に不安定ながら探索を実装することができた。探索のほかにダイクストラ法での経路導出を実装したが,実際に役に立ったのは半年後であった。

また,6月の下旬にはマイクロマウス合宿に参加した。プチ大会で走らせたが,壁制御がブルブルしたり,ターンの角度が毎回違うなどが原因で完走はできなかった。

 

(7月)

大廻のターンを実装して関西地区大会に参加した。大会三日前に機体を壊したりして,大変だったが,奇跡的に完走することができた。

最短は直進で距離がずれてコケてしまった。大会後は不安定だったスラロームの改善を試みた。かどすべーるを張ったりして角度追従がきれいになったように見えたが気のせいでターンの再現性は低いままだった。

 

(8月~9月上旬)

金沢草の根大会に向けて無謀にも斜め走行を実装しようとした。

スラロームすらできないのに斜めターンなどできるわけなく,実装はしたものの走るのは3×3の迷路ぐらいだった。

ターンの不安定さを補正で何とかしようと壁切れを頑張ったが,そもそも角度に再現性がなく,数回に一回±10°くらいずれるのでどうしようもなかった。

このころはサークルの部員が爆発的な進捗を生んでいたが,自分はスラロームで詰まっていた。

9月の上旬には金沢草の根大会に参加した。精神と時の部屋では不安定なスラロームを改善するべく,ひたすら角度のゲインをいじっていたが,結局一番最初のゲインに戻ってきて絶望した。

前壁補正と後距離の補正で何とか完走はできたが,最短走行はすべて失敗した。しかし重ねて探索させて記録を残すことはできた。

↑無謀な斜めターン(たぶんin135?)

 

(9月中旬~10月)

金沢から帰った後にマウスのタイヤを2つ外して走らせてみる。少し角速度の追従がよくなったのでソフトではなく足回りを疑う。

モータマウントの車高を変えて再発注,軸ねじの長さを短くし,ナイロンナット,ホイール,ギアすべて再発注した。

モータマウントを再発注したら精度の問題でナットをはめる穴が小さくなっており圧入しないといけなくなっており,少し焦った。

しかし,足回りを作り直したら,よりスルスルとタイヤが回るようになり,やっとターンの再現性問題が解決した。

原因はあまりよくわかっていないが,軸ねじが長すぎた,ナイロンナットのナイロンが劣化していて固定が不安定だったこと,軸ねじの頭とナットで止める部分の距離が短すぎたことなどが挙げられる。

角速度も多少の振動はあるものの追従するようになり,ターンの再現性が大幅に上がった。ターンがよくなり,やっと斜め走行がある程度走るようになった。10月の初旬には東北地区大会に参加し,斜めで完走することができた。(ターン速 all 0.8 m/s)

 

(10月~11月)

中部地区大会に向けて吸引の実装を頑張る。ファンを回したら偏心でマウスがものすごく振動してターンどころではなかった。

ファンをゆっくり回すようにしたら振動は収まったが,20~30gくらいしか吸えなかった。

また,ファンを回してたらなぜかファンのfetが焼けるようになった。fetを付けたり外したりしてたら吸引回路のパターンがはがれてファンを回せなくなった。

そのため中部地区大会と東日本地区大会は非吸引で参加した。ただ,このままでは進歩がないので,ターン速を0.8から1.0にした。

 

(12月)

マウスのスピーカを剥ぎ取り,そこにファンのコネクタをつなぎ,さらにファンをアクリルで発注しなおし,ファンの穴径を圧入前提にしたらようやく振動なく150gくらい吸えるようになった。学生大会に向け吸引ターンを調整しようとするが,吸引すると壁制御が利かなくなる問題が発覚した。

ログを見るとセンサーに吸引のノイズが乗りまくっていた。回路に問題があることが分かったが,再発注している時間はないので平均を取ってごまかした。普通の壁制御は平均でもなんとかなったが,斜めの壁制御はどうしようもなかった。

学生大会では長い斜めがあったため連続斜めの重みを増やして,斜めルートを回避した。最短は成功したものの,長い斜めを走れていればもっとタイムを短縮できたと思う。

ノイズが乗る原因はまだよくわかっていないが,ベタGNDができていないのが怪しいので,ベタを張りなおして再発注する予定

 

この一年を振り返えると,ひたすらハードで苦戦しているので,来年は今年の反省を踏まえてしっかりした設計を心掛けたいです。

 

明日はうえぽんさんのマウス0作目のソフト設計のようななにかです。今年はある程度全体のソフト設計を行ってから開発を始めましたが,まだまだ改善点があるので,参考にさせていただきます。

 

関西地区大会2023の反省

お久しぶりです。mice副部長のr.kです。

7月16日に行われた関西地区大会に参加させていただきました。非常にスムーズで楽しい大会でした。運営に関わった方々に感謝致します。

 

今回は関西地区大会での結果と反省点について述べようと思います。

 

まず、私の大会の成績は

DCマウスでの初めての地区大会で完走することができました。しかし、戻り探索と、最短走行はすべて失敗しました。1走目はゴールにはたどり着きましたが、ゴールから出るところでの連続スラロームで角度がずれて、串に突っ込んで止まってしまいました。2走目以降では最短走行を試みたのですが、まず最初の長い直線の距離がずれていたのか、直線後のターンでクラッシュしてしまいました。

 

このような結果になった反省点を並べてみると

① 部室では5×7の迷路しか走らせず、15マスの長い直線の調整をしなかったこと

② 大会3日前、前日、前々日は修理に追われ、ほとんどコードをいじらなかったこと

③ 最短のパラメータを大回り有りと無しの2つしか用意しなかったこと

④ 大会で2走目以降、探索ではなく、走らない最短を走らせ続けたこと

⑤ 最短で壁切れを入れなかったこと

 

まず①に関しては、大会前はターンの調整ばかりしており、直線の調整はしませんでした。部室の迷路で直線2.5m/sでそこそこ走っていたので大丈夫だろうと思っていました。しかし部室の迷路では直線は長くても6マスくらいだったので、おそらく2m/sも出ていなかったと思います。この反省を踏まえて次の大会までには長い距離走らせて、どれだけずれがあるかを確認したいと思います。

 

大会3日前あたりからマウスの探索中やターンの調整中に急に、マウスが高速回転する現象に悩まされていました。なぜかその場でこの問題について考えずに走らせ続けていたら、さらに前センサーも読めなくなってしまいました。当初自分は前センサーが読めない原因と探索中などに回転する原因がマイコン接触不良であるんじゃないかと思い、マイコン周りの半田付けをやり直したりしました。しかし、何も変わらず、なぜかwhoamiも0になっていました。あまりに分からなかったのでサークルの先輩に助けてもらいました。

 

前センサーが読めなくなっていた原因は半田がクラックしたのか、発光回路の抵抗が導通していたためでした。自分は最初前センサーが読めないのは、発光部でなく受光部が原因だと思っていました。センサのledが光っているかどうかを確認すればよかったのですが、高速で点滅させていたので、スマホの内カメラで見てみても、他のセンサーのledと違いがよく分からず光っていると勝手に思っていました。先輩からアドバイスされ、ledの割り込みでの点滅をやめ、常時点灯させるようにしたら1つだけledが光っていないことがはっきりと分かりました。

 

また、高速回転する原因としてはジャイロの接触不良だったようです。ジャイロのwhoamiをモニターしたら基本は正常値の0x98になっていましたが時々連続して0やffになっていることがありました。ジャイロを指で触ると正常になることがあったので、大会前々日にジャイロの足を温め直すと高速回転しなくなりました。しかしまた高速回転するのが怖かったのでwhoamiの値を監視して、異常だったらフェイルセーフをかけるようにしました。これは実装してよかったです。次の日にマウスを動かそうとしたらフェイルセーフがかかっていたからです。もう一度足を温めたら直りましたが、いつ再発するか分からなかったので大会会場には半田ごてを持って行きました。大会当日では時々マウスにリポをさしてフェイルセーフがかかっていないかを確認していました。

 

これらの反省としてはまず、少しでもマウスが異常な動きをしたら動かすのをやめ、原因を探るべきでした。これをしなかったせいで、どのタイミングで前センサーが壊れたのかが分からず、無駄に時間を消費してしまいました。

 

最短のパラメータを大回り無しと有りの2つしか用意しませんでした。理由としてはこれまで、最短走行のパラメーター選択がなく、前日に機能を実装してバグになるのが嫌だったからです。そもそもそんなに時間がかかる機能でもないのにこれまで、面倒くさがってパラメータを直接書き換えていました。まず、速度を上げたりするよりもパラメータ選択機能を作ることなどを優先させるべきでした。低速パラメータを作っておけば、もう少しよい結果になったんじゃないかと思っています。

 

大会では2走目以降も最短走行を走らせ続けましたが、すべて失敗してしまいました。そもそもパラメータは2つしか作っていなかったので、両方失敗した時点でこれ以上走らせても、成功する確率は低かったと思います。走る可能性の低い最短を走らせるくらいなら、既知区間加速もありますし、もう一度探索を走らせた方がいい結果になったと思います。しかし、大会中はまったく頭が回りませんでした。この反省を踏まえて、これから2走目は重ね探索をさせて、確実に記録を残そうと思います。

 

最短走行での補正は前壁補正のみで、壁切れを入れていませんでした。今回クラッシュした動画を見返してみると、直線の距離が足りず、ターンで引っかかっていた事が分かりました。ターンの前には壁がなかったため、前壁の制御ができず、距離の補正ができませんでした。これは壁切れを入れてさえいれば少なくとも、そこでコケることはなかったと思います。

 

次に今回の大会で良かったことを述べたいと思います。

 

①環境が変わっても安定していたこと

②壁制御はまあまあいい感じだった

③目標にしていた完走をすることができた。

 

去年のステッパーでは大会などで環境が変わるたびに壁センサーのリファレンス値を測り直していました。しかし今回のdcでは一切壁センサーの値をいじらずに、部室にいるときと同じように走ってくれました。

 

壁制御は前に比べるとかなり改善しました。マウス合宿のプチ大会で走らせたときは、壁の切れ目で吸い込まれたり、壁制御と角速度PID制御が干渉したりして、ブルブルと不安定な動きをしていました。部室で閾値をいじったり、壁制御をつける条件を厳しくしたり、AD値そのままで制御するのをやめたりといろいろやりました。その甲斐もあって他の方のdcマウスのような壁制御になったと思います。

 

今回の大会では機体が壊れて前日まで修理していたこともあり、棄権も考えていたので、完走したことはとてもうれしいです。しかし、人間欲がでるもので、マウスを前日あたりに修理していたときは

           完走しなくていいからせめて動いてほしい

                    ↓

                 完走してほしい

                    ↓

                 最短走ってほしい

                    ↓

              maxパラメータで走ってほしい

 

と大会会場でわりと走ってるのをみて、どんどん欲が出てきました。そのため、完走してうれしい気持ちもありますが、最短失敗して悔しい思いも大いにあります。

 

大会の反省としてはこんな感じでしょうか、とりあえず次の大会に向けて開発頑張っていきたいです。夏休みには斜め実装したいです。

 

 

クラシック機体紹介

人生で初めて製作したクラシックDCマウスの機体紹介記事です。

 

写真

 

 

機体情報

機体名 Meteorboy

size width: 70mm Length: 95mm

weight 117g

cpu STM32F446

sensor 受光部 st-1kl3a LED SFH4550

gyro ICM-20689

encoder IEH2-4095

motor 1717-6SR

motordriver TB67H450FNG

 

オーソドックスな4輪DCマウスです。DCマウスを自分で設計するのは初めてだったので,他の人の使っている部品を大いに参考にしました。なので,ハード設計において,オリジナリティーなんてものはありません(笑)

 

設計コンセプトとか

①かっこいいので変則4輪にしたい

②ある程度実績のある部品を利用する

③去年のステッパの経験から前壁センサーは1個にした。

c++オブジェクト指向を意識したソフト設計をする

⑤リポ逆挿しをしない構造←重要

なお逆挿ししなくても回路を壊した模様

 

①について

先輩や大会にいた他のマウサーの方の機体を見て,かっこいいと思ったので,

 

②について

初心者がデータシートを読みこなすのは困難なので,他の方のブログを参考にできるように,有名な部品を選ぶことを心掛けました。

以下に回路図を示します

いちおう受光回路にハイパスフィルタを入れてみたのですが,今のところあまり効果を実感できていません。アートワークの方はここには載せませんが,水晶の下を信号線が通っていたり,ベタGNDができていなかったり,配線が無理やりだったりと色々と怪しいです。今回は無理にすべて手動配線したので,次作るときはもっと部品の配置を練って,自動配線を使ってみようと思います。

 

③について

去年のステッパは何故か,左前壁センサーの感度が低く,ほぼ右前壁センサーのみを使って前壁認識を行っていました。そのため別に前にセンサーが2つなくてもいいんじゃないかと思って,なんとなく前壁センサー1つにしました。ただ,センサー5個の配置の場合,斜めの壁制御がセンサー4つとかなり異なるものになるらしいです。

 

④について

僕は前々からオブジェクト指向を用いてプログラミングしたいと思っていたので,ステッパからDCに移行する際にCからC++に切り替えました。ただ,周りの人は誰もCubeIDEでC++を使っていなかったので,C++への移行は結構詰まるところがありました。CubeIDEでのC++のプロジェクト作成するブログは少なかったので,今後備忘録として書いておこうかとも思っています。

さて,去年の僕のステッパのコードは1ファイルに1500行以上書かれていたりとひどいものでした。コードの綺麗さとかは特に考えずにテキトーに書いてたので,似た処理の関数が複数あったり,externを濫用して勝手にフラグが書き換わっていたり,なぜか迷路探索部の処理の中に,ペリフェラルの関数が入っていたりしました。このようになった原因の一つとして,機能をどんどん追加していくたびに,違法増築を繰り返し,プログラムが雑になっていったという事があります。そこで今年はある程度ソフトの全体設計を行ってからコードを書いていくことにしました。去年ステッパをまあまあちゃんとやったので,マイクロマウスにおいてどのような機能が必要かなどを見渡すことができました。今回はクラス図を書いて,その通りに実装していったのですが,図の作成はplantUMLを使用しました。

とりあえず,制御部だけですが,以下の写真のようなクラス図を書いてみました。設計時は要素間のつながりはできるだけ少なく(特に制御部,センサー,迷路探索部の名前空間の間のつながりは最小限にした),クラスに循環参照ができないように心がけました。実装の際にはsetter,getterを面倒くさがらずに書いて,関係ない所から参照できないようにする,インスタンスのメンバ変数の参照関係は極力クラス図の関係になるようするなどを気を付けました。

 



⑤について

去年の学生大会で大会前日にリポを逆挿しして悲しかったので,もう二度と逆挿ししまいと,電源のmosfetを2段にしました。そのため万が一逆挿ししても大丈夫だと思うのですが,怖いので試したことはありません。

 

↑スイッチを6角レンチで押そうとして手が滑り,回路を導通させ破壊した

 

おわりに

回路を破壊した後は,二日ほどかけてもう一度作り直し,現在は良好に動いています。これから迷路探索部のコードを書いていく予定です。

 

 

 

 

 

 

 

STM32のLチカで苦労した話

 

今回はDCマウスの基板が届いたので、電源とマイコン周りを半田付けしてLチカとUSART通信を試みたことを書こうと思います。

 

まずはプリント基板にレギュレータなどの電源系とマイコン周りを半田付けしました。マイコンの半田付けは足が異常に小さく、(自分には)普通につけるのが無理だったので、マイコンの足に半田を大量に盛り、足とパッドをくっつけてから余分な半田を吸い取り線で取り除いていく作戦でいきました。

 

 

次に秋月で買った64ピンのnucleoボードを下の写真のように部室のニッパーでカットしました。

 

このときボードを割るときに力を入れすぎて、指を切ってしまいました。これからnucleoを割る予定がある方は気をつけましょう。また、分離したボードのST-LINK部分のCN2ピンのジャンパ2つを取り除きました。これにより、CN4の外部デバックコネクタを使えるようになると、公式のデータシートに記述されています。

 

 

CN4のピンは以下の通りです。

自分は1ピン以外の5つのピンをターゲット基板と写真のように接続しました。基板の3.3Vと1ピンのVDDを接続できれば、マイコンをPCの3.3Vで起動できるようになるのでしょうか?よく分かりません?usart通信を行う際にはマイコン基板のTxとST-LINKのRxピンを接続することでマイコンからPC側に送信することができるみたいです。

 

データシートの記述通りにターゲット基板とST-LINKを以下の写真のように接続し、マイコンへの書き込みを試みたところ問題が発生しました。

 

 

とりあえずマイコンへの書き込みはできるのですが、Lチカができない問題が発生しました。CubeIDEのペリフェラル設定ミスかと思い、設定をいじりましたがLEDはうんともすんとも言ってくれませんでした。

 

絶望に打ちひしがれ、その日は帰ったのですが、次の日に部室に行ったら先輩がいたので、相談に乗ってもらったら水晶を逆につけていたことが発覚しました。これを直して一件落着かと思いきや、それでもLEDは光りませんでした。

 

LEDがだめならuartはどうかと思い、uartの設定を行いTeraTermに「hello」の文字列を表示させることを試みると、見事に文字化けして正しく通信ができませんでした。その後もいろいろ試してみましたが、どれもだめでした。

 

結局たまたまレギュレータを指で触っていたときのみLEDが点灯した事から問題の原因が判明しました。3.3Vを作り出すレギュレータとGNDの半田付けが甘く、接触不良になっており、正しくマイコンが動いていなかったようでした。

 

今回は運良く問題の原因が判明しましたが、今後もこういった問題が起こると思うと非常にうんざりします。今回の件で、ロボット製作の恐ろしさが垣間見えた気がしました。

 

 

 

ブログを始めてみました

初めまして

mice前部長のr.kです

ブログを始めてみました。

 

ブログを始めた理由

3月4日に現在制作中のDCマウスの基板を発注しました。これから部品の実装、動作チェックを進めていく予定なのですが、恐らく詰まることが多くなると予想されます。

 

特にマイコンへの書き込み、Lチカの成功が大きな課題だと感じています。

 

このとき問題をどう解決したのかを記録にして残すことで、またマウスを作るときに自分で見返したり、他にマウスを作っている人の役に立つと思ったのが大きな理由です。

 

ブログ自体は前々からなんとなくやってみたいなー、とは思っていたのですが、いつかやろうとなかなか踏ん切りがつきませんでした。あと、初心者過ぎて何を書けばいいのか分からなかったというのもあります笑。

 

他の理由としては自分の考えたことを他の人に伝える練習の意味もあります。

自分は人に考えたことを伝えるのが苦手なので...

 

また、miceでは白鑞先輩が初心者にもわかりやすいステッパーマウスやdcのマニュアルを書いてくださっていました。そのおかげで全くの初心者だった自分がひとまず大会で完走できるくらいにはなりました。

 

miceが潰れなかったのはサークルのメンバーが先輩に熱心に指導してもらったことが非常に大きいと思っています。ありがとうございます。

 

ただ、先輩は卒業されるので、今度は自分たちで技術継承をしていかないとmiceは再び存続が危うくなってしまいます。

 

技術継承を行う上で今の自分にできることはブログを書くことだと思いました。dcマウスの作成をメインに書く予定ですが、ステッパーでやってきたことについても書いていこうと考えています。

 

去年までは一応部長だったのですが、まったく何もしてこなかったので、さすがにそろそろサークルに貢献できることをしないといけないなと思っています。こんな部長だったので、去年の3月に新歓を行っていたときは、入ってくる1年生には申し訳ない気持ちでいっぱいでした。

 

今年からはブログの更新をはじめ、dcマウスの作成、後輩の指導などを頑張ろうと思います。