パラレルポート接続の32x16ドットLEDマトリクスで東雲フォントを縦書き表示

パラレルポート接続の32x16ドットLEDマトリクスで東雲フォントを縦書き表示できるようにしてみた。

画像


動作環境

  • Windows XP
  • 秋月「32x16ドットLEDマトリクス表示装置パーツセット」
  • 自作 接続ボード
  • RS-232C ケーブル(ストレート全結線) ELECOM C232N-2515
  • 5V 1AのACアダプタ(H8 キット付属のもの)
  • 電源・グランド接続用ミノムシクリップ
  • ruby-1.8.7-p72-i386-mswin32
  • パラレルポートドライバ Inpout32.dll
  • 東雲フォント

準備


まず、以下を用意しておく

以下を実行しておく
  • ruby-1.8.7-p72-i386-mswin32.zip を展開する
  • inpout32_source_and_bins.zip を展開する
  • スクリプトを置くディレクトリに binaries\Dll\inpout32.dll を置く
  • コマンドプロンプト(DOS窓)でスクリプトを置くディレクトリに移動する(例: cd c:\tmp)
  • shinonome-0.9.11-src.tar.bz2 を展開する


ruby スクリプト作成


以下のようなスクリプトを作成した。

require 'optparse'
require 'dl/import'
require 'kconv'
#require 'pp'
require 'set'

FONT_DIR = 'C:\tmp\scripts\Inpout32_32x16LED\shinonome-0.9.11-src\16'

FONT_LIST = [
# '\hankaku\font_src_diff.bit',
'\latin1\font_src.bit',
'\kanjic\font_src.bit',
# '\mincho\font_src_diff.bit',
].map {|x| FONT_DIR + x }

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

USAGE = "ruby parallel_32x16led_font_v.rb [-h] [-n NUM]"
PARALLEL_PORT = 0x378

$opt_n = 5

ARGV.options {|opt|
opt.on('-h', '--help', 'show this message') { puts USAGE; exit 0 }
opt.on('-n=NUM' , 'speed (default: 5)') { |x| $opt_n = x.to_i }

opt.parse!
}

module ParallelPort
extend DL::Importable
dlload "inpout32.dll"
extern "int Out32(int, int)"
end

def sjis_to_jis_code(c)
jstr = c.tojis
(jstr[3] << 8) + jstr[4]
end

def char_code_list(mes)
ret = Set.new

mes.scan(/./s).each do |c|
if c.size == 1
ret.add(c[0])
else
ret.add(sjis_to_jis_code(c))
end
end

return ret
end

def read_font(file_list, char_code_list)
ret = {}

file_list.each do |f|
mode = :START

code = nil
bitmap = []
File.foreach(f) do |line|
if /ENCODING\s+(\d+)/ =~ line
code = $1.to_i
if char_code_list.include?(code)
mode = :IN
end
elsif mode == :IN && /BITMAP/ =~ line
mode = :BITMAP
bitmap = []
elsif mode == :BITMAP && /ENDCHAR/ =~ line
mode = :START
ret[code] = bitmap.transpose.reverse
elsif mode == :BITMAP
data = line.chomp.split(//).map {|x| x == "." ? 0 : 1 }
data.concat([0, 0, 0, 0, 0, 0, 0, 0]) if data.size == 8
bitmap.push data
end
end
end

return ret
end

def bitmap_ary(font_info, mes)
ret = []

mes.scan(/./s).each do |c|
if c.size == 1
code = c[0]
else
code = sjis_to_jis_code(c)
end

unless font_info.key?(code)
puts "Not Found Font '#{c}' Info!!"
next
end

if ret.empty?
ret = font_info[code]
else
ret.each_with_index do |x, i|
x.concat font_info[code][i]
end
end
end

return ret
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
ParallelPort.out32(PARALLEL_PORT, out)

out |= CLOCK
ParallelPort.out32(PARALLEL_PORT, out)
end

def led_out_ary(led)
while true
led[0].size.times do |x|
$opt_n.times do
15.downto(0) do |sin1_i|
15.downto(0) do |sin23|
led_out((sin1_i == sin23) ? 1 : 0,
(x + sin23 < led[15 - sin1_i].size) ?
led[15 - sin1_i][x + sin23] :
led[15 - sin1_i][x + sin23 - led[15 - sin1_i].size],
(x + sin23 + 16 < led[15 - sin1_i].size) ?
led[15 - sin1_i][x + sin23 + 16] :
led[15 - sin1_i][x + sin23 + 16 - led[15 - sin1_i].size])
end
ParallelPort.out32(PARALLEL_PORT, CLOCK) # LATCH 0
end
end
end
end
end

def scroll_mes(mes)
char_code_list = char_code_list(mes)

font_info = read_font(FONT_LIST, char_code_list)

bitmap_ary = bitmap_ary(font_info, mes)
#pp bitmap_ary

led_out_ary(bitmap_ary)
end

if ARGV.size > 0
mes = ARGV.shift
else
mes = "あけましておめでとうございます"
end

scroll_mes(mes)

以前、「薔薇」「憂鬱」「麒麟」や、全角スペースのビットマップ情報がないようだと書いてしまったが、「\kanjic\font_src.bit」にあることに気がついた。

動作確認


以下のように実行すると、デフォルトの文字列
「あけましておめでとうございます」がスクロール表示される。
> C:\tmp\soft\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -Ks parallel_32x16led_font_v.rb

また、引数を指定すると、指定した文字列をスクロール表示する。
(コマンドプロンプトでの日本語入力は「Alt」+「半角/全角」でできるようだ)
> C:\tmp\soft\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -Ks parallel_32x16led_font_v.rb お年玉


画像


画像

まとめ

  • パラレルポート接続の32x16ドットLEDマトリクスで東雲フォントを縦書き表示できるようにしてみた。
  • 以前、「薔薇」「憂鬱」「麒麟」や、全角スペースのビットマップ情報がないようだと書いてしまったが、「\kanjic\font_src.bit」にあることに気がついた。

この記事へのコメント

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