Blog Archives

DCマウス研修(inukai編)[23] マイクロマウス全日本大会

こんにちは!
inukaiです。

タイトル通りマイクロマウス全日本大会に参加してきました!
試走会や懇親会など大会の雰囲気はこちらから。

まずは試走会ですが、探索走行はできたもののなかなか最短走行ができない状態でした。
社内の迷路と大会の迷路では迷路の塗料の違いからかタイヤのグリップ変わっており、調整しておいたMAXのパラメータではターンで滑ってしまいます。

吸引力を増やしてグリップを稼ごうとするも、ジャイロにノイズが乗ってしまいそちらもうまくいきません。
(吸引ファンの出力は、電源の容量やノイズ、振動によるジャイロのノイズを考慮して抑えて走っていました。)

走行しているうちに試走会も終わりが近づいてきたころ、最後の試走で左後側のホイールとスパーギアが外れるというトラブルが発生。

ギアをよく見ていると削れているのが確認できます。

試走会の失敗で壁に衝突を何度かした時にタイヤがロックしてギアに負担がかかっていたようです。

懇親会の後、宿で予備パーツに交換をしました。

以前のこともあり念のためピニオンギアも一度外して再圧入の上接着しました。

宿で再度組み上げおよび調整を行い大会に備えます。

そして大会当日。
結果としては、15.063と無事最短走行をすることができました。
ただ非吸引での記録となり、吸引での最短走行は失敗してしまいました。

一回だけ吸引で走り切ったものの時間オーバー、時間を縮めることができたものの準備してきたパラメータは出し切れず。

とはいえ地区大会でできていなかった最短走行ができ、無事研修として区切りをつけれたかと思います。
今後は、機体について簡単にまとめて研修はいったん終了すると思います。
前日の故障や速度を出し切れなかったことなど悔しい気持ちもあるので、来年は本機体を改良して個人的に出場したいです。

ちなみに大会の様子は下記リンクの動画からご覧いただけます。
(リンクはクラシックマウスのB競技台の午前です。リンク先のチャンネルに午後の部やA競技台もあります。自分の走行は12:30程度から)

それではまた次回!

続きを読む ›

Posted in DCマウス研修, DCマウス研修(吸引編), 研修


マイクロマウス研修(kora編)[10] 全日本マイクロマウス大会

こんにちは。koraです。

今回は、12月1日から2日にかけて東京工芸大 厚木キャンパスで開催されました「第39回全日本マイクロマウス大会」の報告です。

大会1日目

1日目は試走会です。選手控室と会場に練習用のフィールドが設置してあり、何度かトライさせていただきました。会場でマウスを落っことしてしまったり、気が付いたらセンサが曲がっていたりして焦る場面はありましたが、少しの調整で復活してくれました。HM-StarterKitの設計者曰く頑丈さを重視して作ったそうで、ここで頑丈さをいかんなく発揮してくれたことに感謝です。

 

試走会の後の懇親会では、マイクロマウスの全国大会の熱気を感じながらおいしい料理をいただきました。エキシビジョンの田代杯にも挑戦したのですが、本番会場と照明環境が大いに異なることもあって苦戦してしまいました。初めてのフィールドでも即走れるように、環境光の影響を極力下げたり、その場でキャリブレーションといった対策を将来的に盛り込んでいきたいです。

大会2日目

2日目、いよいよ本番です。

ちなみに今年のマイクロマウス競技はファイナルとセミファイナルに分かれて行われました。地区大会で3ポイント以上獲得した方、あるいは入賞された方がファイナルへ出場することになっていたそうです。私は11月の記録会でかろうじて出場権を得たばかりなので、セミファイナルへの出場となりました。

選手控室の練習フィールドでは光センサの動作が安定せず、一抹の不安を残しての挑戦でしたが、本番フィールドでは当初の不安はなんのその、安定した動作で時間内に5走を走り切りました。

 

1走目:探索+戻り探索
2走目:最短走行
3走目:重ね探索
4走目:最短走行
5走目:速度を上げたパラメータで最短走行

結果として、セミファイナル2位の記録を残すことができました!

一方、ファイナルは観客席の後ろから眺めるだけでしたが、非常にレベルの高い走りを見せていただきました。32×32マスのフィールドで探索自体が難しいにもかかわらず、安定した探索と目にもとまらぬ最短走行で、これがいわゆる宇宙人かと圧倒されてしまいました。来年の大会ではキットではなくハードウェア自作に挑戦したいと考えているので、少しでも追いつけるよう大いに参考にしたいと思います。

続きを読む ›

Posted in DCマウス研修


DCマウス研修(inukai編)[22] 吸引ファンの作り直し

こんにちは!
inukaiです。

安定した走行ができるように調整の日々を過ごしております。
今日は少し時をさかのぼって11月初旬に行ったことを書こうかと思います。

全日本に向けた調整の前に、吸引ファンを再度作り直しました。
100円モータだと吸引に使うと発熱が大きい、電流を流すわりにトルクが出ていなさそうというのが気になっていました。
手ごろなものがあれば交換したいと思っていたところ、よさそうなモータを紹介してもらったので人柱として使用してみました。

購入したのはこちらのモータ。
京商 エクスピードドローンモーター DRW002
サイズはφ10 mm * 20 mm。
ピニオンギア(モジュール0.3、厚み4.5 mm、端数13)が付属してます。

 

こちらに合わせて、吸引ファンをNC加工機で切削して作りました。
というのも出力が上がったため、積層方式の3Dプリンタだと薄い羽の強度が足りずファンがばらばらに…
ばらばらになったファンの残骸がこちら

手元に5mmのPOMがあったため、それを使って削りだしました。

以前設計したファンは厚みが11 mm。今回は5 mm (羽は4mm)と薄くなったので吸引力がどうなるかが心配ですがとりあえず回してみました!

吸引力は約250 gと個人的には満足の結果がでました!
ただ実際の運用ではバッテリーの電流を考えて200 g程度に抑えて使用しています。

吸引用モータおよびファンの交換で、安定して高い吸引力がでるようになり発熱も気にならない程度になりました。
車体重量は105 g → 110 gと少し重くなっています。
ただ結果としては、重心が車軸より1 mm程度前といい感じに落ち着いたのかなと思います。
(吸引モータ交換前は、重心が若干車軸より後ろでした)

今回のDRW002は4つセットですが、1個あたり1300円程度と手ごろなのとパワーがあるので個人的にお勧めです。
モータは0.04 V程度から回りだしたので、摩擦も小さそうかなと思います。
上記の点やピニオンギアも付属していることを考えると足回りにもいいかもしれませんね。

いよいよ全日本直前ですので、最短走行を安定して走れるよう引き続き調整していきたいと思います!
それでは大会でお会いしましょう!

続きを読む ›

Posted in DCマウス研修, DCマウス研修(吸引編), 研修


マイクロマウス研修(kora編)[9]タイマ割り込みによるセンサ値の取得

こんにちは。koraです。

前回、HM-StarterKitのエンコーダとジャイロセンサを使えるようにしましたので、今回はタイマ割り込み機能を使ってこれらの値を読み込みます。

タイマ割り込みの設定

一定周期でエンコーダとジャイロの値を読み取り、車体の状態を更新する割り込み関数を実装します。タイマ割り込み自体の初期設定は、以前作成した、init.cファイルのinit_cmt関数でされています。今回使用するのはCMT0~2のうちのCMT2です。また、割り込んだ後の処理を追加するため、以下のファイルを編集します。

  • intprg.c
  • interrupt.c

intprg.c

他のソースファイル(interrupt.c)にある関数を参照するため、externを使ってプロトタイプ宣言します。

そして以下の行を、

次のように書き換えます。

interrupt.c

2つのファイルをインクルードするよう指定します。

そして、サンプルプログラムStep7のinterrupt.cから、int_cmt2関数をコピー&ペーストします。この関数でエンコーダの値の取得、車体の速度更新、距離積分、およびジャイロの値の取得、車体の角度の積分が行われます。

グローバル変数の設定

割り込みで読み込まれた値を、グローバル変数を介してメインプログラムに渡します。そのためのグローバル変数を用意します。ここでは次のファイルを編集します。

  • glob_var.h
  • static_parameters.h
  • parameters.h

glob_var.h

サンプルプログラムを参考にエンコーダとジャイロのグローバル変数を作りますが、ついでに車体速度、距離、タイマ、制御用などのグローバル変数もつくります。なお、ここで使用している「GLOBAL」については以前のものと同じです。

static_parameters.h

static_parameters.hには定数になるパラメータを記述します。

parameters.h

新しくファイルを作成します。parameters.hには値を調整するパラメータを記述します。

ジャイロとエンコーダの初期設定

ジャイロセンサの値から角速度を求めるには、車体が静止した状態の値を差し引く必要があります。そのため、静止状態の値を取得して保存する関数が必要です。次のファイルを編集します。

  • init.h
  • init.c

init.h

関数のプロトタイプ宣言を追加します。

init.c

関数の定義を追加します。

また、init_all関数にジャイロの初期設定を追加します。

なお、タイマ割り込みによるセンサ値の取得は、センサの初期設定が終了した後に開始したいので、init_cmt関数はここで追加したコードの下に移動します。

wait_ms関数の設定

今後、指定時間待機するwait_msという関数をよく使います。サンプルプログラムStep7から、misc.cをコピーしてプロジェクトに追加します。また、wait_ms関数が機能するように、以下の編集を行います。

  • interrupt.c
  • init.c

interrupt.c

wait_ms関数で使用する変数(timer)は、1msごとに呼び出されるint_cmt0関数内でカウントすることにします。interrupt.cに戻って、int_cmt0関数内に次の一行を追加します。

init.c

変数の初期化も必要なので、init.cのinit_all関数にtimerをリセットする行を追加します。

テスト

正常にセンサの値が取得され、車体の状態が更新されているか確認します。main関数を次のように書き換えます。

my_hm_starterkit.c

TeraTermと接続して実行させると、車体の速度と角度が表示されるはずです。

ちなみに、gyro_get_ref関数はジャイロの値を2500回取得しているため、少し時間がかかります。今回のプログラムだと最初の値が表示されるまで5秒ほど必要です。

次回

エンコーダ、ジャイロセンサ、タイマ割り込みを組み合わせ、マウスの速度・回転を把握できるようになりました。次は、迷路探索に使用する光センサの値を取得できるようにしたいと思います。

続きを読む ›

Posted in DCマウス研修


マイクロマウス研修(kora編)[8]ジャイロとエンコーダ

こんにちは。koraです。

HM-StarterKitには、タイヤの回転を測定するエンコーダと、車体の回転を測定するジャイロセンサが組み込まれています。今回は、これらを使えるようにします。

SPIの準備

エンコーダとジャイロセンサはSPI通信を使用して値を取得します。SPI(シリアル・ペリフェラル・インターフェース)は、マイコンと外部のデバイスの通信によく使われるインターフェースです。HM-StarterKit用のSPI通信用のライブラリがサンプルプログラム内にあるので、今回もそれをコピーして使います。

サンプルプログラムのStep7から、spi.hとspi.cをコピーしてmy_hm_starterkitフォルダ内に貼り付けます。そして、ファイル -> 追加 -> 既存のファイルを追加 を選んで、 先ほどコピーしたファイルをプロジェクトに取り込みます。

また、既存のファイルにいくつか変更点を加えます。

intprg.c

まず、プロトタイプ宣言を追加します。

次に、以下の行を、

下のように書き換えます。

init.c

init.cでは、SPIの初期設定をするためspi.hをインクルードします。

そして、init_all()関数内に、次の行を追加します。この関数は、spi.hとspi.cにすでにあるので、新しく中身を書く必要はありません。

テスト

それでは、追加した機能をテストします。シリアル通信を使いますので、前回と同様にPCとTeraTermを準備しておきます。

my_hm_starterkit.c

まずは、main関数からSPI関連の関数を呼べるように、インクルードします。

エンコーダをテストするときは、サンプルプログラムStep5のmain関数を参考に、自作プロジェクトのmain関数に反映します。

実行してTeraTermに表示した結果は、このようになります。

ジャイロをテストするときは、サンプルプログラムStep6のmain関数を参考にします。

TeraTermに表示すると、このようになります。

ちなみに、init_spi_gyro(); はジャイロセンサ関連のマイコン側の初期設定を行っており、ジャイロセンサ本体の初期設定は、preprocess_spi_gyro(0x062100); で行っています。06がPWR_MGMT_1(パワーマネジメント)のアドレスで、21がsleep mode解除やクロック自動指定の設定です。詳しい情報はジャイロセンサICM-20648のデータシートに記載されています。

次回

エンコーダとジャイロセンサの値を読むことができるようになりました。次は、割り込みでこれらの値を読み込んで、リアルタイム制御に反映できるよう準備したいと思います。

続きを読む ›

Posted in DCマウス研修


DCマウス研修(inukai編)[21] 最短走行を作りました

こんにちは!
inukaiです。

中部地区大会後制御を少し見直しつつ調整をしたのでその進捗を今回は簡単に書いていければと思います。

今までのスラローム探索は直線時に壁の姿勢制御に頼っていたため、ふらつきながら走っていました。
まず壁姿勢制御なしである程度走れるよう、スラロームを終えたところで角速度0 rad/s、角度π/2 radになるようスラロームの調整をしました。

調整した走行がこちら。まずは連続スラローム(壁姿勢制御なし)から。

置く位置によるオフセットがあるものの、壁の姿勢制御なしである程度の探索が可能になりました。

次にくしの探索。

ちなみにこちらは壁の姿勢制御はありませんが、前壁補正により停止時に壁との距離補正はしています。

 

 

前よりきれいに走れるようになったので、最短走行に挑戦しました。
ターンは探索と同じですが、直線の最高速度4 m/s、加速度9.8 m/s/sにしています。
こちらも壁の姿勢制御はないのですが、ターンをきれいに作っておいたおかげか、短い区間であればパラメータを上げるだけで走行できました。

最後ぶつかっているのは、本番のゴールだと1マス余裕がある分、できるだけはやい速度でゴールを切るためです。
(マウスに負担がかかるからこれからは気を付けます…)

最後は先ほどと同様のパラメータで吸引をした場合です。

吸引による影響でスラロームの軌道がずれているようです。
非吸引で走れている速度なので、あえて吸引する必要もないですが。
大会までにはターン速度を上げて、吸引したうえでのパラメータ調整をしていきたいと思います。

大会前で簡単な進捗報告にはなってしまいましたが、今回はここまで。
ではまた次回

続きを読む ›

Posted in DCマウス研修, DCマウス研修(吸引編), ブログ


マイクロマウス研修(kora編)[7] シリアル通信

こんにちは。koraです。

今回はHM-StarterKitにシリアル通信の機能を付け足します。この機能を使うと、HM-StarterKit内の情報を、PCに表示することができるようになります。

シリアル通信の準備

シリアル通信にはSCI(シリアルコミュニケーションインターフェース)という機能を使用します。サンプルプログラム内にシリアル通信用のライブラリがあるので、それを利用させてもらいます。サンプルプログラムのStep7から、sci.hとsci.cをmy_hm_starterkitフォルダ内にコピーして、ファイル -> 追加 -> 既存のファイルを追加 を選び、先ほどコピーしたファイルをプロジェクトに取り込みます。

以前のプログラムに以下の変更を加えて、シリアル通信できるようにします。

init.c

ヘッダーファイルをインクルードします。

void init_all(void) に

を追加します。

my_hm_starterkit.c

今までのmain関数内をコメントアウトして、次の行を追加します。

書き込み基板

プログラムを書き込み終わったら、書き込み基板のスライドスイッチを実行モードに切り替えます。この設定で、書き込み基板を介してPCにデータを送ることができます。

動作確認

PC側からはTeraTermというターミナルソフトを使ってマイコンと通信します。PCにインストールされていない場合はOSDNのページからダウンロードできます。

「設定」 -> 「シリアルポート」を開き、スピードを38400に設定します。

本体の電源を入れて、TeraTermにHello Worldと表示されたら成功です。

数字の出力も可能です。C言語でお馴染みのstdio.hのprintfと似たような使い方ができます。

 次回

HM-StarterKitから値の出力ができるようになりましたので、次からセンサの値を取り込んでいきます。ゆくゆくは走行にフィードバックできるようにします。

続きを読む ›

Posted in DCマウス研修


マイクロマウス研修[6]マイクロマウス東日本記録会

こんにちは。koraです。

今回は、東京工芸大 厚木キャンパスで開催された「2018年マイクロマウス東日本記録会」に出場した件を報告します。

マイクロマウス全国大会への出場権を獲得するには、認定大会で完走し、記録認定証を発行してもらう必要があります。この記録会が今年の全国大会出場へのラストチャンスということで、急遽参加した次第です。

結果から言いますと、無事完走することができました。また、最短走行のタイムは13.396秒を達成し、当日のマイクロマウス部門では2位となることができました。

使用したプログラムは、サンプルプログラムを少し改造したものです。光センサの閾値を会場の環境に合わせることと、その他3つの点を変更しました。

  • 180度旋回するとき、壁にバックして位置を修正。
  • グローバル角度を参照しながら方向転換。
  • 最短走行の際、超信地旋回の代わりにスラロームで走行。

特に、スラロームが成功したため、タイムを大きく縮めることができました。これらの詳細については後々ブログで解説していきたいと思います。

全国大会まで残り1ヵ月ほどです。できる限り成績を上げるため、最短経路の探索を強化したり、走行パラメータをチューニングして臨むつもりです。

続きを読む ›

Posted in DCマウス研修


マイクロマウス研修[5]タイマ割り込み

こんにちは。koraです。

今回はタイマ割り込みを実装します。割り込みとは、マイコンで実行中のプログラムに一時的に割り込んで、別の処理を実行する機能です。タイマ割り込みを使うことで、一定周期でセンサを読み取ったりモータに指示を出したりして、マイクロマウスをリアルタイムで制御することが可能になります。

タイマ割り込みの準備
init.c

Step7のinit.cからinit_cmt()関数をコピーして、自作プロジェクトのinit.cに貼り付けます。また、init_all()関数内にinit_cmt();を追加して、init_all()からタイマ割り込みの初期化を呼び出せるようにします。

CMTはコンペアマッチタイマと言い、一定周期で割り込み処理を行うことができる機能です。init_cmt()関数内ではCMT0~2の、3つのタイマを初期化しています。この初期化で、CMT0は1kHz、CMT1は4kHz、CMT2は2kHzで割り込みが発生する設定になります。モータの制御に使うのはCMT0です。CMT1とCMT2は今後センサーの処理に使用します。

intprg.c

init_cmt()の設定で、intprg.cファイル内のExcep_CMT0_CMI0()関数が1kHzで呼び出されるようになります。今後、多様な処理を割り込みの中で実行したいので、Excep_CMT0_CMI0()関数から、別の関数を呼び出して実際の処理を行います。

#pragma section IntPRGの下に、次の行を追加します。

そして、void Excep_CMT0_CMI0(void){ } を次のように書き換えます。

interrupt.c

「新しいファイルを追加」から、interrupt.cというファイルを作ります。今回はテストのため、下のような簡単な処理のみにします。(本番用のプログラムでは、速度と旋回速度を制御するコードに書き換えます。)

glob_var.hとglob_var.c

グローバル変数を複数のファイル間で共有する場合、ヘッダファイルでextern付きの宣言をして各ソースファイルにインクルードし、実態を持たせる1つのソースファイルでextern無しの定義します。

しかし、このサンプルプログラム(Step7)では何十個もグローバル変数を使います。ヘッダファイルとソースファイルに同じ変数名を何十個も書くのは面倒です。

そこで、マクロでexternの有り無しを制御し、実態を持たせるソースファイルにインクルードされたときのみexternが外れるようにします。

glob_var.hに、

と書きます。そして、glob_var.cの方に、

と書きます。

テスト

my_hm_starterkit.cファイルに、

を追加して、main関数を次のように書き換えます。

グローバル関数Duty_rとDuty_lに値が代入されることで、タイマ割り込みで呼び出されるint_cmt0関数に値が渡され、PWMとして出力されます。Duty_rとDuty_lの値を0.0~1.0の値に設定することによって、モータの回転速度が変化します。

次回

タイマ割り込みでモータが動かせるようになりました。エンコーダ、ジャイロ、光センサの情報を反映できるようにしたいところですが、その前に、センサの情報をPCに表示するため、シリアル通信を使えるようにしたいと思います。

続きを読む ›

Posted in DCマウス研修


マイクロマウス研修[4]モータを動かす

こんにちは。koraです。

前回の更新からだいぶ時間がたってしまいましたが、今回はモータを動かせるようにしたいと思います。

モータドライバについて

まず、マイクロマウス本体を見てみましょう。HM-StarterKitにはDRV8838というモータドライバが2つ搭載されていて、2つのモータの回転方向、回転速度をそれぞれコントロールすることができます。

それぞれのモータドライバは次の3つのピンから制御できます。

  • nSLEEPピン:スリープモードを切り替える。
  • PHピン:回転方向を制御する。(Lowにすると正転、Highにすると逆転)
  • ENピン:回転速度を制御する。(PWM信号を入力する)

回転速度の制御にはPWM(Pulse Width Modulation)を使います。PWMとは、信号線のHIGH/LOWを素早く繰り返すことで、出力される電圧を制御する方法です。繰り返す周期に対するHIGH時間の割合をDuty比といいます。モータドライバから出力される電圧は、バッテリー電圧にDuty比を掛けたものになります。

つまり、このマウスを自由に走らせるには、任意のDuty比のPWM信号を2つ出す必要があります。実際にどうすればいいのか、サンプルプログラム(Step2)を見てみます。

PWM信号の生成には、マイコンのタイマ機能を使います。HM-StarterKit.cの中で、クロックとIOの設定を行っています。この設定では、48MHzで内部のカウンタが動いています。カウンタとPWM信号がどのように連動しているかというと、

  • カウンタの値がMTU0.TGRAの値より小さければ、HIGHが出力される
  • カウンタの値がMTU0.TGRAの値より大きくなれば、LOWが出力される
  • カウンタの値がMTU0.TGRDの値になれば、カウンタがリセットされ0に戻る

“MTU0.TGRD = 240-1″と設定しているので、カウンタは0~239でループします。したがってDuty比は240段階で調整することができます。ちなみに、TGRAが左側、TGRCが右側のモータドライバを制御します。

ファイルの分割

マウスの最終目標は迷路を走ることです。モータを動かすだけでなく、直進、方向転換、センサの読み込み、迷路探索など、多様な機能を盛り込む必要があります。それぞれの機能、処理を分かりやすいように関数化しましょう。というわけで、サンプルプログラム(Step7)を参考に、ファイルを作成していきます。

今回作るファイルは、こちらの4つです。

  • init.c
  • init.h
  • static_parameters.h
  • portdef.h

新しいファイルを作るには、「プロジェクト・ツリー」の「ファイル」を右クリックして「追加」を選択し、「新しいファイルを追加」をクリックします。ソースファイルを作る場合は、表示された「ファイル追加」ウィンドウで「Cソース・ファイル(*.c)」を選択し、ファイル名を入力します。ヘッダファイルを作る場合は、「ヘッダ・ファイル(*.h; *hpp; *.inc)」を選択し、ファイル名を入力です。

init.c

init.cファイルには、クロックの初期化関数(clock_init)、モータの初期化関数(motor_init)、そしてこの2つの関数をまとめて呼び出す関数(init_all)を作ります。

init.h

init.hファイルには、init_allのプロトタイプ宣言を追加します。そうすることで、init.hをインクルードしたファイルから初期化関数を呼べるようになります。

static_parameters.h

static_parameters.hファイルでは、プログラム内で使用する定数を定義します。

  • IO_OUT …

続きを読む ›

Posted in DCマウス研修