Huge messageboard
Making progress here (regarding this post: http://forums.parallax.com/showthread.php/144990-Large-messageboard)
My local soccerteam needs a large messageboard (for score and massaging stuff)
Since this has to be viewed at a large distance, the board will be at least 5m wide (70cm high)
So i start this project with 12 (or maybe 10) displays (each display consists 16 ledstrips, like a 16 digit display)
Uploaded some pics here:
This has to be the final product. ( i like photo editing software
)

And from a distance...

My first 2 displays, 10 to go ....
(almost 2 meters wide, 60 cm high) Tv is a 27 inch one)


wired the ledstrips...

And the drivers, need 3 of them.



some test with my first design...

And of course, it will be controlled by a propeller.
Video is coming up later...
My local soccerteam needs a large messageboard (for score and massaging stuff)
Since this has to be viewed at a large distance, the board will be at least 5m wide (70cm high)
So i start this project with 12 (or maybe 10) displays (each display consists 16 ledstrips, like a 16 digit display)
Uploaded some pics here:
This has to be the final product. ( i like photo editing software

And from a distance...

My first 2 displays, 10 to go ....
(almost 2 meters wide, 60 cm high) Tv is a 27 inch one)


wired the ledstrips...

And the drivers, need 3 of them.



some test with my first design...

And of course, it will be controlled by a propeller.
Video is coming up later...


Comments
http://www.youtube.com/watch?v=EColROJJc5Q
Maybe you could use a black background to make the LEDs really shine?
-Tommy
I used to help out a friend at a sign shop, and learned a good rule of thumb for character height is 1" of letter height for every 10 feet of distance it's to be read. So I guess that's 2.54 cm in height for every 3 meters in viewing distance. This is looking very good!
Hmmm, i'm not :blank:
Finished my first panel, http://www.youtube.com/watch?v=g0ntRBnoI2I&list=UUWYbKz2Sm27cdXqD5b6HEUA
and i need 6 of them.
And here is the driver pcb, can drive 4 displays (4 letters)
4 layer pcb
Almost finished my second panel, just need to connect it to the driver pcb and make a small program for the propeller.
Will upload a movie later this day
Just have to test it in direct sun light.
I really like your your sign project. It'll have tremendous visibility, a useful purpose, and represents a great connection between community and technologists. I'm inspired to build something again.
Here's a different implementation of a neon sign project I built about ten years ago. Jon McPhalen provided the BS2p24 code.
http://www.parallax.com/tabid/336/default.aspx
And a video:
I'll continue to read this thread regularly.
Ken Gracey
I didn't thought about some animation after seeing your movie.
So i did some tests and uploaded a new movie.
I like the 'carrousel' sub and the 'independence day' test
The 'that's why...' text is coming from a sd card.
I hope to finish the next 4 displays this weekend.
Today i contacted some guy who is making a waterproof housing for these displays.
video:
And this is the code i'm using now for testing.
CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 CON 'Shiftregisters CLOCK = 0 ' CLOCK pin number of CLK pin on chip (AKA SCK) DATAIN = 2 ' DATAIN pin number of SER pin on chip LATCH = 1 ' LATCH pin number of RCK pin on chip ' SD Card DO = 20 'Set these pins to match your SD connections. CLK = 21 DI = 22 CS = 23 'Xbee XBT = 10 'DIN XBR = 11 'DOUT OBJ pst : "Parallax Serial Terminal" sdfat : "fsrw" xbee : "xbee_object_2" VAR long letter,bitout,databyte byte id long LETTERS[95] byte inbuf[100] byte inMB[100] CON A1= %1<<0 A2= %1<<1 B= %1<<2 C= %1<<3 D1= %1<<4 D2= %1<<5 E= %1<<6 F= %1<<7 G1= %1<<8 G2= %1<<9 H= %1<<10 I= %1<<11 J= %1<<12 K= %1<<13 L= %1<<14 M= %1<<15 PUB Main | idx,r 'special LETTERS[32] := 0 ' space LETTERS[33] := 0 ' ! LETTERS[34] := F+H ' " LETTERS[35] := 0 ' # LETTERS[36] := 0 ' $ LETTERS[37] := A1+H+G1+F+G2+C+D2+I+K+L' % LETTERS[38] := A1+A2+J+K+I+D1+D2 ' & glass LETTERS[39] := F ' ' LETTERS[40] := H+G1+G2+L+M ' ( little man arms down LETTERS[41] := H+J+K+L+M ' ) little man arms up LETTERS[42] := G1+G2+I+L+H+J+M+K ' * LETTERS[43] := G1+G2+H+I ' + LETTERS[44] := L ' , LETTERS[45] := G1+G2 ' - LETTERS[46] := D1 ' . LETTERS[47] := L+K ' / 'numbers LETTERS[48] := A1+A2+B+C+D1+D2+E+F+K+L '0 LETTERS[49] := A1+H+I+D1+D2 '1 LETTERS[50] := A1+A2+B+D1+D2+E+G1+G2 '2 LETTERS[51] := A1+A2+B+C+D1+D2+G1+G2 '3 LETTERS[52] := B+C+F+G1+G2 '4 LETTERS[53] := A1+A2+C+D1+D2+F+G1+G2 '5 LETTERS[54] := A1+A2+C+D1+D2+E+F+G1+G2 '6 LETTERS[55] := A1+A2+K+I '7 LETTERS[56] := A1+A2+B+C+D1+D2+E+F+G1+G2 '8 LETTERS[57] := A1+A2+B+C+D1+D2+F+G1+G2 '9 'special LETTERS[58] := A1+D1 ': LETTERS[59] := A1+L '; LETTERS[60] := K+M+B+C '< LETTERS[61] := G1+G2+D1+D2 '= LETTERS[62] := J+L+F+E '> LETTERS[63] := 0 '? 'alphabet LETTERS[64] := 0 '@ LETTERS[65] := A1+A2+B+C+E+F+G1+G2 'A LETTERS[66] := A1+A2+B+C+D1+D2+G2+H+I 'B LETTERS[67] := A1+A2+D1+D2+E+F 'C LETTERS[68] := A1+A2+B+C+D1+D2+H+I 'D LETTERS[69] := A1+A2+D1+D2+E+F+G1 'E LETTERS[70] := A1+A2+E+F+G1 'F LETTERS[71] := A1+A2+C+D1+D2+E+F+G2 'G LETTERS[72] := B+C+E+F+G1+G2 'H LETTERS[73] := A1+A2+H+I+D1+D2 'I LETTERS[74] := B+C+D1+D2 'J LETTERS[75] := E+F+G1+K+M 'K LETTERS[76] := D1+D2+E+F 'L LETTERS[77] := B+C+E+F+J+K 'M LETTERS[78] := B+C+E+F+J+M 'N LETTERS[79] := A1+A2+B+C+D1+D2+E+F 'O LETTERS[80] := A1+A2+B+E+F+G1+G2 'P LETTERS[81] := A1+A2+B+C+D1+D2+E+F+M 'Q LETTERS[82] := A1+A2+B+E+F+G1+G2+M 'R LETTERS[83] := A1+A2+C+D1+D2+F+G1+G2 'S LETTERS[84] := A1+A2+H+I 'T LETTERS[85] := B+C+D1+D2+E+F 'U LETTERS[86] := E+F+L+K 'V LETTERS[87] := B+C+E+F+L+M 'W LETTERS[88] := J+K+L+M 'X LETTERS[89] := J+K+I 'Y LETTERS[90] := A1+A2+D1+D2+K+L 'Z LETTERS[91] := A1+F+E+D1 '[ LETTERS[92] := J+M '\ LETTERS[93] := A2+B+C+D2 '] LETTERS[94] := K+B '^ LETTERS[95] := D1+D2 '_ 'start terminal pst.Start(115_200) xbee.start(XBR, XBT, %0000, 9_600) ' start XBee coms 9600 baud pause xbee.tx("O") xbee.tx("K") ' indicate ready Init xbee.rxflush ' clear trash from xbee {{ repeat getstring(string(13),@inbuf) 'pst.str(string("this is what is in the buffer: ")) 'pst.str(@inbuf) 'pst.str(13) 'check for predefined commands if inbuf[0] == "@" if inbuf[1]== "1" carrousel(5) if inbuf[1]=="2" flash(5) if inbuf[1]=="5" SDCard 'else show textfield elseif inbuf[0]=="!" idx := inbuf[1] pst.dec(idx) pst.str(13) writeSer(idx) else repeat idx from 0 to strsize(@inbuf)-1 pst.dec(inbuf[idx]) pst.str(13) writeSer(LETTERS[inbuf[idx]]) qpause bytemove(@inMB, @Inbuf, 100) 'Copy Buff1 to Buff2 }} repeat writeLine(0,0,0,0) writeLine(A1+A2+H+I,B+C+G1+G2+E+F,J+K+L+M,0) 'thx pause writeLine(F+E+G1+K+M,A1+A2+F+G1+E+D1+D2,E+F+J+M+B+ C,0) 'ken pause writeLine(0,F+G1+G2+B+C,0,0) '4 pause writeLine(A1+A2+H+I,E+F+G1+G2+B+C,A1+A2+F+G1+E+D1+ D2,0) 'the pause writeLine(A1+A2+H+I,A1+A2+H+I+D1+D2,E+F+A1+A2+B+G2 +G1,0) 'tip pause SDCard 'read file from SD card 'pause carrousel(5) 'show the carrousel 5 times 'independence day test writeLine(0,0,0,G2) vqpause writeLine(0,0,0,G1) vqpause writeLine(0,0,G2,0) vqpause writeLine(0,G2,0,0) vqpause writeLine(0,G1,0,0) vqpause writeLine(G2,0,0,0) vqpause writeLine(J+K+L+M,0,0,0) '* vqpause writeLine(A1+A2+H+I,0,0,0) 'T pause writeLine(A1+A2+H+I,0,0,G2) vqpause writeLine(A1+A2+H+I,0,0,G1) vqpause writeLine(A1+A2+H+I,0,G2,0) vqpause writeLine(A1+A2+H+I,0,G1,0) vqpause writeLine(A1+A2+H+I,G2,0,0) vqpause writeLine(A1+A2+H+I,G1,0,0) vqpause writeLine(A1+A2+H+I,J+K+L+M,0,0) 'T* vqpause writeLine(A1+A2+H+I,E+F+G1+G2+B+C,0,0) 'TH pause writeLine(A1+A2+H+I,E+F+G1+G2+B+C,0,G2) vqpause writeLine(A1+A2+H+I,E+F+G1+G2+B+C,0,G1) vqpause writeLine(A1+A2+H+I,E+F+G1+G2+B+C,G2,0) vqpause writeLine(A1+A2+H+I,E+F+G1+G2+B+C,G1,0) vqpause writeLine(A1+A2+H+I,E+F+G1+G2+B+C,J+K+L+M,0) 'TH* vqpause writeLine(A1+A2+H+I,E+F+G1+G2+B+C,J+K+L+M,0) 'THX pause writeLine(0,0,0,0) pause pause PUB SDCard | mount ,r writeLine(0,0,0,0) ' mount sd card mount := \sdfat.mount_explicit(DO, CLK, DI, CS) if mount < 0 pst.str( string( 13, "Failed to mount", 13 ) ) abort pst.str(string(13,"SD was card found and mounted fine.",13)) sdfat.popen(string("data.txt"),"r") repeat 'Start a repeat loop r := sdfat.pgetc 'Get a character from data.txt letter := r 'pst.dec(r) if r < 0 'If the character is "less than zero" pst.newline ' send a newline to the terminal quit ' and quit. if r > 10 'If the character is "greater than 10" pst.char(r) ' send the character to the screen. WriteSer(LETTERS[letter]) 'and write it to the modules QPause pst.str(string("Closing file and unmounting SD card.",13)) sdfat.pclose 'Unmount the card and end program. sdfat.unmount PUB WriteSer(Data) Data ><= 16 ' bitwise reverse the lsbs repeat 16 ' shift out 8 bits outa[DATAIN] := Data ' shift out next bit (bit0) to serial pin (0 or 1) outa[CLOCK] ~~ ' toggle the clock pin to shift bit out outa[CLOCK] ~ ' high then low to cycle the clock Data >>= 1 'next bit outa[LATCH]~~ ' toggle the RCK pin to latch the output outa[LATCH]~ 'waitcnt(clkfreq + cnt) PUB WriteSerNoLatch(Data) Data ><= 16 ' bitwise reverse the lsbs repeat 16 ' shift out 8 bits outa[DATAIN] := Data ' shift out next bit (bit0) to serial pin (0 or 1) outa[CLOCK] ~~ ' toggle the clock pin to shift bit out outa[CLOCK] ~ ' high then low to cycle the clock Data >>= 1 'next bit PUB WriteLine(data1,data2,data3,data4) WriteSerNoLatch(data1) WriteSerNoLatch(data2) WriteSerNoLatch(data3) WriteSer(data4) PUB AllOff repeat id from 1 to 16 outa[DATAIN]:= 0 outa[CLOCK] :=1 ' toggle the clock pin to shift bit out outa[CLOCK] :=0 LatchIt PUB LatchIt outa[LATCH] := 1 outa[LATCH] := 0 PUB Pause waitcnt(clkfreq + cnt) PUB QPause waitcnt(clkfreq/2 + cnt) PUB VQPause waitcnt(clkfreq/30 + cnt) PUB Init 'set control line as ouputs dira[CLOCK] ~~ dira[DATAIN] ~~ dira[LATCH] ~~ PUB getstring(endstr, buffer) | rxchar, ec, ce ce := 0 repeat rxchar := xbee.rx ec := endstr 'search term list for end char repeat while byte[ec] <> 0 if byte[ec] == rxchar byte[buffer] := 0 'null terminate return str return byte [ec] 'return terminator else ec++ if rxchar <> 10 byte[buffer] := rxchar ce++ if ce < 100 buffer++ PUB Carrousel (count) repeat count writeLine(A1,0,0,D2) VQpause writeLine(A2,0,0,D1) VQpause writeLine(0,A1,D2,0) VQpause writeLine(0,A2,D1,0) VQpause writeLine(0,D2,A1,0) VQpause writeLine(0,D1,A2,0) VQpause writeLine(D2,0,0,A1) VQpause writeLine(D1,0,0,A2) VQpause writeLine(E,0,0,B) VQpause writeLine(F,0,0,C) VQpause writeLine(A1,0,0,D2) VQpause writeLine(A2,0,0,D1) VQpause writeLine(0,A1,D2,0) VQpause writeLine(0,A2,D1,0) VQpause writeLine(0,D2,A1,0) VQpause writeLine(0,D1,A2,0) VQpause writeLine(D2,0,0,A1) VQpause writeLine(D1,0,0,A2) VQpause writeLine(E,0,0,B) VQpause writeLine(F,0,0,C) VQpause PUB Flash(count) | idx repeat count writeLine(0,0,0,0) qpause repeat idx from 0 to 3 writeSer(LETTERS[inMB[idx]]) qpauseAdded the xbee lib for future use, i'm working on a visual basic project to control this board.
screenshot:
Almost completed the frames for the panels.
Blank panel:
Front:
Back:
Placed horizontally (4m wide)
and vertically (1,2 m high)
And painted
More to come (soon i hope)...
Can you control the brightness of the display?
I doubt you need to control the the brightness of the individual segments (though I don't think it would be too hard to do so) but I'd think controlling the overall brightness would be useful.
It looks like you've tied the enable pin low on your PCB. I did the same with my recent LED project and in hindsight I wish I had routed the enable pins to the input header.
I'm pretty sure one could control the brightness of a display using TPIC6B595 chips by pulsing the enable pin (by "enable" I mean pin 9 "/G" on the datasheet).
Do you have specs on those LED strips you're using? They're pretty darn bright. What's the spacing between LEDs?
Thanks for sharing your project. It's fun to watch your sign in action.
Duane, i can't control the brightness anymore, since i have grounded the enable pin of the tpics. :frown: (seems i made the same mistake as you)
Ledstrip specs (sorry, it's in dutch) : http://www.ledstripxl.nl/product-informatie/5-meter-LED-Strip-Los-IP65/LED01WS/LED-Strip-Waterproof-60*LED-5meter-Koud-Wit-Los.html
Tip for next time.. put a slope on your display. I am not sure of the angle - perhaps an old datasheet of a 16segment display will have the typical slope angle used, or you can measure one.
added a plexiplate front.
As you can see, this panel is huge!
Since this is a project, i will post howto instructions later when i finished this one
And like Wall-e used to say: Tadaaaaah
Finished the second panel this weekend.
Wiring the drivers....
And a video:
To reduce costs, we decide to use only 2 (2x4 -16 segment) displays.
The boxes looks like this:
Now comes the fun stuff, programming.
More later...
My first android app, connected via bleutooth (rn42) and my board...
i like this one
https://www.youtube.com/watch?v=83GmuRSBIKg&feature=youtu.be
Boards willed be picked up in 2 weeks.
Finished software today. A test can be seen here:
There is a special effect between each data file.
Pictures or movie will be added here when boards are placed.