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経由でファームウェアアップデート可能
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)を選択します。
このままでは、AT90USBKEY2に対応していないので、実行CPU、動作ボードの選択、動作周波数をそれぞれ設定します。
実行CPUの指定
AT90USBKEY2のCPUは、AT90USB1287なので、プロジェクト名を右クリックしてプロパティを選択し、DeviceタグのChange DeviceボタンでAT90USB1287を選択します。
動作ボードの選択
動作ボードをAT90USBKEY2 にします。[ASF] -> [ASF Wizard] を起動してダイアログを表示させ、LUFA Board Supportを「usbkey」に変更します。
動作周波数の設定
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標準ゲームコントローラーとして表示されます。
次にパソコン側のプログラムを開発します。VisualStudio Express 2013 for Desktopで、C#からDirectXのDirectInputの機能を使用して、ジョイスティックの情報を表示するソフトを作成します。
DirectX SDKのインストール
DirectXのホームページからDirectXSDKをダウンロードし、インストールします。
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
参照設定が正常に行われると、参照設定の中に次の項目が追加されます。
プロジェクトのプロパティメニューを選択して、アプリケーションタブから 対象フレームワークが「.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("例外が発生しまし"); } }