My Portfolio
Past, Current, and Future Projects
Autonomous Intersection Simulation & A.I.
Developing and Simulating Self-Driving Car A.I. Without Need for Traffic Lights
Expand
-
The Autonomous Intersection in Action!
-
Threading the Needle
-
High-Level Flowchart of the Cars' AI
-
Simulation with 1 Lane
-
Simulation with 2 Lanes
-
Simulation with 3 Lanes
-
Simulation with 4 Lanes
-
Demo of Simulation with 1 Lane
Summary
- The purpose of this project was to create a computer simulation of a four-way intersection with no traffic controls (stop signs or traffic lights) and then develop an autonomous artificial intelligence such that the self-driving cars regulate their speed and pass through the intersection without any collisions.
- This 2D simulation was created entirely from scratch in Visual Studio 2017 using C#, and leveraged the MonoGame framework, an improvement to Microsoft's discontinued XNA 4.0 framework.
- The physics and mathematical details of the simulation were created from scratch specifically for this simulation, with acceleration and deceleration physics derived from data on real world tests of the Tesla Model S.
- The simulation is incredibly flexible and gives the operator extremely granular control over all characteristics of the simulation. This is thanks to the Vars.cs file which contains nearly 50 public global constants that both the simulation and the AI have access to. This means that the even the thickness and length of the dashed lines on the road can be modified. By drawing the simulation dynamically based on these constants, a myriad of different scenarios can be simulated.
- What separates this AI from any other existing solutions out there, is that is fully decentralized and autonomous. There is no central server controlling all the vehicles. Rather, each vehicle makes its own decisions using basic utilitarian values such that the efficiency and safety of the intersection as a whole is the number one priority. By making the AI decentralized, there is no risk of having every car on the road crash when there is a failure with the central server.
-
This was accomplished by leveraging what is known as "swarm intelligence" - all the cars intercommunicate such that they knew exactly what all the other car's current states are and can accurately predict where collisions would occur and then decide how to avoid them.
Custom Smart Deadbolt
Brainstormed, designed, built, and programmed a smart deadbolt from scratch
Expand
-
The Smart Deadbolt w/ Clear Window On
-
The Smart Deadbolt in Action!
-
3D Model of Full Assembly (V4) - Clear Walls
-
3D Model of Full Assembly (V4) - Opaque Walls
-
3D Model of Full Assembly (V4) - Front View
-
OLDER VERSION (V3) - Exploded View of 3D Models
Summary
-
Attaches to my backdoor’s OEM deadbolt and turns the deadbolt lever to lock and unlock door
- Mounts to the door and deadbolt without any adhesive or mounting hardware that could potentially damage the door
- Leverages radio modules for communication with smart home controller
- Powered by an Arduino Pro Mini 5v that drives a high torque TT motor
-
Comprised of 13 different 3D-printed parts
- Designed from scratch in Autodesk Inventor and 3D printed by yours truly
- Custom modular design allows for rapid prototyping and iterative design
-
The deadbolt lever has a 3D-printed adapter that snaps around it (no adhesive necesssary) to convert it into one big gear
- This gear is then turned by the TT motor through a smaller gear with half the teeth which
- Limit switch senses when door is closed or open - useful for functionality such as preventing deadbolt from being extended when trying to shut door
-
Potentiometer sitting opposite the motor shaft provides two-fold functionality:
- Acts as an axle of sorts for the gear driven by the TT motor
- Is a highly precise, non-volatile, axle "encoder" that allows for knowing the position of the deadbolt gear, and can thus infer when the deadbolt is turned into the unlocked or locked position
- Seamlessly integrates with my custom smart home ecosystem
-
Functionality provided by Smart Home:
- Automatically locks deadbolt after a minute if it is left unlocked
- Remote monitoring of whether door is ajar/open
- Remote monitoring and control of the deadbolt from anywhere, enabling the ability to let guests into home remotely
- Function that prevents deadbolt from locking for any reason - useful for when you want to step outside quickly without needing your keys or a smarthpone
-
Currently on its
4th
major version (V4)
- V1 was the proof of concept
- V2 was a more complete prototype, with only small improvements over V2, mostly just improved modularity
- V3 saw the complete overhaul of the design into a proper enclosure with better modularity and better complexity
- V4 took V3's complete design and cleaned up the aesthetics considerably, while adding fully realized modularity allowing for the addition of more attachments and sensors
Smart Mat Alarm Clock
Alarm clock on smartphone that is turned off only by standing on a pressure sensitive mat for 10 minutes
Expand
Summary
-
This project had 3 different pieces
-
The smart mat
- Pressure sensitive mat that acts as button of sorts - when stepped on, its resistance drops to nearly zero and allows current to flow through.
-
Raspberry Pi Zero W that runs a python script which sends HTTP requests to the API hosted on my server
- Sends periodic "heartbeat" POST request every 30 seconds
- Sends POST request whenever the state of that mat changes
- Has ghosting/accidental step off prevention - mat's state must change for >5 seconds before POST request gets send to API
-
The alarm clock software and automation on my phone
- "Wake me up!" Android app provides the alarms that are monitored and triggered by "Tasker"
- "Tasker" Android app monitors and triggers alarms provided "Wake me up!"
-
The Tasker app is where all of the logic lives:
- Request current state of the mat (stood on / not stood on) every minute
- If mat is not being stood on, retrigger the alarm and reset the minutes stood on counter
- If 10 consecutive iterations (each 1 minute long) occur where the mat is stood on, then disable the alarm
-
The public API hosted on my server
- Node.Js with Express
- Receives the mat's current state and filters out false positives
-
The smart mat
Smart Backdoor Auth Panel
3D-Printed access panel that will provide authentication for my custom smart deadbolt using either RFID, fingerprints, or a keypad
Expand
-
3D Model of Auth Panel w/ Cover Open
-
3D Model of Auth Panel w/ Clear Cover
-
3D Model of the Waterproofing Seals/O-Rings
-
3D Model of Auth Panel w/ Cover Closed
Summary
- Leverages NRF24 radio modules to connect to my MySensors network which is controlled by my Home Assistant smart home ecosystem
- Features several methods of authentication that allow for various levels of convenience and security, but regardless of which methods are used, two must be used for any given authentication attempt, creating a 2FA system to significantly enhance security.
- At certain hours of the day, such as 2am to 6am, can enhance security requirements by disabling some less secure authentication methods
-
Authentication methods will include:
- 10+ digit pin entered via physical keypad
- rfid key
- fingerprint scanner
Custom Spotify API Interface & Projects
A monorepo for the custom interface I made for the Spotify web api and the various projects and scripts that leverage it
Expand
Summary
-
Created custom interface for the spotify API that provides a simplified, easy to use library for leveraging various functionality of the spotify API.
- Various python libraries and packages already exist for the spotify API, but after using them for a few months, I knew I wanted to make my own
-
Reasons for making my own DIY spotify library:
- The existing libraries felt too bloated
- Designing and implementing a custom interface from scratch would allow for me to shape it and customize it to fit my needs and use cases
- I wanted to have my own way of handling authentication for the Spotify web API
-
The "Spotify Jukebox" project is a working concept of a web-app that will act as simplified Spotify app, centered around sharing a common queue of music, the "jukebox", if you will, so that 2 or more users can act as DJ
- A proof of concept of the jukebox queue has been implemented in the form of a simple CLI
- The next step will be to build an API to handle the basic functions of the juxebox and then build a web-app as a front end that leverages this API
Bedroom Smart Home Arduino Controller
Arduino that connects to my smart home via RF as controller for LED strips, speakers, and more
Expand
Summary
- Integrates perfectly with my Smart Home Ecosystem via RF module using the MySensors protocol, allowing for easy control from my phone or any browser.
- Manipulates 3 zones of LED strips, allowing for individual control of RGB color, brightness, and on/off per zone
- Controls an 20 year old Sony soundbar & subwoofer combo by sending IR codes via an IR blaster, allowing for control of volume and input selection without need for a remote.
- Detects motion in room and reports this information for use with presence detection and other automations.
3D Modelling Sandbox / Showcase
A collection of various 3D models I created over time and want to show to world
Expand
Summary
- These are all creations that I either made out of boredom or for some personal project that just was not important enough to have its own spot on my GitHub - so they live here now
-
Models that can be found in this collection include:
- Skar VXF12 Subwoofer
- Plan for dorm room layout
- 2 dream monitor layout concepts
Freight: A Custom CSGO 5v5 Defusal Map
Map That I Built From Scratch for Counter-Strike Global Offensive
Expand
-
2nd Mid - Connecting T-Spawn & Mid to A-Site
-
T-Side View of Mid
-
Side View of A-Site
-
B-Site
-
T-Side of B Mid (Area before B-Site)
Summary
- This map takes place on an abandoned ship yard, full of empty freight containers stacked several high, forming large valleys with only two large cranes poking above the looming walls of containers.
- Both sites for this map are centered around these two cranes which make for interesting site layouts, as well as making navigating to both sites intuitive from nearly anywhere on the map by just looking up.
-
The true uniqueness of this map comes from the abnormally high number of different paths to and from each site.
- This can easily become unwieldy, making it nearly impossible to predict how the enemy will arrive at the site, thus making defending the sites a nightmare to defend against.
- To balance this, there is an explicit risk vs reward for each pathway.
- This project has been inactive on the backburner for about a year, but will be picked back up during spring of '22.
- Thank you to my pal KJ for all the help with both guiding the artistic vision and tweaking the layout of the map, as well play testing and then helping decide what to revise afterwards.
Fully Upgrading My $40 RGB Mechanical Keyboard
Breathed new life into my ol' reliable mechanical keyboard with all new switches, keycaps, and sound-dampening foam.
Expand
-
New Switches Installed
-
New Keycaps Installed
-
Side-View of New Switches
-
The Keyboard's PCB
-
Original (Ugly!) Keycaps
-
Original Switches
-
Close-Up of New Switches
-
Side-View of New Keycaps
Summary
-
Replaced the old and crappy Outemu Red linear switches with Gateron Clear linear switches
- Removed all the old switches, then desoldered all ~150 hot-swap sockets which were too small for the new switches, and then soldered in all the new Gateron Clear linear switches.
-
Replaced old keycaps with OEM profile blank fog-white keycaps. Stayed with OEM profile so they keys would be the same shape as the old ones.
- Transfered all of the o-rings from the old keycaps to the new blank fog-white transluscent keycaps to make the new switches even quieter
- Fully cleaned the plate and case, added sound dampening foam to inside the keyboard, and added dampening tape to the loose and wobbly stabalizers to reduce noise.
- Had to do 6 pcb trace and throughhole repairs due to damage sustained from desoldering and resoldering since to the pcb is super cheap and this was one of my first proper soldering experiences.
- Took roughly 25 hours and 300 solders. Worth it! Looks and feels infinitely better.
- Keycaps used: PBT OEM Fog White Keycaps
- Switches used: Gateron Clear Linear Switch Plate Mount 35g Actuation Force
Handwired One-Handed Gaming Keyboard
Ergonomic one-handed mechanical gaming keyboard with thumb cluster and multi-layer keymapping powered by QMK and an arduino pro micro, all fully handwired
Expand
-
The OHGKB
-
Better View of Thumb Cluster
-
Handwiring of Keyboard
-
Handwiring of Keyboard - Side View
-
Close-Up of Arduino's Handwiring
-
Better View of Rear LED Strip
Summary
- Keyboard layout is a Dactyl Manuform 5x6
-
3D printed by yours truly with white PLA
- Took ~72 hours to print on high detail/resolution settings (0.12mm layer height)
- Used QMK firmware to create custom firmware
- Switches Used: Gateron Clear linear mechanical switches
- Keycaps Used: Transparent DSA profile keycaps
- Handwired used 1/4" copper tape, 1N4148 diodes, and 20AWG wire, with a different color wire being used to interconnect each column
- 3D model used was not designed by me. It can be found in GitLabs here: Dactyl Manuform GitLab
Tetris Min-Max A.I. & Custom Simulation
Creating a simulation of tetris from scratch to host/run different AI that I developed, and is also playable by a user via keyboard inputs.
Expand
-
AI Playing The Tetris Simulation
-
Overview of AI's Python Code
Summary
- Created an accurate and faithful Tetris simulation using Python and the Tkinter interface that is playable by the user while also easily and seemlessly interfacing with the AI
- Goal was to create a basic single agent online AI that can clear several levels on average as well as score well before inevitably losing
- Two different AIs were created, trained, and evaluated to examine if increased complexity in the AI is directly related to improved performance
- Overall, both AIs functioned relatively well, but were wildly inconsistent - About 1 in 10 trials would result in the AI failing to even score a single point or it would score in the hundreds of thousands, clearing anywhere from levels 9-13
- In the end, the less complex algorithm was faster with near identical performance
Custom Under-Couch Subwoofer Enclosure
Creating a fully custom low-profile dual chamber MDF subwoofer enclosure powered by dual 12" drivers and a car subwoofer amplifier
Expand
-
The Two 12" Subwoofers
-
The Subwoofer Enclosure - Top View
-
Subwoofer Under the Couch
-
Subwoofer Under the Couch - Front View
-
Clearance Between Subwoofer and Couch
-
The Amp & Power Supply Setup
-
Front of Amp Setup Close-Up
-
Amp Setup - Top View
Summary
- Built a fully custom low-profile, dual chamber, sealed subwoofer enclosure designed specifically to fit under the couch in my dorm room
- Used all car subwoofer components for better customizability, compactness, power, and cost effectiveness than traditional home theatre subwoofers
- Constructed of one 4'x8' sheet of 3/4" MDF, held together by wood glue and wood screws, with 2x2s in each corner of the champers for reinforcement
- Speakers are driven by a car mono amplifier that can deliver 400W max @ 2ohms, which is powered by two 15A 12V (300W) DC power supplies which convert the AC current from the wall into 12v DC which is required by car audio components
-
Designed specifically to fit underneath the couch in my dorm, the enclosure measures a mere 7.5" tall, then a humble 9" tall - even with the subwoofers installed
- Despite the extreme height restriction, each chamber provides the recommended ~1.2 square feet of internal volume per driver
- Outer dimensions of the enclosure: 36" x 24" x 7.5"
-
Sporting two Skar Audio 12" VD12 DVC shallow mount subwoofers, convservatively rated for 500W RMS a piece
- They are 2ohm DVC (Dual Voice Coil) subwoofers, so the voice coils are wired in series to give each driver a net resistance of 4ohm
- Then the two drivers are in turn wired in parallel to create a net 2ohm resistance for the whole circuit, the minimum resistance the amplifier can handle, thus maximizing its power output
-
The two 12" upward firing drivers, located mere inches below the listener seated on the couch create an otherwordly, immersive listening experience. Additionally, the subwoofers move enough air to make the couch vibrate and shake, making movie watching an absolute blast
- Since the listener is at most a few feet from the subwoofer, almost no volume is required, minimizing the chances of disturbing our neighbors
Think Nexus Design Website
Commercial Website Developed From Scratch using HTML, CSS, and JavaScript with jQuery
-
home page
-
services page
-
individual services page
-
projects page
-
services page
-
contact page
-
custom location map
Summary
- My first full-fledged website. First commercial website, first fully responsive website, and first public website.
- Developed from scratch using HTML, CSS, JavaScript, and jQuery.
- Developed from scratch using HTML, CSS, JavaScript, and jQuery.
- Developed from scratch using HTML, CSS, JavaScript, and jQuery.
- Developed from scratch using HTML, CSS, JavaScript, and jQuery.
- Made website fully responsive using breakpoints for the four different general categories of screen sizes: mobile, split screen, HD desktop, and Full-HD desktop.
- Published initial site at the end of 2016 and have been slowly upgrading ever since.
- Released major update, site V2.0, in 2019 giving the website a completely unique mobile site layout, featuring an entirely different taskbar and footer from the desktop site.
Editor's Note
This website was designed and created from scratch by yours truly using HTML, CSS, Javascript, Bootstrap, and jQuery. The content of this website was automatically generated from my GitHub by a Python script I wrote which allows for this site to be effortlessly maintained and updated, all from my GitHub.