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. ![]() ![]() ![]() ![]() ![]() |
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. ![]() ![]() |
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. ![]() |
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
Audio
![]() ![]() |
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. ![]() |
"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:
![]() ![]() |
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. ![]() ![]() |
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. ![]() ![]() |
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. ![]() ![]() ![]() The starter buttonIn 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. CaveatThe 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. ![]() ![]() ![]() |
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. ![]() |