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]を戻り値に返します。
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関数は、仮想シリアルポートの入出力行う関数で、この関数の呼び出しがないと、次のキーデータの入力が行われません。
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関数と同様に、キー操作したデータが入力できます。