Skill
C/C++About me
Hi, I'm Julian. I was working as a welder when a unique and deadly pathogen began to sweep the Earth. I have since used this transformative moment in our collective history to transform myself into a software engineer. I'm presently working with a startup called Service Robotics & Technologies, building a map-based platform to integrate IoT devices from disparate manufacturers.
Fortunately, I already had some previous experience in software engineering—I have a bachelor's degree from Iowa State University in Liberal Studies, which was a multidisciplinary degree which emphasized studies in computer engineering, business, communications, and philosophy.
To facilitate my career transition, I set out to create a fractal explorer coffee table to serve as something of a resume to demonstrate what I can do. Keep reading for a description of the build process!
The Mandelbrot Table
From zero to infinite complexity
At a glance, here are some of the skills, tools, and technologies I learned/worked with:
- Multi-platform: C++, Python 3, OpenGL, GLM, CMake, Git/Github
- Linux: GDB, vi, Emacs, systemd, cron, X11, xrdp
- Windows: Microsoft Visual Studio 2019, Visual Studio Code
Raylib
When I started the project, I planned to use an OpenGL wrapper library called Raylib to build the project. It even came with a sample Julia set shader, so I figured it would be an easy adaptation. Unfortunately, using an iteration count above 60 (which was very low and looked terrible) completely broke the example, and I didn't know enough about OpenGL to fix it. I put the project aside for a little while.
Starting OpenGL
Once I got laid off, I realized I had the opportunity to invest myself in learning OpenGL at a deeper level, from the start, instead of wrestling some code I didn't understand into doing what I wanted it to do. I followed along with some videos on YouTube until I felt confident to try drawing my first fractal. Here is me comparing my first Mandelbrot set against a reference image to make sure it doesn't look squished.
Moving back to the Pi
Initially I developed on the Pi over xrdp. Much to my chagrin, when I tried to run my program on the Pi itself, I was met with a black screen. It turns out xrdp renders with the client's GPU, and I was targeting a version of OpenGL that the Pi did not support. Once I modified everything to conform to OpenGL ES 3.1, I was greeted by my first Pi-native (and terribly slow) Mandelbrot!
Speeding it up
One of the primary techniques I used to make the explorer more fluid was to render to a texture a fraction of the size of the screen and sample it back, which gets a pretty-good approximation of the image to the screen in a fraction of the time. See the video for more details!
Making it feel embedded
That cursor in the middle of the screen was a nightmare to get rid of. Even after explicitly disabling the cursor in OpenGL and in X11, it would reappear on waking from sleep. I finally got rid of it for good by creating a systemd service to run a cursor removal util. A systemd service also starts the explorer first thing when the system boots.
Tying it all together
A Python script turns input from the knobs into keypress events. The script is started on reboot by a cron job. The signals coming from the rotary encoders are quite noisy, and are debounced in software. With everything starting automatically, the table finally feels like a finished product and requires neither muss nor fuss to operate.
Singing dishwasher
Embedded Arduino project to make a dishwasher more lively
At a glance, here are some of the skills, tools, and technologies I learned/worked with:
- Embedded C, UART/Serial communication
- Arduino Uno/Nano/IDE
- Autodesk Fusion 360/Ultimaker Cura
I worked in a group home from 2017-2019. As a parting gift to to the residents and my coworkers, I decided to liven up our all-too-ordinary dishwasher a little. When the door is opened, it has a one-in-ten chance of triggering one of a number of delightful sound effects, from Funky Town to flatulence.
The speaker driver came from a set of desktop speakers with an obsolete connector I got from a thrift store.
I was originally going to use an audio amplifier chip and a Speak & Spell-type library to generate speech from the Arduino, but I ended up using a DFPlayer Mini module, which has an inbuilt amplifier and SD card reader for prerecorded sounds.
I measured the dimensions of the driver and designed a new enclosure for it in Fusion 360.
I 3D printed my design... perfect fit! The lid snaps on and the driver screws into the housing.
I installed it inside the frame of the dishwasher. There are contacts on the hinge assembly which complete a circuit to let the Arduino know the door is closed.