USB通信の実験を行うためにATMEL AT90USBKEY2を購入しました。AT90USBKEY2に搭載されているジョイスティックを用いて、Windows7にHID準拠ゲームコントローラとして認識させます。
AT90USBKEY2のソフト開発は、プログラム開発にAtmel Studio 6.2、USBによるプログラムの書き込みにFlip 3.4.7.112を使用します。パソコン側のプログラム開発には、VisualStudio Express 2013 for Desktop、ジョイスティックの情報の入力のために、DirectXのDirectInputを使用します。

ATMEL AT90USBKEY2とは

ジョイスティック、LED、フラッシュメモリ、温度センサを搭載し、キーボード、マウス、USBメモリ、仮想ポートによるシリアル通信など、USBデバイスクラスを使用したUSB通信の実験ができます。

  • CPU:AT90USB1287
  • システムクロック:8Mhz
  • 搭載ペリフェラル:ジョイスティック、フラッシュメモリ、温度センサ、LED、IOポート
  • USB2.0対応、USBデバイス/ホスト/OTG
  • USBマスストレージクラスのデモ用にシリアルフラッシュ搭載
  • USB経由でファームウェアアップデート可能

AT90USBKEY2

HID準拠ゲームコントローラのソフトウェア開発

AT90USBKEY2のジョイスティックを、Windows7のHID準拠ゲームコントローラとして認識できるようにソフトを開発します。まずソフトを準備します。ソフトはLUFAの「Joystick HID Device Demo (Class Driver APIs)」を使用します。Atmel Studio 6.2からNew Example Projectメニューを選択し、「FourWalledCubicle」→「AVR8 Architecture」からJoystick HID Device Demo (Class Driver APIs)を選択します。

HID準拠ゲームコントローラソフトの取得

このままでは、AT90USBKEY2に対応していないので、実行CPU、動作ボードの選択、動作周波数をそれぞれ設定します。

実行CPUの指定

AT90USBKEY2のCPUは、AT90USB1287なので、プロジェクト名を右クリックしてプロパティを選択し、DeviceタグのChange DeviceボタンでAT90USB1287を選択します。

AT90USB1287の選択

動作ボードの選択

動作ボードをAT90USBKEY2 にします。[ASF] -> [ASF Wizard] を起動してダイアログを表示させ、LUFA Board Supportを「usbkey」に変更します。

動作ボードをAT90USBKEY2に設定

動作周波数の設定

AT90USBKEY2は動作クロックが8MHzで動作します。プロパティのToolchainを用いて、「C Compiler」 → 「Symbols」を選択し、「F_CPU=8000000UL 」と「 F_USB=8000000UL」 に修正します。

動作周波数の設定

設定を終了して、Atmel Studioでビルドをすると、出力Windowのコンパイルパラメータが次のようになり、正常に設定できているかが確認できます。コンパイル・リンクが終了すると、ソリューションエクスプローラのOutputfilesにHexファイルが出来上がっています。

  • -mmcu=at90usb1287
  • -DBOARD=BOARD_USBKEY
  • -DF_CPU=8000000UL
  • -DF_USB=8000000UL
		“C:\Program Files\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe”  -x c -funsigned-char -funsigned-bitfields -DDEBUG -DARCH=ARCH_AVR8 -DF_CPU=8000000UL -DUSE_LUFA_CONFIG_HEADER -DF_USB=8000000UL -DBOARD=BOARD_USBKEY  -I”../src” -I”../src/LUFA” -I”../src/config” -I”../src/LUFA/.”  -O1 -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -g3 -Wall -mmcu=at90usb1287 -c -mrelax -std=gnu99 -fno-strict-aliasing -fno-jump-tables -MD -MP -MF “src/LUFA/LUFA/Drivers/USB/Core/Events.d” -MT”src/LUFA/LUFA/Drivers/USB/Core/Events.d” -MT”src/LUFA/LUFA/Drivers/USB/Core/Events.o”   -o “src/LUFA/LUFA/Drivers/USB/Core/Events.o” “../src/LUFA/LUFA/Drivers/USB/Core/Events.c”

ATMEL AT90USBKEY2へのHID準拠ゲームコントローラソフトの書き込み

Atmel Studioで開発したHID準拠ゲームコントローラソフトをFlipを使用してAT90USBKEY2に書き込みます。AT90USB1287のフラッシュの書き込み方法については、「Atmel Studioで開発したAT90USB162のLED点灯プログラム作成」 を参照してください。

HID準拠ゲームコントローラソフトが正常に書き込まれると、専用のドライバソフトを必要とせずに、パソコンでHID準拠ゲームコントローラとして認識されます。デバイスドライバで確認すると、次のようにヒューマンインタフェースデバイスにHID標準ゲームコントローラーとして表示されます。

デバイスドライバでのHID標準ゲームコントローラーの表示

次にパソコン側のプログラムを開発します。VisualStudio Express 2013 for Desktopで、C#からDirectXのDirectInputの機能を使用して、ジョイスティックの情報を表示するソフトを作成します。

DirectX SDKのインストール

DirectXのホームページからDirectXSDKをダウンロードし、インストールします。

DirectX SDKのインストール

VisualStudioによるジョイスティック情報表示ソフトの開発

DirectX SDKをインストール終了後、Visual StudioでWindowsフォームアプリケーションのプロジェクトを作成します。

DirectInputのDLLを参照設定します。プロジェクトの参照設定を右クリックして、参照の追加を選択し、Microsoft.DirectXとMicrosoft.DirectX.DirectInputのDirectInputのコンポーネントを追加します。DLLを直接指定する場合は、次のフォルダからdllを取得します。

C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.dll
C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.DirectInput.dll

参照設定が正常に行われると、参照設定の中に次の項目が追加されます。

DirectInputの参照設定

プロジェクトのプロパティメニューを選択して、アプリケーションタブから 対象フレームワークが「.NET Framework3.5」になっていることを確認します。このバージョン以外では実行時にエラーが発生します。

対象フレームワークの確認

プログラムを次に示します。最初に、DirectX のDirectInputのManagerクラスで、ゲームコントローラのデバイス一覧を取得し、DirectX のDeviceクラスでデバイスの名称、軸の数、ボタンの数、PoVハットの数を表示します。

ジョイスティック情報表示ソフト

private void button1_Click(object sender, EventArgs e)
{
    DeviceList devList;

    try
    {
        // ゲームコントローラのデバイス一覧を取得
        devList = Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly);

        // 全てのコントローラを列挙
        foreach (DeviceInstance dev in devList)
        {
            joystick = new Device(dev.InstanceGuid);
            joystick.SetCooperativeLevel(this, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);

            // 最初に見つかったジョイスティックを操作対象とする
            break;
        }

        joystick.SetDataFormat(DeviceDataFormat.Joystick);

        // デバイスに対するアクセス権をとる
        joystick.Acquire();

        txtLog.AppendText("名称: " + joystick.DeviceInformation.ProductName + Environment.NewLine);
        // コントローラの軸の数
        txtLog.AppendText("軸の数: " + joystick.Caps.NumberAxes + Environment.NewLine);
        // コントローラに有るボタンの数
        txtLog.AppendText("ボタンの数: " + joystick.Caps.NumberButtons + Environment.NewLine);
        // PoV hatの数
        txtLog.AppendText("PoVハットの数: " + joystick.Caps.NumberPointOfViews + Environment.NewLine);
    }
    catch (FormatException)
    {
        Console.Write("例外が発生しまし");
    }
}

HID準拠ゲームコントローラの動作確認ージョイスティック情報表示ソフトの実行

ジョイスティック情報表示ソフトの実行

AT90USBKEY2をパソコンに接続して、ジョイスティック情報表示ソフトを実行した結果を次に示します。名称が「LUFA Joystick Demo」、軸の数が「3」、ボタンの数が「2」、PoVハットの数が「0」になっていることが確認できます。