Mech. Eng. · Robotics minor · NU ’29 Seeking · Summer 2027 co-op

Kyle Tran

I build robots, autonomous vehicles, and embedded systems — drawn in CAD, machined and printed, wired and coded, then tested until they hold up.

D.R.E.A.M.S v1 survey boat on the dock beside the water 01 · Survey boat
Cycloidal gearbox joint for the robotic arm, CAD 03 · Robotic arm
Sewing machine reverse-engineered in CAD 05A · Sewing
Maze-navigating robot chassis, CAD 04 · Maze robot
Three of the combat robots on a concrete floor 02 · Combat
3D-printed RC plane, CAD 05B · RC plane
6 items · 5 projectsLift one out to open it
BuildingD.R.E.A.M.S V3 — an autonomous survey boat
Best result4th nationally, Plastic Antweight ’24
BasedBoston · Burlingame, CA
4th
National · Plastic AW ’24
16
Team podium finishes
10
Robots designed & built
3.87
GPA · Mechanical Eng.
CAD · SolidWorks · Onshape · Fusion 360 · KiCad · PCB design · MicroPython · Python · asyncio · MATLAB · Java · AI coding agents · Raspberry Pi · VESC · GPS + IMU fusion · Stereo camera rigs · CNC machining · CNC router · PCB mill · Waterjet · Laser cutter · FDM printing · Composite layup  · 

Selected Work

05 / PROJECTS
Competition

Combat Robotics — Team DHM

Around ten robots across five weight classes, designed in CAD and printed in-house. 4th nationally in Plastic Antweight; as a club, 16 podiums over 5 events.

2023 — 2025View
In design

Adaptive Compliant Robotic Arm

Five axes, three on cycloidal gearboxes checked in a simulator I built, a TPU gripper that reads its own grip force, and a ±0.25° positioning target. On paper so far.

2026 — in designView
Mechatronics

Autonomous Maze-Navigating Robot

A 3D-printed tank-drive robot that steers itself through a maze off two angled ultrasonic sensors, with every task on one Raspberry Pi Pico.

Oct — Dec 2025View
Assorted

Miscellaneous Builds

Ceramics tools published free for anyone to print, a 3D-printed RC plane, a sewing machine reverse-engineered in CAD, and printed climbing gear.

2023 — PresentView
Project 01 · Robotics & Embedded

Autonomous Environmental Survey Boat

Raspberry Pi 5Teensy 4.1Custom PCBCAN · VESCComputer VisionMicroPython
D.R.E.A.M.S v1 on the dock at St Katharine Docks, London, after its water test
Status
V3 in build · V1 water-tested
Platform
Twin-hull catamaran · diff-drive
Compute · V3
Raspberry Pi 5 + Teensy 4.1
Sensing · V3
pH · DO · TDS · turbidity · temp · sonar depth
Comms · V3
4G LTE live map · RC override
Team
Co-founded with Matthew Hong

D.R.E.A.M.S (Data Recovery for Environmental And Marine Surveillance) is a modular twin-hull survey boat for mapping water quality in small bodies of water. Matthew Hong and I started it in our first year at Northeastern, and it is on its third generation: V3, in build now, pairs a Raspberry Pi 5 mission computer with a Teensy 4.1 real-time controller on one custom carrier board.

Visit the D.R.E.A.M.S websiteThe full build log, the V3 board in 3D, the team, and how to partner with us ka1e27.github.io/dreams
Result V1, built in one semester in London, navigated to GPS waypoints on its own in a water test at St Katharine Docks, held a 433 MHz radio link of about 1 km to shore, and sampled at the bottom. V2 moved the brain to a Pi 5 with stereo vision and our first custom PCB, but was never fully built: bench tests exposed flaws in its motor control, power and safety design. V3 is the ground-up redesign; its carrier and pod boards are laid out and checked, and its hull is in CAD.
Team I lead the hardware: the hull and CAD, the electronics and custom PCBs, and integrating it into one system. Matthew co-leads the mechanical and structural design, including a Van Veen grab sediment sampler delivered with a full drawing package and bill of materials, and handles planning and communications.
Software The software — firmware, vision pipeline and dashboards — was built with AI coding agents. I specified the architecture and did the integration and testing, not the line-by-line implementation.
D.R.E.A.M.S v1, its hull lettered In Honor Of Omar, on a table at the Creators’ Showcase at Northeastern University London, beside a laptop and a radio transmitter, being explained to two visitors
Showing D.R.E.A.M.S v1 to visitors at the inaugural Creators’ Showcase, Northeastern University London
Version 1 — field-tested Concept sketch, annotated CAD, the sensor pod, and the first build

It started as a sketch: a stable, twin-hull platform that could carry sensitive instruments across open water and still sit calm enough to take clean readings.

The dual-hull layout keeps the boat steady. Each pontoon houses waterproof compartments for batteries and electronics. The winch lowers an instrumented pod on a tethered slip ring until it registers bottom contact, then samples water temperature, conductivity (salinity), and light before retracting and moving to the next waypoint.

We built it in one semester of our first year, in London, with our room as the workshop, then took it to St Katharine Docks. In that water test it navigated to GPS waypoints on its own and held its radio link out to about 1 km.

D.R.E.A.M.S v1 first concept sketch
First concept sketch — v1
CAD model of the v1 catamaran bridge and winch Catamaran bridge Sensor winch
CAD — the bridge ties the two hulls together and carries the winch that lowers the sensor pod. (Hover or tap a marker.)
CAD of the v1 sensor pod
CAD — v1 sensor pod

v1 runs on three Raspberry Pi Picos in MicroPython. The boat controller alone juggles nine concurrent async tasks: GPS navigation, heading, dual-brushless drive, winch, mission logic, and safety. Alongside it run a shore operator station and the underwater pod.

They talk over an HC-12 433 MHz half-duplex radio with XOR-checksummed frames and burst/listen timing. The shore station loads a JSON mission, shows live telemetry, logs everything to CSV, and can e-stop or take manual control at any moment.

Getting the v1 boat ready to test outdoors
Getting ready to test outdoors
Epoxy-sealing the v1 hull
Epoxy-sealing the hull
Our room in London set up as a workshop: a hull section hanging over a taped-down drop sheet, the winch and wiring on the desk
Our room in London, set up as the workshop
Printed v1 sensor pod
Sensor pod, printed
v1 sensor-deployment winch
Sensor-deployment winch
Early jet-propulsion experiment on v1
Early jet-propulsion experiment — a dead end, but a useful one
D.R.E.A.M.S v1 dedicated in honor of Omar
D.R.E.A.M.S v1, dedicated in honor of Omar. He helped us build it in London, and his name on the hull is our thanks.

v1 proved the concept on the water and showed where it ran out of room. It couldn't see or avoid obstacles, the 433 MHz radio was short-range and half-duplex, the hand-wired loom was a tangle of failure points, and a PLA hull isn't built for long days on the water. v2 set out to answer each one:

Systemv1v2
Brain3× RP2040 (boat · shore · pod)Raspberry Pi 5 + 2× RP2040 executors NEW
Hull3D-printed PLA3D-printed ASA (UV-stable) · fiberglass + epoxy skin
ElectronicsHand-wiredCustom KiCad PCB
Vision—Stereo depth + YOLOv8 avoidance NEW
PowerLiPo packsM18 for electronics + winch · 12S LiPo drive planned
CAD design of the v2 hull
CAD — v2 hull geometry, refined for stability and flow
STEP 01 — HULL

A hull tuned for the water

The twin-hull geometry is refined in CAD for stability and clean flow, then printed in bolt-together sections. v1 printed in PLA; v2 moves to ASA, which handles UV and weather where PLA goes soft and brittle, plus a fiberglass-and-epoxy skin for stiffness and water resistance.

STEP 02 — BOARD

One board instead of a harness

A custom KiCad carrier board replaces v1's hand-wired loom — consolidating three isolated battery domains, the two drive ESCs, and every sensor header in one place. Fewer failure points, faster to service.

STEP 03 — BRAIN

A Pi 5 that can see

A Raspberry Pi 5 runs navigation, the mission state machine, and a stereo-camera vision pipeline, with YOLO detection gated by a cheap water-anomaly screen. The two RP2040s stay down at the real-time layer, driving motors and reading sensors.

First printed section of the v2 hull
First printed section of the v2 hull
Fiberglass cloth laid over a boat hull and wetted out with epoxy
A layer of fiberglass going on over the print — wetted out with epoxy for stiffness and water resistance
Stereo camera for onboard tracking on v2
Stereo camera pair — per-object depth for vision-guided avoidance

Two USB cameras form a stereo pair. StereoSGBM turns the disparity into a real per-object distance, so a detected obstacle isn't just a box on a screen — it has a range.

A three-tier vision pipeline keeps it cheap: a constant water-anomaly screen wakes a YOLOv8-nano detector only when something's there, and a threat score decides what to track and when to steer away.

The stereo pair picking me up and following me around the garage. Detection runs on the Pi itself, so the frame rate is low — but it is the first end-to-end look at the vision pipeline actually working.

The command center ran on V2’s Pi 5: the mission map, live telemetry and the controls in one web page. It now runs in a browser with a simulated boat surveying a pond, so anyone can try it.

Then bench testing found the real problem. V2’s motor control, power and safety design weren’t reliable enough to put on the water, so instead of patching it we redesigned the whole system. V2 was never fully built, and V3 exists because of what it showed us.

The V2 command center: a simulated survey loop on a pond beside live telemetry and mission controls
The V2 command center, running a simulated survey on a pond

V3 splits the boat into a Raspberry Pi 5 mission computer and a Teensy 4.1 real-time controller, joined by one custom carrier board, with the sensors in a tethered pod. Its first job is narrower than V2’s on purpose: drive itself around small bodies of water and sample at the surface.

Top view of the D.R.E.A.M.S V3 carrier board, rev D, with the battery inputs, the Raspberry Pi header and the sensor connectors
V3 carrier board, rev D — 130.6 × 101.5 mm, 4 layers, 126 parts, fully routed
Where V2 fell shortThe V3 fix
Real-time controlA Teensy 4.1 core. The Pi’s header carries 5 V only; every control signal goes through the Teensy
Motor controlEach VESC is its own node on a CAN bus, through a TJA1051 transceiver
PowerThree isolated domains, with separate packs for the electronics and the winch and an INA228 monitor on each
SafetyA hand-held RC override at any time, and a winch cut-off that fails safe if the Teensy resets or loses power
3D render of the D.R.E.A.M.S V3 sensor-pod board with its XIAO ESP32-S3 footprint
Sensor-pod board, rev B — 48 × 63 mm, 2 layers, on an RS‑485 tether

The pod board carries a Seeed XIAO ESP32-S3 that measures pH, dissolved oxygen, TDS, turbidity and temperature, and the RS-485 tether that talks to it also powers it. A fish-finder sonar replaces the pod’s pressure sensor for depth, and a TCA9548A multiplexer splits one I²C bus into eight sensor channels. Both boards are laid out in KiCad and checked against their schematics.

Two V2 ideas are left out: vision-based obstacle detection, and lowering the pod on a winch for depth profiles. V3 samples at the surface and gets depth from sonar instead. The winch circuit stays on the board for the sample-collection stage that comes later.

Key components & bill of materials
Mission computer · Pi 5
Navigation, mission logic, data logging and the cloud link
Real-time · Teensy 4.1
Sensor I/O, motor commands and safety
Sensor pod · ESP32-S3
pH, DO, TDS, turbidity and temperature at the surface, over an RS-485 tether
Survey loop
Plan a route in the web dashboard, upload it over 4G, drive the waypoints, sample at each station, stream geo-tagged readings to a live map
Raspberry Pi 5navigation · missions · logging · cloud link
Teensy 4.1sensor I/O · motor commands · safety
2× VESC on CAN busdifferential drive · 12S LiPo pack
u-blox M10 GPS · BNO085 IMUposition + heading · plus barometer, high-g accelerometer, light sensor
Fish-finder sonarwater depth
Seeed XIAO ESP32-S3 pod · RS-485 tetherpH · DO · TDS · turbidity · temp
4G LTEmission upload · live map
SBUS RC receiverhand-held manual override
Carrier rev D (4-layer) + pod board rev Bthree isolated power domains
Modular twin hullin CAD

The V2 software ran against a laptop simulator before any hardware was attached, and its command center still does, in the browser. Its mission was a state machine — transit → deploy → sample → retract → advance — with geo-fenced boundaries and automatic return-to-home on low battery.

V3 is modular by intent: the hull, payload and software are configured for each job, starting with surface water-quality surveys. Swap the pod and the same platform could carry sonar for bathymetric mapping, cameras for an underwater survey, or tools for collecting samples.

Next comes fabricating the boards and assembling the electronics, pod and fish finder into the new hull, then firmware for autonomous waypoint navigation, surface sampling and depth logging, and field trials. We’re talking with the Charles River Watershed Association about collecting water-quality data for them. The CRWA and the Port of Oakland both told us their teams still collect sediment samples by sending divers down, and that is what my robotic arm is for: a deck arm that works with the winch to bring water and sediment samples back.

Project 02 · Competition Robotics

Combat Robotics — Team Dihydrogen Monoxide

CADCNC Machining3D PrintingWeapon Design
Team DHM combat robots lined up
Team
Dihydrogen Monoxide
Active
2023 – 2025
Fleet
~10 robots · 5 weight classes
Weapons
Horizontal spinners · vertical drums
Build
In-house 3D print · outsourced CNC
Best result
4th — Nat'l Plastic AW '24

Two years of competitive combat robotics with Team Dihydrogen Monoxide — around ten robots that competed across five weight classes, all designed in CAD and 3D-printed in-house (machining outsourced), and tested by getting hit very hard. The three that ranked nationally are written up below.

Result My own robots took 4 firsts and 8 seconds, and 4th nationally in Plastic Antweight at the 2024 Robot Combat League Championship. As a club, we placed on the podium 16 times across 5 events.

Achilles — 4th, Plastic Antweight · 2024 RCL National Championship

Korybantes v1 — 2nd · NorCal Robotics Expo

@ktprojdumps
Build clips, match footage & behind-the-scenes
View posts
View on Instagram

Every robot was designed from scratch in CAD, with weapon systems refined through iterative simulation and real-world testing — horizontal spinners and vertical drums.

We sent the aluminum frames out for CNC machining and printed the armor ourselves, in reinforced nylon and polycarbonate.

CAD render of Orcus combat robot
Orcus — CAD render
Achilles first- and second-place finishes
Achilles — a first- and second-place finish in one weekend
Korybantes v2 internal layout
Korybantes v2 — internal layout
Top 35 US · 2025 · 3 lb beater

Korybantes — a 3 lb beater built for reliability and fast repair between matches.

6061 aluminum, carbon-fiber plate, laser-cut titanium armor, UHMW impact structures, and in-house 3D-printed assemblies for rapid iteration — the CNC machining and heat-treating were sent out to a shop. The beater delivers consistent kinetic output that holds up under repeated impacts.

Every so often I'd get a design check from senior builders in the community and fold their criticism into the structural reinforcement and drivetrain tuning. Korybantes reached a top-35 U.S. ranking at the 2025 National 3 lb competition.

Top 15 US · 2025 · 1 lb metal antweight

Achilles (metal) — a 1 lb horizontal spinner, the metal evolution of my plastic antweight.

Flexible, modular 3D-printed armor in engineering-grade polymers absorbs impact and swaps fast between matches, while the weapon and structure use AR500 steel and Grade-5 titanium for durability and energy transfer. Every part is designed around real processes — laser cutting, precision machining, and additive-manufacturing tolerances.

Achilles reached a top-15 U.S. ranking and competed at the 2025 National Antweight competition.

Achilles (metal) with the Sacramento competition trophy
Achilles (metal), with the Sacramento trophy
CAD of Achilles' single-cam shuffler drive
Single-cam shuffler drive — CAD

Instead of wheels, the newest version of Achilles walks on a shuffler drive I designed around a single custom cam.

The cam profile drives feet on both the top and the bottom of the chassis, so the robot keeps shuffling forward even after it's flipped — no self-righting mechanism needed, and no dead side to get stuck on mid-match.

Achilles plastic robot with Kyle's dog Mocha
Achilles (plastic), with my dog Mocha
4th National · Top 30 US · 2024 · 1 lb plastic AW

Achilles (plastic) — the 1 lb belt-driven undercutter that started it all.

Designed in CAD and printed, with a modular plastic chassis for fast, reliable repairs. I handled the CAD, soldering, and wiring, tuning the weight distribution to manage the spinner's gyroscopic forces.

It placed 4th at a national plastic-antweight competition and ranked among the top 30 in the U.S. (2024). It also helped shape the low-profile, belt-driven undercutter meta in the Northern California scene.

After every match, win or lose, we'd pull the robot apart and work out what broke and why — every design generation came straight out of that damage analysis, so I learned to design for repairability first.

The best part was teaching. As club president I ran workshops on CAD, soldering, physics, and fabrication. A few members went on to build and compete with robots of their own.

Project 04 · Mechatronics & Firmware

Autonomous Maze-Navigating Robot

Onshape3D PrintingMicroPythonasyncioProportional Control
Side view of the maze robot: an ultrasonic sensor sits recessed between the two runs of a rubber-band tread, with the Pico, breadboard, potentiometer and LED strip on top
Course
Cornerstone of Eng. · NU
Team
With Matthew Hong · my CAD, prints + code
Control
1× RPi Pico · MicroPython · asyncio
Sensing
2× angled ultrasonic · front IR
Drive
Tank drive · 2 geared DC motors
Steering
Proportional wall-centering

A tank-drive robot that steers itself through a maze, built with Matthew Hong for Northeastern's Cornerstone of Engineering course. I designed it in Onshape, printed every part, and wrote the MicroPython firmware; Matthew designed and printed the wall brackets, built the maze we set for another team, and helped with the wiring.

Result Completed all three challenges: a straight run, a preset path of timed turns, and a maze it steered through on its own, off two angled ultrasonic sensors.

Every team started from the same base kit and had the same brief: get a robot through three courses of varying difficulty, then build a maze for another team to run.

The kit sat tall and tipped in fast or sharp turns, its ping-pong-ball caster steered inconsistently, and it had nowhere to mount extra parts. Rather than fix those one at a time, I designed a new robot around them.

The printed tank-drive robot in the foreground, with the taller class-kit robot on large rubber wheels behind it
Our robot in front of the class kit it replaced
ProblemClass kitOur robot
SteeringA ping-pong-ball caster that steered inconsistentlyTank drive: turns in place
StabilityTall enough to tip in fast turns1.6 in without the LCD, about half the kit
MountingNowhere to mount extra partsA mount for every board and sensor

I started on paper, sketching chassis shapes, sensor placements and drivetrains, then drew the layout that worked as a master sketch in Onshape and modeled every part off it. Checking each dimension and constraint in CAD before exporting meant every printed part fit on the first print.

Pen sketch in a pocket notebook of the robot's chassis seen from above
Notebook sketch: chassis layout and sensor placement
Dimensioned Onshape master sketch of the robot, with the sensors' fields of view drawn as cones
The Onshape master sketch the parts were modeled from, sensor cones drawn in
Onshape CAD model of the maze robot with its top plate on
The finished model, top plate on
The same model with the top plate off, showing the battery pack and the motor driver inside the body
Top plate off: the battery pack and motor driver sit inside the body

We ranked what mattered: control in slow turns, accurate sensor readings, quick switching between programs, and clean wiring.

Two geared DC motors each drive a rubber-band tread around a dead wheel, one motor per side. The battery and motor driver sit inside the body, which keeps the weight low and protects them; the Pico and breadboard stay on top, where uploading code and troubleshooting are easy.

The two ultrasonic sensors angle outward to spot turns early, and sit recessed between the treads, so a scrape along a wall hits the tread instead of the sensor.

Most of the design came out of testing. Matthew and I took turns: one of us ran the robot through the course while the other watched for what went wrong.

FIX 01 — TREADS

Treads that stay on

The treads are rubber bands, and in hard turns they walked off the wheels. Belt drives solve the same problem with crowned pulleys, which keep a belt centered on their own, so I reprinted the wheels with a convex face that brings the band back to the middle as they turn.

The robot from above with one rubber-band tread slipped off its wheels
A tread off its wheels after a hard turn
A reprinted black wheel held edge-on against a white wall, showing its convex face
The reprinted wheel, edge-on: the convex face keeps the band centered
FIX 02 — WALLS AHEAD

A wall it couldn’t see

With both ultrasonic sensors angled out to the sides, nothing looked straight ahead, and the robot ran into walls. I added an infrared sensor at the front to detect walls straight ahead.

The robot stopped with its nose against a cardboard maze wall
Nose-first into a maze wall
An IR sensor module mounted at the front edge of the printed chassis
The IR sensor added at the front
FIX 03 — TUNING

Finding the gain

Tuning the steering took a lot of testing. Too much correction and the robot jittered and overcorrected; too little and tight turns got harder. We tried a function for pre-set turns, which needed precise sensor readings, and slowing the motors through turns, before finding that the real problem was traction.

Carpet was harder still: its higher friction made the treads grip unevenly, and the robot struggled to turn. We didn’t fix that during testing; turning in place on the tank drive could solve it.

Overhead view of the robot turned sideways across a maze corridor at a corner
Overcorrecting at a corner
FIX 04 — PROGRAMS

One robot, three programs

Switching between the three challenge programs meant uploading new code over USB every time. I wired a potentiometer and a button to the Pico: turning the knob pages through Forward, Preset Path and Maze on the LCD, and a press starts the run. For problems the LCD couldn’t show, print statements reported sensor readings and variable states in real time.

FIX 05 — FREEZES

Animations that froze the motors

The LED and LCD animations blocked motor control and froze the robot. After many failed attempts at interleaving them by hand, I restructured the modules around MicroPython’s asyncio, so the animations run as their own tasks alongside the steering loop.

The robot's LCD reading Forward, with the potentiometer value on the line below, lit by its blue LED strip
The knob menu: “Forward” selected, the knob’s reading underneath

The maze program is a proportional controller. Each pass it compares the two side distances and steers by the difference: drift toward the left wall and the left tread speeds up while the right slows, turning the robot back toward the middle.

The gain sets how hard it corrects, and a clamp holds both motors between 20 and 100% duty so neither runs too fast or too slow. In the final code that’s a 55% base speed and a gain of 4.

The sensors, knob, button, LEDs, LCD and motors each have their own module, and main.py ties them together.

base_speed = 55
correction_factor = 4

while True:
    current_left = ultrasonic_sensor.get_distance(6,7)
    current_right = ultrasonic_sensor.get_distance(26,27)

    error = current_left - current_right
    correction = error * correction_factor

    left_speed = base_speed - correction
    right_speed = base_speed + correction

    left_speed = max(20, min(100, left_speed))
    right_speed = max(20, min(100, right_speed))

    motors(int(left_speed) , int(right_speed))

    await asyncio.sleep (.01)
The maze loop, excerpted from motor_control.py
Task · menu
Knob menu on the LCD; the button starts the chosen run
Task · steer
Proportional wall-centering, the timed preset path, 1 kHz PWM drive
Task · sense
Two ultrasonic ranges in cm (30 ms echo timeout) · front IR
Task · show
NeoPixel animations and 16×2 I2C LCD text, each its own asyncio task

What I’d carry forward: prototype early, before committing to prints; structure code as modules from the start instead of untangling it later; and design for the person testing it, even on a prototype. The LCD menu made every test run faster.

That same asyncio architecture carried straight into the survey boat's firmware — concurrent tasks on one Pico, just on water instead of in a maze.

Project 03 · Robotics & Controls

Adaptive Compliant Robotic Arm

Cycloidal DrivesGearbox SimulatorClosed-Loop SteppersTPU GripperRP2040CAD
Status
In design · nothing built
Degrees of freedom
5 · J1–J5
Reach
20 in, shoulder to tool tip
Target
±0.25° static, per joint
Reduction
14–22:1 cycloidal · J1–J3
Control
RP2040 loop · PC for vision

A five-axis arm with a compliant TPU gripper that reads its own grip force. The base, shoulder and elbow run cycloidal gearboxes with a magnetic encoder on the output shaft rather than the motor, which is what makes a ±0.25° static target worth aiming at. Forearm roll and the wrist are direct-drive servos with encoders of their own.

Status Nothing is built yet. Joint layout, link lengths, gear ratios, ring sizes, materials, bearings and the manufacturing route are set, and all three gearboxes pass every check in the simulator I built for them; real masses from CAD are not in yet. The first prototype gets printed to check motion and tune the loop — the ±0.25° figure is for the aluminum version, because printed cycloidal backlash will exceed it on its own.
Schematic of the five joints: base yaw, shoulder pitch, elbow pitch, forearm roll and wrist pitch, ending in a two-jaw gripper J1 J2 J3 J4 J5
Joint layout, schematic and not to scale. The circles are the three pitch joints that hold gravity; J1 yaws on its thrust bearing and J4 rolls about the forearm.

Five joints: base yaw, shoulder pitch, elbow pitch, forearm roll, wrist pitch. Three of them hold gravity, and the shoulder holds everything past it at the longest lever arm, so that is where the torque capacity goes.

A sixth joint — gripper swivel — got cut as redundant with forearm roll. The cost is that roll sits before the wrist, so changing it also rotates the plane the wrist bends in. For pick-and-place with a symmetric two-jaw gripper that does not matter.

JointHolds gravityActuator
J1 · base yawNo — the thrust bearing carries itNEMA 17 · 14:1 · 80 mm ring, printed PLA
J2 · shoulderYes — longest lever armNEMA 23 · 15:1 · 85 mm ring
J3 · elbowYes — shorter lever armNEMA 17 · 22:1 · 51 mm ring
J4 · forearm rollOnly with the wrist bent — the payload then sits off its axis2.5 N·m servo with encoder, direct drive
J5 · wristYes — smallest lever arm2.5 N·m servo with encoder, direct drive

Every joint is sized for its worst pose: the arm straight out with a 1.2 kg payload at the tip, accelerating at 3 rad/s². That puts the shoulder at 11.30 N·m and the elbow at 4.70 N·m, and a 1.5 service factor makes them 16.95 and 7.05 N·m to design for. The shoulder’s NEMA 23, at 1.9 N·m, gives about 24 N·m through 15:1 at 85% efficiency, the elbow’s NEMA 17 about 8.4 N·m through 22:1, and each servo needs 0.96 N·m of its 2.5. The joint and link masses behind those numbers are estimates rather than CAD figures, and wiring and fasteners always come in heavier than expected.

Axial view of the cycloidal drive: the lobed disc inside its pinned ring, with the hex output carrier at the center
Axial view — the lobe profile inside the pinned ring, hex output carrier at the center
The assembled cycloidal joint, showing the output flange bolt circle and the retaining plate
The same joint assembled — output flange bolt circle and retaining plate

One gearbox part for all three geared joints would have been the easy call. It is the wrong one. Pin contact stress scales roughly as (1/scale)1.5, so a smaller ring pays for its size in stress: in the simulator the elbow’s 51 mm ring reaches the same peak contact stress as the shoulder’s 85 mm one, about 470 MPa, at well under half the torque. Worse, a fixed manufacturing tolerance becomes a larger angular error at a smaller radius, because the error divides by the radius — shrinking the gear works against the tolerance target, not toward it.

So each ring is sized to its own joint. J2 kept all 85 mm, with two 7075-T6 discs. J3 carries well under half the shoulder’s torque, so it dropped to 51 mm and runs 22:1, enough for a NEMA 17 to drive it. J1 carries inertia alone, light enough for plastic. For now its 80 mm discs and housing are printed in PLA, with the outer pins printed as part of the housing, because it is a large part and aluminum would cost more; it may move to aluminum later. J4 lost its gearbox; it and the wrist are now direct-drive servos.

The aluminum gearboxes share one build. Steel outer pins are pressed into the housing, and the output pins are standoffs. I’ll machine the housings myself on a Tormach mill, which I’m learning this fall. SendCutSend laser-cuts the 7075 discs, and I finish them on a Bantam desktop PCB mill for accuracy; the tolerance budget below is why that pass exists.

The housing has room to lose too. The input shaft is 20 mm because of 3D printing, where a torsion check puts the real minimum under 4 mm; at 8–10 mm it keeps a wide margin and drops to a far cheaper bearing, taking the shell from about 127 mm toward 100 mm.

I built a browser tool to size these gearboxes, the Cycloidal Gearbox Simulator. It takes the arm joint by joint (masses, link lengths, the payload), works out what each joint carries in its worst pose, and checks each gearbox against the ways it can fail: contact stress at the ring pins and output holes, for yield and for fatigue; pin and standoff bending; the ligaments between holes; undercut in the lobe profile; and the eccentric bearing’s static load and rated life.

A check passes below 0.85 of its limit. The torques, ratios and ring sizes on this page come from one saved session, and all three gearboxes pass.

Screenshot of the Cycloidal Gearbox Simulator on the shoulder joint: the lobed disc inside its ring of 16 pins with the loaded pins coloured by force, a bar chart of the force on each pin, and the joint passing at 0.83 of its tightest limit
The simulator on the shoulder joint — 7 of its 16 ring pins carry load at this input angle, coloured by force at the design torque
JointDesign torqueTightest check, share of its limit
J1 · base · 14:12.00 N·m0.66 · ring contact fatigue, in PLA
J2 · shoulder · 15:116.95 N·m0.83 · ring contact fatigue
J3 · elbow · 22:17.05 N·m0.84 · ring contact fatigue
J4, J5 · servos1.43 N·m0.57 · servo torque, 2.5 N·m rated

The tightest bearing check is the shoulder’s rated life: 2,522 h against a 2,000 h target for its 6704. The motors get checked through their gearboxes too. Every ratio here is above the minimum its motor needs, so a stalled motor could push its gearbox past the design torque; the simulator turns that into a driver current limit for each joint, about 37% of peak current at the base, 70% at the shoulder and 84% at the elbow.

Software The simulator was built with AI coding agents. I specified what it models and checks — the arm load model, each failure check and its limit, and the validation cases its test suite has to match — and the agents wrote the code.

The discs start as laser-cut blanks from SendCutSend, and a finishing pass on a Bantam desktop PCB mill, which I run, sets their final accuracy. At the 85 mm ring’s 42.5 mm radius a linear profile error becomes an angular one, and the budget is small enough that the finished profile, not the cut, decides the answer.

Profile errorAngular errorShare of the budget
±0.05 mm±0.067°~27%
±0.10 mm±0.135°~54%
±0.15 mm±0.20°~80%

At ±0.05 mm there is room left for backlash and structural compliance, which are the larger errors anyway. At ±0.15 mm four fifths of the budget is gone to one source before the arm has moved. That is why the discs get a finishing pass: the laser gets them close, and the mill takes the profile the rest of the way, cleaning up the cut edge exactly where the rolling contact happens.

The encoder sits on the gearbox output, not the motor. It reads the joint angle directly, so the gear ratio drops out of the precision question and only affects torque and speed. It is a 12-bit AS5600 at 0.09° per count, about 2.8× under the target — thin, but backlash and compliance are the bigger errors at this tolerance, so a 14-bit part would be buying precision in the wrong place.

An IMU was the other candidate and does not work here. An IMU measures a link’s orientation against gravity, so it is blind to rotation about a vertical axis — that alone rules out base yaw without leaning on a magnetometer. Even with good fusion an IMU holds roughly 1–3° statically, against a ±0.25° target. It may come back as a supplement on the end effector for an absolute level reference or vibration sensing, but not as the joint sensor.

Forearm roll has a wiring problem rather than a sensing one. The wire sits untwisted at encoder center and a single hard stop sits directly opposite, so the joint swings freely between but never accumulates past a half turn of twist. That stop is physical as well as in firmware — a software limit alone does not protect the wire if the encoder glitches or the board loses position across a power cycle.

Load path
  1. Object
  2. Rigid fingertip pad
  3. Load cell
  4. Stiff finger base

The TPU flexure bends beside this path, not in it.

Closing
  1. Position control
  2. Cells hit target force
  3. Hold
How grip force reaches the sensor, and how a grasp closes

Two TPU flexure fingers driven by one servo through a 1:1 gear mesh, so both sides mirror each other. The compliance does the accommodating; a load cell per side does the measuring.

The part that matters is the load path. The fingertip pad is rigid, the load cell sits behind it, and it anchors to the stiff base of the finger, so force reaches the sensor without passing through the flexing TPU. The finger still conforms to the object and the reading is not corrupted by the finger’s own bending. Closing is position control until the cells hit the target force, then hold.

Still open here: TPU shore hardness, and print orientation at the flexure so the bend point does not delaminate over cycles.

Further out, this is the deck arm for the survey boat, working with its winch to bring water and sediment samples back. Our conversations with the Port of Oakland and the Charles River Watershed Association showed that their teams still collect sediment by sending divers down. A submersible on the tether collects the sample; the arm takes the full container off it, stores it aboard, and puts an empty collector back. That is the reason for grip-force feedback and a compliant gripper rather than a rigid claw — a tethered submersible under a moving boat will not present itself at a repeatable position.

The interface between the two is not defined yet, and the marine side is deliberately deferred: sealed encoder housings, waterproof connectors, marine-rated bearings, anodised rather than bare 6061. None of that gets designed until the mechanism works on a bench.

Still open before hardware: the tolerance the finished discs actually hold, whether J1 moves from printed PLA to aluminum, and real link masses from CAD to replace the estimates above.

Project 05 · Assorted

Miscellaneous Builds

Smaller builds that don't need a page of their own. Repairs, one-offs, and a few things I made just to learn how.

Print these yourselfFree 3D-printable models, published on MakerWorld @kylegtran2007

Ceramic Tools R&D

Over ten custom 3D-printed tools for ceramics classrooms — trimming tools, ribs, wire guides, and stamps. Each was iterated with students at Burlingame High School and published online for anyone with an FDM printer.

3D-printed ceramic tool set
The ceramic tool set
3D-printed loom for a ceramics class
3D-printed loom
3D-printed clay-cutter stencil
Clay-cutter stencil
3D-printed A to Z and 0 to 9 ceramic stamps
3D-printed A–Z & 0–9 stamps
Clay casserole dish cut with the clay-cutter
Casserole dish, cut with the clay-cutter

3D-Printed Plane

A first attempt at designing and printing a flyable model plane — chasing the lightest airframe I could print that would still hold together. It didn't: the wing snapped at the root on the first flight. That joint is where the next version starts.

First attempt at a 3D-printed model plane
First airframe attempt

Sewing Machine (CAD)

A full sewing machine modeled in CAD, from the outer housing down to the internal drive. I sew, so I wanted to understand how one motor shaft becomes a needle stroke, a feed step, and a bobbin rotation, all timed to each other.

Corner view of the sewing machine CAD model
Corner view
Translucent side view showing the internal mechanism
Translucent side view — internal mechanism

Climbing Accessories

3D-printed gear I made for climbing. The Crimp Battle Board is a head-to-head crimp-strength game — two people pull on it to see who has the stronger crimp, and its X-rib lattice takes the abuse. The doorway hangboard is a printed grip trainer for building finger strength at home.

3D-printed X-ribbed crimp-strength battle board
Testing crimp strength on the board
3D-printed climbing hangboard mounted across a doorframe
3D-printed doorway hangboard — grip training
Portrait of Kyle Tran
Kyle Tran

Engineer, builder,
competitor

I'm a Mechanical Engineering student at Northeastern, originally from Burlingame, California. Reading about how something works has never been enough for me. I have to build one.

That's turned into combat robots, an autonomous survey boat, and a drawer full of 3D-printed ceramic tools. Whatever it is, the work runs the same way: sketch it in CAD, print the parts or send them out to be machined, wire it up, write the firmware, then break it and fix it until it holds. Combat robotics is where I learned to like that last part: losing, figuring out why, and coming back with the clock running.

Right now that's a catamaran that surveys water quality in local reservoirs on its own. Nobody handed me a manual for it. That's the part I like.

University
Northeastern
Major
Mechanical Eng.
Minor
Robotics
GPA
3.87
Graduating
May 2029
Based in
Burlingame, CA

Hobbies & interests

Basketball

Pickup games whenever I can get one together — the outdoor courts at home, the gym on campus. I'll take a bad run over no run.

Climbing

Bouldering and top-rope, indoors and out. Read the problem, try something, fall, adjust — same as the workshop, with more chalk. I 3D-printed my own hangboard to train grip at home.

Designing & printing

A lot of my downtime looks like my work: modeling something in CAD and watching it print. Tools, fixtures, upgrades for other projects — if I can print a fix, I usually do.

Sewing

Mostly repairs and alterations — fixing what I own instead of replacing it. The one I keep coming back to is taking old jeans apart and sewing new ones out of the pieces. A pattern turns out to be a flat drawing of a 3D object, which felt familiar.

Teaching & mentoring

Explaining a thing is how I find out whether I actually understand it. These days that's mostly friends' print failures and wiring problems, and I still like it more than I expected to.

Browser games

Two games I built with AI coding agents rather than by hand, then put online — Hex Dominion, an idle hex-conquest game, and JSON, a much sillier one: a meme game about who, exactly, JSON is.

Hex Dominion Play Source
JSON Play Source

Leadership & teams

I build hardware end to end — CAD, composite layup, PCB design, firmware. The combat robots took me to 4th nationally and a top-15 U.S. ranking. The survey boat started as a sketch and drove itself to GPS waypoints on its first water test.

Oct 2023 — Jun 2025
President
Combat Robots Club, Burlingame

Ran workshops on CAD, soldering, physics, material science, and 3D printing. Handled sponsorships and club finances. The team placed on the podium 16 times — 4 firsts, 7 seconds, 5 thirds — across 5 competition events.

16 Podium Finishes 5 Events Sponsorships Secured
Oct 2023 — May 2025
Ceramic Tools R&D
Burlingame High School · Ceramics Program

Researched, designed in CAD, and 3D-printed 10+ custom tools for the ceramics classes — trimming tools, ribs, wire guides, and stamps — then published them online for anyone to print.

10+ Tools published CAD → FDM Open-sourced
Jan 2024 — May 2025
Secretary
Burlingame Aeronautics Club

Helped found the club and ran sessions on the physics of flight — aerodynamics, lift, and drag. Then put the theory into practice, designing small 3D-printed RC airplanes with carbon-fiber rods and lightweight print materials.

Co-founded Taught aerodynamics 3D-printed RC planes
Sep 2021 — May 2024
Subsystem Lead
Iron Panthers FRC #5026

Designed the spindexer mechanism for the team's competition robot. Worked with 10+ team members and 5 professional mentors on design reviews, manufacturing, and competition strategy.

10+ Members 5 Mentors Spindexer Design

Northeastern University

Northeastern University Huskies logo
B.S. Mechanical Engineering
Minor in Robotics
Northeastern University · Boston, MA
GPA 3.87 Sep 2025 — May 2029 (expected)
Coursework Thermodynamics Materials Science Statics Probability & Statistics

Competition results

Placings by robots I designed and built. The club’s overall podium count is on the President entry above.

4th
Robot Combat League National Championship
Achilles · 1 lb plastic antweight · National · 2024
1st
CROS — March Madness
Achilles (metal) · 1 lb antweight · 2024
1st
BCRC Bell Brawls IV
Korybantes Mk2 · 3 lb beetleweight · 2024
1st
Spartan Bell Slugfest
Achilles · 1 lb plastic antweight · 2024
1st
NorCal Robotics Expo
Achilles · 1 lb plastic antweight · 2023
8 more second-place finishes
2nd
NorCal Knockout
Achilles · 1 lb plastic antweight · 2024
2nd
West Coast Combat Robotic League — Competition #1
Achilles · 1 lb plastic antweight · 2024
2nd
Bot'Geddon at the Rocklin Maker Faire
Achilles · 1 lb plastic antweight · 2024
2nd
Spartan Bell Slugfest
Achilles (metal) · 1 lb antweight · 2024
2nd
CROS / WCCRL — Summer Meltdown
Achilles (metal) · 1 lb antweight · 2024
2nd
CROS / WCCRL — Summer Meltdown
Artemisia · 1 lb plastic antweight · 2024
2nd
Nexus Knockout
Korybantes Mk2 · 3 lb beetleweight · 2024
2nd
NorCal Robotics Expo
Korybantes Mk2 · 3 lb beetleweight · 2024

Hands-on skills

Design & CAD
SolidWorksOnshapeFusion 360Mechanism designDFM
Electronics & firmware
KiCadCustom PCBRaspberry Pi · RP2040MicroPythonSoldering & wiring
Software & AI
Python · asyncioMATLABJavaAI coding agentsSimulation-first dev
Fabrication
CNC machiningCNC routerPCB millWaterjetLaser cutterFDM 3D printingComposite layup (FG/CF)Laser-cut Ti / steel
Robotics & autonomy
Stereo camera rigsGPS + IMU fusionVESC drive4G telemetryState machines
Leadership
Club presidentWorkshopsSponsorshipsMentoring

Let's build something.

Looking for a Summer 2027 co-op in hardware and robotics — or just to talk shop about boats, bots, and stubborn brackets.