02Robot arm automation
05Lyny gesture car
06H-bot XY table
07Delta robot vision
08Device testing jig
09FPGA Crazy Machine
10Line-following robot
12PLC stamp & sort
13Street vehicle detection
14Lane detection
15ArUco visual docking
16Cosmetic grading
17Sim-to-real PID
18Asset-label readerSeawater RO unit and smart vending machine. Shown in interviews only.
Multi-axis robot arm deployed and running on an active production floor. The scope covered end-to-end: motion planning, closed-loop sensor integration, suction-based end effector design including Bernoulli-style prototypes, and PLC synchronisation across the full production line. Mechanical components machined via CNC; CAD iterated across multiple revision cycles in SolidWorks and Onshape. Under NDA - specific application and client details not disclosed.
Fast air across the face drops the pressure, so fabric lifts toward it without being touched.
Handling loop · tap a step
Automated property listing intelligence platform built and running live against real Sri Lankan market data. A scraper pipeline continuously pulls listings across multiple sources into a normalised database. REST API backend exposes the data to a React dashboard with dynamic filters, map overlays, and comparison views. WhatsApp alert system fires matched listings to subscribers in real time. Fully self-hosted, database to deployment - no third-party platforms.
Six stages from a listing site to a WhatsApp alert.
Tap a step
Live count from the dashboard. Hover a bar.
Vision-guided soft gripper built for agricultural automation in mango orchards. OpenCV pipeline handles fruit detection, localisation, and depth estimation from a single camera. GRBL controls XYZ positioning; an Arduino drives pneumatic actuation through a custom soft gripper end-effector. The gripper geometry was designed specifically to conform around irregular fruit shapes without surface damage - a constraint that ruled out rigid approaches entirely.
One camera, one gantry, soft fingers.
Tap a step
ESP32-based WiFi-teleoperated robot car with real-time hand gesture recognition. Gesture classification runs on a host machine via OpenCV - detecting and interpreting hand pose from a webcam - and streams directional commands over WebSocket to the onboard firmware. Designed around a low-latency control loop with concurrent video feedback. Custom PCB, 3D-printed chassis, and full firmware from scratch. Personal project, built end to end.
Gesture recognition runs on the laptop; the car stays light and fast.
Tap a step
Developed firmware for a high-dynamic H-BOT XY positioning system for an industry client, using a ClearCore logic board. Motion is parameterised through X, Y, F (feed rate), and A (acceleration) values — X axis range 1700 to -1300, Y axis 4300 to -4300. Precision was critical: small coordinate adjustments with verified sequencing and recommended delays between moves to prevent mechanical overshoot. Wrote and tuned the ClearCore firmware from scratch, iterating through code inspection and parameter refinement until reliable repeatable positioning was achieved on the production line.
Both motors are fixed and share one belt, so every move is a mix of the two.
Both motors turning the same way slides the beam along Y. Opposite ways moves the carriage along X. Anything else is a mix.
Full OpenCV vision pipeline for detecting toothbrushes on a moving conveyor and feeding position + orientation data to a delta robot for pick-and-place. Grayscale processing with contour detection isolates each item; principal component analysis extracts centroid coordinates and rotation angle per object. Template matching on the detected head region corrects angle polarity when the brush flips orientation. A pixel-to-millimetre calibration model — automated using a known-length reference object — converts all screen coordinates into robot workspace coordinates. End result: the delta robot receives precise X, Y, angle for every item on the belt in real time.
Rotate the brush. PCA finds the axis but not which end is the head. Switch the head check off and watch what the robot would be told.
Custom testing jig apparatus built to medical-grade tolerances for a New York-based health-tech company. The system automates pressure-profile validation and EVT testing cycles on consumer wearable devices, replacing manual bench testing with a repeatable, data-logged workflow. ESP32-based hardware handles real-time sensor acquisition and serial data logging; mechanical housing designed in CAD and 3D-printed for rapid iteration. Contributed to compliance documentation and defined pressure-profile requirements from physical testing data.
Bench tests that used to be hand-timed, logged automatically.
Tap a step
A circus-themed interactive machine built from recycled components — servo gate, Ferris wheel, magnetic elevator, and entrance ramp all choreographed together. The core engineering challenge was synchronised Arduino-FPGA SPI communication: Verilog state machines on the FPGA handled timing-critical sequences while Arduino managed higher-level control logic. Sensor accuracy across multiple subsystems required careful debouncing and calibration. Final result is a fully autonomous sequence that runs start-to-finish without intervention.
Hard timing in hardware, decisions in software.
Tap a step
Line-following robot built from first principles — dual DAC generates a linear ramp signal that feeds into NE555 comparators for optical sensor thresholding, driving push-pull transistor motor stages directly. Bang-bang closed-loop control implemented in Arduino firmware adapts to varying track conditions in real time. Paired with a custom Python GUI for live sensor monitoring and parameter tuning without reflashing. Explored control algorithm refinement, sensor power optimisation, and circuit design across the full hardware-firmware-software stack.
Analog front end, digital decisions.
Tap a step
End-to-end IoT system for automated plant care — soil moisture and raindrop sensors drive solenoid valves through a custom 3D-printed control box housing a 20x4 LCD. Three operating modes: manual trigger, time-interval scheduling, or sensor-threshold automation. Backend on Firebase for real-time data storage; Blynk for remote control. Flutter mobile app built in Dart gives full visibility and control from anywhere. Rain detection prevents unnecessary watering on wet days. Multiple solenoid lines configurable for different plant zones.
Three modes, rain-aware, controllable from anywhere.
Tap a step
Conveyor-based automated stamping and sorting system that categorises items into Large, Medium, and Small by measured length. Photo sensors detect items on the belt; actuators divert them to the correct output lane. Control logic runs on a SIMATIC S7-300 CPU using Ladder Diagram programming — precise timing coordination between stamp actuation and conveyor indexing was the key challenge. Built as a team project exploring how PLCs govern real industrial automation: deterministic cycle times, fail-safe sensor handling, and scalable logic structure.
Deterministic PLC timing against a moving belt.
Tap a step




A bounded, resumable pipeline that finds parked vehicles in licensed street imagery for a whole town. Panoramas are re-rendered into flat views and photos are tiled so small, distant cars survive detection. YOLO11 boxes are merged across tiles and views, located with a pinhole range model, and clustered so one car seen in dozens of frames becomes one record. Ballarat pilot: 1,844 images, 6,917 detections and 2,460 vehicles, every one saved as a crop for human review. Street imagery: Mapillary contributors, CC BY-SA 4.0.
Eight stages from a road network to a reviewable vehicle record.
Tap a step
1,844 images processed on a CPU.




Detects two painted lane lines 1.5 m apart in night footage from a Zed2i stereo camera, built for Monash Connected Autonomous Vehicle's technical task. Every threshold comes from the frame's own histogram with Otsu's method, so the same code works as lighting changes. A pixel must be both an edge and white to count, and lane lines are fitted with a Huber loss plus inlier rejection so stray segments from lamps and shadows can't drag them. Output: a lane overlay, a bird's-eye view and a 416.7 px/m scale, served from a Flask app that takes images or video.
Seven stages from a raw night frame to two fitted lines. Use the arrows or your keyboard.



Team project at Monash: a TurtleBot3 finds a fiducial marker on its charging dock with a single RGB camera, drives in and stops at a set distance. The controller changes with range because the pose estimate's reliability changes with range: bearing-only homing far away, an odometry-driven swing onto the dock's centre line, then a blind final 0.25 m where the marker no longer fits in the camera's view. All four seeded runs docked within about 7 mm, and pose error at 1.76 m was 6.5 mm.
Runs at 20 Hz. Tap a state, then see how resolution and angle limit what the camera can read.
States · tap one
Last reliable detection while reversing at 0.22 m/s, by camera resolution.
Share of frames with the centre marker detected, 320×240 at 0.15 m/s.



A grading baseline that needs no training data: it finds scratches, scuffs and dents on a laptop lid, measures them in millimetres and turns that into grade A, B or C, with the damage marked on the saved photo as evidence. Lighting is flattened using only lid pixels, damage is thresholded against a robust noise estimate, and thin blobs are measured as scratches while round shaded blobs count as dents. Cut-offs fitted on half of 180 test lids graded the other half 93.3% correctly; its misses were fingerprints and dust counted as damage. The test lids are generated, with real-world nuisances added on purpose.
Drag the handle. Then check every lid's score against the fitted cut-offs.


Log scale. Dashed lines are the cut-offs fitted on the training half. Red rings are test lids graded wrong. Hover a dot.
90 lids the cut-offs never saw. 84 correct (93.3%).
| Given A | Given B | Given C | |
|---|---|---|---|
| True A | 25 | 5 | 0 |
| True B | 0 | 30 | 0 |
| True C | 0 | 1 | 29 |

Tune a PID controller in simulation, then make the simulator behave like the real Sphero robot so the gains carry over. I fitted a dynamics model with a delay term and logged 377 runs on the real robot. The fitted model predicted held-out runs to 0.033 m RMSE, and the real robot tracked its path at 0.075 m RMSE against a 0.20 m pass limit, with 0.038 m final error against 0.10 m.
The simulator is only useful once it behaves like the real robot.
Tap a step
Same gains, run on the real Sphero. Hover a bar.




Reads the serial number off an equipment asset label three independent ways and only auto-accepts when two agree. OpenCV locates the barcode, and a Code 128 decoder written from scratch rectifies it, reads scanlines in both directions, matches bar widths to the 106 patterns and rejects anything that fails the checksum. QR and RapidOCR run alongside. Across 108 test images in nine conditions (tilt, glare, blur, low light, worn labels) it got 96 serials right, sent 12 to a person and accepted zero wrong ones. Motion blur was the only condition that beat it. The test labels are generated.
See what each reader found and what the vote decided, then the read rate across all 108 images.

How a read works · tap a step
Read rate by condition · 12 labels each