Just wanted to update you guys on what’s going on. I got the VFD powered-up using an old computer power supply. It works really well for now until I figure out a more compact power supply for a final project.
I successfully shorted a “test” pin on the unit and it ran through some pages of display tests that looked really good.
I’ve been researching some interfacing with the board. All of the “controllers” are on the board attached to the VFD so I really just have to control text or graphics going to the display with the Arduino.
I’ve become confused. I figured out the output of the VFD and the input that would be needed to go to the parallel port of a computer to work with various LCD displays. The problem with all of these schematics and LCD programs is that they list pins or i/o that I don’t have.
I have these pins that I need to interface:
D0 - Pin 8
D1 - Pin 7
D2 - 6
D3 - 5
D4 - 4
D5 - 3
D6 - 2
D7 - 1
nWR - 9 (Write Signal (input))
nBL - 11 (Display Blanking Signal (input))
nCS - 19 (Chip Select Signal (input))
nRESET - 20
BUSY - X (not usually used)
Most LCDs use an Enable pin, W/R pin, Register pin and a contrast pin. I wanted to use the LiquidCrystal library because it sounds like most of it could be really useful for what I have but it doesn’t match up with these pins.
Does anyone have any advice on how to code something for this VFD? I know it’s possible and have seen some example of it working out there with an arduino but no code examples. Any help would be greatly appreciated! So far the help has been great and got me this far!
Thanks a lot, -Joe
PS - this Python code helped me out a lot for anyone else looking into this:
User mode device driver for Noritake GU128x32-311 Vacuum Fluorescent Display.
Copyright (c) 2006 firstname.lastname@example.org
This file is released under the GNU Lesser General Public Licence.
See the file LICENSE for details.
# VFD | PARPORT
# WR | /strobe pin 1
# CS | GND
# RESET | +5V
# BLANK | +5V
# BUSY | Busy pin 11
# D0-7 | pins 2-9
USE_FCNTL = False
if sys.platform == 'linux2':
#USE_FCNTL = False
USE_FCNTL = True
def __init__(self, dev=0):
self.fd = os.open('/dev/parport%d' % dev, os.O_RDWR)
fcntl.ioctl(self.fd, 0x708F) # mark parport as exclusive
fcntl.ioctl(self.fd, 0x708B) # claim the parport
p = parallel.Parallel(dev)
self.setWR = p.setDataStrobe # pin 1
self.getBUSY = p.getInBusy # pin 11
self.setData = p.setData # pins 2-9
def enable(self, on=True):
def selectFlickerless(self, on=True):
def selectCharPage(self, page):
assert page in [0,1]
def sendData(self, data):
for b in data:
while self.getBUSY(): pass
def sendCommand(self, cmd):
self.sendData('\x01\x4f%c' % cmd)
def setBrightness(self, value):
assert 0 <= value <= 100
value = 100 - value
self._brightness = value
arg = 0x61 + (value*16/100)
def characterWrite(self, str, col=0, row=0, mode='S'):
addr = row*22 + col
message = '\x01C%c%c%c%s' % (addr, len(str), mode, str)
def graphicWrite(self, image, address, mode='S'):
imglen = len(image)
arg = (address/256, address%256, imglen/256, imglen%256, mode, image)
message = '\x01H%c%c%c%c%c%s' % arg
except: print 'GU311 parallel not available'
def pong(d, mode='O', loop=1000000):
bits = '\x01\x02\x04\x08\x10\x20\x40\x80'
x = 0; y = 0
dx = dy = 1
for i in xrange(loop):
if x < 0-dx: dx = random.randint(1,3)
if x > 127-dx: dx = -2
x = (x+dx)%128
if y < 0-dy: dy = 1
if y > 31-dy: dy = -1
y = (y+dy)%32
address = x*4 + y/8
d.graphicWrite(bits[y%8], address, mode)
d.graphicWrite(bits[y%8], address, mode='E')
if __name__ == '__main__':
d = GU311(dev=2)
d.characterWrite('Noritake', 7, 0)
d.characterWrite('GU128x32-311', 5, 2)