#
# matrixled.rb - Matrix LED Demonstration
#
# --- Pin layout of OSL641501-ARA ---
# 13 3 4 10 6 11 15 16 < Anode (Pullup 100Ω)
# 9 o o o o o o o o
# 14 o o o o o o o o
# 8 o o o o o o o o
# 12 o o o o o o o o
# 1 o o o o o o o o
# 7 o o o o o o o o
# 2 o o o o o o o o
# 5 o o o o o o o o
# ^
# Cathode
#
# --- GPIO pin assign ---
# <Anode> <Cathode>
# Pin : GPIO Pin : GPIO
# 13 : A2 9 : D9
# 3 : D2 14 : A3
# 4 : D3 8 : D7
# 10 : D8 12 : A1
# 6 : D5 1 : D0
# 11 : A0 7 : D6
# 15 : A4 2 : D1
# 16 : A5 5 : D4
#
ROWS = 8
COLS = 8
# initialize GPIO pins
da = [A2,D2,D3,D8,D5,A0,A4,A5].map {|p| DigitalIO.new(p, OUTPUT)} # anode
dc = [D9,A3,D7,A1,D0,D6,D1,D4].map {|p| DigitalIO.new(p, OUTPUT)} # cathode
da.each {|d| d.low} # set anode to LOW
dc.each {|d| d.high} # set cathode to HIGH
# Character bit image
NILIMAGE=[[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]
CHARIMAGE=[
nil, # \x00:
nil, # \x01:
nil, # \x02:
nil, # \x03:
nil, # \x04:
nil, # \x05:
nil, # \x06:
nil, # \x07:
nil, # \x08:
nil, # \x09:
nil, # \x0A:
nil, # \x0B:
nil, # \x0C:
nil, # \x0D:
nil, # \x0E:
nil, # \x0F:
nil, # \x10:
nil, # \x11:
nil, # \x12:
nil, # \x13:
nil, # \x14:
nil, # \x15:
nil, # \x16:
nil, # \x17:
nil, # \x18:
nil, # \x19:
nil, # \x1A:
nil, # \x1B:
nil, # \x1C:
nil, # \x1D:
nil, # \x1E:
nil, # \x1F:
nil, # \x20:
[0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00], # \x21: !
[0x14,0x14,0x28,0x00,0x00,0x00,0x00,0x00], # \x22: "
[0x00,0x28,0x7c,0x28,0x7c,0x28,0x00,0x00], # \x23: #
[0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x00], # \x24: $
[0x62,0x64,0x08,0x10,0x20,0x46,0x86,0x00], # \x25: %
[0x38,0x44,0x48,0x30,0x4a,0x44,0x3a,0x00], # \x26: &
[0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00], # \x27: '
[0x08,0x10,0x20,0x20,0x20,0x10,0x08,0x00], # \x28: (
[0x20,0x10,0x08,0x08,0x08,0x10,0x20,0x00], # \x29: )
[0x00,0x54,0x38,0x10,0x38,0x54,0x00,0x00], # \x2A: *
[0x00,0x10,0x10,0x7c,0x10,0x10,0x00,0x00], # \x2B: +
[0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x10], # \x2C: ,
[0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00], # \x2D: -
[0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00], # \x2E: .
[0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00], # \x2F: /
[0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00], # \x30: 0
[0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00], # \x31: 1
[0x38,0x44,0x04,0x08,0x10,0x20,0x7c,0x00], # \x32: 2
[0x38,0x44,0x04,0x38,0x04,0x44,0x38,0x00], # \x33: 3
[0x08,0x18,0x28,0x48,0x7c,0x08,0x08,0x00], # \x34: 4
[0x7c,0x40,0x40,0x78,0x04,0x44,0x38,0x00], # \x35: 5
[0x38,0x44,0x40,0x78,0x44,0x44,0x38,0x00], # \x36: 6
[0x7c,0x44,0x08,0x08,0x10,0x10,0x10,0x00], # \x37: 7
[0x38,0x44,0x44,0x38,0x44,0x44,0x38,0x00], # \x38: 8
[0x38,0x44,0x44,0x3c,0x04,0x44,0x38,0x00], # \x39: 9
[0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00], # \x3A: :
[0x00,0x00,0x10,0x00,0x10,0x20,0x00,0x00], # \x3B: ;
[0x06,0x18,0x60,0x80,0x60,0x18,0x06,0x00], # \x3C: <
[0x00,0x00,0x7c,0x00,0x00,0x7c,0x00,0x00], # \x3D: =
[0xc0,0x30,0x0c,0x02,0x0c,0x30,0xc0,0x00], # \x3E: >
[0x38,0x44,0x04,0x08,0x10,0x00,0x10,0x00], # \x3F: ?
[0x7c,0x82,0xba,0x8a,0xba,0xaa,0x5c,0x00], # \x40: @
[0x10,0x28,0x44,0x44,0x7c,0x44,0x44,0x00], # \x41: A
[0x78,0x44,0x44,0x78,0x44,0x44,0x78,0x00], # \x42: B
[0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00], # \x43: C
[0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00], # \x44: D
[0x7c,0x40,0x40,0x78,0x40,0x40,0x7c,0x00], # \x45: E
[0x7c,0x40,0x40,0x78,0x40,0x40,0x40,0x00], # \x46: F
[0x38,0x44,0x40,0x4c,0x44,0x44,0x38,0x00], # \x47: G
[0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x00], # \x48: H
[0x38,0x10,0x10,0x10,0x10,0x10,0x38,0x00], # \x49: I
[0x38,0x10,0x10,0x10,0x10,0x50,0x20,0x00], # \x4A: J
[0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00], # \x4B: K
[0x40,0x40,0x40,0x40,0x40,0x40,0x7c,0x00], # \x4C: L
[0x82,0xc6,0xaa,0x92,0x82,0x82,0x82,0x00], # \x4D: M
[0x44,0x44,0x64,0x54,0x4c,0x44,0x44,0x00], # \x4E: N
[0x3c,0x42,0x42,0x42,0x42,0x42,0x3c,0x00], # \x4F: O
[0x78,0x44,0x44,0x78,0x40,0x40,0x40,0x00], # \x50: P
[0x3c,0x42,0x42,0x42,0x4a,0x46,0x3e,0x00], # \x51: Q
[0x78,0x44,0x44,0x78,0x50,0x48,0x44,0x00], # \x52: R
[0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00], # \x53: S
[0x7c,0x10,0x10,0x10,0x10,0x10,0x10,0x00], # \x54: T
[0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00], # \x55: U
[0x44,0x44,0x44,0x44,0x44,0x28,0x10,0x00], # \x56: V
[0x82,0x82,0x82,0x92,0xaa,0xc6,0x82,0x00], # \x57: W
[0x82,0x44,0x28,0x10,0x28,0x44,0x82,0x00], # \x58: X
[0x82,0x44,0x28,0x10,0x10,0x10,0x10,0x00], # \x59: Y
[0x7c,0x04,0x08,0x10,0x20,0x40,0x7c,0x00], # \x5A: Z
[0x38,0x20,0x20,0x20,0x20,0x20,0x38,0x00], # \x5B: [
[0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x00], # \x5C: \
[0x38,0x08,0x08,0x08,0x08,0x08,0x38,0x00], # \x5D: ]
[0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00], # \x5E: ^
[0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00], # \x5F: _
[0x20,0x10,0x08,0x00,0x00,0x00,0x00,0x00], # \x60: `
[0x00,0x38,0x04,0x3c,0x44,0x44,0x3a,0x00], # \x61: a
[0x40,0x40,0x40,0x78,0x44,0x44,0x78,0x00], # \x62: b
[0x00,0x00,0x38,0x44,0x40,0x44,0x38,0x00], # \x63: c
[0x04,0x04,0x04,0x3c,0x44,0x44,0x3c,0x00], # \x64: d
[0x00,0x38,0x44,0x7c,0x40,0x44,0x38,0x00], # \x65: e
[0x0c,0x10,0x10,0x7c,0x10,0x10,0x10,0x00], # \x66: f
[0x00,0x3c,0x44,0x44,0x3c,0x04,0x44,0x38], # \x67: g
[0x40,0x40,0x40,0x78,0x44,0x44,0x44,0x00], # \x68: h
[0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x00], # \x69: i
[0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x20], # \x6A: j
[0x40,0x40,0x48,0x50,0x70,0x48,0x44,0x00], # \x6B: k
[0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x00], # \x6C: l
[0x00,0x80,0xec,0x92,0x92,0x92,0x92,0x00], # \x6D: m
[0x00,0x40,0x78,0x44,0x44,0x44,0x44,0x00], # \x6E: n
[0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00], # \x6F: o
[0x00,0x00,0x78,0x44,0x44,0x78,0x40,0x40], # \x70: p
[0x00,0x00,0x3c,0x44,0x44,0x3c,0x04,0x04], # \x71: q
[0x00,0x00,0x5c,0x60,0x40,0x40,0x40,0x00], # \x72: r
[0x00,0x00,0x3c,0x40,0x3c,0x04,0x78,0x00], # \x73: s
[0x10,0x10,0x7c,0x10,0x10,0x10,0x0c,0x00], # \x74: t
[0x00,0x00,0x44,0x44,0x44,0x44,0x3c,0x00], # \x75: u
[0x00,0x00,0x44,0x44,0x44,0x28,0x10,0x00], # \x76: v
[0x00,0x00,0x44,0x44,0x54,0x6c,0x44,0x00], # \x77: w
[0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x00], # \x78: x
[0x00,0x00,0x44,0x44,0x44,0x3c,0x04,0x38], # \x79: y
[0x00,0x00,0x7c,0x08,0x10,0x20,0x7c,0x00], # \x7A: z
[0x08,0x10,0x10,0x20,0x10,0x10,0x08,0x00], # \x7B: {
[0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00], # \x7C: |
[0x20,0x10,0x10,0x08,0x10,0x10,0x20,0x00], # \x7D: }
[0x24,0x58,0x00,0x00,0x00,0x00,0x00,0x00], # \x7E: ~
[0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00] # \x7F:
]
# Rasterize character image
def rasterize(ch)
ptn = []
f = CHARIMAGE[ch]
return NILIMAGE unless f
f.each {|lin|
p = [0, 0, 0, 0, 0, 0, 0, 0]
8.times {|bit|
p[bit] = 1 if (lin & (2 << (7 - bit))) != 0
}
ptn << p
}
#p ptn
ptn
end
# Slim character image
def slim(ptn, pitch=1)
return NILIMAGE unless ptn
tmp = [0, 0, 0, 0, 0, 0, 0, 0]
ptn.each {|lin|
lin.each_with_index {|bit, i|
tmp[i] |= lin[i]
}
}
b, e = 0, 7
b = tmp.index(1) - pitch if tmp.index(1)
b = 0 if b < 0
e = tmp.rindex(1) + pitch if tmp.rindex(1)
e = 7 if e > 7
dst = []
ptn.each {|lin|
dst << lin[b, e - b + 1]
}
dst
end
# Build up message image
def buildImage(msg)
#p msg
vram = []
8.times {
vram << []
}
msg.each_byte {|ch|
ptn = slim(rasterize(ch))
#p ch, ptn
8.times {|y|
vram[y] << ptn[y]
}
}
8.times {|y|
vram[y].flatten!
}
vram
end
DISPTIME = 10
# input message
print "Input message => "
msg = gets.chomp
#p msg
msg = " " + msg if msg[0] != " "
vram = buildImage(msg)
while true
# show VRAM image
DISPTIME.times {|t|
ROWS.times {|y|
# setup 1 line output values
COLS.times {|x| da[x].write(vram[y][x])}
# LED (1 line) turn on -> wait -> turn off
dc[y].low
delay 1
dc[y].high
}
}
# scroll VRAM
ROWS.times {|y| vram[y] << vram[y].shift}
end