Category Archives: LED Matrix

Tetris Gaming Device v2 Prototype + PCB

2014-02-09 21.56.15

Figure 1: Tetris Gaming Device v2 Breadboard Prototype

For the past month, I’ve been working on the second version of my Tetris Gaming Device. This first picture shows you almost everything I’ve included in this version except for the two 8×8 RGB LED matrices.

One major difference between this one and the first version I made last September is that I’ve replaced the 74HC595 shift registers with LED driver ICs. The problem with using 74HC595 shift registers to drive the led matrix is that they can’t supply enough current though each channel. An example would be when you having text scrolling across the screen, and you can clearly see the dimming in columns that have more LED lit up than the others. To solve this problem, I decided to replace the two column (anode) driving shift registers with a single MIC5891 source driver from Micrel, and the six row (cathode) shift registers with three STP16DP05 constant current LED sink drivers from STMicroelectronics. After making these changes, the brightness of each LED won’t change at all no matter how many of them light up in each column. Absolutely fantastic!

2014-02-09 22.50.40

Figure 2: Tetris Gaming Device v2 PCB, ordered from Advanced Circuits (

I’ve also added several other components to the system. First of all, I’ve added an accelerometer breakout board to provide a motion controlled gaming experience. The IC on this breakout board is the MMA8452Q from Freescale. It talks to the ATmega328 over I2c at 800Hz and provides 3-axis acceleration with either 12-bit or 8-bit resolution. Next, I’ve added a vibration motor to provide extra physical feedback to the player. In the current Arduino sketch, I’ve decided to let it vibrate whenever a line is cleared for about half a second. Last but not least, I’ve added a second LED bargraph to make the pcb look more symmetric. The two bargraphs are individually controlled by the 328 and can be used for any kind and status indication.

2014-02-07 11.44.09

Figure 3: Populated PCB with LED Matrices removed, everything hand soldered

This is my first time designing a PCB, and I inevitably made a couple mistakes in the PCB layout. The first major issue is that the eagle part I used for the LED Matrix is from one of SeeedStudio’s PCB, and its dimension is short by 1mm on each side. As a result I had to bend the pins on the two matrices in opposite directions to make them fit together. In future PCB designs, I’ll definitely check the dimensions for any part from non-major manufactures. Second, I placed the female programming headers way too close to the bottom edge of the board. I actually wanted the headers to be flush with the bottom edge, but, for reasons unknown, I just didn’t bother to check the actual dimension of the headers.

2014-02-09 23.23.59

Figure 4: The PCB in its final form running Tetris!

I’ve already designed an enclosure for this PCB in solidworks, and it will be 3D printed tomorrow. Since I have a midterm this Wednesday, I don’t know if I’ll have time to make a video of me playing it right after the enclosure is done. However, I’ll definitely be on this week’s Show and Tell at 7pm on Wednesday, so be sure to check out that video or watch it live!

2014-02-09 23.46.02Figure 6: A modded 2-cell Lipo battery pack taped to the back of the PCB

Updates on Both the Piano and the Tetris Game

2013-10-12 16.46.46

On my Arduino piano, the LM386 amplifier circuit has been replaced by a MAX98306 class D amplifier board from Adafruit. This board gives me more control over the gain, and makes the maximum volume much higher given the same supply voltage (3.7V lipo). There was originally quite a lot of noise coming out of the speaker, and for weeks I simply couldn’t figure out where that noise is from. Last week I tried to comment out sections of code and add delays at different places, and see if it has any effect on the noise. Through this investigation, I realised that the noise on the pin of the ATmega328 that is connected to the input of the amplifier is heavily affected by other operations on all the other pins. I soon realised that there is a way to hide these noise from the amplifier instead of removing them. Instead of tying the other input to the amplifier to ground, I connected it to another pin on the ATmega328 that is set to LOW. In this way, the same noise cancels out each other on the two pins, and the output would become very clean. 

2013-10-12 16.54.24

As I said in a previous post, I added a LED bar graph to the Tetris game to reflect the progress in the game. Currently the setting in the code is that one additional segment on the bar graph turns on for every 5 lines cleared in the game. The setting on the speed at which the piece drops makes it really difficult to go through a total of 50 lines. Also, in order to make the bar graph more lively, I used a timer interrupt to flash the next segment at 1Hz, before it turns solid after the 5 lines are cleared.

Another big change to the layout on the breadboard is that I replaced the 9V battery with two 3.7V 300mAh lipo batteries. This change is not that necessary, but I just don’t want to have any  components hanging off the edge of the breadboard.

Now It Plays the Tetris Theme Song!

Now it plays the Tetris theme song while you’re playing! An ATtiny85 is used to store the notes matrix and it listens to the ATmega328p on two pins to either play/stop the music or just pause it. I used the Arduino-Tiny core instead of the one from MIT HLT for the ATtiny85 since it supports the Tone() function in the Arduino library. It was actually quite hard to fit all the frequency values and duration values in a mere 512 bytes of RAM on the tiny85.

Here is a few more components that I’m considering to add to this Tetris game in the future:

-A 3-axis accelerometer (MMA8452Q) to provide another form of input;

-A LED bar graph, or just a couple LEDs, that could reflect the game progress/score.

-A separate small 8*8 or two 5*7 single colour LED matrices to display the next Tetris piece, and to allow the player to store the current piece.

2013-09-23 23.19.47


The Code: