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)を選択します。

CdcAcm04

このままでは、AT90USBKEY2に対応していないので、実行CPU、動作ボードの選択、動作周波数をそれぞれ設定します。方法については「AT90USBKEY2のJoystickとパソコンとでHID準拠ゲームコントローラ接続」に示します。
また、AT90USB1287のフラッシュの書き込み方法については、「Atmel Studioで開発したAT90USB162のLED点灯プログラム作成」 を参照してください。

AT90USBKEY2による仮想シリアルポートの動作確認

AT90USBKEY2をパソコンに接続して、デバイスマネージャーで確認すると、次のようにポートに「LUFA CDC-ACM Virtual Serial Port」が表示されます。

AT90USBKEY2のデバイスマネージャーでの表示
Teratermの通信設定を次のように設定し、AT90USBKEY2のジョイスティックを動かします。

Teratermの通信設定

ジョイスティックの動きに従い、次のデータが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関数と同様に、キー操作したデータが入力できます。

Teratermよりキー操作したソフトの実行結果