Cool project website

John

Conover

John Conover
@alalalsam
Sesami
Firmware Engineer
November 2024 - Present
Coapt: Myo Pattern Recognition
Firmware Intern
August 2022 - May 2023
Robotics Team 4206
Control Systems Lead
August 2017 - May 2020

Here's a couple projects I've worked on for fun or otherwise.

Yummy beef for stupid rainy

heres the beef wellington i made you'ere welkcom

MLPerf Tiny inference on 3ds

I'm currently developing universal 3d-mode support for any application running on the 3ds, and this was the first foray into seeing whether or not that was possible. Currently, the most viable path to universal 3D involves using ML to predict steroscopic image pairs, then displaying the generated image pair along with the original. I've tested displaying predicted image pairs on the 3ds, and it works surprisingly well. If you're curious about learning how the 3ds' 3d display works, the website here has a pretty good explanation

Anyways, for this project I used TVM to cross-compile the MLPerf Tiny Visual Wake Words model for inference on the 3ds, with some help from a tutorial on the TVM website. Since the 3ds homebrew development environment is literally hacky, completing this project taught me a lot about kernel development on custom hardware systems.

While GPUs are generally used for machine-learning operations because they can perform lots of mathematical operations concurrently, I probably won't be able to leverage the 3ds GPU for machine learning, since it's already very busy rendering 5 different framebuffers (2 switching framebuffers for the left perspective, 2 for the right, and 1 for the bottom screen), and also probably more importantly that would require me to reimplement machine-learning algorithms from the ground up in assembly. Fortunately, the upgraded (new) 3ds model has 2 extra CPU cores that I can leverage for my purposes.

Coapt Internship Project

At Coapt, I had to evaluate proof-of-concept for a low power bluetooth device. When I got there, the device wasn't running to spec, so I was put in charge of integrating a new IMU, then programming low-power features until they were satisfied. This was my first exposure to embedded systems and using C extensively, so it took me a little while to get into the swing of things. Once I got comfortable coding though, I implemented their requested functionality, and even threw together a couple test scripts that I could flash onto the device to make testing a little easier for the hardware guys.

3ds Dataset Building Utility

This is a homebrew 3ds program that I'm using to make me a machine learning dataset. It employs multithreading to collect stereoscopic 3D image pairs every few seconds. Initially, I had a working version in 2 days, but this version would freeze gameplay for a quarter second every time It saved the screenshot to memory. I hated this a lot, so I spent 2 weeks working on a multithreading implementation to write the screenshots in a way that wouldn't interrupt gameplay.

Employing multithreading wasn't too difficult (since I wasn't building the functionality from scratch), but I had an issue where, for one of my image pairs, the leftmost column of pixels would be missing, and the rightmost would be full of noise. Initially, I thought this was an issue with which address my code was reading from, but that wasn't the case. What was happening was that whenever the left stereoscopic image pair was written to cache, the dummy variables used during that operation were located in the addresses directly after the first screenshot's location, which overwrote the start of the second screenshot. To fix this, I allocated an extra column of pixels in cache, and offset the writing of the right image pair by that column. The extra column I allocated would then be filled with the dummy values, and the right view's data would remain untouched.

Robotic Robot

In high school I participated in FIRST robotics competition, and this is the robot we made during my senior year. At this point our team was working out of 2 garages and a shipping container, and we had barely 10-ish people on the team that were actually useful. I was in charge of building all the electronics and pneumatics, and everyone else did everything else. This was also the first year we had 2 working robots in time for competition (1 for competition and 1 for practice), which was frankly astounding given our circumstances.

When this bot was designed the designer didn't designate any space for electronics so I ended up cutting our control systems in half, zip-typing them to the sides of the bot, and routing all our wires through the bottom, making sure they don't get snagged on any belts, gears, motors or gamepieces they might come very close to. This was especially challenging because our driver was a crazed maniac who filled his days and nights with vyvanse-fueled ranked overwatch gameplay, and we encouraged him. One competition our team swapped out the wheels on the bot so that he could ram into other people with more force. It was hilarious to watch, but I had to make sure the lengths and tolerances of my wiring could endure tons of violence before they failed.

Hilarious Website

I'm pretty mad because whoever implemented the web stack at Netlify made it so that you can't display your own website from within an Iframe more than once. This section was supposed to be a funny joke where I tell you "you can't scroll any further until you scroll down all the way in the website window," and then it would trap you into a recursive loop where you have to keep scrolling for like 50 layers deep of this website. The closest I can get is if I put in the wrong url, then the Netlify 404 page has a link to take you back to this website, but even then it stops rendering all embeds like 10 layers deep. Huge thanks to Sevan Evans for providing me a Node.js example to build off of.

Shrek Can Feel Your Heart Beating

Here's a project I was forced to do at gunpoint during my time at the University. This is a MSP430 that takes an input ECG signal on 2 pins, then isolates and displays the signal on the display. Later on in my instruction we hooked up electrodes to our makeshift cardiographs and measured our own heart rate, which was cool. I had to encode and display a random picture on the screen too, to prove to my overseers that I could understand how displays work at a low level.

Gun

I was bored in engineering class one day, so I went into our shipping container full of trash and made this gun out of garbage. It uses a cannibalized power drill to power a compressor which builds pressure. It then uses a solenoid to dump that pressure. Unfortunately, the solenoids we had couldn't dump all pressure at once and the valves we had that could were already being used by more useful projects, so the gun couldn't hurt anyone unless you hit them with it. We had a couple plastic lightsabers for that anyways so it ended up being used for testing which pistons in our shipping container full of trash worked. Unlucky!

Miscellaneous Projects

I've done many more projects than are listed on this site, but I don't have any documentation for most of them. Some of the more noteable ones include developing ADD, SUB, and MULT subroutines to a 16-bit arithmetic logic unit on an FPGA, developing a complete recreation of the dice game Yahtzee with JavaScript, building the world's worst t-shirt cannon, building the world's best popsicle stick bridge, and developing firmware for a makeshift 6-DOF arm.

The End