これまでHIDにアクセスする為のコードを紹介してきましたが、秋月電子通商で販売している『USB接続デジタル入出力モジュール USB-IO2.0(AKI)』を例に全てのコードをまとめたプロジェクトファイルがこちらです。
USB接続デジタル入出力モジュール USB-IO2.0(AKI)
この秋月電子通商のキットには、CD-ROMが付属しており、Visual Basicによるサンプルコードが付属しています。ただ、このサンプルコードはあまり抽象化されておらず、汎用的に活用することが難しいものとなっています。また、Visual Basicの場合、Win32 APIへのMarshalingがとにかく遅い。CLRレベルまで調べていないので理由はわかりませんが、HIDにアクセスする上で必要と思われるクラスを全てC#で書き直しました。(私自身がVisual Basicが苦手ということもあります。)
今回公開したコードには一つだけ注意点があります。この秋月のキットはPIC 18F45K50を使用していることもあり、ポート毎に割り込みを発生させることが出来ません。ポートステータスを確認し続け、ステータスが変化したらイベントを発生させることも可能ですが、このキットの18F45K50に書き込まれているプログラムはそれを行っていません。もしかしたら、PICのマイコンは出力と入力のステータスを共有していることに関係があるかもしれません。というのも、PICはポートのステータスをピンから読み込みます。その為、低い電圧の素子を繋いでいたりすると、常に値が’0’になってしまいます。そのため、常にステータスを確認し続け…という実装をしても、機能しない場合が出てきます。
そこで今回公開したコードは、タイマーを使用してポートステータスをポーリングしています。タイマーの割り込み感覚を短くすれば、ステータスの変化を早く知る事が出来る一方で、USBバスへの負荷が増します。逆に長くすればUSBバスへの負荷は減りますが、ポートのステータスが変化してから、それを検知するまでの時間が長くなります。用途に応じて感覚を変えて使用してください。
このようなちょっとした注意点はありますが、USB経由で外部のスイッチをオン・オフしたり、状態を取得したりが簡単にできるのは便利です。とにかく、この基板は小さいですから。限られた用途には十分かと思います。
より複雑なことをしたい場合は、AVR ATmegaなどで作った方が制約が少なく、良いのではと思います。以前ならすぐ自分で作っていましたが、最近はそんな気力もなく、秋月とかでキットだしてくれたらいいなあ、と思うのでした。
USB接続デジタル入出力モジュール USB-IO2.0(AKI)
便利に使わせていただいています。
J1:8bit,J2:4bitの間違いではないでしょうか?
お知らせありがとうございます。ご指摘の通りJ1とJ2が逆になっていました。
基本的、且つわかりやすいところを間違え、恥ずかしい限りです。早めに修正したいと思います。
例えば、usbio20.csのLoadConfigurationメソッドで、
rgbSend[1]=0xf8;
と、コマンドを設定されていますが、
なぜ配列の二つ目の要素に格納されているのでしょうか。
すっかり返信が遅くなりすいません。
2バイト目に格納しているのは、このボードの仕様が2バイト目をコマンドとして認識するようになっている為です。ボードに付属しているサンプルVBコードでは、送信時に先頭に1バイト挿入しています。なぜそのような仕様になっているかは、ちょっとわかりません。
複雑すぎる。
かなり遅ればせながら、自分のジャンク箱にこのキットを発見し、VBをうんうん言いながらC#に移植していました。marshal何とかやHID_何とかをいじりながら、何か決定的に間違っている、と思い始めた時にようやくこちらにサルベージして頂きました。
どうもありがとうございます。
現時点の環境はVS2017Express, C#7.2 on .Net4.8です。コンパイル後、本体を繋がずに実行すると例外になりますが、簡単に回避できました。
1年前に秋月デジタルIOを入手してました。
こちらのC#プログラムを使わせてもらい、C#の勉強もさせていただきました。
J1 8bit、J2 4bitへの改造もボタンの追加と削除、EVENTの書き換え、配列数変更等でうまく動きました。
貴重な情報を有難うございます。