.NET Gadgeteer モジュールのデモ:Joystick

.NET Gadgeteer のモジュール紹介、そろそろ入力系もほしいよね、ということで、ジョイスティック を取り上げます。
一番廉価なキットである FEZ Cerberus Basic Kit にも含まれている、お手軽なモジュールです。ユーザーの操作を直接受け取れるので Gadgeteer の練習には分かりやすいモジュールでもありますね。

Joystick Module

 

Joystick の操作は以下の通り。

  • ジョイスティックの位置の取得
  • 押下状態の取得(2種類の方法)

 

まずはこんな風に接続してみます。

image

 

「あれ、出力は?」という感じですが、まずは Visual Studio に接続した状態で動作を見てみることにします。この場合は Debug.Print メソッドが使えるので、ここにジョイスティックの状態を出力することにします。
もうちょっとちゃんとした(?)サンプルコードは こちらの記事 で紹介しています。参考まで。

 


ジョイスティックの位置の取得

ジョイスティックの位置を取得するには GetJoystickPosition メソッドを使います。ジョイスティックは定期的に位置情報を返してくれるわけではないので、ポーリングして位置の取得を行います。

X軸、Y軸とも 0~1 の範囲で返してきます。つまりジョイスティックがニュートラルな状態では (0.5, 0.5) になるということです。これだと処理しづらいようであれば、それぞれ 0.5 を引いた値で処理をするといいでしょうね。そのあたりは こちらの記事 で紹介しています。

簡単なコードはこんな感じ。

  1. using Microsoft.SPOT;
  2. using GT = Gadgeteer;
  3.  
  4. namespace JoystickDemo
  5. {
  6.     public partial class Program
  7.     {
  8.         // This method is run when the mainboard is powered up or reset.  
  9.         void ProgramStarted()
  10.         {
  11.             GT.Timer timer = new GT.Timer(1000);
  12.             timer.Tick += new GT.Timer.TickEventHandler(timer_Tick);
  13.             timer.Start();
  14.  
  15.             // Use Debug.Print to show messages in Visual Studio’s "Output" window during debugging.
  16.             Debug.Print("Program Started");
  17.         }
  18.  
  19.         void timer_Tick(GT.Timer timer)
  20.         {
  21.             var pos = joystick.GetJoystickPosition();
  22.             Debug.Print("x=" + pos.X.ToString() + ", y=" + pos.Y.ToString());
  23.         }
  24.     }
  25. }

 

実際の動作結果は次の項目(スティックの押下)のあとで。


押下状態の取得(1)

ジョイスティックはボタンを兼ねているので、押下状態を取得することもできます。

ポーリングのタイミングで、IsPressed プロパティ を参照すると状態が得られます。

  1. using Microsoft.SPOT;
  2. using GT = Gadgeteer;
  3.  
  4. namespace JoystickDemo
  5. {
  6.     public partial class Program
  7.     {
  8.         // This method is run when the mainboard is powered up or reset.  
  9.         void ProgramStarted()
  10.         {
  11.             GT.Timer timer = new GT.Timer(1000);
  12.             timer.Tick += new GT.Timer.TickEventHandler(timer_Tick);
  13.             timer.Start();
  14.  
  15.             // Use Debug.Print to show messages in Visual Studio’s "Output" window during debugging.
  16.             Debug.Print("Program Started");
  17.         }
  18.  
  19.         void timer_Tick(GT.Timer timer)
  20.         {
  21.             var pos = joystick.GetJoystickPosition();
  22.             Debug.Print("x=" + pos.X.ToString() + ", y=" + pos.Y.ToString());
  23.             
  24.             if (joystick.IsPressed)
  25.                 Debug.Print("Pressed !!");
  26.         }
  27.     }
  28. }

 

先ほどの位置情報の取得と合わせて、Visual Studio の出力ウィンドウにこんな風に表示されるはず。

 

Program Started
x=0.50207570207570207, y=0.48937728937728942
x=0.0021978021978021978, y=0.47936507936507933
x=0.0009768009768009768, y=0.47814407814407811
x=1, y=0.99902319902319903
x=0.99902319902319903, y=0.99902319902319903
x=0.50158730158730158, y=0.48962148962148966
x=0.50207570207570207, y=0.48937728937728942
x=0.50183150183150182, y=0.50183150183150182
Pressed !!
x=0.50183150183150182, y=0.48962148962148966
Pressed !!
x=0.061294261294261292, y=0.99902319902319903
x=0.50183150183150182, y=0.48913308913308917
x=0.99951159951159951, y=0.00073260073260073
x=0.50207570207570207, y=0.00073260073260073
Pressed !!
x=0.50207570207570207, y=0.00097680097680097333
Pressed !!
x=0.50329670329670328, y=0.00097680097680097333
Pressed !!
x=0.5045177045177045, y=0.99926739926739927
Pressed !!
x=0.64346764346764351, y=0.99902319902319903
x=0.50183150183150182, y=0.48937728937728942

押下状態の取得(2)

ジョイスティックの押下状態はポーリングする以外に、イベントでも取得できます

JoystickPressed イベントJoystickReleased イベントです。

  1. using Microsoft.SPOT;
  2. using GT = Gadgeteer;
  3.  
  4. namespace JoystickDemo
  5. {
  6.     public partial class Program
  7.     {
  8.         // This method is run when the mainboard is powered up or reset.  
  9.         void ProgramStarted()
  10.         {
  11.             joystick.JoystickPressed += new GT.Modules.GHIElectronics.Joystick.JoystickEventHandler(joystick_JoystickPressed);
  12.             joystick.JoystickReleased += new GT.Modules.GHIElectronics.Joystick.JoystickEventHandler(joystick_JoystickReleased);
  13.  
  14.             // Use Debug.Print to show messages in Visual Studio’s "Output" window during debugging.
  15.             Debug.Print("Program Started");
  16.         }
  17.  
  18.         void joystick_JoystickPressed(GT.Modules.GHIElectronics.Joystick sender, GT.Modules.GHIElectronics.Joystick.JoystickState state)
  19.         {
  20.             Debug.Print("Pressed !!");
  21.         }
  22.  
  23.         void joystick_JoystickReleased(GT.Modules.GHIElectronics.Joystick sender, GT.Modules.GHIElectronics.Joystick.JoystickState state)
  24.         {
  25.             Debug.Print("Released !!");
  26.         }
  27.     }
  28. }

 

実行結果は・・・掲載するまでもないですね。

位置情報を取得する場合はポーリングのタイミングで合わせて押下状態を取得してもいいですね。ただしポーリング間隔を長めに設定している場合はイベントで押下状態を取るというのもアリ。


もうちょっとだけちゃんとしたデモ

実行時に常に Visual Studio に繋いでいるわけにもいかないので、いつまでも Debug.Print で結果を出力するわけにもいきません。Character Display も繋いでみます。

接続はこんな感じ。

image

コードは以下の通り。

  1. using Microsoft.SPOT;
  2. using GT = Gadgeteer;
  3.  
  4. namespace JoystickDemo
  5. {
  6.     public partial class Program
  7.     {
  8.         // This method is run when the mainboard is powered up or reset.  
  9.         void ProgramStarted()
  10.         {
  11.             char_Display.Initialize();
  12.             char_Display.SetBacklight(false);
  13.  
  14.             joystick.JoystickPressed += new GT.Modules.GHIElectronics.Joystick.JoystickEventHandler(joystick_JoystickPressed);
  15.             joystick.JoystickReleased += new GT.Modules.GHIElectronics.Joystick.JoystickEventHandler(joystick_JoystickReleased);
  16.  
  17.             GT.Timer timer = new GT.Timer(500);
  18.             timer.Tick += new GT.Timer.TickEventHandler(timer_Tick);
  19.             timer.Start();
  20.  
  21.             // Use Debug.Print to show messages in Visual Studio’s "Output" window during debugging.
  22.             Debug.Print("Program Started");
  23.         }
  24.  
  25.         void timer_Tick(GT.Timer timer)
  26.         {
  27.             var pos = joystick.GetJoystickPosition();
  28.  
  29.             char_Display.Clear();
  30.             char_Display.PrintString(pos.X.ToString().Substring(0, 5) + ", " + pos.Y.ToString().Substring(0, 5));
  31.         }
  32.  
  33.         void joystick_JoystickPressed(GT.Modules.GHIElectronics.Joystick sender, GT.Modules.GHIElectronics.Joystick.JoystickState state)
  34.         {
  35.             char_Display.SetBacklight(true);
  36.         }
  37.  
  38.         void joystick_JoystickReleased(GT.Modules.GHIElectronics.Joystick sender, GT.Modules.GHIElectronics.Joystick.JoystickState state)
  39.         {
  40.             char_Display.SetBacklight(false);
  41.         }
  42.     }
  43. }

 

ディスプレイの消灯時の動きが分かりづらいですが、こんな風に動作します。

 


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

申し込みサイトはまだありませんが(すみません・・・)、ご都合の付く方は今のうちにカレンダーに印を付けておいてください。

瀬尾への連絡方法をご存じの方は、事前にご連絡いただけるとさらにうれしいです。

会場も無事決まり、受付を始めました。こちらのページ からお申し込みください。

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

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

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

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中