Pick and Place Machine Maintenance: What Actually Wears Out
Three months of placing boards wears a desktop pick and place machine in a few specific places, and all of them are adjustable. Belt tension, the O-rings that seat the nozzle tips, a Z lead screw that shipped dry, and the head offsets somebody nudged while chasing a placement error. Nothing on that list is sealed, and every adjustment moves a number OpenPnP is already using, so maintenance on this class of machine is mostly a measurement job.
A Vertex 4 sells for $1,499 with 50 feeder slots and two JUKI-compatible heads, and it is rated down to 0402 parts. Under IPC-7351 an 0402 gets a total placement budget of 0.1 mm, and an axis that has drifted two tenths of a millimetre is already past it.
What wears on a machine this size
The motors are the least likely suspect. The Lumen REV4 firmware example drives X and Y at 800 mA with 64 microsteps, Z at 800 mA with 8 microsteps, and the two nozzle rotation motors at 700 mA with 8, all on TMC2209 drivers with 0.11 Ω sense resistors. A stepper run inside its rating does not lose steps because it is old.
The mechanical side is where the hours show. Opulo's design notes describe the layout: X rides one NEMA 17 on a GT2 belt along an MGN12H rail, Y uses two NEMA 17 motors on two MGN12H rails and has driven them independently since v4.0.0, Z pulls two counterweighted gantries along short LML9B rails, and the A and B axes are NEMA 11 hollow-shaft motors with the vacuum passing through 4 mm tubing. Earlier versions used V-slot rollers for X and Y, and Opulo switched to linear rails partly because rails need less maintenance. Neither a rail nor a belt adjusts itself.
Belt tension and rail alignment belong to the build, and kit assembly is where they are set. The same numbers come back around at month three.
Read the drivers before touching the machine
M122 is the cheapest check available, and on the stock Vertex 4 configuration it prints the full table because TMC_DEBUG is enabled in the firmware. It reports per driver: Set current, which is what Marlin asked for; RMS current, which is what the driver is actually set to and reads 795 when you asked for 800 because of the 32-step current scale; Run current and Hold current as counts out of 31; CS actual; msteps; tstep; and Stallguard thrs.
Two fields are worth reading every month. Enabled false means the driver outputs are off. That is the idle timeout: the firmware default is DEFAULT_STEPPER_TIMEOUT_SEC 120, and the factory CONNECT_COMMAND has no M18 line overriding it, so a stock machine de-energises its motors two minutes after the last move. An axis without current holds no position, which is why a session starts with a homing cycle. The second field is the DRVSTATUS line, where an asterisk next to a name means that flag is set: ola and olb are an open load on coil A or B, s2ga and s2gb a short to ground, otpw a temperature pre-warning, ot a shutdown. Run the report with an axis moving. A loose crimp often keeps the motor turning on one coil, so the flag shows up on the DRVSTATUS line while everything still appears to work.
Two commands sit next to it. M122 I re-sends Marlin's settings to every driver, which matters because a driver that lost motor power forgets everything written to it. M911 lists the overtemperature pre-warning flag of each driver and M912 clears it. The flag stays set after the warning ends, so treat it as a record of when the driver last ran hot.
Belt tension, and the number it moves
Opulo's build guide gives one measurement for belt tension: pull back on the tensioner arm and "a tug should result in only a 2mm deflection". A stock machine carries two 1400 mm belts on Y and a 1500 mm belt on X, so there is a lot of belt to be slack. The same guide has you clamp the X belt on the motor side first so the tail cannot foul the limit switch; if you re-tension an X belt, that is the step to remember.
Re-tensioning changes the backlash number, and this is where a maintenance pass turns into calibration work. Measure one point four times through a reversal cycle, in, back, in, back. Slack alternates between the same two values and keeps alternating. Lost steps return a different value each time. The 0.2 mm to 0.3 mm error that only appears after a reversal is belt slack, and the backlash page has the five-minute measurement plus the five compensation methods OpenPnP offers. Compensation is the last step, because no offset repairs a machine that is shedding steps.
O-rings, the Z lead screw, and the parts that ship dry
The Z lead screw ships dry. A light PTFE grease on the threads is the fix for the grinding noise that shows up during early homing runs, and it sits on the machine's FAQ page beside the symptom that imitates it: an axis that moves freely by hand but grinds under power points at motor current rather than lubrication.
The nozzle tips carry O-rings. Opulo's nozzle prep guide asks for a very small amount of lubricant before the first install, with the tip inserted and removed several times to spread it evenly, plus a warning that too much clogs a CP40 tip because the openings are tiny. The same guide gives the reason to keep doing it later: lubrication prevents the O-rings from wearing prematurely and keeps automatic tip changes smooth. A worn O-ring changes how the tip seats on the nozzle, and runout is measured from that seat, so a tip that has started to sit differently needs a fresh runout calibration. The factory configuration lists six tips, N045 through N75, with pick dwell times between 200 ms and 500 ms and place dwells between 100 ms and 200 ms.
Nothing recalibrates itself on the stock config
Open the factory machine.xml and every nozzle tip has enabled="true" on its <calibration> element with recalibration-trigger="Manual", background-calibration-method="None", six angle subdivisions, and up to five allowed misdetections. OpenPnP supports four triggers: NozzleTipChange, NozzleTipChangeInJob, MachineHome and Manual. The code default is NozzleTipChangeInJob. A stock machine is set to Manual, so the only thing that re-measures runout is somebody pressing the button.
Some changes wipe the stored calibration for you. Move a nozzle's head offset by more than 0.01 mm and OpenPnP calls resetAllNozzleTips(), which drops the calibration of every tip on the machine. It treats a down-looking camera whose view has changed the same way. Calibration also refuses to run on a machine that is not homed, and the request ends with "Machine not yet homed, nozzle tip calibration request aborted".
A schedule that fits in an hour
| When | Check | What it invalidates |
|---|---|---|
| Every session | Home before the first job. Wipe the rails with a dry lint-free cloth. Jog X and Y through full travel and listen. | Nothing |
| Monthly | M122 with one axis moving, then M911. Belt tug at 2 mm. PTFE grease on the Z screw. Look at the O-rings. Fiducial check against the datum board. | Nothing, until you adjust something |
| After any adjustment | Re-measure backlash. Re-run tip calibration if you changed head offsets, the tips, or the camera. | Backlash offset, tip calibration |
| Quarterly, or after moving the machine | Re-tension the belts, then re-measure backlash. Check steps per mm with a 100 mm ruler only if the machine was rebuilt or moved. | Steps per mm, backlash |

The order matters more than the interval. Measure the axis before you adjust it, change one part at a time, and after each change re-run the calibration that change invalidated. A machine that has been adjusted three times without a measurement in between is carrying three unknown numbers, and the next placement error will not tell you which one moved.
