.NET Gadgeteer モジュールのデモ:Compass Module

.NET Gadgeteer のモジュール紹介シリーズ、Compass モジュール です。 コンパス=方位磁針 ですね。正確に言うと地磁気センサーということになります。

Compass Module
周囲の環境の値を取得するモジュールは組み込み開発っぽくていいですね。コンパスしかり、照度センサー、温度センサーしかり。

センサーモジュールなので機能は言うまでもない、といえばその通りなのですが、一応載せておくと以下の通り。

  • センサーデータを取得 (要求して 1回取得)
  • 継続してセンサーデータを取得する間隔の設定
  • 継続してセンサーデータを取得
  • ゲイン(取得値の増幅率)の設定

明示的に 1回だけセンサーデータを取得する方法と継続して取得する方法の 2通りの取得方法があります。
環境の変化をモニタリングするなら継続して取得、何かの契機(別のセンサーの状態など)で取得するなら 1回取得するという使い分けになるかと思います。
※以下のデモでは、どちらも継続してデータを取得し続けるものですが。

データを取得するモジュールなので、それを繋いだだけでは何の役にも立ちませんw
ということで、以下のデモでは Character Display も繋いでここに出力することにします。

image


センサーデータを取得 (要求して 1回取得)

センサーデータを取得するには RequestMeasurement メソッドを使います。引数は無し。
取得した値は同期的に返ってくるわけではなく、イベントが発行されます。MeasurementCompleteEventHandler イベントハンドラーも必要です。

取得したデータは、イベントハンドラーの第2引数 Angle プロパティ、X, Y, Z プロパティから読み出します。

Angle は double 型、Intellisence のヒントを見るとラジアンだということになっていますが、私の見る限りでは度数が返ってきています(0~360の値を取ります)。モジュールのボードと並行の面上で、ある方向を 0 とした時の回転角が求められます。

X, Y, Z は int です。それぞれ 3軸方向の値を取ります。・・・が、すみません、「これって何の値?」というのが実は私は分かっていません。ただしモジュールをある場所、ある向きに置くと同じような値を取るので、モジュールの向きを特定できるのは確かです。
(すみません、その程度の理解で使ってます。詳しい方、ぜひ教えてください)

まずはタイマーを使って連続してデータを取得してみます。

  1. using System;
  2. using Microsoft.SPOT;
  3. using System.Threading;
  4. using GT = Gadgeteer;
  5. using Gadgeteer.Modules.Seeed;
  6.  
  7. namespace CompassDemo
  8. {
  9.     public partial class Program
  10.     {
  11.         // This method is run when the mainboard is powered up or reset.   
  12.         void ProgramStarted()
  13.         {
  14.             compass.MeasurementComplete += new Compass.MeasurementCompleteEventHandler(compass_MeasurementComplete);
  15.  
  16.             var timer = new GT.Timer(1000);
  17.             timer.Tick += new GT.Timer.TickEventHandler(timer_Tick);
  18.             timer.Start();
  19.  
  20.             // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
  21.             Debug.Print("Program Started");
  22.         }
  23.  
  24.         void timer_Tick(GT.Timer timer)
  25.         {
  26.             compass.RequestMeasurement();
  27.         }
  28.  
  29.         void compass_MeasurementComplete(Compass sender, Compass.SensorData sensorData)
  30.         {
  31.             char_Display.Clear();
  32.             char_Display.PrintString(sensorData.Angle.ToString("F"));
  33.             char_Display.SetCursor(1, 0);
  34.             char_Display.PrintString(sensorData.X.ToString() + ", " + sensorData.Y.ToString() + ", " + sensorData.Z.ToString());
  35.         }
  36.     }
  37. }

 

※PC からのケーブルがウザかったのでw、エネループで給電してみました。

 


継続してセンサーデータを取得/取得する間隔の設定

データ取得を継続するためにタイマーを回すのもどうか、ということもありますね。
そんな時には StartContinuousMeasurements メソッドを使います。取得したデータは先ほどと同じで MeasurementCompleteEventHandler イベントハンドラー を使います。

StartContinuousMeasurements を呼び出す前には、ContinuousMeasurementInterval プロパティ に TimeSpan 型の時間間隔を指定するのを忘れずに。

  1. using System;
  2. using Microsoft.SPOT;
  3. using System.Threading;
  4. using GT = Gadgeteer;
  5. using Gadgeteer.Modules.Seeed;
  6. using Gadgeteer.Modules.GHIElectronics;
  7.  
  8. namespace CompassDemo2
  9. {
  10.     public partial class Program
  11.     {
  12.         // This method is run when the mainboard is powered up or reset.   
  13.         void ProgramStarted()
  14.         {
  15.             compass.MeasurementComplete += new Compass.MeasurementCompleteEventHandler(compass_MeasurementComplete);
  16.  
  17.             compass.ContinuousMeasurementInterval = new TimeSpan(0, 0, 1);
  18.             compass.StartContinuousMeasurements();
  19.  
  20.             // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
  21.             Debug.Print("Program Started");
  22.         }
  23.  
  24.         void compass_MeasurementComplete(Compass sender, Compass.SensorData sensorData)
  25.         {
  26.             char_Display.Clear();
  27.             char_Display.PrintString(sensorData.Angle.ToString("F"));
  28.             char_Display.SetCursor(1, 0);
  29.             char_Display.PrintString(sensorData.X.ToString() + ", " + sensorData.Y.ToString() + ", " + sensorData.Z.ToString());
  30.         }
  31.     }
  32. }

実行結果は先ほどと同じようなものになってしまうので動画は省略。

 


ゲイン(取得値の増幅率)の設定

実行する上で必須のメソッドではありませんが、ゲイン(=取得地の増幅率)を指定することもできます。文字通りですが SetGain メソッドを使います。
引数は列挙型の Compass.Gain.Gain1 ~ Gain8 をしてます。
Angle は前と変わりませんが(回転角が増幅されても困りますけど)、X, Y, Z の値は前とは変わってくるので、実際の開発時にトライアンドエラーで指定する値を決めるといいと思います。

データ取得を始める前、MeasurementCompleteEventHandler の次の行で指定するといいですね。

  1. compass.MeasurementComplete += new Compass.MeasurementCompleteEventHandler(compass_MeasurementComplete);
  2. compass.SetGain(Compass.Gain.Gain8);
  3.  
  4. compass.ContinuousMeasurementInterval = new TimeSpan(0, 0, 1);
  5. compass.StartContinuousMeasurements();

これも結果の値が異なるだけなので動画は省略。

 


Compass を使うと、機器の物理的な動きをトレースできるようになります。私の場合は X, Y, Z の値は直感的には分かっていないのですが、利用方法は簡単で、それなのに高精度なセンサーなので非常に有用なモジュールです。

次回の技術ひろば.net の勉強会は 4月20日(土) の開催です。

組み込みってなかなか面白そうと思った方は こちらのページ からお申し込みください。
実務では組み込みはやらないという方も多いかもしれませんが、基本的な考え方を理解しておくのは大事かも。
初心者/未経験者も大歓迎!というより、そういう方にぜひ組み込み開発を体験していただきたいな、と思います。
当日お貸しできるボード、モジュールは複数用意してありますので、安心してどなたでもお気軽に参加してください。

皆で .NET Gadgeteer で楽しみましょう!!

広告
カテゴリー: .NET Micro Framework タグ: , , パーマリンク

.NET Gadgeteer モジュールのデモ:Compass Module への1件のフィードバック

  1. ピンバック: .NET Gadgeteer モジュールのデモ:Accelerometer Module | 技術との戯れ

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中