7: Globe PCB v1 – A somewhat mitigated disaster

Ok so this one was mostly my fault. Despite all the time I spent agonising over the schematic entry I ended up cocking a few things up. I was considering pasting and hot airing the board rather than manually soldering but since this would require doing each side of the board all in one go and anticipating potential screw ups I decided to manually solder stage by stage, testing as I went…wise choice.

Before I detail all of these I will mention what went right:

  • Voltage regulator: The voltage regulator does its job giving a nice clean 3.3V and 1.2V
  • FTDI: The FT2232 does its job allowing me to program the FPGA and communicate with it.
  • HDMI buffer: Does its job, level shifts nicely, impossible to tell if it does anything to the HDMI signal since A. the HDMI sockets screwed (more on that in a sec) and B. I don’t have easy access to a scope to check the signal anyway.
  • FPGA: After some tinkering I was able to program the FPGA and test that it does at least something that I told it to.

So what went wrong?

  • FPGA flash: I switched the SI & SO lines resulting in the flash being unprogrammable it first. Straightforward fix to cut the traces and swap the lines. After that it was programming happily.
  • FPGA configuration: Some pins that should have been pulled high or low for configuration were not/connected to things which would pulling in the wrong direction. Fixed by cutting traces, rewiring and adding pull up/down resistors where needed.
  • Thermal reliefs: The thermal relief connects for the polygons were too big (I failed to take into account the use of 2oz copper), making soldering the ground connection on pretty much all the components a massive pain. This caused occasional dry joints and in general slowed down the assembly.
  • Untented vias under components: Putting vias under components was fairly mandatory for a 2 layer board with fairly dense component placement, leaving them untented was not. By not doing so caused the excess solder added during the SMD soldering process to cause a short behind the package legs between 3.3 and 1.2V. A simple continuity test between all power rails after this prevented any damage to the board but did require further time to be wasted visually inspecting and fixing any time such a problem did crop up.
  • HDMI socket: Somehow during the move from Eagle to Altium the schematic component library got screwed with the negative and shield pins getting switched on every single data and clock line. To fix this should have been possible…just, but would have required some pretty ninja like cutting and wiring. Even then it may not have worked since the traces would no longer be matched lengths.

Aside from a few other trivial issues there wasn’t too much else that went wrong. Once I hit the HDMI issue and realised what a pain it would be to fix I decided that simply getting a new board made with all the other problems fixed would be the sensible route. While being another £250 expense which I could have really done without, I felt it would be best to have a prototype that didn’t have cut traces and wires hanging off it for any pictures that would feature in the Kickstarter campaign. It also gave me an opportunity to remove the clock and data buffers (unnecessary as I will send this data through the GS lines) and the ESP8266 wireless module (unnecessary due to the recently released Pi Zero having in built wifi).

So at the time of writing this my new PCB has just shipped from China – cue import duty, which should turn up towards the end of this week. The only manufacturing difference between this board and the last is the decision to go for a matte black solder mask, mostly just out of curiosity. I will have a little vote on which people would prefer.

 

6: Globe PCBs arrive

PCBs are in from China. I always buy two since most of the cost goes into tooling and it’s always good to have a backup in case you accidentally  screw one up beyond repair.

I used PCB Cart and I am pretty damn pleased with the service.

I wont go into too much detail about the PCB layout, aside from answering the question that most people are probably asking when looking at this; “why is there so much empty space in the middle of the board, it makes it look a bit strange?”. The answer to that is that I originally intended to design the board with big crescent slots cut out on either side to reduce air resistance when it’s spinning because without them it will be moving a fair amount of air. Unfortunately I am not a mechanical engineer and I really don’t know whether putting the slots in would cause the disk to become structurally unsound when spinning or even whether putting those slots in would help all that much after all it is the PCB that is closest to the edge that is travelling fastest and therefor going to have most air resistance. It is something I would love to investigate but I simply couldn’t afford to risk this PCB breaking. If the Kickstarter campaign gets funded I will definitely try sticking some in there, possibly with hilarious results.

I went for:

  • 3.2mm PCB: MKI was made with a standard 1.6mm substrate which had a little bit of flex in it. Considering that I am spinning this board faster and that it’s slightly larger I wanted to ensure that flex was kept to a minimum in case it caused breaks in solder joints/traces. I can assure you all this board is very rigid, I might even be able to reduce the thickness to 2.4 or even 2mm. As with the lack of slots, better to pay a few $ extra to minimise the risk of the thing breaking apart.
  • 2oz copper: The 5v power line is distributed to the LEDs in two large arc traces around the edge of the PCB. Without wanting these traces to become too wide and push all other components towards the centre I decided to bump up to 2oz copper.
  • Silver immersion: Probably could have got away with HASL here but it only cost about $20 more and I was doing a lot of SMD soldering I thought it was probably for the best. It’s a slight departure from ENIG which is what I would normally opt for; I chose it because it is less likely to form a brittle joint and also happened to be a smidgen cheaper.
  • Black solder mask: Generally I go for green solder masks because I’m poor and most of the time no one is going to see your PCB anyway. Since the whole point of this PCB is to be on display looking badass I decided to shell out a little more for black. While it tends to show up scratches a little more and is virtually impossible to see traces for visual inspection when you have to *ahem* cut them to fix an inevitable mistake you made, I am pretty damn please with the result.

5: Globe Test PCB

Before investing too much time and money in designing the full Globe PCB a smaller test board was needed. The purpose of this PCB was to test the following:

  1. TFP401 interface with FPGA
  2. SDRAM interface with FPGA
  3. Modifying EDIDs
  4. FPGA SPI controller & interface with TLC5951
  5. First version of code

The board was designed as a shield for the Papilio Pro. The P. Pro is a development board with a Spartan 6 LX9, 64Mb of SDRAM and an FT2232 USB interface with 48 female headers. If you are interested in playing round with an FPGA it makes a great place to start.

The shield had a TFP401A, a couple of linear voltage regulators, 4 daisy-chained TLC5951s, an HDMI socket and a small EEPROM to hold the EDID.
at this point I hadn’t settled on the number of TLC5951 to be connected in series or the use of the HDMI buffer to handle the I2C level shifting for the EDID FPGA interface.

The nice thing about the code written for this test board was that it was more or less the code required for Globe. While it only made use of two of its SPI lines the code for all additional ones was implemented as well, all data that would be required for the full board was buffered, written to and read from the SDRAM.

The nice thing about the SPI control of the LED drivers is that it is pretty easy to tell whether the code is doing what it’s meant to be doing at a glance. If I make the PCB “screen” fully green, if the code is working then all the LEDs will become statically green. If the latch signal occurs incorrectly or the data ends up skewed during its buffering, even if a single bit is lost or appended to the data the resultant LED colour just becomes an ever changing jumble.

Suffice it to say, everything worked…eventually.

2017-03-23 18.01.07
Purple OSH Park goodness

4: Globe PCB design

POV MKI used 4 PIC32s each controlling 4 TLC5951 LED drivers which each in turn drive 8 RGB LEDs, with one of the PICs acting as master and the other three as slaves. Since we are only increasing the number of LEDs, LED drivers and required SPI control lines, we can either apply more microcontrollers to the problem or switch over to using an FPGA. To use more microcontrollers would simply be too cumbersome (and a pain in the arse to try and interface video with) whereas an FPGA while being slightly more complex to code would make life far more simple in terms of overall circuit design and performance.

The Spartan 6 LX9 is the FPGA of choice, basically as beefy a chip as you are going to get while still coming in an easy to solder TQFP package. Due to having LEDs on both the left and right side of the PCB, the image data for LEDs on one side of the board needs to be offset by half an image from the other side. This means one of two things needs to be done, either the data being streamed via HDMI needs to fudged so that every second horizontal line is half an image offset or the whole image needs to be buffered on the PCB side and appropriately accessed by the FPGA.

  • To do the former would be an absolute nightmare either requiring everything that one wants to display to go through a program that does the fudging or rewriting the entire video driver
  • To do the latter requires the use of an external memory module for the FPGA, one image requiring 1.382Mb (1920*240*24) and the LX9 only having 576Kb. In reality at least two images need to be stored, one for writing in and one for reading out.

The other matter that needs to be considered is the necessary data rate. If we are aiming for 15 FPS then our required data rate will be about 332Mb/s (1920*240*24*2) or just over 41MB/s. Luckily the SDRAM controller that Mike Field wrote can handle that (as long as reads and writes are performed at least semi-sequentially). The SDRAM module used is a 256Mb Micron MT48LC16M16, slightly overkill but it’s hard to get hold of anything smaller.

A TFP401 is used to decode the HDMI LVDS signals into nice 24bit output data with HSYNC, VSYNC, DE and Pixel Clock brought out for easy interfacing. Throw in a TPD12S016  HDMI buffer with inbuilt logic level shifter allowing the EDID to be handled by the FPGA, avoiding having to have an additional EEPROM to store it.

We will be sticking with the TLC5951 which I used in POV MKI. I really like this chip; it offers 12bit PWM control over each channel, a 30Mb/s data throughput, daisy chaining, up to 40mA per channel current sink and a host of features such as global brightness control for each channel. While it’s a bit irritating having to pad and transfer an additional 50% of data, since our images and HDMI data is only 24bit, the high data rate makes up for it. It also comes in both a DSO and a tiny VQFN (which will come in useful if the flex PCB design is explored).

Mark II will use 240 LEDs requiring 30 TLC5951 drivers. The maximum SPI transfer rate for the drivers is 30Mb/s, we can therefor calculate the maximum number of SPI drivers that can be run in with the calculation:
N = 30,000,000/(12*24*15*1920)
So N = 3.62, rounded down to 3, which conveniently results in 10 series of 3, easy to program, layout and route.

Power wise, three voltage supplies are needed: 5, 3.3 and 1.2 volts. The LEDs will require the highest current by far; if each LED channel requires 20mA that’s 60mA per LED*240 LEDs, coming out at 14.4A. For simplicity the board will be supplied by a single 5V supply rail with a current limit of 30A (always better to have a bit of headroom and most power supplies tend run most efficiently at ~50% load) which will use a dual output buck converter to provide the 3.3V and 1.2V. All the LEDs anodes can be connected to the 5V rail; the drivers providing the necessary current limiting. The total 3.3V current requirement should no more than 2A. The TPS54292 provides a 1.5 and 2.5A configurable voltage outputs which should be ample for this design. TIs’ Switcher Pro (soon to be replaced) makes designing your voltage regulator a lot easier than trying to work through equations from the data sheet, thumbs up to TI for that.

While the slip rings should be capable of transferring HDMI signals there is the possibility that they aren’t which is why I am including a Raspberry Pi Zero on the PCB. The Pi Zero is a pretty neat little bit of kit, much smaller and lighter than a regular Pi with minimal connectors on (2 micro USBs, 1 mini HDMI, SD card and 40 PIN GPIO header). In the worst case scenario I can connect the Pi Zero via a miniHDMI to HDMI cable to the port on the bottom of the board (yeah it will look pretty sketchy). For MKIII all the data connections via slip rings will be removed (unless there is an overwhelming demand for them) and instead a Pi Compute module will be added to allow Globe to appear as a networked computer enabling users to wirelessly control, stream content and even RDP to.

 

3: LEDs and resolution

The difficulty with the resolution is that at the end of the day it all comes down to size. More LEDs require more board space, more board space presents a much greater mechanical challenge and costs more money.

MKI used 5mm clear through hole LEDs due to cost and ease of use. If these are all packed in as tightly as they possibly can and interlaced, then the minimum PCB diameter required to accommodate them can be calculated as:
D = (N*5)/Pi
without taking into consideration shaft diameter. In hindsight diffused LEDs should have been used; clear LEDs provide very small points of light, rapidly losing luminosity as viewing angle increases i.e towards the edges of the sphere. I took a brillo pad to them in an effort to diffuse them which was fairly successful but far from perfect. If diffused LEDs were used then the calculation becomes:
D = (2*N*5)/Pi
meaning even the original LED resolution would require a PCB with diameter of at least 407mm.

For Globe I switched from through hole LEDs for which the smallest RGB versions are 5mm to domed right angle surface mount. These have a body length of 3.2mm but a dome of only 2mm. By once again interlacing the calculation for diameter becomes:
D=2*N*2/PI
meaning we could fit our original 128 LEDs onto a ~165mm PCB…or cram even more LEDs onto a PCB of the same size.

Because PCB is generally paid for by the square cm/inch, the cost increases exponentially with diameter. Realistically I didn’t want to push the diameter much beyond 300mm MKI, having used a PCB of similar size previously and the cost just becoming silly otherwise. If we rearrange our calculation we can calculate the amount of LEDs we could fit on a board of that size to:
N = (D*Pi)/(2*2)
If we account for a 40mm shaft + an additional 60mm for peripheral connections this becomes:
N = ((D*Pi)-100)/(2*2)
With a strict board size of 300mm this would yield an LED count of 210. Fudge the numbers a little bit and we can achieve an LED count of 240, board diameter of 310mm with the bottom 10% of PCB being taken up with connections. This means that the displays imagined resolution is 270 which is a convenient factor of 1080, so what you see is a vertical resolution divided by 4 with the bottom 30 pixels cut off.

Mark I had an resolution of 1024 x 128 yielding a total pixel count of 131,072. Globe has a resolution of 1920 x 240 yielding a total pixel count of 460,800.

Depending on how funding does I will investigate the possibility of switching to flex PCB bent round the outside of a hoop. This would mean I could switch over to some very small 1x1mm LEDs with a lens of only 0.6mm meaning it would be possible to fit 2 or 3 times the number of LEDs onto the same diameter display, or with an increase to 400mm possibly even 4 times this meaning a full HD resolution might be achievable…

 

2: Persistence of Vision MKI

The Globe project started out in 2012 as my final year project of my bachelors degree at the University of Kent. Before I get stuck into this blog, depending on which end you are reading from, I fully acknowledge that this first version looks shonky as hell. Provide a third year with a tiny budget and an overly ambitious project and the result is a half working travesty with an amusing backstory.

It used 4 PIC32 microcontrollers each driving 4 daisy chained TLC5951 LED drivers to achieve a total resolution of 1024×128 24bit colour. Each LED driver can achieve a transfer rate of ~30Mb/s  which in the current configuration would be capable of delivering the required data of ~18Mb/s (horizontal resolution [1024] * vertical resolution per bank [32] * colour depth [36] * rotation frequency [15]) with a fair amount of time to spare for overheads. Able to store about 4 pictures in the program memory of the PIC’s it could cycle between these images…and that’s about it.

pov-completed
By this point I was at least fairly sure that nothing would fly off. Taken with a tripod mounted camera with its shutter speed matched to the rotation speed (approx 1/8th of a second)

Originally intended to be programmable via an Xbee blutooth module (never got that working) it required spinning down and manually programming with 4 different hex files each time the code or image list needed changing which became extremely tedious.

Due to a very limited budget and my own inexperience this first iteration suffered from intermittent dropouts of banks of LED drivers due (from what I can tell without being able to probe a PCB doing about 480RPM) to power transfer issues initially via my own DIY slip rings and later a set of 300RPM rated ones from China (they helped, but not much).

In addition to the dropouts the display also never appeared to the human eye quite as it was meant to. Due to health and safety concerns the University wouldn’t let me go ahead with my original plan for the motor which went something along the lines of “just rip one along with its driver out of a broken washing machine and bung it in there”. I can kind of see their point…
Sticking to low voltage and having not much money but needing something with a reasonable amount of oomph left me in somewhat of a difficult position. In the end I settled on an RC starter motor. At about 7V it draws about 25A so got pretty toasty after running for about a minute. My solution was to cut some big slots in the casing, pointed a fan at it and hoped for the best.
The problem with this motor, coupled with the dropout issue, was that it prevented the board ever spinning at the speed it was meant to. As mentioned in one of the other posts, the POV effect to really work the board would ideally be spinning at 700-900rpm. Being limited to sub 500 meant that to the human eye the display always appeared somewhat faded and washed out.

Edit 08/09/2017 – What was said above about the washed out appearance being caused by the slow spin speed is partially correct, but the problem is almost certainly more related to the lack of gamma compensation. The need for gamma compensation is something I realised when working on Globe and is pretty thoroughly covered in this Adafruit article.

2013-08-08 16.27.57
Test spin with a potato phone camera

2013-04-03 11.07.442013-03-01 16.28.352013-03-01 16.28.022013-03-01 16.28.162013-02-26 13.00.182013-02-26 13.01.452013-03-01 16.28.28

BlueJproject2
Turning an image into funky hex

 

1: Introduction

This blog has been written for those who are interested in the development of Globe and the design behind it. I have tried to keep the engineering terms to a minimum leaving it accessible to all, but if you do come across something that you don’t understand please do write a comment and I will attempt to better explain it.
I have also tried to keep the posts honest; where something has gone wrong either by a silly mistake, oversight or just bad luck, I have left it in. If you are still trying to decide whether to back this project then please don’t be dissuaded when you come across something like this.

The blog posts are meant to be read sequentially and to that end I have tried to make sure their publication dates place them in the correct order, but just in case that goes awry I have also numbered them.

If this project meets its funding target on Kickstarter I shall keep this blog going to provide updates on the progress of the project so do keep checking back here and if there’s something you would really like to see included in the final version, let me know!