USB-IO 32x16ドットLEDマトリクス接続

USB-IOに秋月の32x16ドットLEDマトリクス表示装置パーツセットを接続してみた。
ruby スクリプトで簡単な動作テストをした。

「32x16ドットLEDマトリクス表示装置パーツセット」の型番は不明である。
「16x32ドット赤LEDモジュール基板シリアルドライブIC付きAD-501-B」というものとは別物である。

AD-501-Bが700円なのに、「32x16ドットLEDマトリクス表示装置パーツセット」は
2950円となぜかちょっと高い。

動作環境



  • Windows XP
  • テクノキット 汎用USB-I/Oキット USBIOV8/K
  • 秋月「32x16ドットLEDマトリクス表示装置パーツセット」
  • 抵抗390Ω 2本(キット付属)
  • 5x2のピンヘッダ 2個(キット付属)
  • 5x2のピンソケット 2個(キット付属)
  • 26Pフラットケーブルコネクタ
  • ジュンフロン線
  • 基板
  • 26P フラットケーブル
  • USBケーブル(ストレート)
  • 5V 800mAのACアダプタ(手近にあったもの)
  • ruby 1.8.4 mswin32
  • vbausbio.dll


回路作成


LEDマトリクス表示装置パーツセットの作成


説明書に「R3, 4に抵抗を」という記述があったが、部品表や他の箇所より間違いと判断し、
基板の表の R2, R3 にジャンパーを基板の裏の R4, R5 に抵抗を接続した。

説明書には、基板にはピンヘッダ、ピンソケットの好きなほうを接続するよう書いてあった。
接続用の基板を複数作る可能性があるので、値段の高いと思われるピンソケットの方を
LEDマトリクス基板につけることにした。
画像:LEDマトリクス表示装置


接続基板の作成


以下のようなUSB-IOとの接続基板を作った。
CN1A, CN1B はまったく同じらしいのだが、電流供給のため LED_PWRは
2箇所以上接続するように書いてあったので、その通りにした。

電源・グランドは、ACアダプタから供給する。
今回は800mAのACアダプタを使用したが、説明書には最大1Aの電源が必要と書いてあった。

なんだかんだで、作成に2時間くらいかかってしまった。

  • CN1A 1. LED_PWR → Vcc
  • CN1A 2. SIN 1 → USB-IO P00
  • CN1A 3. SIN 2 → USB-IO P01
  • CN1A 4. SIN 3 → USB-IO P02
  • CN1A 5. CLOCK → USB-IO P03
  • CN1A 6. LATCH → USB-IO P04
  • CN1A 7. STROBE → USB-IO P05
  • CN1A 8. IC_PWR → Vcc
  • CN1A 9. GND → GND
  • CN1A 10. GND → GND
  • CN1B 1. LED_PWR → Vcc
  • CN1B 9. GND → GND
  • CN1B 10. GND → GND
  • GND → USB-IO GND

画像:USB-IOとの接続基板


動作確認スクリプト(LATCH信号 間違い入り)


動作の説明やタイミングチャート、LEDの配置図など、
説明書にはかなり親切な説明が書いてあった。

Ruby というスクリプト言語で以下のような動作確認用のプログラムを書いてみた。
SIN1 が縦データ入力で、SIN2, SIN3 がそれぞれ左・右LEDの横データとなっており、
シリアルでデータを送る。
「ABで汎用USB-IO(VBA用の専用DLL使用)」の vbausbio.dll をカレントディレクトリに置いて実行する。

# LATCH信号 間違い入り

require 'dl/import'

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

def led_out(sin1, sin2, sin3)
out = (sin1 == 1) ? 1 : 0
out |= (sin2 == 1) ? 1 << 1 : 0
out |= (sin3 == 1) ? 1 << 2 : 0
USB_IO.uio_out(0, out, 0)

out |= (1 << 3)
USB_IO.uio_out(0, out, 0)
end

led_out(1, 0, 1) # D15
led_out(0, 0, 0) # D14
led_out(0, 0, 1) # D13
led_out(0, 0, 1) # D12
11.downto(2) do |i|
led_out(0, 0, 0) # D11-2
end
led_out(0, 1, 0) # D1
led_out(0, 1, 0) # D0


説明書にあった信号例・点灯例と同じように点灯するようにしてみた。
はじめ最上位の横一列でない列が点灯したが、基板をいじったり、電源を入れなおしたら
意図どおり、最上位の横一列が点灯した。
画像:最上位列LED点灯中


いろいろ試しているうちに、どうやら基板の接触などが悪いのではなく、
信号の出し方が間違っていることに気がついた。
最上位の横一列が点灯するはずなのに、以下のように別の列が点灯することがあった。
画像:LED点灯中


動作確認スクリプト(LATCH信号 間違い修正)


結局、LATCH信号の出力の仕方が間違っていることが分かった。
SIN1, SIN2, SIN3 に信号を入れているときには、LATCH を 1にしておき、
信号入力後 LATCH を 0 にする必要があるらしいことが分かった。
ずーと LATCH を 0 にしておけば、突き抜けてそのまま出力されて大丈夫だと
思ったのだが、そうではなかったらしい。

以下のようにスクリプトを変更した。
これにより常に、最上位列が点灯するようになった。

CLOCK = 1 << 3

require 'dl/import'

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

def led_out(sin1, sin2, sin3)
out = 1 << 4 # LATCH 1
out |= (sin1 == 1) ? 1 : 0
out |= (sin2 == 1) ? 1 << 1 : 0
out |= (sin3 == 1) ? 1 << 2 : 0
USB_IO.uio_out(0, out, 0)

out |= CLOCK
USB_IO.uio_out(0, out, 0)
end

led_out(1, 0, 1) # D15
led_out(0, 0, 0) # D14
led_out(0, 0, 1) # D13
led_out(0, 0, 1) # D12
11.downto(2) do |i|
led_out(0, 0, 0) # D11-2
end
led_out(0, 1, 0) # D1
led_out(0, 1, 0) # D0

USB_IO.uio_out(0, CLOCK, 0) # LATCH 0


動作確認スクリプト 文字を表示できるように?


配列で表示データを指定できるようなスクリプトも書いてみた。
これを実行してみると、マトリックス全部を書き換えるのに2秒近くかかってしまい
実用的な表示器とならないことが分かった。
スクリプトの実行が遅いのか?USB-IOの出力が遅いのか?は不明である。

1出力(USB_IO.uio_out())あたり、2秒/(16*(2*16+1)) = 3.8[ms]くらいとなっているようである。

その後、なんか遅いなあと思って検索してみたところ、『手作りUSB機器』に
速度の記述があるらしいことが分かった。
確かに、92ページに出力は4ミリ秒(実測)という記述があった。

X1 = [
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
]

X2 = [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
]

CLOCK = 1 << 3
LATCH = 1 << 4

require 'dl/import'

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

def led_out(sin1, sin2, sin3)
out = LATCH # LATCH 1
out |= (sin1 == 1) ? 1 : 0
out |= (sin2 == 1) ? 1 << 1 : 0
out |= (sin3 == 1) ? 1 << 2 : 0
USB_IO.uio_out(0, out, 0)

out |= CLOCK
USB_IO.uio_out(0, out, 0)
end

def led_out_ary(led1, led2)
while true
15.downto(0) do |sin1_i|
15.downto(0) do |sin23|
led_out((sin1_i == sin23) ? 1 : 0,
led1[15 - sin1_i][sin23],
led2[15 - sin1_i][sin23])
end
USB_IO.uio_out(0, CLOCK, 0) # LATCH 0
end
end
end

led_out_ary(X1, X2)


まとめ



  • USB-IOに秋月の32x16ドットLEDマトリクス表示装置パーツセットを接続し、ruby スクリプトで簡単な動作テストをした。
  • マトリックス全部を書き換えるのに2秒近くかかってしまうことが分かった。スクリプトの実行が遅いのか?USB-IOの出力が遅いのか?は不明である。
  • USB-IOは結構遅く、出力に4ミリ秒、入力に16ミリ秒くらいかかるらしい。

この記事へのコメント

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