Blog Archives

shotaのマイクロマウス研修24 地区大会の振り返りをGitHubで。

こんにちは、shotaです。
社員研修として、オリジナルマウスを製作しています。

[前回の記事]では、ようやくオリジナルマウスのアートワークが完成しました。

ところが、現実世界ではすでにいくつかの地区大会に参加しています。(ブログ更新が現実に追いついていません・・・)

ということで、今回は地区大会の参加結果とGitHubを用いた大会振り返り方法について書きます。

  • 第37回マイクロマウス東日本地区大会
  • 第37回マイクロマウス北陸信越地区大会
  • GitHubを用いた大会振り返り。
  • 第32回マイクロマウス東北地区大会(中止)
  • 続きを読む ›

    Posted in DCマウス研修, ブログ, 大会情報, 研修


    マイクロマウス研修(kora編)[34] モータ制御の実装

    こんにちは。koraです。

    今回は、指示した通りにマウス本体を動かせるようにモータを制御するモジュールを追加します。

    CubeMXの設定

    左右のモータを制御できるように、2つのPWMを出力できるようにします。使用するタイマをTIM3として、チャンネル1と2をPWM出力に設定します。

    PWMのクロックにはAPB1 Timer clockが供給されるらしいので、108MHzになります。

    以前使用していたHM-StarterKitでは48MHzで240階調 = 200kHz周期のPWMを出力していました。同じモータとモータドライバを使っているので、周期を同じにするため108MHzで200kHzになるよう539(540階調 – 1)に設定します。

    PWMを出力

    HALを使ってPWMのパルス幅を変更するには、TIM_OC_InitTypeDefという構造体を使用します。この構造体のメンバPulseに0~539の値を設定してHAL_TIM_PWM_ConfigChannel関数に渡すことで、パルス幅が変わります。

    設定をするだけではPWM出力が開始されるわけではありません。開始するには以下のHAL_TIM_PWM_Start関数を呼び出します。

    モータ制御モジュールの追加

    指定される目標速度と目標角速度に対して、エンコーダとジャイロで測定される車体の速度と角速度を一致させるよう、モータに掛ける電圧を調整します。単純なPID制御を使って実装しました。

    テスト

    実際にスラロームの軌道に追従させてみました。あまりなめらかな動きとは言えませんが、一応意図した動作はしてくれているようです。

    続きを読む ›

    Posted in DCマウス研修


    マイクロマウス研修(kora編)[33] 目標軌道への追従方法の検討

    こんにちは。koraです。

    前々回までにマウスの自己位置を推定できるようになったので、今度はマウスに辿らせたい目標軌道を生成していきたいと思います。

    目標軌道の生成方法

    マウスは目標点に追従するものとして、その目標点を移動させることで軌道とします。
    速く走るためには斜め走行や180度ターンなど多様な軌道を考えるべきですが、今回は確実に動かすことを目標として、直進と90度のスラロームの2つだけ考えます。

    目標軌道の追従方法

    目標軌道から、目標点の速度(Vr)と角速度(ωr)が分かりますので、これをマウスで再現させます。ただしこの際、目標点とマウスのズレをフィードバックさせることで、より目標軌道に近い経路を走行できるようにします。

    考え方はシンプルです。マウスから見て目標点の前後のズレをXe、左右のずれをYe、角度のズレをθeとしたとき、ズレを反映した目標速度(V)と目標角速度(ω)を以下の式で求めます。

    V = Vr * cos(θe) + Kx * Xe
    ω = ωr + Vr * (Ky * Ye + Kθ * sin(θe))

    ただし、Kx、Ky、Kθはそれぞれ前後、左右、角度のズレに掛けるゲインです。
    この追従方法はKanayama Control Methodというそうです。こちらを参考にさせていただきました。

    ここで求めた新しい目標速度と目標角速度に対し、マウスの速度と角速度を一致させるようにモーターの出力を決定してマウスを追従させます。

    軌道追従の実装

    以下の手順で軌道追従できると思います。②~⑤を1ms周期で繰り返し、目標点が目標軌道の終点に達したら①に戻って新たな目標軌道を設定します。

    ①目標軌道を設定
    ②オドメトリによりマウスの位置と速度を取得
    ③目標軌道に沿って目標点の位置を更新
    ④上式で目標速度と目標角速度を計算
    ⑤目標速度と目標角速度に追従するようモーター出力を決定

    次回

    今回考えた軌道追従を実現するには、速度と角速度を追従させる制御が必要です。次回はこれを実装したいと思います。

    続きを読む ›

    Posted in DCマウス研修


    shotaのマイクロマウス研修23 アートワーク完成

    こんにちは、shotaです。
    社員研修として、オリジナルマウスを製作しています。

    [前回の記事]の続きで、アートワーク作成について書きます。

    ↓回路図はこちら
    especial.pdf
    ※2シート目のソフト書き込み回路には間違いがあるのでご注意ください
    参考:shotaのマイクロマウス研修17 回路設計⑤:ESP32ソフト書き込み基板と間違い
    ※この回路図は最新状態であり、これから貼るアートワーク画像と異なる部分があります

    続きを読む ›

    Posted in DCマウス研修, ブログ, 研修


    マイクロマウス研修(kora編)[32] 東日本地区大会・北陸信越地区大会

    こんにちは。koraです。

    今回は、東日本地区大会と北陸信越地区大会の参加レポートです。

    マイクロマウス東日本地区大会


    東日本地区大会は、9月7日~8日にパシフィコ横浜で開かれたロボットのイベント「ロボフェス」の一環として開催されました。

    7月の関西地区大会に挑んだときはバグだらけで暴走しがちだった自作マウスでしたが、そこから改良を重ね、スラローム探索も安定してこなせるようになっています。前日の試走会もそこそこ安定した走りを見せてくれました。

    しかし、思えばこれで慢心してしまっていたのでしょう。翌日の本番では、序盤こそ調子よさそうに走っていたものの、ゴール手前で壁を読み間違えてしまい、残念ながら完走することはできませんでした。

    敗因は本番のフィールドに合わせた光センサの調整ができていなかったことのようです。前方の光センサの閾値を上げるだけで解決できたのですが、ルール上、競技中はソフトウェアを変更することはできないため、なすすべもなく壁を読み間違えるマウスを見守ることしかできませんでした。

    マイクロマウス北陸信越地区大会


    東日本地区大会の1週間後、北陸信越地区大会がNCC新潟コンピュータ専門学校で開催されました。

    全国大会への出場権を得るためには、地区大会での完走が条件になっています。確実に完走を決めることを目標に参加しました。

    1走目、タイヤが汚れていたのか直進距離にズレが生じ、壁に衝突してしまいました。
    2走目、タイヤを丁寧に拭いてから挑戦したところ距離は正確になりました。が、前回の大会と同様に壁の誤認が発生して迷子になってしまいました。
    3走目、こんなこともあろうかと光センサを調整できるようにしておいたので、ほんの少し閾値を上げて走らせた結果、上手いこと認識できるようになり、ついに完走を決めることができました。おまけにスタートへ戻る際に最短経路を見つけてくれたようです。
    4走目と5走目は、先ほど見つけた最短経路を通り、壁にぶつかることなくゴールすることができました。

    結果、タイムは00:12.313で5位の成績になりました。
    入賞は逃しましたが、ようやく全国大会への出場権を得ることができたので大満足です。

    次の大会ではさらに安定性を上げて、タイムを縮められるよう、工夫を凝らしたいと思います。

    続きを読む ›

    Posted in DCマウス研修


    shotaのマイクロマウス研修22 アートワーク作成の続き(モータドライバから)

    こんにちは、shotaです。
    社員研修として、オリジナルマウスを製作しています。

    [前回の記事]の続きで、アートワーク作成について書きます。

    ↓回路図はこちら
    especial.pdf
    ※2シート目のソフト書き込み回路には間違いがあるのでご注意ください
    参考:shotaのマイクロマウス研修17 回路設計⑤:ESP32ソフト書き込み基板と間違い
    ※この回路図は最新状態であり、これから貼るアートワーク画像と異なる部分があります

    モータドライバ回路の結線から開始

    モータドライバ(回路図のMotor Driver)を結線します。

    とりあえず接続することはできました。機能ピンの割り当てを変えればもう少し綺麗にパターンを引けそうですが、それは後ほど考えることにします。

    次にモーションセンサ(回路図のMotion Tracking)を結線します。
    ここでも機能ピンの割り当てをいくつか変更しました。(アートワーク中に機能割り当てを変更できてESP32は楽だなぁ〜

    通信ラインなのでできるだけ他の線とクロスしないように、かつ表面だけで結線できるようにしたかったのですが、基板が小さいのでなかなか難しいです。。。
    最低でも、モーションセンサからの通信線同士がクロスしないように結線しました。

    次に距離センサ(回路図のObject Sensors)への出力信号(IRLED_R_FL, IRLED_L_FR)を結線します。

    距離センサは基板上部にあるため、ESP32のできるだけ上にあるピンと接続したいです。
    そのため、またESP32の機能割り当てを変更しました。迷いなく変更できるのでいいですねぇ〜。出力信号は24, 26ピンです。

    この信号線を距離センサ回路ブロックまで持っていきます。距離センサまわりのパターンがぐちゃぐちゃしてきましたね・・・整えたいです。

    最後にエンコーダ(回路図のMotor Encoder)を結線します。
    こちらも通信信号ラインなので、クロスせずに結線したかったのですが、、、やっぱり難しいですね。
    とりあえず接続することはできました。

    これで各回路ブロックとESP32を接続できました。
    残りは電源とGNDラインです。まずは4層基板に設定して、2層目を電源・GND、3層目をベタGNDにしてみます。

    これですべてのパターンを結線できました。
    もちろんこれで完成ではないので、次回はパターンの修正に入ります。

    次回の記事

    アートワーク作成の続きで、パターンの修正について書きます。

    続きを読む ›

    Posted in DCマウス研修, ブログ, 研修


    shotaのマイクロマウス研修21 アートワーク作成の続き(メイン基板の配線開始)

    こんにちは、shotaです。
    社員研修として、オリジナルマウスを製作しています。

    [前回の記事]の続きで、アートワーク作成について書きます。

    回路図の確認

    今回はメイン基板の配線について書くので、改めて回路図を確認します。

    ↓このリンクを開くとPDFファイルが表示されます。
    especial.pdf

    ※2シート目のソフト書き込み回路には間違いがあるのでご注意ください
    shotaのマイクロマウス研修17 回路設計⑤:ESP32ソフト書き込み基板と間違い

    ※この回路図は最新状態であり、これから貼るアートワーク画像と異なる部分があります

    メイン基板の配線スタート

    まず、アナログ回路である距離センサ(回路図上のObject Sensors)からパターンを引きます。
    画像上部にあるのがセンサ回路ブロックです。

    ESP32のA/Dピンは固定されているので、仕方なく上から右下に接続します。他の機能だとピンの入れ替えができて良いんですけどね〜

    次にソフト書き込み用のパターン(回路図上のUSB Serial)を引きます。
    こちらも、ESP32の機能ピンを入れ替えられないので、仕方なくこのように引きました。

    (だんだんESP32周りがゴチャゴチャしてきました。。。)

    ここでちょこっと回路修正

    次にデバッグLED(2個)のパターンを引くのですが、上手に引けそうにないので機能ピンを入れ替えました。

    まず、機能割り当て表を変更します。
    デバッグLEDが接続されるのは、24ピンのLED0と28ピンのLED1です。これを36ピン(IRLED_L_FR)と、37ピン(6AXIS_MOSI)と交換します。

    変更後の割り当て表はこのようになりました。
    LED0が接続されていた24ピンは、起動時プルダウンされるピンです。そのため、外部回路がPull DownとなっているIRLED_L_FR(元36ピン)を割り当てます。

    28ピンには6AXIS_MOSI(元37ピン)を割り当てます。SPIの機能を好きなピンに割り当てられるのはESP32に強みですね〜。すごい。

    LED0, LED1は、それぞれ37ピン、36ピンに割り当てました。GPIOももちろん好きなピンに割り当てられます。

    ※好きなピンと言ってもいくつか制限があるので注意してください。
    参考:shotaのマイクロマウス研修18 ESP32周辺回路とピンの機能選択

    もちろん回路図も変更します。
    こういう時に回路図をブロック化していると変更が楽ですね!

    そして最後に、LEDとESP32間のパターンを引きます。

    ここで、メイン回路のアートワーク進捗は30%くらいです。まだまだです。

    次回の記事

    次回もアートワーク作成の続きで、モータドライバ回路のパターンを引きます。

    続きを読む ›

    Posted in DCマウス研修, ブログ, 研修


    マイクロマウス研修(kora編)[31] オドメトリの実装

    こんにちは。koraです。

    今回はオドメトリ(自己位置推定)をできるようにします。
    以前の制御では迷路の壁に沿って進んでいたので、正確な自己位置を把握する必要はなかったのですが、今回は目標軌道に追従させるような制御をしたいので実装することにしました。

    オドメトリの実装
    計算方法

    制御周期を1msとしますので、制御周期ごとに車体の角度と移動距離を計算して積算していけば、ロボットの自己位置を推定することができます。

    1. ジャイロの出力値から[度/秒]の車体の角速度が得られるので、単位を[rad/ms]に変換して1ms前の車体の角度[rad]に足し合わせることで、現在の車体の角度[rad]になります。
    2. エンコーダ出力値(タイヤの絶対角度)に対して、1ms前の値との差分をとるとタイヤの角速度[rad/ms]が得られます。これにタイヤの直径[mm]を掛けると車体の進行方向の移動距離[mm/ms = m/s]が得られます。
    3. 車体の角度と進行方向の移動距離から、X方向、Y方向の移動距離をそれぞれ求めます
      • X方向の移動距離 = 車体の進行方向の移動距離 * cos(車体の角度)
      • Y方向の移動距離 = 車体の進行方向の移動距離 * sin(車体の角度)

    実際には1ms間も角度が変わり続けているのですが、ここでは計算を簡単にするため角度一定と仮定しています。また、タイヤの滑りなどで誤差が出ますので、後々補正を入れる必要があります。

    モジュールの実装

    エンコーダのモジュールを作ります。Srcフォルダにodom.cを、Incフォルダにodom.hを作って、上記の計算を実装します。また、タイマ割り込みで制御周期ごとに呼び出されるようにします。

    動作確認

    実際にマウスを動かして、角度と座標を計算できていることを確認できました!

    次回

    次回から、目標軌道の生成とその追従制御に取り掛かりたいと思います。

    続きを読む ›

    Posted in DCマウス研修


    shotaのマイクロマウス研修20 アートワーク作成の続き

    こんにちは、shotaです。
    社員研修として、オリジナルマウスを製作しています。

    [前回の記事]の続きで、アートワーク作成について書きます。

    ソフト書き込み基板とエンコーダ基板

    先にソフト書き込み基板とエンコーダ基板の作成に取り掛かります。

    ソフト書き込み基板については、ほぼ完成です。

    エンコーダ基板については、この後修正しました。

    エンコーダ基板の配置を3D CADで確認

    もともとエンコーダ基板はピンソケットを使って立てる予定でしたが、接触不良が発生しそうなので、
    代わりに直接ハンダ付けで接続するようにしました。

    3D CAD(Fusion360)に基板データを取り込んで、エンコーダの位置を決めています。

    Fusion360で、上から見た図です。
    この図の茶色い塊は1.5mm厚のエアギャップです。

    エンコーダ[MA702のデータシート]によると、

    The recommended magnet is a Neodymium alloy (N35) cylinder with dimensions Ø5x3mm inserted into
    an aluminum shaft with a 1.5mm air gap between the magnet and the sensor (surface of package).

    … 磁石とパッケージの表面間には1.5 mmのエアギャップを設けてね

    と書かれています。エンコーダと磁石の間には適切なギャップが必要なようです。

    3D CADに合わせてアートワークを修正

    エンコーダ基板の形状と配置が決まったので、アートワークを修正します。

    エンコーダ基板には、メイン基板と接続するためのランドを用意しました。
    (メイン基板との接続ランドが少し小さいように見えますが、、、そうです小さいのです(失敗)

    メイン基板にも、エンコーダ基板を接続するためのランドを用意してます。

    その後、ちょこちょこと修正して、エンコーダ基板はこうなりました。

    部品番号は違いますが、同じ形状同じ配線の基板です。
    これは量産が簡単ですね。(接続用のランドはもちろん小さいままです。)

    全体としての進捗はこんな感じです。
    ソフト書き込み基板とエンコーダ基板はほぼ完成です。
    次はいよいよメイン基板の配線スタートです。

    次回の記事

    アートワーク作成の続きで、メイン基板の配線について書きます。

    続きを読む ›

    Posted in DCマウス研修, ブログ, 研修


    マイクロマウス研修(kora編)[30] タイマ割り込みの実装

    こんにちは。koraです。

    今回はタイマ割り込みを設定します。
    以前HM-StarterKitを使ったときも実装していましたが、一定周期でセンサ値の取得と車体の制御ができるようになります。

    タイマ割り込みの設定

    マウス本体は1kHzで制御する予定ですが、この中で4つの光センサと1つの電源電圧のAD変換を行いたいので、1kHzの5倍の5kHzで割り込ませたいと思います。

    CubeMXの設定

    まず、CubeMXのClock Configurationタブを開いて、クロックを確認します。
    STM32には複数のタイマがありますが、今回はGeneral-purpose timersの1つであるTIM2を使います。
    STM32F72x/3x Reference Manualの5章によると、APB1 Timer clocksがのTIM2に供給されるようです。

    次に、Pinout&Configurationタブを開いて、タイマを設定します。
    左側のタブからTimersをクリックし、TIM2を選択して、TIM2 Mode and Configurationウィンドウを表示します。

    • 上段のModeの”Clock Source”を”Internal Clock”に変更します。
    • 下段のConfigurationのParameter Settingsタブを開いて割り込み周波数を設定します。
      割り込み周波数 = クロック周波数 / ((Prescaler + 1) * (Counter Period + 1))
      APB1 Timer clocksが108MHzですので、”Prescaler”を200-1に、”Counter Period”を108-1にすれば、割り込み周波数が5kHzになります。
    • NVIC Settingsタブを開いて”TIM2 global interrupt”にチェックを入れることで、割り込みが可能になります

    タイマ割り込みのプログラム

    割り込みが発生したときに呼び出される関数は、CubeMXで生成されるファイルのstm32f7xx_it.cにある、TIM2_IRQHandler()です。ここから各モジュールを呼び出すようにします。
    5kHzで発生する割り込みに対し、前回設定したADCを順番に実行し、全体を1kHzで更新します。また、ジャイロとの通信、エンコーダとの通信、現在位置の計算(未実装)、目標軌道の計算(未実装)、モータの制御(未実装)も順番で実行し、これも1kHzで更新します。
    なお、実際にタイマ割り込みを開始するには、main関数内に次の行を追加しておく必要があります。

    次回

    センサが一通りそろって、タイマ割り込みもできるようになりましたので、次から現在位置の計算をさせてみます。最終的には目標軌道に追従させるような制御をさせるつもりです。

    続きを読む ›

    Posted in DCマウス研修