Joel McCandless

My Projects

Personal Website12/23-NOW
Record what makes me happy and share it with the world!

You're looking at it! This website is built with Vue.js, Nuxt JS and Tailwind CSS. It's hosted on AWS Amplify, which provides free hosting for small static websites such as this. The Vue.js framework enables me to make automated HTML, such as this page, which uses a Vue for loop to iterate over all of my projects. The project information is stored in a JSON (JavaScript Object Notation) file, and the .vue file responsible for this page structures and styles the content, making it easy to keep content and formatting individually organized. With its shorthand notation of common styling, Tailwind enables quick adjustment of the appearance of pages, including adding breakpoints for responsive web development (try adjusting the page size!).

MoreGit Repo

Personal Website
Cognitive Robotics: Wumpus Challenge11/23-12/23
Assemble and program a robot to solve the Wumpus Challenge!

My partner and I adapted the Rensselaer MinSeg Motor Kit and programmed an Arduino Nano 33 IoT using ArduinoC++ to solve the Wumpus challenge. Some notable functionality from our project includes reading motor encoders and implementing a basic PID loop to reach target motor positions, creating and maintaining a Bluetooth Light connection between the Arduino and a phone, and connecting and reading infrared sensors for line detection. Additionally, we developed a lightweight algorithm which stores known information about the board and makes logical deductions from it to solve the puzzle. We also made a website using Vue.js with Nuxt and hosted on Amazon Web Services Amplify to document our meetings and results.

MoreGit RepoProject Website

Cognitive Robotics: Wumpus Challenge
RPI Prerequisites Graph8/23-9/23
Crawl the RPI course catalog and display course progressions in a graph!

I use two programs to reach the goal: one web crawls the RPI course catalog and parses the course information to create a database while the second creates and displays a graphical representation of the database. In the crawling step, I use Python's requests and beautifulsoup4 libraries to crawl RPI's course catalog, regular expressions to extract the prerequisites for each course, and pickle to store the dictionary of Course objects. To avoid uneccesarily crawling each page multiple times, I cache the original html from every page. For graphical visualization, I write a DOT language file and use graphviz's twopi layout engine to display courses in a radial web graph.

MoreGit Repo

RPI Prerequisites Graph
9x9 Tic Tac Toe AI Player6/22-11/23
Develop an intelligent computer player to excel at 9x9 Tic Tac Toe!

Written in Rust Lang, my first version used a traditional minimax algorithm and a point-based rating system. Since then, I have strengthened the algorithm by making it threaded. With its multiple threads, it is constantly "thinking" by using a work queue to build a decision tree breadth first. The tree stores all the computed future boards (amounting to ~5 moves in advance due to the exponential growth of potential boards as it looks into the future). I've also improved the rating algorithm to use probability rather than points, because probability (the chance of winning a board) is robust to all of the strange board arrangements which could tickle bugs in the point-based rating (1 point for each X, 4 points for 2 in a row, etc.). With these changes, I've seen significant improvement in how it plays the game.

MoreGit Repo

9x9 Tic Tac Toe AI Player
A Chest Protector for Joey7/22-9/22
Create a chest protector for a disabled dog!

I heard about this project from a Lexington schoolteacher who was looking for someone to help a dog, named Joey, who was born without front legs. Joey had learned to hop on his hind legs like a kangaroo but slammed his chest on the ground whenever he lost his balance. He needed a chest protector that would absorb the shock of his falls, but such a product was not available on the commercial market, so I designed one for him. I scanned his body using the Lidar sensor on a phone, used Fusion 360 to design a prototype, and 3D printed it out of flexible TPU filament. Upon testing, I realized that I had to prioritize safety, comfort, and convenience as my initial protector was too rough, had inadequate padding, and slid up and down his chest. In later versions, I devised smoother surfaces, thicker padding, and a more secure harness.


A Chest Protector for Joey
UpDownLHS: Digital Voting for School Change11/21-6/23
Create and market a web app which fosters honest debate about school wide issues!

UpDownLHS is an open source Progressive Web App (PWA) for high schoolers, designed to spark conversation about major issues in the school community. UpDown provides Student Senators with a framework to view issues students find pertinent and draft legislation to fix them. Its server is multi-threaded and uses Python's shelve databases with thread locking to store data reliably. It assigns each user a 32 hex digit uuid and sets cookies for sign-in. In addition to 9 viewable web pages, UpDown handles many more behind the scenes requests using Asynchronous JavaScript and XML (AJAX). UpDown's AJAX retrieves data upon the user's request and animates the DOM. While developing the app, I enjoyed designing page layouts, selecting color themes and making the UpDown icon.

MoreGit RepoLanding PageInstagram

UpDownLHS: Digital Voting for School Change
Cryptographic Substitution Cipher Solver1/21-1/21
Write a program which solves substitution ciphers using (intelligent) brute force!

This project started as a Caesar cipher challenge from a high school teacher. Caesar ciphers are a type of substitution cipher, which is a cipher where each letter is replaced by another unique letter. In Caesar ciphers, the remapping is organized by shifting letters a defined value down the alphabet, a process often visualized by a pair of inner and outer revolvable alphabetic wheels. Caesar ciphers are straightforward for a computer to solve, because there are only 25 possible shifts. After solving the Caesar ciphers, I wanted to write a program that would solve any substitution cipher, which is much more challenging because there are 26! = 2.092279e+13 possible substitution ciphers. The program works recursively by matching encrypted words to potential decryptions 1 word at a time, and seeing if the decryption key created works for the other words. A later addition was to try matching the most frequently occuring English words first, which is expected to find the answer faster on average.

MoreGit Repo

Cryptographic Substitution Cipher Solver
Candy Clawbot7/18-8/19
Remake the candy claw arcade game to showcase robotics to kids!

The clawbot utilizes an H-frame x-y positioning system (same as modern 3D printers) which uses 2 motors and a single shared belt to traverse the x-y plane. My dad, brother and I found this design while researching potential x-y motion systems, and chose it because of its simplicity and reliability. I enjoyed designing many custom parts for the clawbot, especially the joystick, which was printed as an in-place captive ball joint. Using a magnet mounted on the bottom and magnetic reed switches on the 4 poles, the clawbot can sense joystick direction. The clawbot is operated by an Arduino Mega 2560, which takes the boolean sensor inputs and communicates with 2 dual-channel motor controllers to control 3 motors and one servo. The clawbot was a great success which I took to many robotics events. Many of the kids respond with glee as they drive the claw and experience robotics hands on, prompting the parents to ask about how their child can get involved.


Candy Clawbot
Card Covers for One Night Ultimate Werewolf3/20-4/20
Cover the Werewolf cards to prevent distinguishable wearout!

One Night Ultimate Werewolf is a social deception game where players draw cards that give them roles to play. One problem with Werewolf, and any card game, is that the cards become readable as they wear down in distinguishable ways. To prevent this form of cheating, I designed card covers to cover the edges of the cards, which erode first. I iterated to find the correct balance between the ease of sliding the card in and out of the cover and the friction that holds the cards in. I also tapered the corners because they were too sharp. 3D printing suits this project very well because it produces practically indistinguishable covers which makes the cards identical from the backside. Furthermore, if they get dirty or damaged, the covers can be easily and cheaply replaced.


Card Covers for One Night Ultimate Werewolf
Personalized Gifts6/22-7/22
Design and manufacture custom gifts for friends!

To spread my love for making, I like to design unique, personalized gifts. For a cake topper for an informal wedding celebration, I laser cut a heart with names out of acrylic, to be hung later as a wall decoration. I downloaded the heart from the internet and used Lightburn to add text and customize it. As a housewarming gift, I made a custom house plaque with the house number, family surname, and tennis rackets to represent their favorite pastime. It is also laser cut, but out of wood, so I decided to etch the name rather than cut it; this darkened the wood but did not remove it. Making the house number required using multiple layers in Lightburn, each with a different setting, to produce varying depths and darknesses.


Personalized Gifts
3D Printed Watch Band5/20-7/20
Design and print a replacement watch band.

After breaking multiple watch bands and buying (quite overpriced) replacements, I decided to design my own. I used Fusion 360 to design an initial band that was identical to the commercial one and embedded user parameters (design variables) such as the length of the band, how many holes it has, how they are spaced, etc. I later used these parameters to customize the band, adjusting its appearance at the push of a button. 3D printed out of flexible black TPU filament with a triangular infill for strength, my custom watch band outlasted all of the commercial watch bands I had before. In addition to helping me in my everyday life, as I carried it around on my wrist, my watch band represented how helpful maker skills can be.


3D Printed Watch Band
OneTesla Tesla Coil Kit5/16-8/16
Assemble the Tesla Coil and make cool sparks!

This Tesla coil came as a kit from OneTesla. Working with my dad and brother, we soldered large IGBT transistors, capacitors, and other electronics onto the circuit board of the Tesla coil. We added the secondary coil and the top load above it. Having not soldered much before this experience, my original solder joints were weak, but by the time I finished assembling the kit, I could solder strong joints quickly, a skill that I have used in many other projects and appreciate for its quick welding capabilities. Through controlling the frequency of its spark emission, the Tesla coil can make specific notes. We downloaded many popular songs for it to play and my family enjoys putting on a visual and audial show. Additionally, we connected an electronic piano keyboard to it using MIDI output, which enables pianists to perform in Tesla coil sparks.


OneTesla Tesla Coil Kit
OpenROV Submarine5/15-10/15
Assemble the mini-submarine and explore our local pond with it.

Ever since we were young, my siblings and I always loved to explore our local pond, but we were never able to see what was below the surface. When my dad found this kit, we decided to assemble it together. Made up of three waterproof tubes (one for the revolving camera, the other two for balanced flotation), the telerobotic submarine could control its depth using one propeller and move forward/back and turn with a set of two propellers. By attaching a wire to its back, we could control it with a downloadable Graphical User Interface. Before walking to our local pond, our family tested the ROV in our bathtub to confirm our seals were truly waterproof. Determining it was safe, we walked to our pond and explored below the surface, finding fish, turtles and lots of pond muck.


OpenROV Submarine