Wiiリモコンっていいよね!って話

 

始めまして、kazu8823と申します。(twitter:@kazujdDR8823)

 

この記事はFUN Advent Calendar 2020 Part2 9日目の記事です。

FUN Part2 Advent Calendar 2020 - Adventar

 

昨日は はくすけ さんの「†┏┛墓┗┓†」でした!

あの墓マジで見てみたいんですけど、置いてあるカフェの場所知っている方いれば是非教えてもらいたいです...

 

 

 

本題に入る前に...

始めましての人がほとんどだと思うので、自己紹介します。

 

音ゲーマーです

 

弐寺DDRドラマニをメイン機種としているBEMANI好きのオタクです。

 

...と冗談はさておき...

未来大生としての自己紹介をすると、

知シスかICT(情シス)に進むか悩んでいる1年です。

好きな言語はC#、好きな分野は組み込み、特にPICマイコンをよく使っています。

 

こんなことや、

 

そんなことや、

 

あんなことや、 

 

こんなことを、

しています。

 

よろしくお願いします。

 

 

 

それでは、本題に入ります。

先ほど自己紹介の中で組み込みが好きだと書いたのですが、私が思うに組み込みの大きな魅力の一つに、多彩な入力があると思います。

入力回路から作らなければいけませんが、作りさえすればいろいろな入力部品を使用することができます。アナログ値を取れるというのがものすごくでかい気がしてます。

(めっちゃ楽しいよ、みんなやろうよ組み込み!)

 

 

と、このように組み込みを推す発言を書いていますが、本題は組み込みではないです。

ここまでで何が言いたいかと言いますと、

入力って面白いよ!

って話です。

しかし、組み込みって正直難しいと思います。単純なものを作ろうにも、必要な知識が他に比べて多いです。しかも、何らかの入力機器をPCにつないで何かするとなると、さらに難しくなります。

 

それでも、アナログ値が返ってくる入力部品が使いたい!って人はいると思います。いるよね?

 

 

 

そんなあなたにオススメしたい機器があります!

 

簡単にPCに接続できて!!!

入手性もよくて!!!!

多彩な入力がある機器!!!!!

 

 

そう!!!!!!!

それは!!!!!!!!

 

 

 

Wii リモコンです!!!!!!!!!!

 

 

 

 

この記事について(注意)

この記事は、私が後先のことを何も考えずその時のノリと勢いで書いています。そのせいで、ものすごく長ったらしい記事になってしまっています。

もしWiiリモコンを実際にPCに接続して使ってみたい人は、全体的に読んでいただけるとありがたいのですが、そのつもりがない方は、

WiiリモコンをPCに接続してみよう!!

・WiimoteLibについて

・WiimoteLibの使い方

の3つを読み飛ばすことをおススメします。

 

Wii リモコンについて

Wiiリモコンとは、任天堂のゲーム機「Wii」及び「Wii U」において使用できる、標準のコントローラーです。

Wiiリモコンは、Wii本体とBluetooth通信でつながっています。そのため、非公式の使用方法として、PCとつないで使用することができます。もちろん、ただつなぐだけで使うことはできませんが、簡単に使用できるようにするためのライブラリが、有志の手によって作成されています。

今回はその中でも「WiimoteLib」というライブラリを後ほど紹介します。

 

Wiiリモコンには様々な装置が備わっています。

・ボタン(A,B,1,2,十字,-,+,home,電源ボタン)

・バイブレーション

・LED×4

・ポインタ(詳しくは後述)

・スピーカ

・3軸加速度センサ

・3軸ジャイロセンサ(Wiiリモコンプラス、もしくはWiiモーションプラスのみ)

・ユーザメモリ(Miiなどの保存に用いる)

などの装置がWiiリモコンには入っています。

 

こんだけたくさん入って3800円ってやばくない???マジでやばいよ

 

 

ポインタについて

Wiiにはセンサーバーという機器が付属していて、それにリモコンを向けることによって、センサーバーがリモコンの指している向きを認識し、ゲーム上でポインタを使うことができます。

 

 

と、思われているかもしれませんが、実は違います!

分解してみるとわかるのですが、センサーバーの中身はただの赤外線LEDです。

カメラ等でセンサーバーを撮ってみると、両端の部分が光っています。

 

  f:id:kazujdDR8823:20201208214818p:plain

上が赤外線が映るカメラ(iPhone8 内カメ)

下が赤外線が映らないカメラ(iPhone8 外カメ)

 

それじゃあどのようにして、ポインタの動作を実現しているかと言いますと、

Wiiリモコンの先っぽにある黒い部分にはCMOSセンサ(カメラみたいなもの)があり、そのCMOSセンサで、センサーバーの赤外線LEDの位置を検知し、そこからWiiリモコンがセンサーバーに対してどのような角度にあるかを割り出します。

 

  f:id:kazujdDR8823:20201208214936j:plain

 

この記事に、詳しい説明や画像が載っているので、気になる方はぜひ見てみてください!

xtech.nikkei.com

 

 ちなみに、CMOSセンサから入力された画像データは、「赤外線が強い、上位4つの点の座標」という数値の形式でWii本体とやり取りされます。(だったはず、違ったらすいません...)

  

余談ですが、SwitchのJoy-Con(R)に搭載されているモーションIRカメラも似たようなものなのですが、こちらは画像データそのままをやり取りしているっぽいので、Wiiリモコンよりもっと多彩なことができます。

 

 

 

WiiリモコンをPCに接続してみよう!!

 注意! 

この先の内容すべてに言えることなのですが、私の持っている環境がwindowsのみなため、maclinuxでの方法については書くことができません。ご了承ください。

使用する環境は Win + Visual Studio + C# です

また、Visual Studio を少し使える(プロジェクトを作ってビルドするまでくらい)人向けの内容となっています。 

 

 

 超注意!!

今回使うライブラリ「WiimoteLib」はWiiリモコンプラスに対応していません。そのため、古いWiiリモコンしか使えませんのでご注意ください。

 

  f:id:kazujdDR8823:20201208215148p:plain

左が古いWiiリモコン、右が新しいWiiリモコンプラス

     f:id:kazujdDR8823:20201208215234j:plain

リモコン下部に、「Wii MotionPlus INSIDE」の文字があるものが、新しいWiiリモコン

文字がないWiiリモコンしかWiimoteLibでは使えません。

 

 

 

それでは、WiiリモコンとPCを接続していくのですが、Wiiリモコンについてのところで説明したように、WiiリモコンBluetoothで通信を行うため、Windows標準の機能で簡単に接続することができます。

 

 

 

と思いきや、めっちゃめんどいです。

まず普通に繋ごうとしても繋がらないのと、もし繋がったとしても再度接続しなおすたびに、デバイスマネージャーからデバイスのアンインストールをしなきゃいけなくなるなど、めっちゃ大変です。

そんなわけで、「wiipermpair2」というソフトを使用します。

tyche.pu-toyama.ac.jp

 

このソフトを使用することで、簡単に接続できるのと、毎回毎回デバイスマネージャーを開かなくてよくなります。

詳しいインストール方法や使い方などはこのサイトを参照してください。C#の環境が必要です。

一応簡単にこのソフトを導入するまでの流れを説明すると、

 

wiipermpair2のソースコードをダウンロード

 ↓

Visual Studio でビルド(C#)

 ↓

生成されたexeを起動

(プロジェクトフォルダ/wiipermpair2/bin/Release/wiipermpair2.exe)

 ↓

Wiiリモコンの赤いボタンを押す

 ↓

一覧に何か表示されたらもう一度赤いボタンを押し、プログラムの「pairing」のボタンを押してしばらく待つ。

 ↓

「disconnect」の表示がでればOK

 

また、Wiiリモコンとの接続をやめるときは、PC側のBluetoothをOFFにすることで簡単に切断できます。確実に切断することができるので、この方法をオススメします

 

って感じです。もし何かあれば私(@kazujdDR8823)に連絡してくれれば対応できるかもしれません。(期待はしないでください...笑)

 

 

WiimoteLibについて

WiiリモコンをPCに接続するだけでは、思うように使用することはできません。そこで、簡単にWiiリモコンと通信できるようにするための「WiimoteLib」というライブラリを使用します。(WiimoteとはフランスでのWiiリモコンの名称らしいです)

 

github.com

 

使用方法

(Visual Studio がインストール済み&C#の環境も構築済みとします)

1. 上のリンクのリポジトリからダウンロードします

2. WiimoteLib-master/WiimoteCS/Wiimote.sinを開く

3. ビルドします

 ビルドすることにより、WiimoteLib.dllというファイルが生成されます。

 この時に、Wiiリモコンを接続していなかった場合

 

    f:id:kazujdDR8823:20201208035135p:plain

 

 このように怒られますが、気にしないでOKです。

 一応確認のために、Wiiリモコンをつないでからもう一度ビルドしてみましょう。

 

 Wiiリモコンをつないでからビルドした場合、

 

  f:id:kazujdDR8823:20201208154531p:plain

 

 このような画面が出てきます。ボタンを押したりWiiリモコンを振ったりすると、画面上の値などが変わっていきます。

 Outputsの欄にチェックをつけると、対応したLEDを光らせたり、バイブレーションをONにできたりします。

 

 もし、接続したはずなのにエラーが出てくる場合、接続の手段をもう一度やり直してみましょう。

 

4. 新しくC#のプロジェクトを作る(私はフォームアプリケーションで制作していますが、WPFでも大丈夫だと思います。というか今はWPFのいいんだよね?移行するのめんどい...)

 

  f:id:kazujdDR8823:20201208035527p:plain

 

5. 作成したプロジェクトに先ほど作ったWiimoteLibのdllファイルを参照させます。

 

  f:id:kazujdDR8823:20201208040229p:plain

 

 画像のように、上のメニューバーの「プロジェクト」→「参照の追加」を押します。

 

 

  f:id:kazujdDR8823:20201208040517p:plain

 

 その後、出てきたウィンドウの右下の「参照」を押し、先ほど作成した「WiimoteLib.dll」を追加します。

 場所は

  wiimoteLibのプロジェクトフォルダ(WiimoteCS)/WiimoteLib/bin/Debug/WiimoteLib.dll

 です。

 

  f:id:kazujdDR8823:20201208040905p:plain

 

 画像のように「WiimoteLib.dll」の左側にチェックマークが入っていればOKです!

 

これで、WiimoteLibを使用する準備は整いました!

 

 

 

 WiimoteLibの使い方

使い方に入る前に、参考にさせていただいたサイトを貼っておきます。

 

C#ではなくVBでの実装ですが、やってることは同じなのでいろいろと参考にさせていただきました。

bibo.capture.jp

  

 

 

それでは実際にWiiリモコンを使用してみましょう!

 

  f:id:kazujdDR8823:20201208160247p:plain

 

フォームアプリケーションだった場合このようなソースコード(Form1.cs)が生成されると思います。

これに追加する形で書いていきましょう!

 

下準備

まず接続(button1)と切断(button2)を行うボタンを作ります。

  

  f:id:kazujdDR8823:20201208161152p:plain

 

そして、Form1.csにこのように書きます。

 

using System;
using System.Windows.Forms;
using WiimoteLib;

namespace Wiimote_kazu8823 {
    public partial class Form1 : Form {

        Wiimote wiimote = new Wiimote();            // インスタンスの作成
        public WiimoteState wiimoteState = null;

        private delegate void UpdateWiimoteStateDelegate(WiimoteChangedEventArgs args);

        public Form1() {
            InitializeComponent();
        }

        // 接続ボタン
        private void button1_Click(object sender, EventArgs e) {
            try {
                wiimote.Connect();  // Wiiリモコンへの接続を行う
            } catch (WiimoteNotFoundException exception){
                MessageBox.Show("Wiiリモコンが見つかりません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            // Wiiリモコンとの通信モードを設定
            wiimote.SetReportType(InputReport.ButtonsAccel, true);

            wiimote.SetLEDs(0b1111);    // LEDの点灯

            wiimote.WiimoteChanged += Wiimote_WiimoteChanged;
        }

        // 切断ボタン
        private void button2_Click(object sender, EventArgs e) {
            wiimote.SetLEDs(0b0000);    // LEDの消灯
            wiimote.Disconnect();   // Wiiリモコンの切断を行う
        }

        private void Wiimote_WiimoteChanged(object sender, WiimoteChangedEventArgs e) {
            BeginInvoke(new UpdateWiimoteStateDelegate(UpdateWiimoteChanged), e);
        }

        public void UpdateWiimoteChanged(WiimoteChangedEventArgs args) {
            wiimoteState = args.WiimoteState;
        }
    }
}

 

これで実行してみると、接続ボタンを押すとLEDが光り、切断ボタンを押すとLEDが消えるプログラムができます。

 

 

これでWiiリモコンとの接続ができました!!!!!!

後は、一番下の関数(UpdateWiimoteChanged)にいろいろな処理を追加していくだけです!

 

バッテリー残量の表示

Wiiリモコンのバッテリー残量を表示してみましょう。

Form1にバッテリー残量を表示するラベル(label1)を追加します。

 

  f:id:kazujdDR8823:20201208170349p:plain

 

そして、UpdateWiimoteChangedをこのようにします。

 

public void UpdateWiimoteChanged(WiimoteChangedEventArgs args) {
    wiimoteState = args.WiimoteState;

    label1.Text = "battery : " + wiimoteState.Battery + "%";    // バッテリー残量の表示
}

 

これで実行すると、接続している間、Wiiリモコンのバッテリー残量が表示されます。

 

  f:id:kazujdDR8823:20201208170829p:plain

 

 

ボタンの状態の取得

Wiiリモコンにあるボタンの状態を取得してみましょう。

Form1にCheckBoxを追加します。

 

  f:id:kazujdDR8823:20201208171408p:plain

 

番号は

↑:1   ←:2   →:3   ↓:4   A:5   B:6   1(ボタン):7   2(ボタン):8

にしています。

 

そしてUpdateWiimoteChangedの末尾にこれを追加します。

 

// ボタン
checkBox1.Checked = wiimoteState.ButtonState.Up;
checkBox2.Checked = wiimoteState.ButtonState.Left;
checkBox3.Checked = wiimoteState.ButtonState.Right;
checkBox4.Checked = wiimoteState.ButtonState.Down;
checkBox5.Checked = wiimoteState.ButtonState.A;
checkBox6.Checked = wiimoteState.ButtonState.B;
checkBox7.Checked = wiimoteState.ButtonState.One;
checkBox8.Checked = wiimoteState.ButtonState.Two;

 

これで実行すると、ボタンに対応したcheckboxに表示されます。

 

 

加速度の取得

はい来ました、これですよ。加速度センサってすんごく楽しいんですよ。マジで。

これをやりたいがために、今回のテーマをWiiリモコンにしたといっても過言じゃないレベルです。

とりあえず、データを取得するところまでやってみましょう。

 

まずはForm1にtrackBarを3つ追加します。

(左側のラベルはわかりやすくするために付けているだけなのでなくても大丈夫です)

 

  f:id:kazujdDR8823:20201208172916p:plain

 

また、プロパティから

 Maximum を 255 に

 Minimum を 0 に

 SmallChange を 1 に

 Value を 127 に

しておきましょう

 

  f:id:kazujdDR8823:20201208173111p:plain

 

その後、UpdateWiimoteChangedの末尾に、以下を追加しましょう。

 

// 加速度センサ
trackBar1.Value = wiimoteState.AccelState.RawValues.X;
trackBar2.Value = wiimoteState.AccelState.RawValues.Y;
trackBar3.Value = wiimoteState.AccelState.RawValues.Z;

 

これで実行すると、Wiiリモコンの動きに合わせてtrackBarが動きます。

 

 

これだけで楽しいよね!!!!!!

これを伝えたいんだよ私は!!!!!!!

良くない??

だって自分の動きがそのまま取れるんだよ!!!!

楽しいっしょ!!!!!

 

 

 

 

すいません、取り乱しました。

 

CMOSセンサの取得

ポインタ関係です。

最初の方で述べたように、センサーバーにはただの赤外線LEDしかなく、Wiiリモコンに入っている赤外線を検出するCMOSセンサから、ポインタなどの処理をやっています。

 

なのでまずは、赤外線を発射するものを準備する必要があります。

もちろんセンサーバーを使ってもいいのですが、いちいちWiiの電源をつけるのはめんどくさいと思います。

なので赤外線LEDを少し離して2つ設置して、簡易センサーバーを作ることをおススメします。

 

調べるとセンサーバーを自作している人が結構います。

traceback.mydns.jp

 

ちなみに私は、ビュートローバーというプログラミング学習者向けロボットについている、ライントレース用の赤外線センサを利用しています。

 

f:id:kazujdDR8823:20201208220348j:plain

赤丸で囲んだ部分に赤外線LED(など)があります。

 

 

それでは値の取得をしてみましょう。

まずはわかりやすいようにPanelを追加します。

大きさは512×384にします。

CMOSセンサから取得できる座標データは1024×768なのですが、大きすぎるため半分にしました。

 

  f:id:kazujdDR8823:20201208180857p:plain

 

次に、今作ったPanelの中にButtonを2つ追加します。

Buttonである必要はありませんが、形を作りやすいという理由からButtonにしてます。

 

  f:id:kazujdDR8823:20201208181110p:plain

 

大きさやテキストは何でもいいのですが、分かりやすいように1(button3)と2(button4)にしてます。

またsizeは20,20にしました。

 

このようにPanelの中に置くと、座標がPanel基準となり、Panelの左上の座標からの相対座標で位置を指定できるようになります。(って認識なんですけどあってますよね?詳しい人教えてください...笑)

 

プログラムに関しては、UpdateWiimoteChangedの末尾に以下のコードを追加してください。

 

// 赤外線関係
button3.Visible = wiimoteState.IRState.IRSensors[0].Found;
button4.Visible = wiimoteState.IRState.IRSensors[1].Found;

if(wiimoteState.IRState.IRSensors[0].Found) {
    button3.Location = new System.Drawing.Point(wiimoteState.IRState.IRSensors[0].RawPosition.X / 2, wiimoteState.IRState.IRSensors[0].RawPosition.Y / 2);
}
if(wiimoteState.IRState.IRSensors[1].Found) {
    button4.Location = new System.Drawing.Point(wiimoteState.IRState.IRSensors[1].RawPosition.X / 2, wiimoteState.IRState.IRSensors[1].RawPosition.Y / 2);
}

 

それに加えて、Button1_click()内にあるwiimote.SetReportTypeを変更します。

 

// 接続ボタン
private void button1_Click(object sender, EventArgs e) {
    try {
        wiimote.Connect();  // Wiiリモコンへの接続を行う
    } catch (WiimoteNotFoundException exception){
        MessageBox.Show("Wiiリモコンが見つかりません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }

    // Wiiリモコンとの通信モードを設定
    wiimote.SetReportType(InputReport.IRAccel, true);       // 変更部分

    wiimote.SetLEDs(0b1111);    // LEDの点灯

    wiimote.WiimoteChanged += Wiimote_WiimoteChanged;
}

 

InputReport.ButtonsAccel ではCMOSセンサ関係のデータは取得できないのですが、

InpurReport.IRAccel にすることで取得できるようになります。

 

このようにすることで、CMOSセンサの値を取得することができます。

 

 

また、今回のコードではwiiリモコン側から見た、赤外線LEDの座標をそのまま表示しているため、左右が反転しています。

左右を反転し、赤外線LEDの2点の座標を平均化することによって、Wiiにおいての挙動に近づけることができます。

 

まず中心を示すボタン(button5)を追加します。

  f:id:kazujdDR8823:20201208190211p:plain

 

 次にプログラムを↓

 

// 赤外線関係
var IR0Enable = wiimoteState.IRState.IRSensors[0].Found;
var IR1Enable = wiimoteState.IRState.IRSensors[1].Found;
var IR01Enable = IR0Enable && IR1Enable;

var IR0PositionX = 1023 - wiimoteState.IRState.IRSensors[0].RawPosition.X;
var IR0PositionY = wiimoteState.IRState.IRSensors[0].RawPosition.Y;
var IR1PositionX = 1023 - wiimoteState.IRState.IRSensors[1].RawPosition.X;
var IR1PositionY = wiimoteState.IRState.IRSensors[1].RawPosition.Y;

button3.Visible = IR0Enable;
button4.Visible = IR0Enable;
button5.Visible = IR01Enable;


if(IR0Enable) {
    button3.Location = new System.Drawing.Point(IR0PositionX / 2, IR0PositionY / 2);
}
if(IR1Enable) {
    button4.Location = new System.Drawing.Point(IR1PositionX / 2, IR1PositionY / 2);
}
if(IR01Enable) {
    button5.Location = new System.Drawing.Point((IR0PositionX + IR1PositionX) / 4, (IR0PositionY + IR1PositionY) / 4); 
}

先ほどの部分をこのように置き換えることでWiiのポインタのような挙動になります。

 

 

 

 

その他

これでWiiリモコンに関するものは一通り終わりました。

しかし、WiimoteLibで扱えるものはまだあります。

 

ヌンチャク

 

WiimoteLibは様々な周辺機器にも対応しています。

 

例えば、ヌンチャク

 

  f:id:kazujdDR8823:20201208220611j:plain

 

ヌンチャクには、

・ボタン×2 (c, z)

・アナログスティック

・3軸加速度センサ

が入っており、これらもWiimoteLibを使用することでPCから扱うことができます。

 

一つ注意として、ヌンチャク自体に通信をする機能は存在していません。

Wiiリモコンとつなげることによって、はじめて通信できるようになります。

 

使い方の前に、表示用として

Wiiリモコンの加速度と同じようにtrackBarを3つ

・アナログスティックの表示用にhScrollBarとvScrollBar

・CとZのボタンのためにcheckBoxを2つ

を用意しています。

また、hScrollBarとvScrollBarは

 Maximum を 255 に

 Minimum を 0 に

 SmallChange を 1 に

 Value を 127 に

しています。

 

  f:id:kazujdDR8823:20201208194411p:plain

 

使い方は、まずWiimtoeStateを宣言したように、NunchukStateというものを宣言します。

  

  f:id:kazujdDR8823:20201208192816p:plain

 

public NunchukState nunchukState;    // 追加

 

それに加えて、先ほどと同じようにButton1_click()内にあるwiimote.SetReportTypeを変更します。

 

// 接続ボタン
private void button1_Click(object sender, EventArgs e) {
    try {
        wiimote.Connect();  // Wiiリモコンへの接続を行う
    } catch (WiimoteNotFoundException exception){
        MessageBox.Show("Wiiリモコンが見つかりません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }

    // Wiiリモコンとの通信モードを設定
    wiimote.SetReportType(InputReport.ExtensionAccel, true);       // 変更部分

    wiimote.SetLEDs(0b1111);    // LEDの点灯

    wiimote.WiimoteChanged += Wiimote_WiimoteChanged;
}

 

ExtensionAccelにすることで、ヌンチャクの状態を取得することができます。

 

そして、UpdateWiimoteChangedの末尾に以下を追加します。

 

// ヌンチャクの状態を取得
nunchukState = wiimoteState.NunchukState;

// 加速度センサ(ヌンチャク)
trackBar4.Value = nunchukState.AccelState.RawValues.X;
trackBar5.Value = nunchukState.AccelState.RawValues.Y;
trackBar6.Value = nunchukState.AccelState.RawValues.Z;

// アナログスティック
hScrollBar1.Value = nunchukState.RawJoystick.X;
vScrollBar1.Value = 255 - nunchukState.RawJoystick.Y;

// ボタン(ヌンチャク)
checkBox9.Checked = nunchukState.C;
checkBox10.Checked = nunchukState.Z;

 

 

これで、ヌンチャクのデータを取得することができます。

 

 

 

バランスWiiボード

WiimoteLibでは、Wiiリモコンに直接つなぐ機器だけでなく、バランスWiiボードも使うことができます。

取得できるデータは

・圧力センサ×4(4隅にある)

・体重

・重心(平面座標の形で取得できる)

です。

 

バランスボードに関しては、今のプログラムに追加する形だとちょっと大変(というかごちゃごちゃしすぎる)なので、参考になるウェブサイトを紹介させていただきます。

 

yamaokuno-usausa.hatenablog.com

 

ちなみに、バランスボードとPCの接続方法は、Wiiリモコンの時と同じ流れでOKです。

 

 

説明を端折る代わりに、以前作ったものなのですが、バランスボードとWiimoteLibを使うとこんなことができるよっていう例を紹介します。

 

(ところどころ音声が乱れています。すいません...) 

 

この動画では、体重移動をマウスの移動に変換し、それで壺おじをプレイしています。

もちろんですが、操作性はクソです。

もしやってみたい人がいましたら、連絡してください笑

 

ちなみにソースコードは人に見せられるものじゃないので、もし欲しい人がいれば教えてください。全力で書き直してから渡します...

 

 

 活用例

ここからは、センサの値を取得するだけでない活用例を紹介します。

また、ここにある例のほとんどは昔作ったものな為、ネタが古いことが多々あります。

ご了承ください。

 

 

マウス代わり

せっかくポインタ的なことができるので、マウスの代わりにWiiリモコンを使ってみましょう。

 

 

流れ的にWiimoteLibで書いたもののように感じるかもしれませんが、WiimoteLibを使っていません。

それどころか自分で書いたプログラムじゃないです...

これはWiinRemoteというソフトを用いて、Wiiリモコンをマウス代わりにしています。

WiinRemoteを使うと、加速度センサの値がグラフで表示されるのでものすごくわかりやすいです。

 

nostalgia.xii.jp

 

こちらのサイトの手順のうち、BluetoothによるPCとの接続に関する部分は、すでに接続できている場合必要ありません。

 

 

魔法みたいな感じなやつ(適当)

まずは動画をご覧ください。

 

 

Wiiリモコンを画面に向けると音が割れるプログラムです。 

 

何が起きているかを説明すると、PCのディスプレイの上に赤外線LEDが置いてあります。

Wiiリモコンを画面に向けると、その赤外線LEDの光がCMOSセンサに入ります。

ということで、普通に曲を流しつつ、赤外線LEDをCMOSセンサが検知している間だけ、割れている曲に切り替えています。

 

ちなみに画面に向けている間、手が震えていますが、その震えに意味はありません。

なんか魔法出してる感を出そうとしてこうなりました。わかりずらっ...

 

 

電動消しゴム

Wiiリモコンにはバイブレーション機能がついています。

このバイブレーション機能を有効活用してみました。

 

UpdateWiimoteChangedの末尾に以下のコードを追加しました。

 

if(wiimoteState.ButtonState.A) {
    wiimote.SetRumble(true);    // 振動スタート
}
if(wiimoteState.ButtonState.B) {
    wiimote.SetRumble(false);   // 振動ストップ
}

 

Aボタンで振動スタート、Bボタンでストップです。

 

このプログラムを活用することで、Wiiリモコンが遊ぶためじゃなく、電動消しゴムがない時の代わりにもなります!!!!!

すごくないですか?!!!!

文字も消せるWiiリモコンってすごいですよね!!!!!!!!

やばいよ!!!!!

マジで!!!!!!!

 

 

 

マウス代わり(2回目)

はい、先ほどはスイマセンデシタ...

どうしようもないクソ枠はさっきので終わりです。

次は(ネタではあるけど)ちゃんとしてます。

 

先ほどバランスボードのところで、体重移動をマウス移動に変換していました。

それに加えて、Wiiリモコンでクリックの操作をします。

クリックは単純にボタンに割り当てるのではなく、加速度センサを使い、一定以上の速度でリモコンを振ったときにクリックの扱いにしています。

 

それを用いてくまのプーさんのホームランダービー!をします。

(今年中で遊べなくなっちゃうの悲しいね...)

 

 

はい...

 

想像の100倍くらい難しいですよこれ...

 

マジで...

 

 

ということで、以上活用例でした。

 

 

まとめ

ものすごく長々と書きましたが、どうだったでしょうか?

もしこの記事を読んで、Wiiリモコンを使って遊ぶ方が増えてくれれば幸いです。

 

もちろん、何か質問などがあれば私に言っていただければ、精いっぱい対応しますので、みなさんもぜひWiiリモコンを使ってみてください!

 

また、今回はWiimoteLibを用いましたが、私は使ったことがないのですがこれ以外にもUnityやProcessing向けのライブラリも存在します。C#だけでない様々な環境でWiiリモコンを使うことができるので、皆さんに合ったもので開発してみてください!!

 

 

以上、kazu8823(twitter:@kazujdDR8823)による「Wiiリモコンっていいよね!って話」でした!!!

 

この記事はFUN Advent Calendar 2020 Part2 9日目の記事でした。

FUN Part2 Advent Calendar 2020 - Adventar

 

明日は 7 さんによる「なんか書きます」です!!お楽しみに!!!