USB-IO Rubyでデータ入力

『手作りUSB機器』に載っている USB-IO をスクリプト言語 Ruby で制御するスクリプトを書き、データ入力を行うことができた。
画像

動作環境


  • Windows XP
  • テクノキット 汎用USB-I/Oキット USBIOV8/K
  • 抵抗 4.7KΩ(抵抗値はいいかげん。不要かも)
  • USBケーブル(ストレート)
  • ruby-1.8.6-p111-i386-mswin32
  • vbausbio.dll

準備


以下を用意しておく。

以下を実行しておく

  • ruby-1.8.6-p111-i386-mswin32.zip の展開
  • 制御用のスクリプトを置くディレクトリに vbausbio.dll を置く
  • コマンドプロンプト(DOS窓)で制御用のスクリプトを置くディレクトリに移動(例: cd c:\tmp)

スクリプトの作成


ActiveBasic を用いた制御で使った bas_vbausbio.bas に書いてある入力関数の定義は、以下のようになっていた。
Declare Function uio_inp Lib "vbausbio.dll" (ByRef InpDat As Byte, ByVal Port As Long, ByVal p3 As Long) As Long

そこで、以下のようなスクリプトを書いた。

require 'dl/import'

module USB_IO
  extend DL::Importable
  dlload "vbausbio.dll"
  extern "long uio_out(long, long, long)"
  extern "long uio_inp(char ref, long, long)"

  module_function
  def out(port, data, p3)
    uio_out(port, data, p3)
  end
  def inp(port, p3)
    dummy = 0
    if uio_inp(dummy, port, p3) != 0
      raise "can't get data from port"
    end
    return @args[0]
  end
end

port = 0
USB_IO.out(port, 0xff, 0)
printf "%02x", USB_IO.inp(port, 0)

「USB_IO.out(port, 0xff, 0)」とデータを出力しているのは、『手作りUSB機器』の54ページに
「データ入力を行う場合、その端子に前もって「1」を出力しておく必要がある」という記述が
あったからである。

88ページのコードを見る限り、入力のたびに出力する必要はなく、
最初に一度出力するだけで良いのかもしれない。

動作確認


ポート P00 を以下のどちらかの状態にする。

  • GND に接続
  • 抵抗 4.7KΩ経由で基板の VCC に接続

その後、スクリプトを以下のように実行する。

> D:\tmp\soft\ruby-1.8.6-p111-i386-mswin32\bin\ruby.exe test.rb

GND にした場合は、「fe」と出力される。
VCC にした場合は、「ff」と出力される。
オープンにした場合は「ff」と出力される。

まとめ


  • USB-IO をスクリプト言語 Ruby で制御するスクリプトを書き、データ入力を行うことができた。
  • dl モジュールで引数のポインタに値を返す関数の場合どう書けば良いか分からず、多少手間取ってしまった。
  • オープンは(良くないのかもしれないが)、「1」が返ってくるようだ(直前に「1」を出力しているからかもしれない)
  • 「データ入力を行う場合、その端子に前もって「1」を出力しておく必要がある」らしいが、毎入力の前に必要というより、最初に一度出力しておけば良いのかもしれない。

この記事へのコメント

この記事へのトラックバック

  • 「USB-IO Rubyでデータ入力」について

    Excerpt: 「USB-IO Rubyでデータ入力」について uio_inpのruby版について、 最初に教えてもらったスクリプトで試しましたが駄目でしたと 回答するつもりでしたが、この記事のスクリプトをそのま.. Weblog: 電子工作で悪あがき(仮) racked: 2008-02-12 17:06