Put it all on one frame, recalibrate for real, and show what you built.
Anything that changes the machine's physical geometry — a screw retightened, a part reprinted slightly differently, the sensor now sitting a few millimetres further from a Skittle than it did on the bench — can shift a homing offset or the numbers the classifier expects to see. That's not a sign of a bad design; it's just what happens when a system moves from a loose bench rig to a rigid final frame, and it's why calibration is treated here as a repeatable last step rather than a one-time setting.
Before cutting or bolting anything, sketch where each subsystem physically sits relative to the others, and how cables will route between them.
Assemble your chosen frame (aluminium extrusion, plywood, or anything else rigid enough to hold alignment) and mount every subsystem, leaving screws slightly loose until final alignment is checked.
Re-verify both motors' homing once everything is rigidly mounted — offsets set on a loose bench rig often shift slightly once the frame is tightened down.
Re-scan a few known Skittles in their final mounted position and compare against your Week 8 centroids. If the readings have shifted meaningfully from the sensor's new position/distance, recollect a small amount of data and retrain.
Pour a fresh mixed bag of Skittles through the hopper and launch 1 - Sort All from the LCD menu. Watch the state machine transition from indexing to sensing, steering, and discharging.
Real systems engineers evaluate not just accuracy, but throughput velocity. Run the data science telemetry analyzer:
python3 batch_analytics.py
Time a full 55-candy retail bag ($45\text{g}$) with a stopwatch. Each candy takes approximately 1.45 seconds ($T_{\text{cycle}}$), delivering a sustained sorting rate of $\approx 42\text{ Skittles / minute}$:
| Subsystem Stage | Operation | Latency |
|---|---|---|
| 1. Wheel Indexing | Rotate pocket $60^\circ$ into shroud | 320 ms |
| 2. Opto Settle | Damping vibration & NeoPixel illumination | 250 ms |
| 3. AS7341 Acquisition | 8-channel optical integration | 180 ms |
| 4. Chute Steering | Rotate slide to target bucket ($0^\circ\dots180^\circ$) | 400 ms |
| 5. Gravity Discharge | Ejection & slide descent | 300 ms |
| TOTAL CYCLE | One Skittle sorted end-to-end | ~1.45 s (42 cpm) |
Pick whichever failure type is most common from your telemetry log, fix that one thing (e.g. slight chute friction or lighting shroud reflection), and retest.
Review the generated $5\times5$ confusion matrix from batch_analytics.py. Cover: what works, what doesn't yet, one specific failure and how you fixed it in your Engineering Log, and your final accuracy score.
Run the whole thing once, start to finish, the day before if possible — it catches most surprises before they happen in front of an audience.