.NET Gadgeteer の LED7R モジュールとジョイステックモジュール 簡単サンプル (FEZ Cerberus でお手軽 Gadgeteer)

お手軽に .NET Gadgeteer を楽しむことができる FEZ Cerberus Basic Kit
ただ同梱されているモジュールが LED7Rジョイスティック のみ。価格からすると確かにそのくらいになりますが。

ということでデモ、というか API の確認を兼ねて、FEZ Cerberus Basic Kit を使った超簡単サンプルを作ってみました。
どちらも機能はシンプルなモジュールなので、API と言っても大層なことは全くしてません。


1. 準備

FEZ Cerberus を使うには、.NET Micro Framework の SDK、Gadgeteer 用のライブラリ等は v4.2 が必要です。
Gadgeteer 用パッケージは現時点ではベータですが、以下の実行には問題ない品質です。
SDK 等のダウンロードは TinyCLR.com のページ から。


2. デザイン

Visual Studio で Gadgeteer 用のプロジェクトを作り(v4.2 を選択するのを忘れずに!)、

  • FEZ Cerberus
  • LED7R
  • Joystick

をデザイナーにドロップします。右クリックで “Connect all modules” すればこんな接続になるはず。

image

なお、Cerberus では給電やソリューション配置に使う USB Client モジュールは出てきません。8 番コネクターに繋ぎます。


3. コーディング

コードはこんな感じ。長くもないし難しくもないので、全ソースを載せます。

using Microsoft.SPOT;
using GT = Gadgeteer;
using Gadgeteer.Modules.GHIElectronics;

namespace GadgeteerApp2
{
    public partial class Program
    {
        private GT.Timer _timer = new GT.Timer(100);

        private const double _minRadius = 0.2;
        private const double _tan60 = 1.7320508075;
        
        // This method is run when the mainboard is powered up or reset.   
        void ProgramStarted()
        {
            _timer.Tick += new GT.Timer.TickEventHandler(timer_Tick);
            _timer.Start();

            // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
            Debug.Print("Program Started");
        }

        void timer_Tick(GT.Timer timer)
        {
            var pos = joystick.GetJoystickPosition();
            double x = pos.X - 0.5;
            double y = pos.Y - 0.5;

            TurnLightOn(x, y);
            //Debug.Print("x=" + x.ToString() + ", y=" + y.ToString());
        }

        void TurnLightOn(double x, double y)
        {
            if (x * x + y * y < _minRadius * _minRadius)
            {
                led7r.TurnLightOn(7, true);
            }
            else
            {
                if (x == 0)
                    led7r.TurnLightOn(y > 0 ? 1 : 4, true);
                else if (x > 0 && y >= 0)
                    led7r.TurnLightOn(y / x <= _tan60 ? 2 : 1, true);
                else if (x < 0 && y >= 0)
                    led7r.TurnLightOn(y / -x > _tan60 ? 1 : 6, true);
                else if (x < 0 && y < 0)
                    led7r.TurnLightOn(y / x <= _tan60 ? 5 : 4, true);
                else /* x >= 0 && y < 0 */
                    led7r.TurnLightOn(-y / x > _tan60 ? 4 : 3, true);
            }
        }
    }
}

 

100ms 間隔のタイマーでジョイスティックの位置を取得しています。

Joystick クラスの GetJoystickPosition メソッドを使います。

X軸、Y軸とも 0~1 の範囲を取るので計算しやすいようにぞれぞれ 0.5 引いた値を使って、どの LED を点灯させるか決めています。これでスティックがセンターにいる時に 座標 (0, 0) となってあとがやりやすいはず。

点灯する LED を決めるのが TurnLightOn メソッド。

スティックに多少の遊びを持たせるために、移動距離が _minRadius 以下であればセンターにいるものとしました。この時に点灯する LED はモジュール中央にある 7番 LED とします。ということで、

led7r.TurnLightOn(7, true);

というコードになります。ちなみに第2引数の true は、他の LED は排他的に消すために指定します。

LED7R では中央の 7番 LED を取り囲むように 6個のLED が円形に配置されています。時計回りに 1~6 番となっているので、座標計算をした上で TurnLightOn メソッドの第1引数に渡します。これでジョイスティックの位置に対応した LED が点灯します。

_tan60 (1.7320508075 ・・・ルート3!) は、ジョイスティックの座標がどの LED の位置に近いかを計算するために使っています。がっつり三角関数を駆使したいわけではないので、60度の位置の tan と比較するだけ、ということで固定値で持ちました。

 

今回のアプリは実用度ゼロ (笑) なので、せめてルーレットでも作ってみればいいんですかね。あるいは、6個の LED が並んでいるということでサイコロを作ってもいいのか。

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

.NET Gadgeteer の LED7R モジュールとジョイステックモジュール 簡単サンプル (FEZ Cerberus でお手軽 Gadgeteer) への1件のフィードバック

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中