KOSAKA LABORATORY->Tips

 このBlogの一部が書籍になりました。
書籍:「WiiRemoteプログラミング」
著者:白井暁彦・小坂崇之・木村秀敬・くるくる研究室
表紙:タナカユカリ
発売:2009年7月25日 好評発売中
詳細:こちらから

内容:WiiRemoteを利用したインタラクティブ技術のプログラミング学習書

 話題の家庭用ゲーム機「Wii」の特徴的なコントローラーである「WiiRemote」をPCで使うプログラミングが注目されている。高性能な加速度センサーや赤外線センサーを持ち、Bluetooth接続が可能で、プログラミング可能なデバイスを、個人レベルで自作したり入手したりすることはできなかった。WiiRemoteの登場とともにそれが安価で手軽に入手可能になり、多くの人々が興味を持っている。

 本書は、WiiRemoteの応用に興味があるプログラミング初学者向けに、WiiRemoteをPCから扱うためのプログラミングを解説する。ハードウェア寄りのゲームプログラミング入門書として、ステップバイステップでソースコードを解説する。具体的なサンプルを開発しながら、インタラクション技術を独習できる。言語はC/C++、C#およびActionScript 3、Processingなどをサポート。

Wiiリモコン センサ値をCSVファイルで出力

 今までWiiリモコンのセンサ値を用いたプログラムを解説してきました。 Wiiリモコンの用途によっては、Wiiリモコンのセンサの値をリアルタイムに処理するのではなく、一度ファイルに書き出してから解説を行う必要がある場合もあります。今回は、センサの値をファイルで出力するプログラムについて解説を行います。
 今回はCSVファイルで加速度センサの値を書き出します。CSVファイルとはデータを","(カンマ)で区切って並べたファイル形式です。Excelなどの表計算ソフトで用いられている形式でExcelに読み込ませてグラフ表示などに用いることができます。
1.Wii CSV出力プログラム

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 System.IO;                                                      //IOの宣言
using WiimoteLib;                                                     //WimoteLibの宣言


namespace WiimoteLib_Sample {
    public partial class Form1 : Form {

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

        Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");        //文字コードをShift_JISへ
        StreamWriter writer;                                         //StreamWriterの宣言

        public Form1() {
            InitializeComponent();
        }

        //接続ボタンが押されたら
        private void button1_Click(object sender, EventArgs e) {

            //StreamWriterのオープン test.csvに出力 上書き 文字コードはShiftJIS
            this.writer = new StreamWriter("test.csv", false, sjisEnc);
            
            this.wm.Connect();                                        //Wiimoteの接続
            this.wm.WiimoteChanged += wm_WiimoteChanged;              //イベント関数の登録
            this.wm.SetReportType(InputReport.IRExtensionAccel, true);//レポートタイプの設定
        }

        //切断ボタンが押されたら
        private void button2_Click(object sender, EventArgs e) {
            this.wm.Disconnect();                                     //Wiimote切断
            this.writer.Close();                                      //StreamWriterのクローズ
        }


        //Wiiリモコンの値が変化する度に呼ばれる
        void wm_WiimoteChanged(object sender, WiimoteChangedEventArgs args) {
            WiimoteState ws = args.WiimoteState;                      //WiimoteStateの値を取得

            //StreamWriterに書き出し 各軸は","で区切る
            this.writer.WriteLine( ws.AccelState.Values.X + "," + 
                                   ws.AccelState.Values.Y + "," + 
                                   ws.AccelState.Values.Z );
        }
   }
}

実行

1.WiiRemoteを接続してください。
 
2.F5キーを押して実行してください。
 
3.接続ボタンをクリックしてください。
  接続ボタンを押した瞬間から、ファイルに書き出されます。   ※もしエラーが発生する場合はWiiRemoteが正しく接続されているか確認してください。
 
4.Wiiリモコンを左右、上下、手前奥に振り回してください。
 
5.切断ボタンをクリックしてください。
  切断ボタンを押されるとファイル出力が停止します。
 
6.プログラムを停止して、プログラムの実行ファイルが格納されている場所まで移動します。
  ~Documents\Visual Studio 2008\Projects\WiimoteLib_Sample\WiimoteLib_Sample\bin\Debug
 
7.test.csvというファイルが作成されているので、クリックしてExcelを起動します。
 
8.グラフ機能を使ってグラフを描写します。

 
解説

 Wiiリモコンの加速度センサの値をCSVファイルとして出力します。

using System.IO;                                                      //IOの宣言
 ファイルの出力をするのに必要です。
 

Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");        //文字コードをShift_JISへ
StreamWriter writer;                                         //StreamWriterの宣言
 出力するファイルの文字コードをShift_JISに設定します。そしてStremWriterを宣言します。
 

 //StreamWriterのオープン test.csvに出力 上書き 文字コードはShiftJIS
 this.writer = new StreamWriter("test.csv", false, sjisEnc);
 出力するファイル名と文字コードを設定します。
第二引数のfalseをtrueにするとファイルの最後に常に追加されていきます。
 

this.writer.Close();                                      //StreamWriterのクローズ
 ファイルを閉じます
 

//StreamWriterに書き出し 各軸は","で区切る
            this.writer.WriteLine( ws.AccelState.Values.X + "," + 
                                   ws.AccelState.Values.Y + "," + 
                                   ws.AccelState.Values.Z );
 ファイルにデータを書き出します。加速度センサのX軸,Y軸,Z軸の値を書きだしています。各軸データには区切り文字の","(カンマ)で区切ることによりCSVファイルとしています。
 今回は、加速度センサの値を出力しましたがボタンの値や赤外線カメラの情報も出力することが可能です。