USB経由でオン・オフ状態を取得

外部のスイッチ状態(オン・オフ)を取得したり、外部のリレーを簡単に設定する簡単な方法を探していたのですが、中々良いものが見つからず。また、自分で作るか。HIDブートローダもあり、サンプルプログラムもメーカーから提供されているMicrochip社のPIC18F14K50でも使って作ることを考えたのですが、なんか面倒くさい。(PICKit2を友人に譲り、PICKit3買ってからほとんど使ってない。)

そこで、何か簡単にできる方法は…と探していたところ見つけたのが秋月電子の「USB接続デジタル入出力モジュール USB-IO2.0

no title

なぜこんな物を探していたかというと、ちょっと人に頼まれて電鍵とPCを繋いで、モールス練習ソフトなんか作れない?と。ベテランの自己診断にも使えるようなものをと頼まれまして。このプログラムについては、そのうち公開できればと思います。似たようなものを作られている方もいるのですが、より簡単に誰にでもということで、これが丁度良いとの結論に。
 

先日裸で使っていた基板をショートさせて壊したばかりなので、少し前に余分に共立エレショップで買ったケース(W45xH25xD90)があったので、これに穴をあけて、接着式基板スタンドを貼って取りあえず取り付けました。ステレオミニジャックをつけて、挿せば使える状態に。取りあえずこんな感じに。かなり手抜きしてますが、ま、そこは。

ケースケースとパーツ

このキットには、長方形の変形ミニCDが付属しています。このCDには、Visual Basicで書かれたサンプルプログラムが入っていて、このプログラムを実行するとこんな画面が表示されます。

0サンプル

Windows 8.1 x64版を使っているのですが、なぜかそのままでは動作せず。色々試したところ、x86(32ビット)版であれば動く事を確認。実効するとこんな画面が表示されます。IOの設定とステータスの取得ができるようです。取り敢えず電鍵につないで動作させてみます。R0とR1に接続しているので、電鍵を操作するとグリーンのボタンの色が変化。しかし、なんか遅い。亀のような。

コードを見てみると、タイマーでループさせてステータスを取得しているだけのようです。取得間隔を短くしても機敏に動作してくれません。コンパイルして生成されるCLRの最適化に差があるのか、通常C#の方が似たコードを実行してもかなり早いので、C#で書き直すことにしました。

ん?よく見ると、このキットはPIC18F14K50を使っているんですね。ということは、書き換えればステータスが変化した場合に通知するようにすることも可能ということかな?ま、それは時間に余裕があるときに考えよう。

C#で書き直すにあたって、HID用に汎用的に使えるクラスを作ってしまいますかね。

マネージド・コードからWin32のネイティブコードを使用する事って結構あるのだけど(Win32 APIでしかできないことが色々とある)、都度Stubを書かないといけないのは結構面倒くさい。Windows 8.1ではUSBデバイスの為のクラスが追加されているので、それを使えば簡単に出来そうですが、まずはデスクトップアプリとして作ってみます。

まずは下準備としてWin32 APIへのStubコード。これで、C#から簡単にWin32 APIを使用することが出来ます。

  [StructLayout(LayoutKind.Sequential, Pack = 1)]

コードの中にこのように書いてある行がありますが、これは定義される構造体のアライメントが1バイト単位となるようにするものです。これを入れておかないと、32ビット、64ビットなどにアラインされてしまいます。
ZIP

今日はちょっと時間切れ。続きはまた次回に。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です