Blog Archives

shotaのマイクロマウス研修10[オリジナルマウスの仕様を決める]

こんにちは、shotaです。

社員研修として、オリジナルマウスの製作を始めます。

[前回の記事]で、ESP32を使ったマウスを作る!!という目標を掲げました。

今回はより詳細な仕様を決めたいと思います。

仕様決めのルール

設計を楽にするため(妥協するため)、仕様を3段階に分けます。

  • 最低限必要な機能・性能
    • これがないとマウスじゃない
  • 重要な機能・性能
    • 目指すマウスの姿
    • 目標
    • 欲望
  • できればほしい機能・性能
    • あったら嬉しい
    • 妥協できるところ

最低限必要な機能・性能

これがないとマウスじゃないという機能・性能です。実現しないと大会に出場できません。

  • 迷路を直進・旋回できる
    • 実現しないと迷路を走れません
  • 壁を検知できる
    • 実現しないと角を曲がれません迷路を解けません
  • 迷路情報をフラッシュメモリに保存できる
    • 実現しないと競技中にマウスの電源を切れません
  • 電源スイッチがある
    • 実現しないと電源を切るためにバッテリーを引き抜かなければなりません
  • モード切替インタフェースがある
    • 実現しないと電源ONですぐに走り出しちゃいます

重要な機能・性能

目指すマウスの姿です。これらをすべて実現できるように頑張ります。

  • ESP-WROOM-32Dを使う
    • 一番重要な項目です。ESP32はマイクロマウスで使えない。なんてことにならないようにがんばります。
  • WiFi・Bluetoothが使える
    • ESP32の主な機能の一つです。ただ、マウスで使うにあたって注意事項があります。この記事の最後に書きます。
  • 組み込みOS(FreeRTOS)が使える
    • 組み込みでマルチタスクを使ってみます
  • AWSと接続して迷路データをクラウド(AWS)に送信できる
    • 番むずかしい仕様だと思います。
    • これまで使っていた[Pi:Co Classic3]では、マウスとPCをUSBで接続して、迷路情報を[Tera Term]に表示していました。
    • 無線で迷路情報をクラウドに送信し、いつでもどこからでも迷路情報を閲覧できるようにしたいです。
  • DCモータを使う
  • Linuxのターミナルで開発できる
    • (Windows使いたくない)
    • (好きなエディタ(NeoVim)を使いたい)

 

続きを読む ›

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


マイクロマウス研修(kora編)[15] 迷路探索の解説

こんにちは。koraです。

今回は、迷路探索アルゴリズムがどのようになっているのか確認します。
HM-StarterKitのサンプルプログラムには、足立法による迷路探索のコードが含まれています。
足立法については、過去のRTのブログなどで解説されています。これらを参考にしながら、サンプルプログラムでどのように実現されているか確認します。

足立法の考え方

簡単のため、4×4の迷路を考えます。次の図の”S”をスタート座標 (0, 0) 、”G”をゴール座標(3, 3)とします。

迷路探索には歩数マップを使います。ゴールのマスが0、隣のマスは1、その隣が2…というようにゴールからの歩数が入ったマップを作れば、より小さい歩数のマスに向かうことで、おのずとゴールに到達できるはずというわけです。

迷路探索のシミュレート

それではマウスの気分になって迷路を解いてみます。

1. 最初にマウスが認識している壁はこれだけです。

2. 既知の壁情報をもとに、歩数マップを作成します。そして、歩数マップをもとに、現在のマスより歩数の小さいマスへ移動します。また、1マス動くたびに壁情報と歩数マップを更新し、次に進む方向を考えます(サンプルではset_wall関数で壁情報を、make_map関数で歩数マップを更新して、get_nextdir関数で進む方向を決定するようになっています)。

3. 探索を続けると、徐々に既知の壁が増え、歩数マップも変化します。

4. やがて、進める方向が複数あるような分岐点が現れます。サンプルでは、進行方向の優先順位はget_priority関数で決めます。どのように決めるかというと、探索時は未探索マスに進むことを優先し、どちらの候補も未探索あるいは探索済な場合は直進を優先するようになっています。

5. 壁の探索が終わると、歩数マップが出来上がります。あとは歩数マップにしたがって各マス進めばゴールに到達します。

次回

迷路探索アルゴリズムがわかったので、次回はHM-StarterKitに実装して迷路を走ってもらおうと思います。

続きを読む ›

Posted in DCマウス研修


shotaのマイクロマウス研修9[オリジナルマウスの製作開始]

こんにちは、shotaです。

社員研修として、オリジナルマウスの製作を始めます。

 

前回までの研修では[Pi:Co Classic3]を動かしていました。

Pi:Coはマイクロマウスキットなので、筐体設計・基板設計は不要です。

マウスに必要なプログラミング要素を学ぶことができました。

 

今回からはいよいよマウス研修の本番です。

筐体・回路・プログラムのすべてを設計・製作します。

 

研修の課題

は、オリジナルマウスで迷路を走る(完走?)、です。

つまり、クラシック競技でもハーフ競技でも、早いマウスでも遅いマウスでも、何でもOKということです。

 

課題がゆるふわだと製作するマウスもゆるふわになってしまうので、まずはどんなマウスを作りたいか(目標)を決めます。

 

どんなマウスを作りたいか(目標)

ESP32を使ったマウスを作る!!!

 

ESP32(ESP-WROOM-32D)って何?

秋月さんの販売ページの言葉を拝借すると、以下のとおりです。

ESP-WROOM-32は、WiFiとBluetoothが一つのモジュールに収まったワイヤレスモジュールです。SPI、UART、I2C、I2S、PWM、GPIO、SDIO、ADコンバータなど、多彩なインターフェースが内蔵されています。モジュールは工事設計認証(技適/TELEC)番号を取得済みですので安心してお使い頂けます。

http://akizukidenshi.com/catalog/g/gM-13318/

詳細な情報は[ESP-WROOM-32Dのデータシート]を読んでみてください。

 

また、秋月さんからはブレッドボードに差し込めるタイプの[開発ボード]が販売されています。

お手頃価格ですので、話題のIoTを始めたい方にはピッタリだと思います。

なぜESP32を使いたいか?

理由は主に3つです。

  • WiFiとBluetoothが使える
  • マウスに必要な機能(GPIO、ADコンバータ、PWM、I2C、SPI、フラッシュメモリ…etc)がある
  • 組み込みOS(FreeRTOS)に対応している

 

続きを読む ›

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


マイクロマウス研修(kora編)[14] IOエキスパンダを使ってみる

こんにちは。koraです。

今回は、HM-StarterKitの表示用LEDとスイッチを使用できるようにします。これを使うと、動作確認・センサの調整・探索・最短走行などのモードの確認がやりやすくなります。

HM-StarterKitの表示用LEDはD3~D6の4つ、スイッチはSW2~SW4の3つです。これらは直接マイコンにつながっているわけではなく、IOエキスパンダ(PCA9557PW)というデバイスにつながっています。このIOエキスパンダとマイコンはI2Cを使って通信しますので、まずはI2Cの準備をします。

I2Cの準備
i2c.hとi2c.c

サンプルプログラムのStep7からi2c.hとi2c.cをコピーして、現在のプロジェクトに追加します。そのままだとテストするときにスイッチの状態がわかりにくいので、225行目と226行目を次のように書き換えて、IOex_SWITCH関数でスイッチの状態が読み込まれた際にprintfで出力するようにします。

intprg.c

intprg.cファイルに、externを使ったプロトタイプ宣言を追加します。

そして次の行を、

以下のように書き換えて、I2C関連の割り込みが発生したときにi2c.cの関数が呼ばれるようにします。

I2Cのテスト
my_hm_starterkit.c

インクルードを追加します。

そして、テスト用にmain関数を次のように書き換えます。

プログラムを実行し、問題がなければ写真のように4つのLEDが点灯します。

また、シリアル通信でTeraTerm上にスイッチの状態が画面に出力されます。スイッチSW2~SW4を押すことで、表示される値が変化します。

インターフェースの作成

IOエキスパンダが動作することが確認できましたので、次は使いやすいように、サンプルプログラムのStep7にならってLEDのインターフェースを整えます。

interface.c

i2c.hのインクルードを追加します。

入力した数値を二進数でLEDに表示する関数を追加します。HM-StarterKitのLEDの並びは二進数とは少し異なるので、ビットの順を入れ替えて対応しています。

interface.h

ヘッダーファイルにプロトタイプ宣言を追加して、他のソースファイルからもinterface.hをインクルードすればLED関数を呼び出せるようにします。

init.c

I2C通信とIOエキスパンダの初期化をinit_all関数の中で済ませるために、以下の変更を加えます。まず、i2c.hとinterface.hのインクルードを追加します。

init_all関数に次の行を追加します。

my_hm_starterkit.c

LED関数とinit_all関数の動作を確認します。main関数を以下のように書き換えてHM-StarterKitに書き込みます。

書き込みが終わったら実行します。成功していれば、0から15までの数をLEDで表します。

次回

今回までいろいろ下準備をしてきましたが、次回からいよいよ迷路探索アルゴリズムを追加して、実際の迷路でゴールを探すようにしたいと思います。

続きを読む ›

Posted in DCマウス研修


マイクロマウス研修(kora編)[13]自律走行の実装

あけましておめでとうございます。koraです。

2019年最初の更新です。
年末に自律走行に取り掛かっていたところだったので、今回はその続きで自律走行を実装します。

ブザーの実装

まずは、ブザーを鳴らす関数を作ります。実際にマウスを走らせると、外からはマウスが何を実行しようとしているのか分かりにくくなってしまうので、ブザーでプログラムの進行状況を知らせるようにします。

interface.h

新しくinterface.hというファイルを作って、次のプロトタイプ宣言を追加します。

interface.c

ブザーを鳴らす関数の実体を作ります。新しくinterface.cというファイルを作って、サンプルプログラムStep7のBEEP関数とBEEP_MULTIをコピーします。

自律走行の実装
interrupt.c

machine.hをインクルードするように追加して、サンプルプログラムStep7からint_cmt0関数をコピーします。

int_cmt0関数を書くと長くなってしまうので、ここでは省略します。中身については前回の記事で解説しています。

glob_var.h

直進か回転かを切り替えるグローバル変数を追加します。TURN_DIRは回転モードで使用するグローバル変数です。

static_parameters.h

定数を追加します。

parameters.h

将来的に調整する定数を追加します。

run.h

Step7からrun.hファイルをコピーしてプロジェクトに追加します。

run.c

Step7からrun.cファイルを持ってきてプロジェクトに追加します。

直進走行のテスト
my_hm_starterkit.c

まず、今回追加したヘッダーファイルをインクルードします。

次に待機用の関数を宣言します。wait_ms関数については以前の記事で解説しています。

main関数の中身を作成します。

  1. init_all()で初期設定した後、wait_ms(1000)で1秒間待機し、gyro_get_ref()でジャイロセンサの初期値を取得します。
  2. 次に、マウスが進んだ距離を表すグローバル変数len_mouseをリセットし、straight(SECTION,SEARCH_ACCEL,SEARCH_SPEED,0)で直進します。引数で指定している値の意味は以下の通りです。
  • SECTIONが進みたい距離(マイクロマウスの迷路の1区間=90 mm)
  • SEARCH_ACCELが加速度(1.0 m/s^2)
  • SEARCH_SPEEDが最高速度(0.3 m/s)
  • 0が最終速度(0 m/s)
    1. 最後にwait_ms(1000)で1秒間待機し、MOT_POWER_OFFでモータドライバをOFFにして終了します。

    以上のプログラムを書き込んで、実際に走行した結果がこちらです。

    次回

    今回、マウスが走行できるようになりました。しかし、実際に迷路で走行するためには、動作確認・センサの調整・探索・最短走行など、複数のモードを人間が切り替える必要があります。HM-StarterKitはLEDで選択中のモードを表示できるようになっていますので、次回はこれを使用できるようにします。

    続きを読む ›

    Posted in DCマウス研修


    マイクロマウス研修(kora編)[12]自律走行の解説

    こんにちは。koraです。

    ジャイロやエンコーダの値を反映してマウスを自律走行をできるようにしたいので、今回はサンプルプログラムでどのようになっているのか確認します。

    サンプルプログラムの確認
    割り込み

    まず、サンプルプログラムStep7のinterrupt.cファイルのint_cmt0関数を見てみましょう。これはタイマ割り込みによって1msおきに実行される関数です。最初のif文によって、グローバル変数run_modeごとに、実行される内容が異なることがわかります。
    簡単のため、まずはrun_modeがSTRAIGHT_MODEの場合に着目します。これは台形加速(一定の加速度で加速した後、一定の速度で走行し、最後に一定の加速度で減速する走り方)で直進するモードです。

    1.目標速度生成

    目標速度tar_speed [m/s]に加速度accel [m/s^2]を加算して、徐々に加速します。ちなみに、加速度accel [m/s^2] を1000で割っているのは、この処理が1秒間に1000回実施されるからです。

    2.横壁センサによる目標角度生成

    壁制御をONに設定している場合、割り込みint_cmt1関数で更新される光センサの値sen_r.value、sen_l.valueをもとに、目標角速度tar_ang_vel [rad/s]を生成します。なお、右壁が無い場合sen_r.errorに0が、左壁が無い場合sen_l.errorに0が入るので、両壁が無い場合は壁制御の影響が無くなります。

    3.目標速度と目標角角度の積分

    I_tar_speedとI_tar_ang_velは、それぞれ目標速度の積分値と目標角速度の積分値です。積分値が大きくなりすぎないようになっています。

    4.目標速度の偏差から出力電圧にフィードバック

    目標速度と現在の速度の差、および目標角速度と目標角速度の差をもとに、PID制御で出力電圧を計算しています。

    5.出力電圧からモータの回転方向を決定

    モータドライバには、回転方向と電圧をそれぞれ別に指定する仕様になっているので、計算した電圧をもとに反映します。

    6.出力電圧の制限

    出力が大きくなりすぎてモータやモータドライバが壊れないように、出力電圧に制限をかけています。

    7.モータへ出力

    最後に、計算した電圧を出力に反映します。出力電圧とバッテリー電圧に対する比に、240を掛けた値をPWMに設定します。

    以上をまとめると、加速度accel [m/s^2]と最高速度max_speed [m/s]を指定すれば、随時目標速度tar_speed [m/s]が計算され、それに追従するようモータの電圧が制御されます。また、壁があればそれに沿って進むための目標角速度tar_ang_vel [rad/s]が計算され、それに追従するようモータの電圧が制御される、というプログラムになっています。

    走行の設定

    では、accelとmax_speedをどのように設定するのか調べるため、run.cの中身を見てみましょう。straight関数とturn関数が用意してありますので、straight関数に着目します。

    1.グローバル変数に値を代入

    積分値のリセットや、走行モードの設定など、制御に使用するグローバル変数の設定をしています。

    2.モータ出力をON

    モータ出力をONにすると、int_cmt0関数の制御がマウス本体に反映されます。
    なおこれ以降は、直進の最後に停止する場合と停止しない場合に分かれていますが、とりあえず停止する場合を考えます。

    3.加速、定速走行

    細かい制御はint_cmt0の割り込みでされるので、straight関数では減速が開始されるまで待機するだけです。目標距離len_target [mm]と現在距離len_mouse [mm]の差が、減速に必要な距離より大きい間、whileでループします。(少し補正してlen_targetを-10しています。)ちなみに減速に必要な距離は、なつかしの等加速度運動の公式 v1^2 – v0^2 = 2*a*xから計算します。(v1がtar_speed、v0がend_speed、aがaccel、xが求めたい距離です。)

    4.減速

    加速・等速走行のwhileループから抜けたら、加速度accel [m/s^2]を反転して減速を開始します。減速も細かい制御はint_cmt0任せです。目標距離len_target [mm]が現在距離len_mouse [mm]より大きい間、whileでループします。(少し補正を入れてlen_targetを-1しています。)
    ただし、目標距離に届く前に速度が0になってしまうと、いつまでたってもループから抜け出せなくなるので、最低速度 MIN_SPEED を下回らないように補正しています。
    そして目標距離に達したら、今度は速度speed [m/s]が0になるまでループです。

    5.終了処理

    以上で直進が終了します。

    次回

    自律走行で直進する流れがわかったので、次回は実装して走らせてみたいと思います。

    続きを読む ›

    Posted in DCマウス研修


    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マウス研修