Metatransformer report
Buy and build — Pico + FS90 bounded servo bench
Printable procurement, assembly, firmware, and evidence handoff · researched but unbuilt
Text report: images and diagrams are omitted, and links to project files are inactive. Keep the exported project alongside this PDF for wiring diagrams, models, and linked files.
Status, scope, and stop control
This is a researched, unbuilt bench route. It has not been flashed, wired, measured, or physically validated, and it carries no performance or safety guarantee. It uses the original Raspberry Pi Pico RP2040 and the positional FEETECH FS90 sold as Pololu product 2818—not FS90R continuous rotation, FS90-FB, or SG92R. The existing SG92R project remains unchanged; this FS90 route is not a drop-in qualification for it.
The firmware limits commands, but it is not a hardware safety certification or interlock. No pulses does not prove that the shaft released or cannot move. Keep the external supply’s low-voltage barrel connection within reach: unplugging that barrel is the physical stop for servo power. USB powers only the Pico. Keep fingers, hair, tools, and fragile objects outside the possible travel before applying servo power.
Procurement and receiving inspection
Acquire one original Pico RP2040 with loose headers (opens in a new tab), one positional FEETECH FS90 / Pololu 2818 (opens in a new tab), one regulated 5 V, 2 A supply (opens in a new tab), one 2.1 mm female screw-terminal adapter (opens in a new tab), one normally-open momentary button (opens in a new tab), a breadboard (opens in a new tab), male/male logic jumpers (opens in a new tab), and either a USB-A/Micro-B data cable (opens in a new tab) or USB-C/Micro-B data cable (opens in a new tab) to suit the host. Header soldering requires an iron, solder, stand, eye protection, and ventilation.
Use one Adafruit 5515 shrouded servo adapter (opens in a new tab), plus one short separate common-ground lead and three logic jumpers (GP0 signal extension if needed, GP3 to button, button to GND). The Pico needs its two included 20-pin header strips; acquire one button 10-pack but use one button, and one jumper 40-pack but use only the required conductors. Tools required: a DC-voltage/continuity multimeter, wire stripper/cutter suited to 26 AWG, and a screwdriver fitting the terminal screws. Provide insulation and strain relief. The signal contact may enter the breadboard, but servo positive and negative must bypass breadboard and Pico rails. Terminate the power conductors with correctly stripped wire or a ferrule sized for the clamp; never clamp a loose Dupont pin. With everything unplugged, retain the adapter signal pin and prepare its power and ground ends for the screw clamp; modify the replaceable adapter, not the servo lead. Confirm the clamp can retain those conductors and the separate ground lead without exposed strands; stop if it cannot. A suitable splice/terminal is required if the clamp cannot accept the intended junction. This is a prepared cable assembly, not plug-and-play.
Identify the exact FS90 contacts using the FS90 pinout from Pimoroni (opens in a new tab): red is supply, orange is signal, brown is ground. Compare the received FS90 markings and lead arrangement with the Pololu product reference (opens in a new tab); a different lead arrangement needs supplier clarification before power. Trace each servo-side contact through the unplugged adapter with continuity and label the prepared ends. Do not transfer colors between adapters or guess left/right from a rotated connector.
Record the exact received label. Pololu’s measured-current page reports 0.6 A stall at 6 V, while its linked PDF is marked FS90-C and reports 0.8 A at 6 V. Preserve that discrepancy rather than merging the values. The 2 A supply is planned headroom, not proof of transient response, connector quality, or current limiting. Do not deliberately stall the servo.
Unpowered topology and inspection
Solder and inspect the Pico headers before wiring. With every source disconnected, use the official numbered Pico pinout (opens in a new tab) and verify the servo adapter contacts. Wire this topology exactly:
Host USB -> Pico USB only
Adapter positive -> servo POWER + only
Adapter negative -> servo GROUND (direct motor-current return)
-> Pico GND physical 3 (separate reference lead)
Pico GP0 physical 1 -> servo SIGNAL
Pico GP3 physical 5 -> normally-open button -> Pico GND physical 8
Pico GP25 -> onboard LED only
External positive has no connection to VBUS physical 40, VSYS physical 39, or 3V3(OUT) physical 36. Servo current does not use a breadboard rail, Pico power pin, or logic jumper. A four-leg button contains two internally common pairs: use unpowered continuity to identify them, then connect across the switched sides. Connecting the same common pair makes the input permanently active. Confirm GP3 reads released before attaching the servo. Stop on any uncertain pin number, connector fit, polarity, loose strand, bridge, or continuity result.
Firmware handoff and command behavior
Install the original-Pico CircuitPython UF2 (opens in a new tab): hold BOOTSEL while attaching USB, copy that UF2 to RPI-RP2, and wait for the reboot to expose CIRCUITPY. This packet needs no external library bundle: it uses only built-in board, time, math, digitalio, and pwmio plus its own module. Copy both files to the CIRCUITPY root: copy firmware/code.py as code.py and firmware/servo_control.py as servo_control.py. The source packet owns the complete code; this guide intentionally does not duplicate it.
At boot the output duty is zero and the controller is disarmed. It must observe the button released continuously for at least 0.05 s. A press then begins at 1500 µs and slowly traces a triangle between 1450 and 1550 µs at no more than 50 µs/s, at 50 Hz. Release requests zero output on the next loop iteration (nominally 20 ms, not a real-time guarantee). Five seconds of continuous command forces zero output; release stably, then press again to rearm. A held-at-startup button never starts motion. Backward or non-finite clock values reset to zero output. The onboard LED means only “command active,” not actual shaft position. Serial telemetry reports state and commanded pulse, never fabricated position feedback.
Staged first test
- Leave the servo connector physically disconnected. Attach USB, confirm CIRCUITPY and serial, and let the released button arm. If available, use a logic analyzer or oscilloscope at GP0-to-GND to check 50 Hz, zero output before arming, the first 1500 µs command, immediate release, and the five-second timeout. The LED alone cannot verify pulse width. Complete this disconnected output test before connecting the servo.
- Disconnect USB. Remove the servo horn and every link or load, secure the servo body, trace the signal/ground/power topology, verify supply polarity and nominal voltage, and inspect the screw clamps. Clear the entire travel envelope.
- Reconnect USB first. Wait for the controller to boot disarmed with the button released. Do not press while a connected servo is unpowered. After inspections, connect external servo power; keep the barrel plug reachable.
- Press briefly. The first command can jump toward center. Release and confirm the command stops; observe behavior without claiming a measured angle. Repeat long enough to observe the five-second timeout, then release and repress to confirm rearming.
- Stop immediately for heat, persistent buzz, Pico reset, binding, supply sag, damaged insulation, odor, or unexpected motion. Do not widen the pulse range or raise a current limit to force movement. Remove external servo power before removing USB. A software crash can leave the last pulse until cleanup runs, so retain access to the barrel disconnect.
Only after unloaded checks should a lightweight paper pointer be fitted for angle observations. Attach no working load until supply voltage, current where instrumentation is available, motion, and clearances are recorded.
Engineering record and troubleshooting
A worked static estimate for a 20 g mass at a horizontal 40 mm lever arm is m g r = 0.020 kg × 9.80665 m/s² × 0.040 m = 0.00784532 N·m, or 0.08 kgf·cm. An optional factor of three gives 0.02353596 N·m. This assumes gravity is perpendicular to a massless horizontal arm; arm mass, acceleration, friction, impacts, geometry, and losses remain excluded. Compare only with the published 1.3 kgf·cm stall value at 4.8 V as an upper stalled reference—not a continuous rating. Arithmetic margin does not establish usable torque. Review torque and gearing theory before adding a load.
Use notes/bench-log.csv for date, exact variant, supply voltage at rest and moving, pulse bounds, observed angle, startup/release/timeout observations, measured current if suitable instrumentation is available, and notes. Angle and current are pending until measured; never backfill estimates as observations.
Diagnose in layers: no CIRCUITPY suggests the USB data cable, BOOTSEL procedure, or UF2; import/traceback suggests file names or firmware; no arm/start suggests button pair, pull-up, or startup-held state; LED command without motion suggests servo power, common ground, signal contact, or connector mapping; resets or sag suggest the power path; buzz or restricted travel suggests mechanical binding or an unsuitable variant. Depower before continuity or rewiring.
Export and transfer
In Metatransformer choose New project → Pico + FS90 servo bench to obtain the source packet. Keep README.md, BUY_AND_BUILD.md, WIRING.md, ENGINEERING.md, both firmware files, and notes/bench-log.csv together. Export the project’s source bundle after reviewing it for private notes. A recipient can import it with pnpm workshop import /path/to/bench.workshop.json /path/to/new-bench, then register it with pnpm workshop register /path/to/new-bench. Use a new destination directory. Recheck exact hardware identity and wiring after transfer; source portability is not physical validation.
Sources and references
- Pimoroni — FS90 contact pinout (corroborating reference) (opens in a new tab)
- Adafruit — 5515 shrouded servo adapter (opens in a new tab)
- Pololu — FEETECH FS90 positional micro servo (opens in a new tab)
- Pololu — FS90 measured specifications (opens in a new tab)
- Pololu — linked FS90-C specification PDF (opens in a new tab)
- Adafruit — original Raspberry Pi Pico RP2040 (opens in a new tab)
- Adafruit — original Pico numbered pinout (opens in a new tab)
- Adafruit — regulated 5 V 2 A supply (opens in a new tab)
- Adafruit — 2.1 mm female screw-terminal adapter (opens in a new tab)
- CircuitPython — original Raspberry Pi Pico UF2 (opens in a new tab)
- CircuitPython — pwmio reference (opens in a new tab)