Machdep

Engineering across the hardware–kernel boundary.
PCB systems and FreeBSD kernel expertise, unified into reliable embedded platforms.

Hacking the Assembly Line: Custom firmware for a Pick and Place machine

Bringing OpenPnP support to proprietary industrial equipment

If you’ve ever built hardware beyond a handful of prototypes, you’ve probably run into the limits of manual assembly pretty quickly. That’s where pick-and-place machines come in—and recently, I went a step further by writing custom firmware for one.

What Is Pick-and-Place?

Pick-and-place (PnP) is the process of

  • Picking electronic components (resistors, ICs, capacitors) from reels or trays
  • Placing them precisely onto a PCB coated with solder paste

After placement, the board goes through reflow, and everything gets soldered in place.

In production environments, this is fully automated. Even at the desktop level, machines like the YY1 bring:

  • Vision-assisted alignment
  • Multi-nozzle heads
  • Feeder-based component handling

Under the hood, it’s a mix of motion control, computer vision, and real-time coordination.

Why the NeoDen YY1?

The NeoDen YY1 sits in an interesting niche:

  • Compact and relatively affordable
  • Integrated vision system
  • Designed for small labs and low-volume production

Out of the box, it works—but like a lot of turnkey hardware, it makes assumptions:

  • About workflows
  • About component sourcing
  • About how “typical” jobs look

That’s where firmware starts to matter.

Why Write Custom Firmware?

The stock firmware is designed for general usability, not flexibility.

In my case, I wanted:

  • Improve vision quality
  • Improved handling of edge cases (odd footprints)
  • Integration with my own build pipeline
  • More deterministic motion behavior
  • Better control over placement timing

More importantly, I wanted visibility—understanding exactly what the machine is doing, not just trusting it.

Software stack

The new firmware is based on mdepx real-time OS and uses several components from FreeBSD.

Source code