F18: Catch me if you can

From Embedded Systems Learning Academy
Revision as of 15:16, 19 December 2018 by Proj user11 (talk | contribs) (Testing & Technical Challenges)

Jump to: navigation, search

Grading Criteria

  • How well is Software & Hardware Design described?
  • How well can this report be used to reproduce this project?
  • Code Quality
  • Overall Report Quality:
    • Software Block Diagrams
    • Hardware Block Diagrams
      Schematic Quality
    • Quality of technical challenges and solutions adopted.

Project Title

Catch Me If You Can

Catch me if you can

Abstract

"Catch me if you can" is a fun game where the user must be attentive and agile enough to catch the randomly dropping eggs from above into a basket with increasing difficulty levels for an intriguing experience. This is all displayed in the LED matrix acting as the screen. The system will consist of two SJ1 boards, one used as a game console with which user will try to catch the eggs by moving it in the required orientation. The other board will control the display module that displays the graphics of eggs falling and also the basket movement. The display module shall communicate with the game console via RF Nordic transceiver. There will be game sounds produced by the display module board for various events during the game like entering a new level.

Objectives & Introduction

Objective

To develop an Embedded system in the form of a 2D game involving a Matrix LED display acting as the Human Machine Interface to guide the player along the way while playing the game. This project aims at integrating micro-controller peripheral drivers and the application software in a meaningful way, where the accelerometer data is sent out from a node via wireless Nordic transceiver to control slider movement on the other node to control the game according to player's performance.

Introduction

The Project consists of three main modules:

Console Module: It consists of accelerometer on SJ one board. Calibrated board orientation and switch pressed status is sent to the Display Module via Wireless Module.

Display Module: It is responsible for controlling 32*32 LED Matrix and Piezo buzzer interfaced to SJ One Board.

Wireless Module: This establishes communication between Display and Console module.

About the game

  • Player should collect the eggs into the basket which are shot from the canon.
  • Press switch on the console (SJOne board) to start the game.
  • Tilt the console left or right to move the basket.
  • Collect the eggs.
  • Avoid red objects, if caught Game Over, else continue to collect eggs till the end of level.

Team Members & Responsibilities

  • Aquib Abduljabbar Mulani
    • Wireless chip TX driver/application and calibrating accelerometer.
  • Kailash Kumar Chakravarty
    • RGB LED 32x32 matrix driver and game application code.
  • Nandini Mandya Shankaraiah
    • Audio output and Wireless chip RX driver/application.
  • Rishabh Sheth
    • PCB design.
  • Swanand Sapre
    • Console and Game design and application code.

Schedule

Week# Date Task Status Actual Completion Date
1 10/16/2018
  • Product Requirement Analysis & Order Required Parts.
  • Software Design and ownership of each module
Completed 10/25/2018
2 10/30/2018
  • Calibrating Accelerometer values for actual orientation
  • Project report update on the wiki.
Completed 11/05/2018
3 11/06/2018
  • Design schematics for console charging circuit & LED display circuit
  • Finalize parts and components for PCB design and develop footprints library for KiCAD (if not present)
  • Porting Adafruit LED driver into LPC
Completed 11/13/2018
4 11/13/2018
  • Develop algorithm for basket movement and dropping eggs using accelerometer values
  • Basic LED testing by activating individual and group of pixels
  • Develop game specific APIs to draw objects like basket on top of led driver
  • Project report update on the wiki.
Completed 11/16/2018
5 11/20/2018
  • Piezo Buzzer operation with different frequency
  • Order PCB for manufacturing and order missing components
  • Check Nordic Wireless Transmit part by sending accelerometer value
  • Project report update on the wiki.
Completed 11/22/2018
6 11/27/2018
  • Design PCB for Console & Display and generate Gerber files, finalize PCB manufacture
  • Start and Stop switch, which controls the power to the system and displays Welcome and Good Bye screen
  • Generating different tones using PWM on Piezo buzzer
  • Check Nordic wireless receive part
Completed 12/1/2018
7 11/30/2018
  • Integrating calibrated accelerometer, switch functionalities and wireless transfer on console board
  • Once Integrated check the LED display response to the varying inputs from the game console
Completed 12/06/2018
8 12/04/2018
  • Display the score of the user upon request
  • Final testing product with varying inputs of gaming console|
Completed 12/11/2018
9 12/11/2018
  • Complete Wiki Report and Final Demo
Completed 18/11/2018

Parts List & Cost

Sl No Parts Seller Quantity Price
1 SJOne LPC1758 Microcontroller Board Preetpal Kang 2 $160
2 RGB LED Matrix Panel - 32x32 Sparkfun 1 $55.6
3 Piezo Buzzer Amazon 2 $1.5
4 Accelerometer On board 1 NA
5 Switches On board 4 NA
6 Portable Power Supply Local seller 1 $5
7 RF Nordic On board 1 NA
8 BOM / PCB components Moser - $20

Design & Implementation

Hardware Design

Discuss your hardware design here. Show detailed schematics, and the interface here.

PCB Design

PCB is an important part of the embedded system, it is certainly true for this project as it reduced wire complexity and gave independent power to our circuit. There are many softwares available for PCB design, among them Eagle and KiCAD are more popular and both software are free for students. We chose KiCAD (v5.10.0) for PCB design over Eagle because, it is opensource so we din't have to worry about the license and it offers free usage for students for an year. The second reason was that, all of our team members was new to PCB design so the learning curve was same for both software but we found a good tutorial series for KiCAD on youtube ( KiCAD tutorials ). KiCAD has its own issues which are discussed in the issue section of this wiki. The steps involved in the PCB design process are described in the next section.

Schematic Design:

Our project can be divided into two main circuits, first is game display circuit and second is a console circuit. We decided to design separate PCB for both circuits as doing so can make wiring easy and improve the user experience.

Display PCB schematic:
Game Display PCB Schematic


Display PCB has two independent circuits. One circuit is to connect SJOne board to LED panel connector and with two piezo buzzers. While another circuit is to connect one unused power cable of LED panel to SJOne board so that we don't have to power SJOne board from PC while we are playing the game. Our preliminary idea was to make this PCB, a Arduino kind of shield but for SJOne board.

Console PCB schematic:
Game Console PCB Schematic


In this game, console is used to move the basket to catch fast falling eggs and if there were any wires attached to console then it is very inconvenient for the user to play. so, we decided to make PCB which can charge battery and power the console while the user is playing. As shown in figure, the heart of the circuit is microchip's MCP73831 LiPo battery charging management IC. One LED is connected to it's Status Pin which glows when the battery is charging. A mini USB B port is used to connect to power resource (PC or any 5V mobile charger)via USB cable to charge the battery. while playing the game, the user must connect USB A port to SJOne Board's mini USB B port. To use the console on battery power user must turn on/off switch.

PCB Layout:

After schematic design, the most important step is to connect the PCB layout. In KiCAD components is not automatically associated with it's PCB footprint, so it's user's responsibility to connect right PCB footprint with the right components. In our case, we did not have the footprint of JLC connector and Rocker switch. so, we created it in a different window and saved it. The amazing feature of KiCAD is once we have done with PCB layout we can visualize PCB in 3D by pressing just one button. Below are actual screenshots of both, PCB layout & their 3D model.

Display PCB layout:
Dispay PCB layout without Copper layer
Display PCB layout with Copper layer
Display PCB front 3D view


Console PCB layout:
Console PCB layout without Copper layer
Console PCB layout with Copper layer
Console PCB front 3D view

PCB manufacturing and soldering:

We chose JLC PCB to manufacture our PCB because, it is the cheapest and convenient option available for any prototype PCB manufacturing. It just cost us $2 for quantity of 10 PCB and $17 for shipment. We received manufactured PCB in just 5 days. We order components from Moser the total BOM cost of both PCB is approx $25 including shipment. Followings are actual photos of manufactured & assembled PCBs.

Actual Console PCB
Actual Display PCB'

Hardware Interface

Hardware Design Diagram


Hardware design diagram above gives an overview of the entire system which consists of the two SJ-One controllers: one board is used as Control Module and other board is used as the Display Module.

  • The Console Module uses the onboard accelerometer on SJ-One which is interfaced via I2C protocol. The calibrated accelerometer values are then used to determine the basket position on the LED Matrix.
  • The Display Module SJ-One board is used to control a 32*32 RGB LED Matrix.This matrix displays the basket, eggs shot from the cannon.The movement of the basket is as per the orientation value received from the Control Module, through Wireless Module. It also consists of Peizo buzzer which is controlled via PWM pin.

Software Design and Implementation

Tasks and Flow Control:

Tasks and Flow Control
File:GameFlowChat.PNG
Tasks and Flow Control



Display Module

RGB LED Matrix:

RGB LED matrix display
RGB Display'

The Human Machine Interface is a display which is composed of 6mm pitch 1024 RGB LEDs arranged in a 32x32 matrix. 32 rows of the matrix is divided into 16 interleaved sections. Here the first section is the 1st and 16th 'row' (32 x 2 = 64 RGB LEDs), the second section is 2nd and 17th 'row' and so on. On the PCB is 12 LED driver chips. These are like 74HC595s but they have 16 outputs and they are constant current. 16 outputs * 12 chips = 192 LEDs that can be controlled at once, and 64 * 3 (R G and B) = 192. So now the design comes together. We can have 192 outputs that can control one line at a time, with each of 192 R, G and B LEDs either on or off. The LPC1758 controller selects which section to currently draw (using A, B, C and D address pins - 4 bits can have 16 values). Once the address is set, the controller clocks out 192 bits of data (24 bytes) and latches it. Then it increments the address and clocks out another 192 bits, etc until it gets to address #15, then it sets the address back to #0. To light up an individual pixel, appropriate row value is loaded on to the address pins A,B,C & D, Clock is set out to traverse the row and when required pixel is reached, the latch is set high to turn ON the LED. The hardware interface to the LED Matrix uses GPIO for all data and control lines. A GPIO clock is toggled to shift in data sitting at the Matrix's 6 data ports.

SJ One Board Pin Name Description
P0.0 addrA Address Input A
P0.1 addrB Address Input B
P2.6 addrC Address Input C
P2.7 addrD Address Input D
P1.29 Latch Shift in row data/Active High
P1.28 Output Enable Turn on selected rows/Active Low
P1.19 Clock Shift clock
P1.22 R1 Top half red data
P0.26 G1 Top half green data
P1.23 B1 Top half blue data
P1.30 R2 Bottom half red data
P1.31 G2 Bottom half green data
P2.5 B2 Bottom half blue data

Piezo Buzzer:

Piezo Schematic Diagram
Piezo Physical Diagram

Piezo electric buzzer are high performance buzzer that employ piezoelectric elements and are designed for easy incorporation into various circuits. These buzzers are designed for external excitation, the same part can serve as both a musical tone oscillator and a buzzer. In our project we are using this device to create musical tones by varying the operating frequency.The different range of operating frequency are generated from PWM peripheral. Different range of frequencies are maintained as constants ,these constants are fed to PWM,which generates square wave. The output of the PWM is driving the Piezo buzzer.

Code snippet for creating musical tones by varying frequency:

int fire[]=
{
		550,/*twice the freq of this and use always tempo as 40 */
		404,
		315,
		494,
		182,
		260,
		455,
		387,
		340
};

void fire_sound_level(void){
	 for(int i = 0;i < 8;i++)
		 {
		 	 uint8_t tempo = 40;
		 	 	 while(tempo)
		 	 	 {
					pwm.SetFrequency(fire[i]*2);
					pwm.SetDutyCycle(pwm.k2_1,50);
					pwm.PwmEnableMode(true);
					tempo--;
		 	 	 }
		 }
		 pwm.PwmEnableMode(false);
	}

Control Module

Accelerometer:

Accelerometer Detection
The MMA8452Q which is a smart low-power, three-axis, capacitive micromachined accelerometer with 12 bits of resolution is used. Accelerometers are electromechanical devices that are used to sense acceleration that can be of various forms, for instance gravity.
In our project,we have calibrated the accelerometer based the values of X,Y and Z co-ordinates corresponding to different orientations of the accelerometer to control the horizontal movement of the Basket to catch the eggs on the screen. This has also helped us decide and control the speed of the basket.

Code snippet for Accelerometer Calibration:

if (((x_coordiante > px_coordiante + CONSOLE_SENSITIVITY) && (x_coordiante <= CONSOLE_TILT_RANGE) ))
{
        boardOrientation=left;
        bskObj.speed=BASKET_SPEED;
        px_coordiante=x_coordiante;
}
    //left
    else if((x_coordiante<px_coordiante-CONSOLE_SENSITIVITY && x_coordiante>=-CONSOLE_TILT_RANGE))
{
        boardOrientation=right;
        bskObj.speed=BASKET_SPEED;
        px_coordiante=x_coordiante;
}
else if(x_coordiante>CONSOLE_TILT_RANGE ){
        boardOrientation=left;
        bskObj.speed=BASKET_SPEED;
}
else if(x_coordiante<-CONSOLE_TILT_RANGE ){
        boardOrientation=right;
        bskObj.speed=BASKET_SPEED;
    }
else
{
        boardOrientation=invalid;
        py_coordiante=y_coordiante;
}

Wireless Module:

Nordic Wireless Block Diagram
The nRF24L01+ is a single chip 2.4GHz transceiver with an embedded baseband protocol engine, suitable for ultra low power wireless applications. The nRF24L01+ is designed for operation in the world wide ISM frequency band at 2.400 - 2.4835GHz.The nRF24L01+ supports an air data rate of 250 kbps, 1 Mbps and 2Mbps. The high air data rate combined with two power saving modes make the nRF24L01+ very suitable for ultra low power designs. The register map, which is accessible through the SPI, contains all configuration registers in the nRF24L01+ and is accessible in all operation modes of the chip. The embedded baseband protocol is based on packet communication and supports various modes from manual operation to advanced autonomous protocol operation. Internal FIFOs ensure a smooth data flow between the radio front end and the system’s MCU. Enhanced ShockBurst reduces system cost by handling all the high speed link layer operations.
Code snippet for Wireless Transmitter:
struct pckt
{
    int16_t x;
    int16_t y;
    int16_t z;
    int16_t buttonPressed=0;
};
void WirelessTx(void *p)
{
       while(1)
       {
           pckt var;
           var.x = AS.getX();/values from accelerometer*/
           var.y = AS.getY();
           var.z = AS.getZ();
           pckt var;
             while(1)
             {
                 if(SW.getSwitch(1))
                 {
                     var.buttonPressed=1;
                     vTaskDelay(300);
                 }
                 else if(SW.getSwitch(2))
                 {
                     var.buttonPressed=2;
                     vTaskDelay(300);
                 }
           wireless_send(REM, mesh_pkt_nack,(pckt*)&var, 8, 0);
           vTaskDelay(50);
             }
       }
}

Code snippet for Wireless Receiver:

void wirelessRx(void* p)
{
    while(1)
    {
        mesh_packet_t rcvPkt;
        int timeout_ms = 50;

        if(wireless_get_rx_pkt(&rcvPkt, timeout_ms)){

            iphObj.x_coordiante = (int16_t)(*((uint16_t*)(rcvPkt.data+0)));
            iphObj.y_coordiante = (int16_t)(*((uint16_t*)(rcvPkt.data+2)));
            iphObj.z_coordiante = (int16_t)(*((uint16_t*)(rcvPkt.data+4)));
            iphObj.buttonPressed= (int16_t)(*((uint16_t*)(rcvPkt.data+6)));
            if(iphObj.buttonPressed==1 )
            {
                xSemaphoreGive(playPauseHandler);
            }
            else if(iphObj.buttonPressed==2 )
            {
               xSemaphoreGive(resetGameHandler);
            }
        }
        vTaskDelay(50);
    }
}


Tasks within LPC Board 1 (LED display):
Input_handler: This task receives accelerometer and status of button press from the console unit.The values are received as a structure.Task checks for button press and accordingly changes the state of game.i.e For button 1 press it pauses the Game and for button 2 press it restarts the game.The accelerometer values are used to calibrate the basket horizontal movement.Depending upon the x-axis values of console the basket slides horizontally.
Display_handler: We have implemented the various functions to display the components used in our Game.It uses GFX matrix library to draw the shapes and pixel.Objects used in our game includes Baskets,Eggs,Cannon and Water.Apart form Object display Handler also has functions to implement the screens used in our Game like-Play/Pause screen,Game Over Screen,Win Screen.
Tasks within LPC Board 2 (Console):
Data_sender : This task continuously sends the raw accelerometer values to LPC board 1.
Game_handler : This task is responsible for handling events like game start, game pause, game end via on board switches.


Porting Adafruit driver into LPC :
1. LPC GPIOs were accordingly mapped and made as output for LED matrix connections.
2. Basic shapes, patterns and text were drawn.
3. Game specific APIs were developed for objects like basket, egg, cannon.

Testing & Technical Challenges

Issue #1

Porting Adafruit driver into LPC As we used the existing Adafruit library,we had to map the LPC GPIOs to LED matrix pins.This was challenging because choosing the pins also mattered for PCB design, which we were unaware untill we started to design PCB. We hadto remap the LPC GPIO pins to LED matrix as per PCB wiring convenience.

Issue #2

In Nordic Wireless, the transmitted data was received only once, despite the transmitter transmitting data continuously. This was because vTaskStartScheduler() API was used by us.The scheduler_start() API was right API to be used for Nordic Wireless to function properly. Once we implemented the queue to collect orientation and switch status,we saw a delay in data reception.This was due to /* to be filled */

Issue #3

Determining the range of audio frequencies which would be audible and sensible was challenging.After days of trail and error method we found the range. After finding the range, the problem we encountered was with switching frequencies. Drastically varying frequency of PWM will cause sound produced by Peizo unpleasant.In order to overcome this we had to vary frequency in small steps. Say you want to change frequency from 410 to 510. do it in steps 410,420,430 soon.One more important thing to verify is the whether the frequency generated by PWM peripheral matches your expected frequency, do verify it with logic analyzer once before writing the music tone libraries.

Issue #4

/*PCB issue to be filled by rishab */

Issue #5

Configuring Task Priorities and State Machine was challenge. Game slowed down as the level progress.After Debugging we found out the issue was due to high RIT_Interrupt rate.

Hardware PCB Testing

Display module Testing

Console module Testing

Integrated system Testing

Conclusion

At the start, project was a jigsaw puzzle. We only had pieces of knowledge and unaware of how to tailor it to solve the puzzle. Well we are successful in implementing our idea of building a game. This project has helped us to gain practical exposure in building a real time embedded system. This project gave us a platform to utilize all LPC drivers and Free RTOS knowledge which we learnt in our course work and what are the key things to consider while building a real time system. We are thankful to Preet, who motivated and guided us through the course work ,

Project Video

Upload a video of your project and post the link here.

Project Source Code

References

Acknowledgement

Any acknowledgement that you may wish to provide can be included here.

References Used

[1] Nordic wireless datasheet

[2] [1]

[3] Low_Powered_Mesh_Network_stack

Appendix

You can list the references you used.