Portfolio

Swimtrack - Capstone (2025)

Project Type:Team project

Programming Languages: C++

Contribution: Programming, modeling (partially), wiring

Links: Demo (dryland), Demo (pool)

Swimtrack was designed and built for our engineering capstone project. Using off-the-shelf parts and a custom enclosure, we made a device that counts the time it takes for a swimmer to swim laps in a swimming pool.

In the world of swim-tracking gadgets, there are generally two types: internal and external. The internal trackers are wearables such as the Fitbit or Apple watch, which use onboard (i.e. internal) sensors to tell when a lap starts or stops. The external swim trackers are devices that tell when a lap starts or stops by looking at what the swimmer is doing from the outside. In competitive swimming, this type of tracking is accomplished with touch pads, which are very expensive and completely stationary once setup. In normal training situations, however, external tracking is often done by a human being (i.e. a coach) using a stopwatch.

Generally, external trackers are more reliable because they can clearly distinguish the transition between swimming and resting to get the most accurate lap times, whereas internal trackers depend on recognizing patterns in sensor data in order to tell when the laps start, which is inherently less reliable because these patterns are not perfectly well defined so there are often off-by-one miscounts. The main issue is that there is only one option for external trackers on the market: touch pads, which involve setting up a prohibitively-expensive system for individuals or small users and is not even portable.

Our device, therefore, is unique in that it is an external tracker--so it has the potential to be the most accurate type of tracker--and it is both portable, and inexpensive.

Figure 1. Completed project.
Figure 2. Internal view of the device and the CAD model made in Onshape.
Figure 3. Finite State machine that is implemented on the Arduino MEGA.

Zigbee Sensor Network (2023)

Project Type: Individual

Programming Languages: C++, Python

Links: Github repository

A small network of sensors that uses a Raspberry Pi 4 as the base station and Arduinos for the sensor nodes. The Zigbee wireless communication is established using XBee RF modules. This was a project submitted for our computer network class. In lieu of a final exam, the professor assigned us a semester-long project that could be on any topic related to the class; for example, a sensor network.

Both the base station and Arduino are unaware of the Zigbee implementation because they only utilize the UART port. The outgoing data from the UART ports is received by Xbee RF modules and then immediately transmitted over the network.

The Xbee modules are pre-configured in the XCTU software on a computer to make them communicate on the same channel.

Figure 1. Custom base station platform using the Raspberry Pi 400.
Figure 2. A sensor node on a breadboard.

Bootloader (2023)

Project Type: Individual

Programming Languages: x86 assembly

Links: Github repository

System23 is a bootloader written in assembly. In particular, the Intel 8086 instruction set is used, and BIOS functions are utilized to make the system perform basic tasks. For the technical people, this bootloader stays in 16-bit real mode, it does not enter protected mode... yet.

The bootloader can load 512-byte boot sector games in its "root directory," which I have not written myself, but found on github. For example, these ones.

It can be written to a real floppy disk or a USB flash drive. When plugged into a running computer with an operating system like MacOS or Windows, the drive appears as a tiny disk (~1.4 MB) in which you can put the boot sector games as .bin files.

Background. When any computer with Intel's x86 architecture is started up, it behaves like the original 16-bit processor from the 1970s, the 8086. At that time, the BIOS(a tiny piece of software residing in memory at bootup) was the only way to interface with/control devices like the keyboard, screen, or hard disk drive. To tell the computer to read from the disk for example, you must load registers A, C, and D with specific values and execute the INT 13h instruction.

The bootloader is the piece of software that runs before the operating system is loaded. In particular, the bootloader reads the operating system (e.g., Windows 10) off the disk and loads it into memory, then it sets up some low-level data structures, changes some hardware settings, and switches the computer into either 32-bit or 64-bit mode, depending on the computer and the operating system. Finally, the bootloader issues a jump to the first instruction of the operating system code, and the operating system takes over from there.

This is by far one of the most complicated, albeit simple-looking projects that I have ever worked on.

Figure 1. System23 bootup screen. Screenshot from VMware workstation.

EasySteg (2023)

Project Type: Team project

Programming Languages: C, C++

Links: Github repository

Easysteg is a digital steganography tool that can encode secret data into both image and audio files. This was a 2-person project submitted for our computer security class. In lieu of a final exam, the professor assigned us a semester-long project that could be on any topic related to the class; for example, digital steganography.

The following is a list of currently accepted image and audio formats:

Image

  • 24-bit BMP files

Audio

  • 16-bit PCM WAV files

Figure 1
Figure 1. EasySteg GUI window with a BMP image loaded, made in Borland C6.
Figure 2
Figure 2. EasySteg message encoding screen.

Self-setting Smart clock (2022)

Project Type: Team project

Programming Languages: C++

Links: Github repository

A Smart clock that uses an ESP8266 microcontroller and automatically sets the current time using a geolocation API. This was a 3-person project submitted for our microcontrollers class. In lieu of a final exam, the professor assigned us a semester-long project for which the only concrete requirement was to "use a microcontroller." The idea was entirely our own.

The clock initially sets itself up as a wireless access point which you can connect to on your phone or PC to configure it. After connecting to the access point, you are greeted with a configuration portal in which you can choose a WiFi network in the vicinity for the clock to use. After choosing a network and putting the password in, the portal closes and the clock will automatically set the time. Because the RTC module it uses (the DS3231) has a battery, the time will be saved even if the clock loses main power.

The clock has 3 buttons, from left to right: INCREMENT, DECREMENT, and MODE. Pressing the INCREMENT/DECREMENT buttons by default changes the minute, but while holding the MODE button, they change the hour.

Figure 1
Figure 1. Completed smartclock on breadboard.

"Byte Pong" - A pong clone for NES (2021)

Project Type: Individual

Programming Languages: 6502 assembly

Links: YouTube demo

Wrote a pong clone for the Nintendo Entertainment System (NES) and programmed the game onto an EEPROM to create a physical game cartridge. There are two modes and they both work as you would expect:

  • 1-player mode pits you (the left side paddle) against a computer (the right side paddle).
  • 2-player mode lets another person take control of the right side paddle with the second controller.

Figure 1
Figure 1. Byte pong main menu.
Figure 2
Figure 2. Byte pong 1-player game in progress.

AsterRoll (2020- )

Project Type: Team (Shippensburg Videogame Dev Club)

Programming Languages: GDScript/Python

Links: Play the game here

Composed all sound effects and music for the AsterRoll game created in Shippensburg Video Game Dev Club. The game was submitted for the GameOff 2020 game jam, for which the theme was "Moonshot." In short, the game revolves around you (a small asteroid) rolling around on bigger asteroids to collect rocks and resources in order to become a bigger asteroid, kind of like a cartoon snowball rolling down a hill. Eventually, you become large enough to be a moon, at which point you can try to launch yourself toward a planet to start orbiting it, ending the game.

I continued work on the game long after the game jam because I was never satisfied with the look and feel of the game, and I ended up producing many original assets and fixing many bugs or completely reprogramming stuff over the years.

Screenshot of AsterRoll, 2024
Figure 1. Screenshot of AsterRoll in 2024.
Collage of (almost) all visual assets made by me
Figure 2. Collage of (almost) all visual assets made by me.

Homemade Brushless motor (May 2017)

Project Type: Individual

Links: YouTube demo

Using wood, copper pipes, inductors, and a hall effect sensor, I made a DC brushless motor.

This motor is based off a design from a video on YouTube which, at the time of writing, I can no longer find, but his version was much nicer, with custom machined aluminum parts and everything. Unfortunately, even though I was 17, I was still not very good at documenting anything I did, so I no longer remember any key details of this project such as the operating voltage.

I do remember, however, that I needed to create an inverter (NOT gate) because one of the signals I was expecting to be HIGH was actually LOW, and I was very happy to get it working.

Figure 1. The brushless motor.
Figure 2. The brushless motor while operating.

50-amp variable power supply "Grand Daddy Variac" (2015-2016)

Project Type: Individual

This power supply was made using a 2-gang 50-amp variac that I found on ebay for $100, and it puts out 0-120 V. The motivation was to have an overly-capable power supply in my collection that could handle absolutely any load without overheating and blowing fuses. So far I haven't acquired any heavy-duty gear that would require the full 50 amps, but it has proved very useful in a variety of high current projects, such as the HHO generator I built.

I made the enclosure box out of plywood and drywall screws, and it is slightly larger than necessary in order to house some wiring in the front side. The top panel is a sheet of aluminum, and it has a power switch, a starter button, and an LCD volt meter.

Figure 1. Final completed state in January 2016.
Figure 2. Rear view of the power supply. I never built a back panel because I knew someday I would make a better enclosure, but I have yet to spend time actually doing that.
Figure 3. The power supply alongside my other 3-amp (red) and 10-amp (white) variacs.

The starter button

In short, the starter button is what allows you to plug this thing into a normal 120V 15-amp socket without tripping the circuit breaker due to the inrush current. It works like this: When initially powered up using the ON/OFF switch, the variac is partially energized through an inductive ballast placed in series with the variac, and when the starter button is pushed, a relay is triggered (and latched), bypassing the ballast, and allowing the variac to be fully energized. There were no particular instructions I read to arrive at this exact solution, but I watched a lot of videos from people like Photonicinduction, and read forum posts in order to learn how to deal with inrush current.

Caveat

The main caveat is that this power supply is not exactly ready for 50-amp loads.

Due to the extreme compactness of the enclosure, I had to use small wire (8 AWG, I believe), limiting the safe maximum current to probably around 40 amps. Then, there is the fact that the outlet on the front is not even rated for 30 amps, let alone 50 or more, so that would also pose a risk for prolonged usage. Finally, the most obvious thing is that the current is ultimately limited by the circuit breaker you plug this into because in the worst case scenario, the current seen by the outlet is the same as the current going to the load (50 amps), but neither the plug nor the breaker I have it connected to are rated for 50 amps currently.

That said, all of these items are pretty easy to address if I really need the 50 amps.

Pickle jar vacuum chamber (2015)

Project Type: Individual

Links: YouTube demo

Using a pickle jar and a series of hoses and fittings from an old freon charging station, I built a vacuum chamber for high voltage experiments. The photos below show what happened when very high voltage was applied to the top of the chamber, which is really the only "experiment" I was able to do.

The high voltage power source was an AC flyback transformer from a CRT driven by an electronic fluorescent light ballast. In hindsight, the most important thing was that it was an AC flyback transformer, which made it produce a very large corona discharge. The corona discharge was so strong that to prevent arcing within the windings, I had to submerge the transformer in mineral oil, evacuate the air, and make a special enclosure out of a tupperware container to house it.

Figure 1. Vaccuum chamber with a weak vacuum.
Figure 2. Vaccuum chamber with a funny-looking piece of wire attached to the lid. It wasn't as spectacular as I had hoped.
Figure 3. Vaccuum chamber with a very deep vacuum.

Aluminum foundry (2015)

Project Type: Individual

Aluminum/zinc foundry made from a stainless steel pot, plaster, sand, and a hairdryer.

This foundry was based on the mini aluminum foundry video from Grant Thompson, "The King of Random." Unfortunately, not much photographic evidence remains of this project, but I do at least have a video, of which figure 1 is a screenshot.

For fuel, the foundry mostly used charcoal because it was easy to get, but it didn't last very long. At one point, however, I managed to acquire some real coal for free, and it worked very well.

Ultimately, my goal was to cast parts using lost-foam casting, but before I gathered enough aluminum ingots to make anything interesting, the foundry lining and my crucible broke, and being that I was a jobless 15 year-old, it was hard to secure funding to fix those things. Therefore, the foundry was a short-lived project. I did, however, end up with a bunch of muffin-shaped aluminum ingots and one failed casting.

Figure 1. Mini aluminum foundry halfway through melting a beer can.