概要

Km2Net USB-IO2.0(AKI)をVisual C++ 2008でコントロールするためにライブラリを作ってみた。このライブラリは簡単な操作で、複数接続のUSB-IO2(AKI)を同時にコントロール可能である。
ライブラリを使ったGUI及びコマンドラインで作成したプログラムを動作確認用に作成した。なおUSB-IO2(AKI)本体のプログラムは市販された状態(書き換えていない状態)を想定している
ただし入出力は設定を変えている。
ビットが1の場合入力を示す
0個目のUSB-IO2(AKI) 入出力設定 J1 0xfc J2 0xc3 回路図(PNG) 回路図(PDF) 回路図(DXF)
1個目のUSB-IO2(AKI) 入出力設定 J2 0x01 J2 0x08 回路図(PNG) 回路図(PDF) 回路図(DXF)

ライブラリの構成

ファイルの構成

ソースプログラムusbio2.cppとusbio2.hで構成されている。

コンパイル方法

私は、Visual C++ 2008 Express Edition又はStandard Editonで動作確認をしている。動作OSは32bitの場合Windows XP~7、64bitの場合、Windows Vista~Windows 7(64bitアプリケーションとして実行可能)としている。Windows 8については多分動くと思われる。
コンパイルするには、WDK 7(http://msdn.microsoft.com/library/windows/hardware/gg487428)のインストールが必要である。
ユーザープログラムではusbio2.hをインクルードしusbio2.cppをユーザープログラムのプロジェクトに加え、WDK 7のインクルートディレクトリ・ライブラリディレクトリをVisual C++のプロジェクトに指定しなければならない。なお、インクルードファイルは、単純にWDK 7のインクルードパスのみ指定するとWDK 7のヘッダファイルがVisual C++標準のヘッダファイルより古いため同一ファイル名のヘッダファイルがある場合WDK 7の方が参照され意味不明のエラーが大量に発生する。例えば下記の様に指定するとVisual C++のヘッダファイルが優先されコンパイル可能となる。
$(VCInstallDir)include;C:\WinDDK\7600.16385.1\inc\api

usbio2.h

複数のUSB-IO2(AKI)をサポートするためのクラスUSBIO2_DEV_LISTとデバイス名をもとにデバイスのオープン・クローズ・入出力を行う、USBIO2クラスの定義を行っている。

usbio2.cpp

usbio2.hの実体である。下記に各メンバー関数の概略を記す。

USBIO2_DEV_LIST::DevEnum(void)

接続されているUSB-IO2(AKI)のデバイス名の一覧を取得する。接続されているUSB-IO2(AKI)の個数を返す

USBIO2_DEV_LIST::FirstDev(void)

最初に見つかったUSB-IO2(AKI)デバイス名のクラス(USBIO2_DEV)を返す
デバイス名はUSBIO2_DEVのメンバであるnameで取得可能である。有効なデバイスがない場合は0を返す

USBIO2_DEV_LIST::NextDev(USBIO2_DEV* )

次に見つかったUSB-IO2(AKI)デバイス名のクラス(USBIO2_DEV)を返す
デバイス名はUSBIO2_DEVのメンバであるnameで取得可能である。有効なデバイスがない場合は0を返す

USBIO2::open(CHAR* name)

USB-IO2デバイスを開きます。失敗した場合は0を返します。

USBIO2::SendRecv(BYTE* send,BYTE* recv)

USB-IO2と通信をします。通信に成功した場合は、true失敗した場合はfalseを返します。

USBIO2::InOut(unsigned j1o,unsigned j2o,unsigned* j1in,unsigned* j2in)

USB-IO2に出力後入力します。通信に成功した場合は、true失敗した場合はfalseを返します。
j1o,j2oが出力する値で、j1in,j2inが入力値となります。通信に成功した場合は、true失敗した場合はfalseを返します。

USBIO2::ConfigIn(unsigned* j1io,unsigned* j2io,unsigned* j2pu)

USB-IO2の入出力設定とプルアップの状態を取得します。
*j1io,*j2ioがJ1 J2の入出力状態を表しビットが1の場合入力を示す。*j2puはプルアップの有無を示し0の場合プルアップ有りとなる。通信に成功した場合は、true失敗した場合はfalseを返します。

USBIO2::ConfigSet(unsigned j1io,unsigned j2io,unsigned j2pu)

USB-IO2の入出力設定とプルアップの状態を設定します。
j1io,j2ioがJ1 J2の入出力状態を表しビットが1の場合入力を示す。j2puはプルアップの有無を示し0の場合プルアップ有りとなる。通信に成功した場合は、true失敗した場合はfalseを返します。

USBIO2::close(void)

デバイスを閉じます。

USBIO2_DEV_LISTを使用したデバイス名の一覧を表示するサンプルプログラム

DevEnumでデバイス一覧を取得後、FirstDevで最初のデバイスを取得、次にNextDevで戻り値が0になる場で実行すれば一覧が取得できる。下記にサンプルプログラムと実行例を示す
サンプルプログラムダウンロード(ライブラリも含む) usbiolist.zip
下記のソースはプログラムの一部を書き出したものである。

	USBIO2_DEV_LIST list;
	USBIO2_DEV* p;
	int max;

	max=list.DevEnum();
	p=list.FirstDev();
	while(p){
		_putts(p->name);
		p=list.NextDev(p);
	}
実行例
USB-IO2の接続数 2個
\\?\hid#vid_1352&pid_0121#8&1e13344e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
\\?\hid#vid_1352&pid_0121#8&7ebcb91&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}

コマンドラインでUSB-IO2(AKI)へ出力するサンプルプログラム(USB-IO2(AKI) 1個に対応)

コマンドラインでUSB-IO2(AKI)へ出力できるプログラムである。
オプション指定方法
/t時間 : 出力後待機する時間をミリ秒で指定

usbio 32 64 /t200
0個目のデバイスのJ1に32(0x20)J2に64(0x40)を出力後0.2秒待機
待機時間を使用するとバッチファイルのみで指定時間後に出力値を変化させることができる。
例えばJ2の0ビット~2ビットにアノードコモン3色LED(ビット0 青,ビット1 緑,ビット2 赤)が接続されている場合、下記のバッチファイルで0.1秒置きに色を変化させることができる。白黄紫赤水緑青

:start
usbioouts 0 0 /t100
usbioouts 0 1 /t100
usbioouts 0 2 /t100
usbioouts 0 3 /t100
usbioouts 0 4 /t100
usbioouts 0 5 /t100
usbioouts 0 6 /t100
usbioouts 0 7 /t100
goto start
サンプルプログラムダウンロード(ライブラリも含む) usbioout.zip

コマンドラインでUSB-IO2(AKI)へ出力するサンプルプログラム(USB-IO2(AKI) 複数個に同時出力に対応)

コマンドラインでUSB-IO2(AKI)へ出力できるプログラムである。
オプション指定方法
/s番号 : 出力するデバイス番号を指定
/t時間 : 出力後待機する時間をミリ秒で指定

usbio 32 64 /s1 255 1
0個目のデバイスのJ1に32(0x20)J2に64(0x40)を出力、1個目のデバイスのJ1に255(0xff)J2に1(0x01)を出力する
usbio 32 64 /t200
0個目のデバイスのJ1に32(0x20)J2に64(0x40)を出力後0.2秒待機
待機時間を使用するとバッチファイルのみで指定時間後に出力値を変化させることができる。
例えば0個目USB-IO2(AKI)のJ1の0ビットと1ビットにLEDが接続され1個目はJ2の0ビット~2ビットにアノードコモン3色LED(ビット0 青,ビット1 緑,ビット2 赤)が接続されている場合、下記のバッチファイルで0.1秒置きに色を変化させることができる。0個目は交互にLEDが点灯、1個目は白黄紫赤水緑青の順で点灯

:start
usbioouts 1 0 /s1 0 0 /t100
usbioouts 2 0 /s1 0 1 /t100
usbioouts 1 0 /s1 0 2 /t100
usbioouts 2 0 /s1 0 3 /t100
usbioouts 1 0 /s1 0 4 /t100
usbioouts 2 0 /s1 0 5 /t100
usbioouts 1 0 /s1 0 6 /t100
usbioouts 2 0 /s1 0 7 /t100
goto start
サンプルプログラムダウンロード(ライブラリも含む) usbioouts.zip

コマンドラインでUSB-IO2(AKI)から入力するサンプルプログラム(USB-IO2(AKI) 1個に対応)

コマンドラインでUSB-IO2(AKI)から入力するプログラムである。
オプションで読み込み間隔と読み込み回数を指定できます。リダイレクトすれば入力結果をファイルへ保存することができます。
オプション指定方法
/t時間 : 入力間隔をミリ秒で指定
/c回数 : 入力回数

usbioin /t100 /c100
0個目のデバイスから0.1秒置きに100回入力
J2のビット0~1にタクトスイッチを接続しプルアップ状態で交互にスイッチを押した場合の実行例を示します

usbioin /t100 /c10
USB-IO2の接続数 2個 10回,100ms
0,03,0e
1,03,0e
2,03,0d
3,03,0e
4,03,0d
5,03,0c
6,03,0d
7,03,0c
8,03,0d
9,03,0c
上記の行の最初の数値が読み込み回数、次の16進数がJ1、その次がJ2に対応しています。
サンプルプログラムダウンロード(ライブラリも含む) usbioin.zip

コマンドラインでUSB-IO2(AKI)から入力するサンプルプログラム(USB-IO2(AKI) 複数個の入力に対応)

コマンドラインでUSB-IO2(AKI)から入力するプログラムである。
オプションで読み込み間隔と読み込み回数を指定できます。リダイレクトすれば入力結果をファイルへ保存することができます。
オプション指定方法
/s番号 : 入力するデバイス番号を指定 /sが指定されない場合は0がデバイス番号となる
/t時間 : 入力間隔をミリ秒で指定
/c回数 : 入力回数

usbioin /s1 /t100 /c100
1個目のデバイスから0.1秒置きに100回入力
usbioin /t100 /c100
0個目のデバイスから0.1秒置きに100回入力
0個目のJ2のビット0~1にタクトスイッチを接続しプルアップ状態、1個目はJ1の0ビット目にタクトスイッチを接続しプルアップ状態で交互にスイッチを押した場合の実行例を示します

usbioins /s0 /s1 /t100 c10
0
USB-IO2の接続数 2個
0,0,03,0f
0,1,ff,0f
1,0,03,0f
1,1,ff,0f
2,0,03,0f
2,1,ff,0f
3,0,03,0f
3,1,ff,0f
4,0,03,0f
4,1,ff,0f
5,0,03,0f
5,1,fe,0f
6,0,03,0e
6,1,fe,0f
7,0,03,0d
7,1,ff,0f
8,0,03,0e
8,1,fe,0f
9,0,03,0d
9,1,fe,0f
上記の行の最初の数値が読み込み回数、次の数字がUSB-IO2(AKI)が何個目が表し次の16進数がJ1、その次がJ2に対応しています。
サンプルプログラムダウンロード(ライブラリも含む) usbioins.zip

GUIでUSB-IO2(AKI)をコントロールサンプルプログラム(USB-IO2(AKI) 複数個の入出力に対応)

USB-IO2(AKI)に付属のサンプルプログラム(Visual Basic)と同等の機能をC++で記述しています。
画像をクリックすると大きな画像が表示されます。
サンプルプログラムダウンロード(ライブラリも含む) usbiogui.zip