LoginSignup
7
4

More than 3 years have passed since last update.

JavaでWiiリモコンを使ってみる

Last updated at Posted at 2018-06-23

今回はJavaでWiiリモコンを使ってみたいと思います。

日本語文献が少ないうえに古いので、新しい文献として使っていただければなと思います。

注意

WiiリモコンをPCにBluetoothデバイスとしてペアリングしなければ動作しません。
必ずペアリングしてから実行してください。

環境

Windows 10 Home Edition
Eclipse 4.6
Java 1.8

ライブラリの調達

Mavenとかではなく普通のプロジェクトとして進めていきます。

WiiuseJ

https://code.google.com/archive/p/wiiusej/downloads のWiiusej 0.12a.zip

プロジェクトのセットアップ

リソースフォルダ内にWindowsならwiiuse.dllとWiiUseJ.dll、Macユーザならlibwiiuse.soとlibWiiuseJ.soを入れましょう。

ライブラリを弄る

とりあえずWiiリモコンを探す

Wiiリモコンが見つかった場合にはwiimote変数にWiiリモコンのオブジェクトが入ります。

example.java
import com.github.awvalenti.wiiusej.WiiusejNativeLibraryLoadingException;

import wiiusej.WiiUseApiManager;
import wiiusej.Wiimote;

public class MainAccessPoint {

    private Wiimote wiimote;
    private Wiimote[] wiimotes;

    public MainAccessPoint() throws InterruptedException {
        try {
            System.out.println("Finding wiimotes...");

            while(wiimotes == null) {
                /*2019/8/5 ミスがありました。getWiimotes(1);ではなく、getWiimotes(1, true);でした。またWiiUseApiManagerへはstaticアクセスでした。*/
                wiimotes = WiiUseApiManager.getWiimotes(1, true);
                if(wiimotes != null && wiimotes.length > 0) {
                    wiimote = wiimotes[0];
                    System.out.println("Wiiリモコンが見つかりました。 Id: " + wiimote.getId());
                    break;
                }
                wiimotes = null;
                continue;
            }

        } catch (WiiusejNativeLibraryLoadingException e) {
            e.printStackTrace();
        }
    }

    public static void main(String args[]) throws InterruptedException {
        MainAccessPoint main = new MainAccessPoint();
    }
}

LEDを変えてみる

1番目の引数から左から順番にbooleanで指定します。

wiimote.setLeds(true, false, false, false);

Wiiリモコンにリスナを登録する

以下のリスナをwiimoteに登録します。

リスナ

Listener.java
import wiiusej.values.GForce;
import wiiusej.wiiusejevents.physicalevents.ExpansionEvent;
import wiiusej.wiiusejevents.physicalevents.IREvent;
import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent;
import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent;
import wiiusej.wiiusejevents.utils.WiimoteListener;
import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent;
import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent;

public class Listener implements WiimoteListener {

    public Listener() {
    }

    // ボタン押下時に発火。どのボタンかはメソッド名でわかると思います。
    @Override
    public void onButtonsEvent(WiimoteButtonsEvent arg0) {
        if(arg0.isButtonHomeJustPressed()) {

        } else if(arg0.isButtonHomeJustReleased()) {

        } else if(arg0.isButtonPlusJustPressed()) {

        } else if(arg0.isButtonPlusJustReleased()) {

        } else if(arg0.isButtonMinusJustPressed()) {

        } else if(arg0.isButtonMinusJustReleased()) {

        } else if(arg0.isButtonOneJustPressed()) {

        } else if(arg0.isButtonOneJustReleased()) {

        } else if(arg0.isButtonTwoJustPressed()) {

        } else if(arg0.isButtonTwoJustReleased()) {

        } else if(arg0.isButtonAJustPressed()) {

        } else if(arg0.isButtonAJustReleased()) {

        } else if(arg0.isButtonBJustPressed()) {

        } else if(arg0.isButtonBJustReleased()) {

        } else if(arg0.isButtonRightJustPressed()) {

        } else if(arg0.isButtonRightJustReleased()) {

        } else if(arg0.isButtonLeftJustPressed()) {

        } else if(arg0.isButtonLeftJustReleased()) {

        } else if(arg0.isButtonUpJustPressed()) {

        } else if(arg0.isButtonUpJustReleased()) {

        } else if(arg0.isButtonDownJustPressed()) {

        } else if(arg0.isButtonDownJustReleased()) {

        }
    }

    // Wiiリモコンが動いた時に発火。
    @Override
    public void onMotionSensingEvent(MotionSensingEvent arg0) {
        // 3軸加速度センサの値が1~-1の範囲で返ってきます。
        GForce force = arg0.getGforce();
        System.out.println("X: " + force.getX());
        System.out.println("Y: " + force.getY());
        System.out.println("Z: " + force.getZ());
    }

    @Override public void onStatusEvent(StatusEvent arg0) {}
    @Override public void onDisconnectionEvent(DisconnectionEvent arg0) {}
    @Override public void onClassicControllerInsertedEvent(ClassicControllerInsertedEvent arg0) {}
    @Override public void onClassicControllerRemovedEvent(ClassicControllerRemovedEvent arg0) {}
    @Override public void onExpansionEvent(ExpansionEvent arg0) {}
    @Override public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) {}
    @Override public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) {}
    @Override public void onIrEvent(IREvent arg0) {}
    @Override public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) {}
    @Override public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) {}

}

リスナをwiimoteに登録

wiimote.addWiiMoteEventListeners(new Listener());

モーションリスナを有効化する

モーションを取得するには以下のコードを書く必要があります。

wiimote.activateMotionSensing();

また何かわかったら追記します。
わからないこと等あればコメントでお願いします。

7
4
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4