C#によるHIDコントロール【USB接続デジタル入出力モジュール USB-IO2.0(AKI)】

これまでHIDにアクセスする為のコードを紹介してきましたが、秋月電子通商で販売している『USB接続デジタル入出力モジュール USB-IO2.0(AKI)』を例に全てのコードをまとめたプロジェクトファイルがこちらです。

ZIPUSB接続デジタル入出力モジュール USB-IO2.0(AKI)

この秋月電子通商のキットには、CD-ROMが付属しており、Visual Basicによるサンプルコードが付属しています。ただ、このサンプルコードはあまり抽象化されておらず、汎用的に活用することが難しいものとなっています。また、Visual Basicの場合、Win32 APIへのMarshalingがとにかく遅い。CLRレベルまで調べていないので理由はわかりませんが、HIDにアクセスする上で必要と思われるクラスを全てC#で書き直しました。(私自身がVisual Basicが苦手ということもあります。)

実行すると、こんな感じのものが表示されます。
USBIO20

今回公開したコードには一つだけ注意点があります。この秋月のキットはPIC 18F45K50を使用していることもあり、ポート毎に割り込みを発生させることが出来ません。ポートステータスを確認し続け、ステータスが変化したらイベントを発生させることも可能ですが、このキットの18F45K50に書き込まれているプログラムはそれを行っていません。もしかしたら、PICのマイコンは出力と入力のステータスを共有していることに関係があるかもしれません。というのも、PICはポートのステータスをピンから読み込みます。その為、低い電圧の素子を繋いでいたりすると、常に値が’0’になってしまいます。そのため、常にステータスを確認し続け…という実装をしても、機能しない場合が出てきます。

そこで今回公開したコードは、タイマーを使用してポートステータスをポーリングしています。タイマーの割り込み感覚を短くすれば、ステータスの変化を早く知る事が出来る一方で、USBバスへの負荷が増します。逆に長くすればUSBバスへの負荷は減りますが、ポートのステータスが変化してから、それを検知するまでの時間が長くなります。用途に応じて感覚を変えて使用してください。

このようなちょっとした注意点はありますが、USB経由で外部のスイッチをオン・オフしたり、状態を取得したりが簡単にできるのは便利です。とにかく、この基板は小さいですから。限られた用途には十分かと思います。

より複雑なことをしたい場合は、AVR ATmegaなどで作った方が制約が少なく、良いのではと思います。以前ならすぐ自分で作っていましたが、最近はそんな気力もなく、秋月とかでキットだしてくれたらいいなあ、と思うのでした。

「C#によるHIDコントロール【USB接続デジタル入出力モジュール USB-IO2.0(AKI)】」への7件のフィードバック

  1. USB接続デジタル入出力モジュール USB-IO2.0(AKI)
    便利に使わせていただいています。
    J1:8bit,J2:4bitの間違いではないでしょうか?

  2. ちょいテクおやじ

    お知らせありがとうございます。ご指摘の通りJ1とJ2が逆になっていました。
    基本的、且つわかりやすいところを間違え、恥ずかしい限りです。早めに修正したいと思います。

  3. 例えば、usbio20.csのLoadConfigurationメソッドで、
    rgbSend[1]=0xf8;
    と、コマンドを設定されていますが、
    なぜ配列の二つ目の要素に格納されているのでしょうか。

  4. ちょいテックおやじ

    すっかり返信が遅くなりすいません。
    2バイト目に格納しているのは、このボードの仕様が2バイト目をコマンドとして認識するようになっている為です。ボードに付属しているサンプルVBコードでは、送信時に先頭に1バイト挿入しています。なぜそのような仕様になっているかは、ちょっとわかりません。

  5.  かなり遅ればせながら、自分のジャンク箱にこのキットを発見し、VBをうんうん言いながらC#に移植していました。marshal何とかやHID_何とかをいじりながら、何か決定的に間違っている、と思い始めた時にようやくこちらにサルベージして頂きました。
     どうもありがとうございます。
     現時点の環境はVS2017Express, C#7.2 on .Net4.8です。コンパイル後、本体を繋がずに実行すると例外になりますが、簡単に回避できました。

  6. 1年前に秋月デジタルIOを入手してました。
    こちらのC#プログラムを使わせてもらい、C#の勉強もさせていただきました。
    J1 8bit、J2 4bitへの改造もボタンの追加と削除、EVENTの書き換え、配列数変更等でうまく動きました。
    貴重な情報を有難うございます。

コメントする

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