USB-IO IVBでシーケンサを作る  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ver 0.1 2009年8月21日(金) 江端智一 E-mail:See http://www.kobore.net/mailAddress.gif http://www.kobore.net/  言うまでもありませんが、本文章は 無保証です。この文章の影響によりどの ような事が起ころうとも当方は一切の責任を持ちません。 0.変更履歴  ̄ ̄ ̄ ̄ ̄ ver 0.1 2009年8月21日(金) - USB-IOのプログラムを忘れない内にメモ 1.目的  ̄ ̄ ̄ 「必要な時に、必要なものがない」 ある実験で、複数のAC電源のON/OFFを遠隔でコントロールする必要が 生じたのですが、3ヶ月前の私であれば、山のような実験機材を持ち合 わせていました。 資材管理が面倒くさくなり、全品廃棄処分して、せいせいしたところ に実験の必要に迫られることになりました。 我が家には、X10のコントローラが山ほどあるのですが、会社のよう に多系統の電力線では、X10信号が上手く転送されないようです。 2年程前に購入だけして、一度も使ったことのない、USB-IO(IVB2)を 取り出して、このIO信号でリレーを駆動させることにしました。 リレーは、秋月のSSRを組み立てたものが、自宅に5台程ありましたの で、これを使うことにしました。 http://www.technokit.biz/usb_io_kiban/usb_iov8.html 2.方針  ̄ ̄ ̄ 「IOのON/OFF(1/0)制御ができれば、手段は問わない」とし、私の利 用実績の高い、Visual C++ Version 6で動かすこととしました。 当初ドライバから自作しようとしたのですが、難しそうでしたので、 DLLを探してくることにしました。 3.実施内容  ̄ ̄ ̄ ̄ ̄ 「(合)モルフィー企画社製 USB-IO専用 DLL 3.6 Demo版」の、 http://www.geocities.jp/m_m_m_ishi/usbiodlldemo.htmの usbiodlldemo.zipをダウンロードして、 「Visual C++ 使い方(Demo版)」にある通りを実施しました。 以下「 有限会社 三石印房殿」の文章を、そのまま転載。 -------- 転載ここから -------------- Visual C++ 使い方(Demo版): C++ 関数の準備 --------------------------------------------------------------- 手順その1...プロジェクト新規作成(これは問題ないかと思いますが) ---------------------------------------------------------------- 手順その2...「USBIO DLL Demo」がインストールされているフォルダを エクスプローラで開く 例 C:\Program Files\USBIO DLL Demo ---------------------------------------------------------------- 手順その3...このフォルダにある2つのファイルをプロジェクト新規作 成したフォルダにコピーする USBIODLLDemo.h USBIODLLDemo.lib ---------------------------------------------------------------- 手順その4...手順その3でコピーしておいた「USBIODLLDemo.h」と 「USBIODLLDemo.lib」をプロジェクトの中に追加する(既存項目の追加) ----------------------------------------------------------------- 手順その5...手順その3でコピーしておいたUSBIODLLDemo.hを開き4行 すべてをコピーしてから、プロジェクトの中のヘッダーファイルの 「stdafx.h」にペーストし追加する (江端は、メインプログラムに追加した) ----------------------------------------------------------------- ■これで設定するべき作業は終わりました。用意された4つの関数は使 えるようになります。 ●GetNo 関数 ----------------------------------------------------------------- BYTE No; No = GetNo(); ----------------------------------------------------------------- 変数"No"が"0"だったら失敗、"1"以上だったら成功 この関数が成功しなければ下記のI/O関数は動きません。 ●P1Write 関数 バイト単位で書き込みます ----------------------------------------------------------------- P1Write(0x0); | P1Write(0xF); ----------------------------------------------------------------- ●P1Read 関数 バイト単位で読み込みます ----------------------------------------------------------------- BYTE No; No = P1Read(); ----------------------------------------------------------------- ●P1WriteBit関数 ビット単位で書き込みます ----------------------------------------------------------------- ----------------------------------------------------------------- BYTE = P1WriteBit(0, 0) | BYTE = P1WriteBit(3, 0) BYTE = P1WriteBit(0, 1) | BYTE = P1WriteBit(3, 1) ----------------------------------------------------------------- ご注意: ●どなたも「USBIO DLL Demo 3.6」のサポートが受けられます。 ●「USBIO DLL Demo 3.6」をインストールできるのは一個の記憶装置に かぎる事なくフリーです。 ●「USBIO DLL Demo 3.6」に含まれている「USBIODemo.DLL ダイナミッッ ク リンク ライブラリ」は再配布できますがそれ以外のファイルは圧縮 などいかなる方法でも再配布ができません。 ●「USBIO DLL Demo 3.6」に含まれるいかなるファイルの著作権の削除 や変更はできません。 ●USBIODLLDemo.DLLの改造はしないでください。 -------- 転載ここまで -------------- 私の環境では、USBIODLLDemo.h でエラーが生じたので、以下のように 書き替えました(色々やったけど、結局"BYTE"を"unsigned char"に、 "BOOL"を"int"にしただけ) ========================================================== __declspec(dllimport) unsigned char __stdcall GetNo(void); __declspec(dllimport) void __stdcall P1Write(unsigned char newVal); __declspec(dllimport) unsigned char __stdcall P1WriteBit(unsigned char Bit, int Tf01); __declspec(dllimport) unsigned char __stdcall P1Read(void); // __declspec(dllimport) unsigned char __stdcall GetNo(void); //void __declspec(dllimport) P1Write(unsigned char newVal); //int __declspec(dllimport) P1WriteBit(unsigned char Bit, bool Tf01); //unsigned char __declspec(dllimport) P1Read(void); ========================================================== usb_test というWindowsコンソールアプリのプロジェクトを作り (C:\code\usbiodlldemo\usbio_test)、そこに"USBIODLLDemo.dll"と、 "USBIODLLDemo.lib"と、"USBIODLLDemo.h"を放り混みました。 "USBIODLLDemo.lib"は、[プロジェクト]→[設定]→[リンク]→[オブジェ クト・ライブラリモジュール]の先頭に加えました。 メインプログラム(usb_test.cpp)は、この程度 ============================================================ // usbio_test.cpp : コンソール アプリケーション用のエントリ ポイントの定義 // #include "stdafx.h" #include "USBIODLLDemo.h" void inputError() { printf("Input error\n"); printf("usbio_test [Port0] [Port1] [Port2] [Port3] \n"); printf("Example:\n"); printf(" usbio 1 0 1 1 (Port1のみをOffにする) \n"); printf(" usbio 1 0 0 0 (Port0のみをOnにする) \n"); } int main(int argc, char* argv[]) { if (argc != 5) { inputError(); return (1); } int port[4]; sscanf(argv[1],"%d",&port[0]); sscanf(argv[2],"%d",&port[1]); sscanf(argv[3],"%d",&port[2]); sscanf(argv[4],"%d",&port[3]); for(int i = 0; i < 4; i++){ if ((port[i] < 0) || port[i] > 1){ inputError(); return (1); } } int sum = port[0] * 1 + port[1] * 2 + port[2] * 4 + port[3] * 8; if (GetNo() == 0){ printf("USBIOの起動に失敗しました。\n"); } P1Write(sum); return 0; } ============================================================ 4.その他  ̄ ̄ ̄ ̄ ̄ LEDの点滅で動作を確認しました。 取り敢えず4ポートは自由に使えるので、問題はありません。 このAPIのシンプルさ、数の少さが、良いです。 DLLのソースを開示して頂けたら、本当はもっと嬉しいです。 ビルドで結構しんどい思いをしましたので。 以上