USB-IO2.0を使う

先日たまたま本屋で見て買ってきた”トランジスタ技術2013年2月号”の付録に触発されて、また電子工作したい熱に駆られ、ちょっと秋葉ブラをした際に、秋月電子でUSB-IO2.0というusbとPIOのキットを購入しました。
d0222779_2253565.jpg


このキットについて帰宅してデータを調べていたら、元はmorphy企画というグループが企画製作していたUSBIOという機器と互換機をkm2NetがUSB-IOとして製造し、そのUSB-IOもマイコンの製造中止により、USB-IO2.0となった、とのこと。

参考→http://km2net.com/shop/index.shtml


しかし、歴史がある反面、今現在入手できる情報が意外に少なく、後で後悔することに。
もう買ったのを後悔しても時既に遅し、なんとか無駄にならないようにがんばるしか有りません。一応動くところまできたので、備忘録として書いておきます。




  1. 動作テスト
    キットに付属のCDROMをPCに入れ、内容を確認。visualBASICのサンプルプログラムが付属していて、windows95SP2以上くらいならば、説明書にあるとおり専用のドライバ無しで標準のままつかえるんじゃないでしょうか。ただ、そればwindowsの場合です。


    組み込みに使うならば、巨大ソフトのwindowsなんて使いたくないという兄も多いと思います。私もその一人。windowsで扱うのは簡単だけど、応用が利かないから、ね。

    そこで、linuxです。私としては玄箱で使いたい。我が家では、初代玄箱をサーバとして使っており、これにPIOを接続すれば、外部からon/offやらインプットならのインタフェースとして、色々夢が広がりそうです。

    平日は仕事で夜遅くまで家に帰れば無い生活をしている私としては、外から家の家電の操作ができるのは便利でもあり、機械好きとして興味があります。
    その点、我が家の玄箱は外出先からsshでのログインやvpnでの接続も準備完了しているので、環境としてはそろっています。あとはこのusb-io2.0のハードを玄箱で動かすだけ。
    でも、なかなか一筋縄ではいきませんでした。




  2. 方法の検討

    RS-232Cの時代にはc(++ではない!)で色々ドライバを試行錯誤で創っていたものですが、usbというヤツはオブジェクト指向でガチガチのシロモノなもんで、様々な.dllやら.oが絡まっていて、にわかに「よし、やろう!」と思っても、スキルがないとくじけてしまいます。実際そうでした。
    幸い、先人達が残してくれた足跡が多数ありましたので、それをググって確認してみました。しかし、記事があまりにも古く、URLのlinkがことごとく消えて無くなってしまっています。これには正直困った。


    断片的な情報から、以下のように大きく二つの方法があることがわかりました。



    • USB-IO2.0のドライバをkernelに喰わせてしまう方法

      kernel自体がUSB-IO2.0をPCハードの一部として認識させ、kernel内にUSB-IO2.0のリソースを確保する。
      メリットは、もう何のアプリも無く、直接ポートをたたけばUSB-IO2.0が反応すると言うことでしょう。デメリットは、やはりkernelに細工するので敷居が多少高いことでしょうか。


      私もポートの値を変更するだけで書き込みできるこの方法を実施したいと思ったのですが、かなり以前の問題で填りました。このUSB-IO2.0が世の中に出た頃(2004年頃?)はkernel2.4系が最新だったようで、先人達足跡もkernel2.4が中心で、今のkernel2.6系のドライバも一応開発はされたようなのですが、今やURLはlink切れで配布先が閉鎖されてしまっていてドライバが入手できず、自分ではドライバを作成する技量もないので断念せざるを得ませんでした。




    • USB-IO2.0をアプリ経由で操作する方法

      USB-IO2.0のアプリを立ち上げて操作します。USB-IO2.0と情報をやりとりするために、アプリからusbのライブラリを操作することで情報をやりとりします。アプリ次第で使い勝手は左右され多少使い勝手が落ちるとは思いますが、幸い、先人達の足跡がソースで残されていたため、こちらはkernelのバージョンに依存することなく利用できそうです。


      この方法でUSB-IO2.0を使用することとします。



     
  3. 玄箱での準備
     
    まずはusb関連のモジュールをインストール。

    apt-get install libusb
    apt-get install libusb-dev
    apt-get install usbutils


    ここでusbの状態をチェック。


    lsusb

    (なにも表示されず‥‥)



    我が家の玄箱では普通にusb-hddを接続しmountして使っているので、usbのhotplugとしての設定はできているモノと思いこんでいました。しかし、USB-IO2.0を接続しても、usb-hddを接続しても、lsusbを実行してもなにも表示されずにプロンプトが返ってくるだけです。
    気持ちが悪いので調べたところ、lsusbは/proc/bus/usbの状態を読んでいるとのこと。確認すると、/proc/busの下にusbが存在していませんでした。


    私の場合は次の方法で表示するようになりました。
    /etc/fstabに以下を追記


    none /proc/bus/usb usbfs defaults 0 0


    再スタートさせると、lsusbの結果が表示されるようになりました。

    <なにも接続しない場合>

    miz-testbox:/mnt/share# lsusb
    Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub


    <USB-IO2.0を接続した場合>

    Bus 003 Device 004: ID 1352:0121
    Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub



    ベンダーidの1352と、デバイスidの0121が表示されるようになりました。これでアプリの方でデバイスの認識ができるようになりました。


  4. 動作確認
    玄箱のlinux上で認識した状態で、確認プログラムを動かします。

    http://km2net.com/usb-fsio/sample.shtml

    から、サンプルプログラムlinux_usbiofamily.zipをダウンロードします。


    コンパイルする前に、一応ソースを確認しましょう。
    私の場合、秋月バージョンなのでヘッダファイルのどこかのベンダコードとデバイス番号を変更しました(どこだったかは失念)


    コンパイルします。


    gcc -lusb -o io_test io_test.c

    問題なくコンパイルでき、USB-IO2.0のアシにテスターで測ると、期待通りの電圧が出力されていることがわかりました。



  5. 動作確認2

    テスターで測っても面白くないし面倒なので、目で見えるようにしました。
    とりあえず、セブンセグメントLEDを光らせる事にして、ソースをちょっと追加させて貰いました。(引数をGPIOに出力するだけ)



     /*----------------------------*/
     /* USB-IO Family TEST */
     /*----------------------------*/

      #include
      #include
      #include
      #include "usbiofamily.h"

      int main(int argc, char **argv)
      {
      int ret;
      int dat;
      int hikisuu;
     
      struct usb_bus *bus;
      struct usb_device *dev;
      usb_dev_handle *udev;
     
      unsigned char sendData[64];
      unsigned char recvData[64];
     
      if(argc<2){printf("hikisuu wo ireru!\n");exit(-1);}
      hikisuu=strtol(argv[1],NULL,0);
      printf("hikisuu=%d\n",hikisuu);
     
     
      /*-------------*/
      /* Device Open */
      /*-------------*/
      bus=io_init();
      dev=io_find(bus,dev);
      if( dev==NULL ){
      puts("io_find NG");
      exit(1);
      }
     
      udev=io_open (dev);
      if( udev==NULL ){
      puts("io_open NG");
      exit(2);
      }
     
      /*------------------------*/
      /* Port 1,2 in_out */
      /*------------------------*/
      memset(sendData, 0, sizeof(sendData));
      sendData[0] = 0x20; //in out
      sendData[1] = 0x01; //port1
      sendData[2] = hikisuu; //out
      sendData[3] = 0x02; //port2
      sendData[4] = 0x07; //out 0x07
      io_send_recv(udev,sendData,recvData);
      printf("in:P1(%x),P2(%x) out:P1(%x),P2(%x)\n"
      ,recvData[1],recvData[2], sendData[2],sendData[4]);
     
      /*------------------------*/
      /* channel 1, 2 Analog input */
      /*------------------------*/
      memset(sendData, 0, sizeof(sendData));
      sendData[0] = 0x2A; //Analog input
      sendData[1] = 0x01; //channel 1
      sendData[4] = 0x02; //channel 2
      io_send_recv(udev,sendData,recvData);

      /*---------------------*/
      /* Device Close & Exit */
      /*---------------------*/
      io_close(udev);
     
      exit(0);
     }
     



    回路は、参考のdipスイッチの部分をそのままGPIO0~3に接続すればok。
    下4ビットをセブンセグメントに接続し、数字が変わることを確認します。


    d0222779_2192091.jpg





    <参考>
    http://www.narimatsu.net/nari_page/musbio.html
    http://www.rlc.gr.jp/prototype/led/seg7led/drive/drive.htm
    [PR]
    by tkn384 | 2014-06-08 02:32 | 玄箱


今の好きなことは、暇な時いじる玄箱とか家電とか


by tkn384

プロフィールを見る
画像一覧

カテゴリ

全体
家電
玄箱
電子工作
Raspberry Pi
未分類

以前の記事

2014年 09月
2014年 08月
2014年 07月
2014年 06月
2014年 03月
2013年 08月
2012年 05月
2011年 05月
2011年 04月
2011年 03月
2011年 02月

フォロー中のブログ

メモ帳

最新のトラックバック

ライフログ

検索

タグ

その他のジャンル

ブログパーツ

最新の記事

玄箱サーバ死亡
at 2014-09-23 16:39
初代玄箱USB増設
at 2014-08-31 14:05
RaspberryPiのバッ..
at 2014-07-21 23:31
Windows7とWindo..
at 2014-07-20 12:16
Windows7のPCを買い..
at 2014-07-06 01:48

外部リンク

ファン

記事ランキング

ブログジャンル

ネット・IT技術

画像一覧