KOSAKA LABORATORY->Tips

wiiリモコン 傾きセンサ マウスカーソル制御 

 Wiiリモコンの加速度センサを用いたプログラムは以前[その1][その2]に解説しました。今回は、加速度センサの傾きを用いてマウスカーソル移動のプログラムを作っていきたいと思います。加速度センサにはX,Y,Z軸の加速度の値だけでなくそれぞれの軸の傾きも計測することができます。今回は、X軸とY軸の傾きを用います。
 赤外線を用いてWiiマウス[1][2]は以前に解説しましたが、赤外線を発光できるセンサーバなどが必要で、あまり実用的ではありませんでした。赤外線を必要としないWiiマウスを作ってみたいと思います。
1.Wiiマウス 傾き移動プログラム
Form1.csに以下の部分を追加する。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WiimoteLib;                                                     //WimoteLibの宣言


namespace WiimoteLib_Sample {


    public partial class Form1 : Form {



        Wiimote wm = new Wiimote();                                   //Wiimoteの宣言

        System.Drawing.Point ScreenSize;                              //画面サイズを格納
        System.Drawing.Point MousePoint;                              //マウス座標を格納

        public Form1() {
            InitializeComponent();

            this.ScreenSize.X = Screen.PrimaryScreen.Bounds.Width;    //画面ザイズの横幅を取得
            this.ScreenSize.Y = Screen.PrimaryScreen.Bounds.Height;   //画面ザイズの立幅を取得
        }

        //接続ボタンが押されたら
        private void button1_Click(object sender, EventArgs e) {
            this.wm.Connect();                                        //Wiimoteの接続
            this.wm.WiimoteChanged += wm_WiimoteChanged;              //イベント関数の登録
            this.wm.SetReportType(InputReport.IRExtensionAccel, true);//レポートタイプの設定
            this.MousePoint = System.Windows.Forms.Cursor.Position;   //現在のマウス座標を取得
        }

        //切断ボタンが押されたら
        private void button2_Click(object sender, EventArgs e) {
            this.wm.Disconnect();                                     //Wiimote切断
        }

        //Wiiリモコンの値が変化したときに呼ばれる関数
        void wm_WiimoteChanged(object sender, WiimoteChangedEventArgs args){
           WiimoteState ws = args.WiimoteState;                //WiimoteStateの値を取得
           //X軸移動量計算
           this.MousePoint.X +=(int) (ws.AccelState.Values.X * 10):

           //X軸移動量計算
           this.MousePoint.Y += (int)(ws.AccelState.Values.Y *10);

           //X軸が画面サイズ外に座標が移動した場合
           if (this.MousePoint.X < 0) { this.MousePoint.X = 0; }
           if (this.MousePoint.X > ScreenSize.X) { this.MousePoint.X = ScreenSize.X; }

           //Y軸が画面サイズ外に座標が移動した場合
           if (this.MousePoint.Y < 0) { this.MousePoint.Y = 0; }
           if (this.MousePoint.Y > ScreenSize.Y) { this.MousePoint.Y = ScreenSize.Y; }

           //Bボタンが押されている間だけ
           if (ws.ButtonState.B) {
               //マウスカーソルを変更
               System.Windows.Forms.Cursor.Position = new System.Drawing.Point(this.MousePoint.X, this.MousePoint.Y);
           }
        }
    
    }
}
実行

1.WiiRemoteを接続してください。

 

2.F5キーを押して実行してください。

 

3.接続ボタンをクリックしてください。
  ※もしエラーが発生する場合はWiiRemoteが正しく接続されているか確認してください。

 

4.WiiリモコンのBボタンを押しながらWiiリモコンを横、縦に回してください。

 動きに対応してマウスカーソルが動くはずです。

 

解説

 Wiiリモコンの傾きの値を取得してマウスカーソルを移動させています。

           ws.AccelState.Values.X;
           ws.AccelState.Values.Y;
 傾きを取得します。-1.0~1.0までの値が出力されるみたいですが、実際に計測したとこ、下図のようになりました。

           //Bボタンが押されている間だけ
           if (ws.ButtonState.B) {
               //マウスカーソルを変更
               System.Windows.Forms.Cursor.Position = new System.Drawing.Point(this.MousePoint.X, this.MousePoint.Y);
           }
 赤外線を用いたWiiマウスのプログラムでは、赤外線を検出しない場合はマウス側にカーソルが戻ってきましたが、常に傾きを検出しているので、制御を戻すために、Bボタンを押している間だけ移動できるようになっています。

 このプログラムにマウスクリックなどのプログラムを追加することで、傾きを用いたWiiマウスが作成できます。