F20: Corona Run
Contents
Corona Run
Abstract
CORONA Run is a game designed for every one (Not PG-13 Rated) to have a good time during this pandemic. Inspired by the current real-life pandemic situation and the game "Minion Rush", the main objective of this game is to avoid CORONA virus. As the game progresses, the player will encounter not only the virus, but also power-ups that provide the player with temporary immunity to the virus. The score of the player will depend on how long the player can survive the game.
Objectives & Introduction
The main objective of this project is to use SJ2 board as the center of our project. To create a properly working game, the game must be able to:
- Detect collision with CORONA virus to end the game
- Provide the player with power-ups when the player touches it
- Keep track of the score
There are some requirements that must be used when creating the game, such as:
- Utilizing FreeRTOS to run the game on SJ2 Board
- Utilizing accelerometer to control the game
Team Members & Responsibilities
Schedule
Week | Date | Task | Actual |
---|---|---|---|
1 | 09/16 |
|
|
2 | 09/18 |
|
|
3 | 09/26 | Project Proposal Submission | Completed on Time |
4 | 10/13 |
|
|
5 | 10/19 |
|
|
6 | 10/23 |
|
|
7 | 10/25 |
|
|
8 | 10/30 |
|
|
9 | 11/1 - 11/7 |
|
|
10 | 11/8 - 11/14 |
|
|
11 | 11/15 - 11/28 |
|
|
12 | 11/29 - 12/5 |
|
|
13 | 12/6 - 12/12 |
|
|
14 | 12/16 |
|
|
Parts List & Cost
Parts | Costs |
---|---|
SJ2 Board | $ 50.00 |
5 V Power Supply Module | $ 6.99 |
Audio FX Sound Board | $ 24.95 |
JBL Go Speaker | $ 29.99 |
LED Matrix | $ 71.40 |
Jumper wires1 Jumper wires2 | $ 11.24 |
Total | $ 194.57 |
P.S: Some prices included shipping
Design & Implementation
The design section can go over your hardware and software design. Organize this section using sub-sections that go over your design and implementation.
Hardware Design
Discuss your hardware design here. Show detailed schematics, and the interface here.
'Adafruit Audio FX Sound Board
The Sound Board has a lot of amazing features If you want to control the Sound Board over UART Serial, you can do so by using the TX, RX and UG pins.
Specifications – No Arduino or other microcontroller required .Standalone.
Operated on 3 to 5.5VDC battery.
Small - only 1.9" x 0.85"
Built in storage, don’t even need an SD card
Built in Mass Storage USB
Compressed or Uncompressed audio ,Go with compressed Ogg Vorbis files for longer audio files, or uncompressed WAV files
High Quality Sound - You want 44.1KHz 16 bit . The decoding hardware can handle any bit/sample rate and mono or stereo
PINS USED –
Vin - This is the primary 'battery' power input pin. Power with 3-5.5 VDC
GND - there's a couple ground pins but we suggest this one for power input. The others can be used for signal grounds
UG - the UART/GPIO selector pin. Pulled high for default GPIO trigger mode. Tie to ground and reset the board for UART mode.
Rst - this is the reset pin, you probably don't need to use this pin but when tied to ground it resets the board
LED MATRIX
Brightness: 2800cd/square meter
Size: 160x160mm
Pitch: 2.5M
5 Addressable Pins
Compatible with M3 mounting screws
Scan: 1/32
Refresh Frequency: >=400HZ
Waterproof Class: IP43
Weight: 204.8g (only matrix panel). 255g (w/ components)
Best for indoor use
Hardware Interface
Our Approach to LED Matrix: We have divided LED display Matrix into two sections
Section 1 - First 32 rows (Row 0 to row 31) Section 2 - Remaining 32 rows (Row 32 to row 63)
There are 6 data lines, 3 for each section are available to drive the RGB matrix.
Section 1: R1, G1, B1
Section 2. R2, G2 , B2
Other pins:
OE - Output Enable
Lat - Latch
Clk - clock signal
Vcc - High Voltage (5V)
Gnd - Ground (0V)
The RGB LED Display Matrix gets the input from Master Module which is our SJTwo board. It is driven by the GPIO Pins of the Master Module. However, these GPIO pins are not connected directly to the display matrix since 64x64 RGB LED Matrix drives on 5V input whereas the GPIO pins from SJTwo board output 3.3V. So, two level shifter ICs are used as an intermediate connection to convert 3.3V GPIO output from SJTwo board to 5V before giving it as an input to the RGB Led Matrix. Each LED can be independently addressed and controlled. This 64x64 LED matrix has 5 address lines viz. A, B, C, D, E. With 5 address lines, we get 2^5 = 32 unique addresses. But, the matrix has 64 rows. The scan rate of the LED Matrix is 1/32, i.e., 2/64. This indicates that by making each address line high, two rows will be driven at the same time. As shown R1,G1,B1 handles the section 1 of the LED Matrix and R2,G2,B2 handles the section 2 of the matrix.
Sr. No. | SJTwo board Pin | LED MATRIX | Function |
---|---|---|---|
1 | P1_31 | R1 | Upper half (Section 1) |
2 | P1_30 | G1 | Upper half (Section 1) |
3 | P1_23 | B1 | Upper half (Section 1) |
4 | P1_28 | R2 | Lower half (Section 2) |
5 | P1_29 | G2 | Lower half (Section 2) |
6 | P2_0 | B2 | Lower half (Section 2) |
7 | P2_2 | A | Address Line |
8 | P2_4 | B | Address Line |
9 | P2_5 | C | Address Line |
10 | P2_6 | D | Address Line |
11 | P2_0 | E | Address Line |
12 | P2_7 | Clk | For upper half and lower half |
13 | P2_8 | Latch | For upper half and lower half |
14 | P2_9 | OE | For upper half and lower half |
The row contains 5:32 decoder as shown in the figure .Here the rows are selected in parallel so if row 1 starts functioning then simultaneously 33 will start .There are five address which are marked as A,B,C,D,E ,only one input is active low at time .The pseudo code is presented below to give broad description how the row can be operated on LED matrix .
The column data is stored in a 64-bit serial-in, a parallel-out shift register. The shift register is designed to work with LEDs and implements a constant-current system that ensures the LED brightness remains uniform.R1,G1,B1 is for section 1 32x64 and R2,G2,B2 is for section 2 .There is single clock interfaced between them. Once the clocking and shifting the register is completed . We need to latch this data to the register. The register data is sent out to all the row lines and that Row line which is pulled low by the decoder will receive this data and corresponding pixels are turned on. The pseudo code is presented below to give broad description how the column can be operated on LED matrix .
Our Approach to Accelerometer Sensing:
The accelerometer makes use of transient detection channel of motion detection. Using this, we can set thresholds for the sensor to generate an interrupt.
This is preferable to continually reading sensor values and trying to mimic the same thing in software on the SJ2. This saves CPU cycles for more intensive tasks.
The interrupt pins unfortunately are not broken out on our board, so we must continually read the interrupt register.
To configure the registers needed for the transient detection, we need to add some code to the acceleration.c file. The registers we need to set are below:
TRANSIENT_CFG = 0x12 | This register tells the board to latch the interrupt to the src register and enables this for the X axis.
TRANSIENT_THS = 0x08 | This value in the ths register sets the transient threshold to a half g. This is the parameter you would adjust for sensitivity.
TRANSIENT_TC = 50ms = 0x05 | writing this value to the tc register will debounce the signal by 50ms. Basically the board will not generate another interrupt within 50ms. This parameter should also be adjusted to remove the stopping reaction force from the input. This value I believe should be half the "sampling rate" of reading the interrupt src register.
TRANSIENT_CR4 = (1 << 5) | This value is the last register that needs to be set is to enable the transient detection feature. After this, the sensor can be brought up into active mode.
To read the interrupt there is a function that performs a single read of the src register to see if there is an interrupt present. Reading this register clears the interrupt and the sensor continues. The src register is returned to the task that read it. The register contains the interrupt flag at bit 6 and if that bit is set, we look at bit 0 to determine the direction of the half g force that caused the interrupt. Depending on the value, a boolean is sent to a queue from the task.
The consumer of the queue reads this boolean and makes a decision based on it. In our case, moving the player.
Our Approach to Sound Effects:
The sound fx board by Adafruit makes it easy to add sound effects to your project. This board is able to play up to 16MB .ogg and .wav files that are added easily by dropping them to the onboard mass storage. The device supports two modes of playback, selectable with the UG pin.
Normall nothing is connected to this pin on startup, and it initializes the device accept input on the 10 gpio trigger pins. When the pin is grounded, a file will be played depending on the file name conventions.
The file names start with a "T" for trigger, plus the two digit pin number. For more advanced triggering there are options that can be added to this.
Appending HOLDL will continuously loop the track while the input is grounded. Appending LATCH will continuously loop the track until the input on that pin occurs again. Appending NEXT plus a one digit number (0-9) will play the tracks in order. Appending RAND plus a one digit number (0-9) will play the tracks randomly.
The other way to trigger is through the uart interface. To access the uart interface, the UG pin needs to be grouned on startup. Through the uart interface at 9600bps, the tracks can be played as needed by using the string: "P<capitalized file up to 8 chars right padded with spaces plus the extension in caps>"
Software Design
All about RGB LED matrix:
RGB led matrix is made up of standard tri-color led chips- red, green and blue. For our game we are using 64*64 matrix and there is no proper documentation for this one hence we have tried to provide as much as we could in this section.
64*64 stands for matrix having 64 rows and 64 columns, however rows are further divided in 2 sections.For upper 32 rows, each pixel has R1, G1 and B1 but for the lower half we need to pass values to R2, G2 and B2 in order to light it up.
To light up a particular led we need to keep a few things in mind. Each led is driven by 1 bit of shift register and there are several shift registers which are daisy chained to each other. This allows us to drive all leds of a row one by one by clocking in R1, G1, B1 or R2, G2, B2 in accordance to the position of led. To understand this, we first need to understand how a shift register works and this will help us figure out the pins we need to set low or high and at what instance (remember this is something that the matrix consists of and not on the surface for us to control except for understanding latch and clock pins).
Shift registers are the modules that allow us to control a large number of input or output by using only a few pins of the microcontroller. It basically can hold the register of bits in memory and the bits are shifted one at a time and hence the name shift register.The advantage is that we can connect as many shift registers as we need the output lines/leds to be and 1 shift register will use the same amount of pins as 50 shift registers would. Daisy chaining will involve shifting the data from one shift register to the next one.
Say, you have 8 leds at the output of the shift register and you intend to set and reset as such that only first and fourth led lights up and all the others are 0. You can do so by using latch, data and clock pins. So you will start by clocking the 0 first through shift register and it gets saved at eighth led. By clocking, I mean we need to set and reset the clock to let the hardware know that a new data is going to come out as output. And so every time we are sending a bit, we need to provide the clock signal. Next u need to push a 1(for 1st led to light up) and this will shift the 0 at 8th position to 7th led and hence the 7th led is 0 and the 8th is set or 1 . So this repeats and the bits are shifted each time you output from the shift register. Once all the bits are shifted ;i.e you have all 8 bits; we will enable the latch and this will send all the bits to output at once. So, we move data in serially and once all the data is gathered we latch it out all together; as in parallely moving the data out. The led number 1 and 4 wont turn on before we latch the bits out.
Now relating this to our 64*64 matrix, we have 64 columns for a single row and they contain shift registers. For a row, we need to drive these leds one by one by clocking R1, G1, B1 or R2, G2 and B2 based on if the row is >32 or row <33.After all the 64 columns are clocked in by color values, we will enable the latch and hence this will turn that particular row’s leds on or off based on what we passed as color bits.
Coming to rows back, the RGB matrix has 5:32 decoder and hence it takes 5 bits as input as in A, B, C, D and E and the resulting address will select a row. This will select 1 row from each section, that means when we select 1, we also select 33, similarly 2 and 34 are selected at the same time and so on.
Implementation
This section includes implementation, but again, not the details, just the high level. For example, you can list the steps it takes to communicate over a sensor, or the steps needed to write a page of memory onto SPI Flash. You can include sub-sections for each of your component implementation.
Testing & Technical Challenges
Describe the challenges of your project. What advise would you give yourself or someone else if your project can be started from scratch again? Make a smooth transition to testing section and described what it took to test your project.
Include sub-sections that list out a problem and solution, such as:
<Bug/issue name>
Discuss the issue and resolution.
Conclusion
Conclude your project here. You can recap your testing and problems. You should address the "so what" part here to indicate what you ultimately learnt from this project. How has this project increased your knowledge?
Project Video
Project Source Code
References
Acknowledgement
We would like to acknowledge the open source software community, which provided us with Audacity. We also would like to acknowledge the creators of the free-to-use sound effects we used. Thank you!
References Used
SJ2 Board
LPC408x/407x User Manual
MMA8452Q datasheet (Sparkfun)
Adafruit Sound FX Sound Board pinouts
Converting sound files with Audacity
Wiki formatting
Appendix
You can list the references you used.