QualityRelay physical build · breadboard, jumpers, bench layout, bench test

Tabletop demo →Measurement logger →BUILD AID · drawings are not evidence · your board's printed labels win
Drawn for a standard 830-hole breadboard (columns 1–63, rows a–j) and a 30-pin "ESP32 DEVKIT V1" (DOIT style), lying sideways with USB to the left. Other ESP32 boards have different pin orders: always match the printed label (GND, D13 / G13 / IO13, D32 / G32 / IO32), not the drawing position.

Every connection on the board

IDjumper typecolourfromtopurpose

How to tell jumpers apart

Male–Male (M–M) metal pin on both ends. Goes into breadboard holesand into the servo plug's sockets. Male–Female (M–F / F–M) pin on one end, square socket on the other. The socketslides onto a header pin of the ESP32 (Layout B only). Female–Female (F–F) sockets on both ends: pin-to-pin. Not neededin this build. Servo plug (female, 3 sockets) brown/black = −red = +5 Vorange/yellow = signal Push one M–M pin into each socket; tape the plug down.
Transport: Outcome:

Click any labeled part

The labels in the drawing are clickable.

Exit and diverter, side view (to scale)

Board top 120–130 mm above the table. Then the chute's rounded back edge sits below the carrier floor and its outlet (about 53 mm high) clears 35 mm bins. The slope stays 30° in every direction because the chute turns about a vertical axis.

Bench test protocol

Run the phases in order. Do not start a phase until every test in the previous phase is PASS. Results are saved in this browser only (local storage) until you export them. Nothing here is pre-filled; NOT RUN is the default.

What to print, and on which printer

Specimens on the Formlabs printer (resin, more accurate): one file with all 11 parts. Sorter on the Bambu Lab printer (PLA): swivel chute, hub, and servo tower. Track, carrier, and bins can stay cardboard, wood, or boxes.

Formlabs: all specimens in one print

File: examples/cad/formlabs/qualityrelay_specimen_plate.stl. It holds the 9 required specimens plus spares S-RISK-2 and T-RISK-2: 11 separate solids, 106 × 54 × 60 mm, so it fits every Formlabs platform (the smallest are 145 × 145 mm on Form 2/3/3+ and 200 × 125 mm on Form 4).

Top view of the plate with each specimen's label

Print this map (examples/cad/formlabs/plate_map.svg) and keep it next to the printer. The slots and tabs look almost identical once printed.

  1. Open the file in PreForm (it accepts STL, OBJ, 3MF, and FORM). Units: millimetres.
  2. Optional: right-click the model and choose Separate Bodies (PreForm 3.60 or newer) to get 11 separate models. If PreForm reports broken models, let it repair them; every solid in the file is closed.
  3. Do not use auto-orient. Every part already stands on its end, so PreForm puts supports only on the bottom end faces. Supports on a long side face or inside a slot would change exactly the width you measure.
  4. Generate supports with the default settings. Check that no touchpoint lands on a long side face or inside a slot.
  5. Resin: Grey or White standard resin, 0.1 mm layers. Avoid Clear (hard for the camera) and Black (no contrast on the dark pad).
  6. After printing: wash, dry, and post-cure with the settings for your resin. Wear nitrile gloves; uncured resin irritates skin.
  7. Before cutting parts off the supports, write each label on its part with a permanent marker, using the map.
  8. Remove the supports and sand only the end faces. Never sand the long faces or inside the slots. Measure after post-curing, at room temperature.
More in one go: the plate uses a fraction of the platform. In PreForm you can duplicate it for a second set; PreForm shows whether it fits. On a Form 4 the extra parts add little print time; on a Form 3/3+ they add some.
Resin parts are brittle: push the defect pairs together gently, by hand. Resin prints come out closer to CAD than FDM, so S-RISK + T-RISK (0.40 mm CAD clearance) may slide together easily. Record the fit you actually see.

Bambu Lab: servo sorter (PLA)

file (examples/cad/sorter/)what it issize, mm
swivel_chute.stlSloped channel the specimen slides down. 76 mm inside (wider than the 68.6 mm specimen diagonal, so a turned part cannot jam), 15 mm walls, rounded inlet that catches the part at every chute angle, 9 mm hole for the horn screw.125 × 79 × 17
chute_hub.stl30° wedge glued under the chute at the hole. It turns the flat print into a 30° slope.Ø 40 × 27
servo_tower.stlStands on the table and holds the SG90 shaft-up. Tabs rest on the end walls; windows let the cable out.70 × 50 × 66

Print settings

  • PLA, 0.2 mm layers, 3 walls, 15–20% infill. Print in the orientation the files are in; no supports, no brim needed. All three fit on one plate, even on an A1 mini: drag them into Bambu Studio together and press Arrange.
  • Chute: the floor's top surface is the sliding surface. Ironing (top surfaces) makes it smoother; optional.
  • Bambu Studio may show the chute and tower as several overlapping solids; it merges them when slicing.

Assemble

  1. Glue the hub under the chute floor with CA glue (superglue) or hot glue: holes lined up (push a pencil or 6 mm rod through both), thick side of the hub towards the rounded inlet. Stand it on the hub on a table: the walls must be level side to side and the floor must slope down to the open end.
  2. Glue the SG90's two-arm horn flat on the hub's bottom face, centre hole over the hole, arms along the chute.
  3. Put the servo in the tower from the top, shaft towards the front (the bins), long end towards the board. Drive the two tab screws from the servo bag into the end-wall tops (or hot-glue the tabs).
  4. Stand the tower on the table with the servo shaft 45 mm in front of the board's end face, on the track centre line. Tape or hot-glue the base down.
  5. Wire the servo (tab 1). Boot the ESP32: the sketch moves the servo to 90° (HOLD). Switch servo power off.
  6. Press the horn (with hub and chute) onto the servo shaft with the chute pointing straight along the track. Drive the horn screw through the holes.
  7. Board top must be 120–130 mm above the table (books or blocks). At HOLD, the chute's rounded back edge must sit at least 4 mm below the carrier floor.
  8. Bins: three trays at most 35 mm high and at least 80 mm deep, near edge about 80 mm from the servo axis (just past the chute outlet), one in each chute direction.
  9. Run phase M of the bench test.

Designed from published SG90 sizes; clones differ by a millimetre or two, which only changes how far the specimen drops into the chute. Not printed or tested yet. Change the numbers at the top of examples/cad/generate_sorter_stl.py and re-run it to adjust; it checks the clearances before writing files.

Specimens on the plate

labelfileCAD widthused in
S-GOODslot_good_21p2021.20 mm slotRun A
T-GOODtab_good_19p8019.80 mm tabRun A
S-RISK (+ spare S-RISK-2)slot_risk_20p7020.70 mm slotRun B
T-RISK (+ spare T-RISK-2)tab_risk_20p3020.30 mm tabRun B
T-NOMtab_nominal_20p0020.00 mm tabRun C (add a disclosed sticker marker), mate for S-DEF
S-NOMslot_nominal_21p0021.00 mm slotreference image, mate for T-DEF
RPT-20repeatability_bar_20p0020.00 mm barrepeatability test R1
S-DEFslot_defect_19p4019.40 mm slot, 1.60 mm undersizeRun D
T-DEFtab_defect_21p6021.60 mm tab, 1.60 mm oversizeRun D

The plate uses clean single-body copies with the same dimensions as examples/cad/stl/. The original slot files are three touching boxes each, which resin slicers can report as broken models. The originals stay unchanged. Rebuild the plate with python3 examples/cad/generate_specimen_stl.py plate.

Printing specimens on an FDM printer instead: PLA, flat on the bed as in examples/cad/stl/, 0.2 mm layers, no brim, no scaling, and measure at mid-height (the first layer prints wider).

Which slot fits which tab (CAD clearance, mm)

slot \ tabT-GOOD 19.80T-NOM 20.00T-RISK 20.30T-DEF 21.60
S-GOOD 21.20+1.40+1.20+0.90−0.40
S-NOM 21.00+1.20+1.00+0.70−0.60
S-RISK 20.70+0.90+0.70+0.40 tight−0.90
S-DEF 19.40−0.40−0.60−0.90−2.20

Clearance = slot gap − tab width. Positive fits by design; negative is interference and cannot fit. Values measured from the STL triangles with python3 examples/cad/generate_specimen_stl.py check. Printed parts differ from CAD, so measure and fit-test them (bench test phase S).

Run D: seeded defect pair

  • Use S-DEF with T-NOM (or S-NOM with T-DEF, or S-DEF with T-DEF).
  • The caliper reading is far outside nominal and the tab does not slide in: fit FAIL.
  • A person confirms the nonconformance, then you stage R and the part goes to REJECT. Without that confirmation, the route is HOLD.
  • Call them seeded defect specimens. They are designed undersize/oversize, not real manufacturing defects.

Other fixtures (no CAD in the repository; make by hand)

partsizehow
Carrier≈ 75 × 45 mm plate, 2–3 mm thick, 3–5 mm lip on 3 sides, front open, arrow on topFoam board or thick card with glued strips
TrackTwo rails 700–800 mm long, 10–20 mm high; clear width = carrier width + 2–3 mmStraight wood strips or aluminium angle glued to the board
Caliper registration blocks2 small L-blocks ≈ 20 × 20 × 10 mmWood offcuts or a tape outline
Webcam B arm clipHolds the webcam on a wood stripZip ties, or the webcam's own clip
Stop pins (gravity version only)3 pins ≈ 4 mm diameter × 40 mmBolts, nails, or wooden dowels

What to use, what to get, what to leave in the box

Based on what you have: two ESP32 boards, the ELEGOO kit with the Power MB V2, two Logitech webcams, a laptop, and a 3D printer. Optional items are skipped. You said you can find cables, so they are listed without models.