top of page

Secure Voting Machine - CCES VIP

In this Vertically Integrated Project team, we're focused on researching, prototyping, and building a secure voting machine meant to be used for any election to ensure that election security is maintained and a fair voting process can be guaranteed to uphold democracy. I'm currently on the System Design subteam where my task is to prototype a working voting machine to create a foundation for future iterations to solve all security risks in the prototype and create custom solutions for any insecure communication channels or storage used in the voting machine. In past semesters, I was on the processor subteam where I designed and implemented a DMA controller meant to speed up I/O transfers into and from memory because a voting machine has many peripherals such as a screen, button inputs, and a printer for an auditable paper trail. The custom processor used for the voting machine is a simple RISC-V processor because it can easily extended to add security modules that make sure even the hardware can't be easily hacked.

Projects: Text

RoboRacing - Autonomous Go-Kart

I'm a member on the electrical subteam of RoboRacing at Georgia Tech where we are trying to build and compete with an autonomous go-kart to drive itself as quickly as possible around a go-kart track and eventually race other robots at the same time. I was the Electrical Subteam Lead during the 2022-'23 school year where I got our drive and steering systems to work with brushless motors and motor controllers. This was an improvement from the previous year where the steering system failed to work due to a motor controller not working properly.

Projects: Text

INDIVIDUAL DISCOVERY PROJECT - LCD GAME

For my Individual Discovery Project for ECE 1100, I decided I wanted to create a fun project out of parts that I had in my Arduino kit from a high school engineering class. I was most interested in trying to program the 16 x 2 LCD in the kit because it would allow me to display some form of graphics which meant that I could make a game! I chose to follow a tutorial because I have little experience in game design, and I still learned plenty while following the tutorial since I had to understand what the program was even doing to add more functionality to an existing game. My original goal was to add more features and functionality to the basic 2d platforming game. This would have involved adding a level difficulty select before the game began or a background song that played as the game was being played. I focused on the background song because I thought that the original Super Mario Bros. Theme Song would have been a perfect fit. However, I soon realized the complexity of playing a song with an Arduino through a buzzer (really a piezoelectric speaker). To program all the notes in a song, you must keep track of all the frequencies/tones being played and how long each note is held. I found an online program that could convert a .midi file into Arduino code that allowed a song to be played with a buzzer. I ran into another issue from this, though. I know that the Arduino is a single-core processor, so it would be difficult to write a program that plays music as the LCD is being constantly updated to scroll and move the player’s character up and down. It’s possible through protothreading as covered in this tutorial https://create.arduino.cc/projecthub/reanimationxp/how-to-multithread-an-arduino-protothreading-tutorial-dd2c37, but it relies on monitoring many different small tasks that can be accomplished in a relatively short amount of time. I could’ve broken this down into different functions like playing one note and checking when the buzzer needed to be changed to play the next note, scrolling the screen by one grid space, checking the user’s button press, and if the player’s character collided with an obstacle. I would’ve had to invest all my time into learning how to multithread between all these small tasks to keep the song being played in the background and update the LCD to be constantly scrolled and move the player’s character up and down depending on if the button was pressed. Instead of adding a full song into the game, I decided to just add sound effects for starting the game and every time the player jumps (the sound is not played when the button is pressed and the player cannot jump). This added audio feedback makes the game a little more enjoyable and would help if the person playing the game intended to go for a high score. Another feature that I thought I could add if given more time would be to save the highest score on the Arduino itself using the microcontroller’s EEPROM to store the score even when the microcontroller doesn’t have any power supplied to it.

​

Tutorial for LCD game taken from here: https://create.arduino.cc/projecthub/muhamd-magdy/arduino-game-by-lcd-9a3bc2

Projects: Text
Schematic.png

Tinkercad Schematic

If you follow this schematic, you would be able to reproduce what I built and play this game for yourself!

Projects: Image

Materials Used:

1x Arduino Uno

1x SunFounder LCD1602 Module

1x Push button

1x 10kOhm Potentiometer

1x Passive Buzzer

1x 100 Ohm Resistor

~19x Jumper Cables

Below are images of all the non-text characters used to display the game graphics. I found it interesting how you could only create 8 custom characters to display on the LCD, so this added limitation made it harder to use many custom sprites. I also thought it was ingenious how the dot character was used as the player’s head when jumping between rows on the LCD screen to save a sprite slot. Games on many early computers worked the same way because of limited custom sprites, so finding different ways of using existing characters as part of a game’s graphics is almost as interesting to me as how modern graphics work and technologies like raytracing.

Projects: Text

First Running Sprite

Second Running Sprite

Full Jumping Sprite

Top half of jump between rows

Left half of obstacle sprite

Full Obstacle Sprite

Right half of obstacle sprite

Bottom half of jump between rows

Projects: Pro Gallery

LCD Game Demo

Here's a quick video of the gameplay. You can hear the sounds being played every time the button is pressed (only when the player can jump or when starting the game).

Projects: Video

Check out the code below!

RoboRacing New Member Project

I'm on the RoboRacing team at Georgia Tech which is one of the 5 teams under the umbrella organization RoboJackets. Check out more about my team here. I'm a member of the electrical subteam where we design all of the electrical subsystems that power and control the vehicle through the batteries, motors, POE network, and more. As a new member, I was given a new member project allowing me to practice designing a PCB and get up to speed with the rest of the team. My project was focused on monitoring the state of charge in our autonomous go-kart robot. I converted the batteries' voltage to a percentage measurement for the state of charge based on the voltage to percent of charge remaining graph in the battery's datasheet. I also applied Coulomb Counting to the current drawn from the batteries. With these two different measurements, I applied Kalman filtering to achieve a more accurate result of the state of charge of the batteries. The other aspect of the project was displaying the battery level of the robot so that people working on the robot could quickly check how much charge was left and determine if the batteries needed to be charged before competing to prevent the robot from unexpectedly shutting down during a lap. We displayed the state of charge, battery voltage, and current drawn all on an LCD panel with a separate LED to indicate when the batteries should be charged. This same information was also transferred through the robot's POE network to display wirelessly on our manual remote controller to allow the driver to also keep track of the battery level if nobody was close to the robot itself. To make this all possible, I designed a PCB that steps down the voltage from the robot's car batteries using a voltage divider to allow the microcontroller to receive the voltage as an input without frying the microcontroller itself. There's also some noise filtering to prevent sudden spikes in the signal from disrupting an accurate measurement. The microcontroller uses a lookup table to convert the voltage into a percentage of charge remaining and the information can be displayed on the LCD and transferred on the POE network for other parts of the robot to use. There is a separate current sensor measuring the current draw from the battery leads to the rest of the robot, so this allows the use of Coulomb counting to measure how much charge is lost and estimate the remaining charge. I used Eagle to draw schematics and route the PCB to print it out and soldered our components onto it, and PlatformIO & Mbed Studio to program our STM microcontroller which uses the Mbed OS.

bottom of page