AT90USBKEY2を用いて、Windows7に仮想シリアルポートとして認識させます。
AT90USBKEY2のソフト開発は、プログラム開発にAtmel Studio 6.2、USBによるプログラムの書き込みに、Flip 3.4.7.112を使用します。パソコン側は、COMポートとしてシリアルポートを認識し、TeraTermによりAT90USBKEY2と通信します。AT90USBKEY2に実装しているJoystickを動かして、その動作をAT90USBKEY2からパソコンに通知させます。
仮想シリアルポートのソフトウェア開発
AT90USBKEY2を接続して、Windows7の仮想シリアルポートとして認識できるようにソフトを開発します。まずソフトを準備します。ソフトはLUFAの「VirtualSerial CDC Device Demo(Class Driver APIs)」を使用します。Atmel Studio 6.2からNew Example Projectメニューを選択し、「FourWalledCubicle」→「AVR8 Architecture」からVirtualSerial CDC Device Demo (Class Driver APIs)を選択します。
このままでは、AT90USBKEY2に対応していないので、実行CPU、動作ボードの選択、動作周波数をそれぞれ設定します。方法については「AT90USBKEY2のJoystickとパソコンとでHID準拠ゲームコントローラ接続」に示します。
また、AT90USB1287のフラッシュの書き込み方法については、「Atmel Studioで開発したAT90USB162のLED点灯プログラム作成」 を参照してください。
AT90USBKEY2による仮想シリアルポートの動作確認
AT90USBKEY2をパソコンに接続して、デバイスマネージャーで確認すると、次のようにポートに「LUFA CDC-ACM Virtual Serial Port」が表示されます。
Teratermの通信設定を次のように設定し、AT90USBKEY2のジョイスティックを動かします。
ジョイスティックの動きに従い、次のデータがTeratermに表示されます。
VirtualSerial CDC Device Demoソフトの変更
作成した仮想シリアルポートソフトを用いて、AT90USBKEY2とパソコン上で動作するTeraterm間でキー操作のインタフェースを持たせます。
main関数のfor文でループ状態になっている部分でCDC_Device_ReceiveByte関数を呼び出しているところを次にように変更し、キー操作が行われると、DebugControl関数を呼び出し、キー操作のデータをEnterキーが押されるまで表示させます。
CDC_Device_ReceiveByte関数は、ループ内で常時呼び出され、キー操作が行われればそのキーコードを戻り値で返し、キー操作がなければ[-1]を戻り値に返します。
1 2 3 4 | if (CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface) != -1) { DebugControl(&USBSerialStream, &VirtualSerial_CDC_Interface); } |
DebugControl関数は、sprintf関数によりデータをフォーマットしてfputs関数で、シリアルポートを経由してTeratermに表示します。キーデータの入力は、CDC_Device_ReceiveByte関数を使用します。入力されたキーコードを16進で表示し、Enterキーが押されるとループを抜け出ます。このループ中に実行されるCDC_Device_USBTask関数は、仮想シリアルポートの入出力行う関数で、この関数の呼び出しがないと、次のキーデータの入力が行われません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | void DebugControl( FILE *USBSerialStream,USB_ClassInfo_CDC_Device_t* const VirtualSerial_CDC_Interface) { char str[100]; char str1[] = "aaa" ; char str2[] = "bbb" ; char str3[] = "ccc" ; int indata; /* Write the string to the virtual COM port via the created character stream */ fputs ( "input \n" , USBSerialStream); sprintf (str, "%s:%s:%s\n" ,str1,str2,str3); fputs ( str, USBSerialStream); while (1) { indata = CDC_Device_ReceiveByte(VirtualSerial_CDC_Interface); if (indata != -1) { sprintf (str, "%x\n" ,indata); fputs ( "CDC_Device_ReceiveByte : " , USBSerialStream); fputs ( str, USBSerialStream); if (indata == 0x0d) { break ; } } CDC_Device_USBTask(VirtualSerial_CDC_Interface); } fgets (str,100,USBSerialStream); fputs ( "fgets : " , USBSerialStream); fputs ( str, USBSerialStream); } |
パソコンとAT90USBKEY2を接続し、Teratermよりキー操作したソフトの実行結果を次に示します(注:最初に一度だけジョイスティックを動かしています)。キー操作は、「12345[ENTER」を行いました。fgets関数はCDC_Device_ReceiveByte関数と同様に、キー操作したデータが入力できます。