<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>PikkoBot Blog</title>
        <link>https://blog.pikkobot.com/</link>
        <description>PikkoBot — field notes from a precision robotics workshop</description>
        <lastBuildDate>Fri, 03 Jul 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 PikkoBot</copyright>
        <item>
            <title><![CDATA[LumenPnP vs JUKI vs Yamaha: Honest Comparison for Hardware Startups]]></title>
            <link>https://blog.pikkobot.com/lumenpnp-vs-juki-vs-yamaha</link>
            <guid>https://blog.pikkobot.com/lumenpnp-vs-juki-vs-yamaha</guid>
            <pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A practical comparison of LumenPnP/PikkoBot, JUKI RS, and Yamaha YS-class pick-and-place machines from a hardware startup's perspective — cost, throughput, repair, and total cost of ownership.]]></description>
            <content:encoded><![CDATA[<p>If you're choosing between a desktop pick-and-place and a used industrial unit, the marketing materials don't tell you what actually matters. This is the honest decision matrix, written from inside both worlds.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="three-categories-three-jobs">Three categories, three jobs<a href="https://blog.pikkobot.com/lumenpnp-vs-juki-vs-yamaha#three-categories-three-jobs" class="hash-link" aria-label="Direct link to Three categories, three jobs" title="Direct link to Three categories, three jobs" translate="no">​</a></h2>
<p>These machines look similar in product photos. They're built for completely different jobs.</p>
<table><thead><tr><th>Category</th><th>Example</th><th>Built for</th><th>Realistic CPH</th></tr></thead><tbody><tr><td><strong>Desktop open-source</strong></td><td>LumenPnP, PikkoBot</td><td>Prototyping, low-mid volume</td><td>800–1,500</td></tr><tr><td><strong>Used industrial</strong></td><td>JUKI RS1, Yamaha YS24</td><td>High-volume contract manufacturing</td><td>25,000–60,000</td></tr><tr><td><strong>New industrial</strong></td><td>JUKI RX7, Yamaha Z<!-- -->:LEX</td><td>Production lines</td><td>100,000+</td></tr></tbody></table>
<p>CPH = components per hour. A desktop machine placing a 200-component board in 10 minutes runs at 1,200 CPH. A used JUKI RS1 does the same board in 12 seconds.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cost-its-not-what-you-think">Cost: it's not what you think<a href="https://blog.pikkobot.com/lumenpnp-vs-juki-vs-yamaha#cost-its-not-what-you-think" class="hash-link" aria-label="Direct link to Cost: it's not what you think" title="Direct link to Cost: it's not what you think" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="purchase-price">Purchase price<a href="https://blog.pikkobot.com/lumenpnp-vs-juki-vs-yamaha#purchase-price" class="hash-link" aria-label="Direct link to Purchase price" title="Direct link to Purchase price" translate="no">​</a></h3>
<table><thead><tr><th>Machine</th><th>Used/Buy price</th><th>Notes</th></tr></thead><tbody><tr><td>PikkoBot</td><td>$3,500–6,000</td><td>New, with support</td></tr><tr><td>LumenPnP DIY kit</td><td>$2,000</td><td>Self-assembled, ~40 hours of work</td></tr><tr><td>JUKI RS1 (used 5–10 yr)</td><td>$8,000–18,000</td><td>"Working" varies dramatically</td></tr><tr><td>Yamaha YS24 (used)</td><td>$12,000–25,000</td><td>—</td></tr><tr><td>JUKI RX7 (new)</td><td>$180,000+</td><td>Production-line only</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-cost-of-ownership-in-year-1">Real cost of ownership in year 1<a href="https://blog.pikkobot.com/lumenpnp-vs-juki-vs-yamaha#real-cost-of-ownership-in-year-1" class="hash-link" aria-label="Direct link to Real cost of ownership in year 1" title="Direct link to Real cost of ownership in year 1" translate="no">​</a></h3>
<p>Purchase price is half the story. Here's what the first year actually costs:</p>
<table><thead><tr><th>Cost item</th><th>Desktop (PikkoBot)</th><th>Used JUKI RS1</th></tr></thead><tbody><tr><td>Machine</td><td>$5,000</td><td>$12,000</td></tr><tr><td>Shipping (US/EU)</td><td>$200</td><td>$1,800 (1-ton crate)</td></tr><tr><td>Power install (3-phase 220V)</td><td>$0 (110V/220V single-phase)</td><td>$400–1,500</td></tr><tr><td>Air compressor</td><td>$200 (or built-in)</td><td>$800 (8 bar industrial)</td></tr><tr><td>Feeders for typical 80-part BOM</td><td>$0 (Photon included or $20/feeder)</td><td>$200–800 each, used</td></tr><tr><td>Vision pipeline tuning</td><td>included</td><td>$0–2,000 (consultant)</td></tr><tr><td>Spare parts inventory</td><td>$200</td><td>$1,500</td></tr><tr><td>Repair on first failure</td><td>$0 (warranty, parts available)</td><td>$500–4,000</td></tr><tr><td><strong>Year 1 total</strong></td><td><strong>~$5,500</strong></td><td><strong>~$18,000–30,000</strong></td></tr></tbody></table>
<p>The "used JUKI" looks cheap until you price the spare feeders. A full bank of 40 used 8 mm feeders alone runs $4,000–8,000. New is double.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-the-desktop-wins">When the desktop wins<a href="https://blog.pikkobot.com/lumenpnp-vs-juki-vs-yamaha#when-the-desktop-wins" class="hash-link" aria-label="Direct link to When the desktop wins" title="Direct link to When the desktop wins" translate="no">​</a></h2>
<ul>
<li class=""><strong>Prototyping</strong>: 5–50 boards per spin, multiple designs per month. Setup time matters more than placement speed. PikkoBot config swap takes 2 minutes; the JUKI takes 20.</li>
<li class=""><strong>Low-volume products</strong>: 100–500 units per month. Desktop machines at 1,200 CPH finish a 100-component board in 5 minutes. That's 60 boards per hour, 480 per shift — well within "low volume."</li>
<li class=""><strong>In-house development at hardware startups</strong>: When the same person does electrical design, firmware, and assembly. The desktop's friendly UI (OpenPnP) makes sense; the JUKI's proprietary software needs a dedicated SMT operator.</li>
<li class=""><strong>Lab and educational use</strong>: Hackerspaces, university labs, R&amp;D departments.</li>
<li class=""><strong>Component diversity</strong>: Lots of one-off parts, custom feeders, mixed reels. Desktop is more flexible per swap.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-the-industrial-used-wins">When the industrial used wins<a href="https://blog.pikkobot.com/lumenpnp-vs-juki-vs-yamaha#when-the-industrial-used-wins" class="hash-link" aria-label="Direct link to When the industrial used wins" title="Direct link to When the industrial used wins" translate="no">​</a></h2>
<ul>
<li class=""><strong>Steady production</strong>: Same board, 1,000+ per month. CPH dominates total cost of ownership.</li>
<li class=""><strong>You have an SMT technician on staff</strong>: Someone who knows industrial nozzle changes, JUKI vision pipelines, and the standard repair workflow.</li>
<li class=""><strong>Tight pitch in volume</strong>: 0.4 mm BGA at scale benefits from industrial-grade vision (10 µm repeatability vs ~25 µm).</li>
<li class=""><strong>24/7 expectation</strong>: Industrial units run all night. Desktop machines need supervised operation.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-the-new-industrial-wins">When the new industrial wins<a href="https://blog.pikkobot.com/lumenpnp-vs-juki-vs-yamaha#when-the-new-industrial-wins" class="hash-link" aria-label="Direct link to When the new industrial wins" title="Direct link to When the new industrial wins" translate="no">​</a></h2>
<p>Honestly: only when you're at the throughput where the line pays for itself in months, not years. Most hardware startups never reach this point. If you do, you'll be working with a contract manufacturer first.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-decision-in-one-paragraph">The decision in one paragraph<a href="https://blog.pikkobot.com/lumenpnp-vs-juki-vs-yamaha#the-decision-in-one-paragraph" class="hash-link" aria-label="Direct link to The decision in one paragraph" title="Direct link to The decision in one paragraph" translate="no">​</a></h2>
<p>If you're a hardware startup placing under 500 boards per month and you don't have a dedicated SMT technician, <strong>a desktop pick-and-place pays for itself in the first product run</strong>. The labor saved on the first 50 boards more than covers the machine. If you're past 500 boards/month and have someone trained, <strong>a used industrial machine wins on CPH</strong> — but budget 2× the purchase price for year-1 total cost.</p>
<p>The wrong answer is buying a used industrial machine "to grow into." We've watched two startups do this. Both sold the JUKI at a loss within 18 months because nobody on the team had time to learn it.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="want-to-see-the-math-on-your-specific-case">Want to see the math on your specific case?<a href="https://blog.pikkobot.com/lumenpnp-vs-juki-vs-yamaha#want-to-see-the-math-on-your-specific-case" class="hash-link" aria-label="Direct link to Want to see the math on your specific case?" title="Direct link to Want to see the math on your specific case?" translate="no">​</a></h2>
<p>Email your monthly board count and typical BOM to <a href="mailto:support@pikkobot.com" target="_blank" rel="noopener noreferrer" class="">support@pikkobot.com</a> — we'll run an honest CPH model and tell you whether PikkoBot is the right answer for you (or not).</p>
<p>For setup specs and what's included, see <a href="https://wiki.pikkobot.com/lumenpnp/getting-started/intro" target="_blank" rel="noopener noreferrer" class="">PikkoBot Introduction</a>. To compare what components a desktop machine actually handles, see <a class="" href="https://blog.pikkobot.com/desktop-pick-and-place-component-sizes">the component size envelope</a>.</p>]]></content:encoded>
            <category>Guide</category>
            <category>Case Study</category>
        </item>
        <item>
            <title><![CDATA[From 0402 to QFN64: What a Desktop Pick-and-Place Can Actually Handle]]></title>
            <link>https://blog.pikkobot.com/desktop-pick-and-place-component-sizes</link>
            <guid>https://blog.pikkobot.com/desktop-pick-and-place-component-sizes</guid>
            <pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[An honest breakdown of which SMD component sizes a desktop pick-and-place machine can reliably handle, based on production data from PikkoBot and LumenPnP installs.]]></description>
            <content:encoded><![CDATA[<p>The first question every hardware founder asks before buying a desktop pick-and-place: <em>will this thing actually handle my boards?</em> This post lays out the real envelope, the edge cases, and the failure modes we see in the field.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-short-answer">The short answer<a href="https://blog.pikkobot.com/desktop-pick-and-place-component-sizes#the-short-answer" class="hash-link" aria-label="Direct link to The short answer" title="Direct link to The short answer" translate="no">​</a></h2>
<p>A well-calibrated PikkoBot / LumenPnP with JUKI nozzles handles the 0201–QFN64 range reliably. Above that you start needing extra prep. Below it, accept failure rates above 5%.</p>
<table><thead><tr><th>Component</th><th>Nozzle</th><th>Placement reliability</th><th>Notes</th></tr></thead><tbody><tr><td><strong>0201</strong></td><td>N04</td><td>80–90%</td><td>Static is your enemy. Anti-stat tape and tweezers required.</td></tr><tr><td><strong>0402</strong></td><td>N045 / N04</td><td><strong>97–99%</strong></td><td>Sweet spot for desktop machines.</td></tr><tr><td><strong>0603</strong></td><td>N045</td><td><strong>99%+</strong></td><td>No issues across thousands of placements.</td></tr><tr><td><strong>0805 to 1206</strong></td><td>N045 / N24</td><td><strong>99%+</strong></td><td>—</td></tr><tr><td><strong>SOIC, SOP-8 to SOP-16</strong></td><td>N24</td><td>99%</td><td>Watch lead bend on pickup if tape is loose.</td></tr><tr><td><strong>QFN-12 to QFN-32</strong></td><td>N24</td><td>97%</td><td>Bottom-camera concentric calibration is critical.</td></tr><tr><td><strong>QFN-48 to QFN-64</strong></td><td>N24</td><td>95%</td><td>Tighter rotation tolerance — recalibrate nozzle runout every 100 boards.</td></tr><tr><td><strong>LQFP/TQFP-100+</strong></td><td>N24 / custom</td><td>90%</td><td>Lead bend on big chips is a problem. Vibration during travel matters.</td></tr><tr><td><strong>0.5 mm pitch BGA</strong></td><td>N24 (with care)</td><td>80%</td><td>Requires careful Z-height and consistent paste — outside the typical desktop envelope.</td></tr><tr><td><strong>&gt;15 mm² ICs (large QFN/QFP)</strong></td><td>N24</td><td>90–95%</td><td>Watch vacuum hold during fast travel.</td></tr><tr><td><strong>Connectors</strong></td><td>Drag feeder + N24</td><td>varies</td><td>Tall connectors block top-camera detection. Trade-off: place by feeder coordinates only, skip vision check.</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-pushes-you-outside-the-envelope">What pushes you outside the envelope<a href="https://blog.pikkobot.com/desktop-pick-and-place-component-sizes#what-pushes-you-outside-the-envelope" class="hash-link" aria-label="Direct link to What pushes you outside the envelope" title="Direct link to What pushes you outside the envelope" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="component-too-small-below-0201">Component too small (below 0201)<a href="https://blog.pikkobot.com/desktop-pick-and-place-component-sizes#component-too-small-below-0201" class="hash-link" aria-label="Direct link to Component too small (below 0201)" title="Direct link to Component too small (below 0201)" translate="no">​</a></h3>
<p>01005 components are technically possible with a custom 0.2 mm nozzle, but placement failure climbs above 15%. The bottleneck isn't the nozzle — it's the camera resolution. To detect a 0.4 × 0.2 mm part on the bottom camera you need &gt;12 px across the long edge, which means moving the camera closer than its calibrated focus.</p>
<p>If your design needs 01005 in volume, you're past desktop territory. Consider a sub-CM SMT line for prototypes, then outsource to a contract manufacturer for production.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="component-too-tall-10-mm">Component too tall (&gt;10 mm)<a href="https://blog.pikkobot.com/desktop-pick-and-place-component-sizes#component-too-tall-10-mm" class="hash-link" aria-label="Direct link to Component too tall (>10 mm)" title="Direct link to Component too tall (>10 mm)" translate="no">​</a></h3>
<p>The Z-axis travel is finite. PikkoBot v4 nozzles can pick parts up to about 25 mm tall, but anything above 15 mm starts blocking the bottom camera during vision check, which means the rotation can't be verified. You can disable bottom-camera verification per-part in OpenPnP, but you trade rotation accuracy for it.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="component-too-heavy-5-g">Component too heavy (&gt;5 g)<a href="https://blog.pikkobot.com/desktop-pick-and-place-component-sizes#component-too-heavy-5-g" class="hash-link" aria-label="Direct link to Component too heavy (>5 g)" title="Direct link to Component too heavy (>5 g)" translate="no">​</a></h3>
<p>Vacuum hold becomes the limit. With a JUKI N24 nozzle at ~70 kPa, you can hold a 5 g part during normal placement moves. Push past that and accept drops at sharp accelerations. Mitigations:</p>
<ul>
<li class="">Reduce machine acceleration in <code>Machine Setup → Heads → Head → Max Feed Rate</code>.</li>
<li class="">Use a larger nozzle (custom 1.5 mm tip).</li>
<li class="">Increase vacuum hold time before release by 50–100 ms.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pitch-too-tight-bga-04-mm">Pitch too tight (BGA ≤0.4 mm)<a href="https://blog.pikkobot.com/desktop-pick-and-place-component-sizes#pitch-too-tight-bga-04-mm" class="hash-link" aria-label="Direct link to Pitch too tight (BGA ≤0.4 mm)" title="Direct link to Pitch too tight (BGA ≤0.4 mm)" translate="no">​</a></h3>
<p>Once you're below 0.4 mm pitch, the alignment requirement falls below the machine's repeatability (~25 µm on a typical desktop unit). Placements become probabilistic. Hand-rework after the fact ends up faster than chasing the last 10% on the machine.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="realistic-prototyping-vs-production">Realistic prototyping vs production<a href="https://blog.pikkobot.com/desktop-pick-and-place-component-sizes#realistic-prototyping-vs-production" class="hash-link" aria-label="Direct link to Realistic prototyping vs production" title="Direct link to Realistic prototyping vs production" translate="no">​</a></h2>
<p>These rules of thumb hold for <strong>prototyping at low volumes</strong> — under 50 boards per session. At higher volumes, two things change:</p>
<ol>
<li class=""><strong>Calibration drift matters more.</strong> Over a 200-board run, nozzle concentric calibration shifts by ~30 µm. Schedule a recalibration every 100 boards if you're running tight-pitch QFNs.</li>
<li class=""><strong>Tape loading errors compound.</strong> A misaligned reel costs you a board if the feeder advances wrong once. Use <a href="https://wiki.pikkobot.com/lumenpnp/feeders/openpnp-setup" target="_blank" rel="noopener noreferrer" class="">Photon auto-feeders</a> instead of drag feeders for runs over 25 boards.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-we-wont-claim">What we won't claim<a href="https://blog.pikkobot.com/desktop-pick-and-place-component-sizes#what-we-wont-claim" class="hash-link" aria-label="Direct link to What we won't claim" title="Direct link to What we won't claim" translate="no">​</a></h2>
<p>We've seen marketing copy from other desktop pick-and-place vendors claiming "01005 to BGA0.3 mm" capability on hardware essentially identical to ours. Those numbers are theoretical maximums, not field-tested reliability. The components technically fit on the nozzle. They just don't place reliably.</p>
<p>If you're buying a desktop machine for production, work from the table above. The 99%+ rows are where these machines earn their keep.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="want-to-test-your-specific-bom">Want to test your specific BOM?<a href="https://blog.pikkobot.com/desktop-pick-and-place-component-sizes#want-to-test-your-specific-bom" class="hash-link" aria-label="Direct link to Want to test your specific BOM?" title="Direct link to Want to test your specific BOM?" translate="no">​</a></h2>
<p>Send your PCB and BOM to <a href="mailto:support@pikkobot.com" target="_blank" rel="noopener noreferrer" class="">support@pikkobot.com</a> and we'll tell you (a) whether PikkoBot can handle it and (b) where the marginal parts are. Free, no obligation, takes us about 10 minutes per BOM.</p>
<p>For the technical setup behind these numbers, see <a href="https://wiki.pikkobot.com/lumenpnp/calibration/calibration-v4" target="_blank" rel="noopener noreferrer" class="">Calibration</a> and <a href="https://wiki.pikkobot.com/lumenpnp/software-setup/load-config" target="_blank" rel="noopener noreferrer" class="">OpenPnP Config</a>.</p>]]></content:encoded>
            <category>Guide</category>
            <category>Case Study</category>
        </item>
        <item>
            <title><![CDATA[OpenPnP Fiducial Detection Failing: 5 Fixes That Actually Work]]></title>
            <link>https://blog.pikkobot.com/openpnp-fiducial-detection-fixes</link>
            <guid>https://blog.pikkobot.com/openpnp-fiducial-detection-fixes</guid>
            <pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Practical, field-tested fixes for fiducial detection problems in OpenPnP, from lighting and pipeline tuning to camera focus and PCB surface prep.]]></description>
            <content:encoded><![CDATA[<p>If OpenPnP can't find your PCB fiducials, the entire job halts. After running PikkoBot machines through hundreds of boards, these are the five fixes that resolve nearly every "fiducial not found" error.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-the-board-surface-is-too-reflective">1. The board surface is too reflective<a href="https://blog.pikkobot.com/openpnp-fiducial-detection-fixes#1-the-board-surface-is-too-reflective" class="hash-link" aria-label="Direct link to 1. The board surface is too reflective" title="Direct link to 1. The board surface is too reflective" translate="no">​</a></h2>
<p>Glossy soldermask reflects the ring light back into the camera, washing out the fiducial circle. The fix is mechanical, not software:</p>
<ul>
<li class="">Wipe the PCB with isopropyl alcohol to remove handling residue.</li>
<li class="">If the board is glossy green or red soldermask, angle the ring light source slightly using a thin diffuser ring (printable in PETG, ~30° angle).</li>
<li class="">Switch the top camera exposure down by 20-30% in <code>Machine Setup → Cameras → Top Camera → Device Settings</code>. The histogram peak should sit at roughly 60% brightness, not 95%.</li>
</ul>
<p>A telltale sign of this issue: detection works at the corners of the board but fails near the center where the reflection is strongest.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-the-vision-pipelines-blob-detector-thresholds-are-wrong">2. The vision pipeline's blob detector thresholds are wrong<a href="https://blog.pikkobot.com/openpnp-fiducial-detection-fixes#2-the-vision-pipelines-blob-detector-thresholds-are-wrong" class="hash-link" aria-label="Direct link to 2. The vision pipeline's blob detector thresholds are wrong" title="Direct link to 2. The vision pipeline's blob detector thresholds are wrong" translate="no">​</a></h2>
<p>OpenPnP's default fiducial detection pipeline uses a <code>BlobDetector</code> stage with conservative defaults. For 1.0 mm copper fiducials on standard soldermask, those defaults work. For anything non-standard, they don't.</p>
<p>Open the pipeline editor: <strong>Job → PCB Fiducials → right-click a fiducial → Edit Pipeline</strong>.</p>
<p>Adjust these stages in order:</p>
<table><thead><tr><th>Stage</th><th>What to check</th><th>Typical value</th></tr></thead><tbody><tr><td><code>ImageCapture</code></td><td>Camera selected = Top Camera</td><td>—</td></tr><tr><td><code>Threshold</code></td><td><code>thresholdValue</code> matches your soldermask brightness</td><td>100–140 (green), 60–80 (red)</td></tr><tr><td><code>BlobDetector</code></td><td><code>minArea</code> and <code>maxArea</code> bracket your fiducial size in pixels²</td><td>For 1.0 mm fiducial at 0.05 mm/px: ~400–2000</td></tr><tr><td><code>BlobDetector</code></td><td><code>minCircularity</code></td><td>0.85 (relaxed for matte boards)</td></tr><tr><td><code>MaskCircle</code></td><td>Search radius around expected position</td><td>20–40 px</td></tr></tbody></table>
<p>After each change, click <strong>Process Pipeline</strong> with a still board image to see what survives each stage.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-the-camera-is-out-of-focus">3. The camera is out of focus<a href="https://blog.pikkobot.com/openpnp-fiducial-detection-fixes#3-the-camera-is-out-of-focus" class="hash-link" aria-label="Direct link to 3. The camera is out of focus" title="Direct link to 3. The camera is out of focus" translate="no">​</a></h2>
<p>The top camera's lens has a fixed focal distance set during manufacturing. If you've adjusted it for component vision (closer focus), fiducial detection at PCB height will look blurry, and <code>BlobDetector</code> will reject the soft edges.</p>
<p>Quick test:</p>
<ol>
<li class="">Jog the top camera over a fiducial.</li>
<li class="">Watch the live feed — sharp edges or fuzzy?</li>
<li class="">If fuzzy, you have two choices:<!-- -->
<ul>
<li class="">Adjust the camera focus ring for fiducial height (loses sharpness for component pickup verification — usually not worth it).</li>
<li class=""><strong>Better:</strong> retune the <code>BlobDetector</code> <code>minCircularity</code> down to 0.7 to accept softer edges, and tighten <code>MaskCircle</code> to compensate for false positives.</li>
</ul>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-mmpixel-calibration-drifted">4. mm/pixel calibration drifted<a href="https://blog.pikkobot.com/openpnp-fiducial-detection-fixes#4-mmpixel-calibration-drifted" class="hash-link" aria-label="Direct link to 4. mm/pixel calibration drifted" title="Direct link to 4. mm/pixel calibration drifted" translate="no">​</a></h2>
<p>OpenPnP needs to know how many millimeters one camera pixel represents. If this value is wrong by even 5%, the search window in <code>MaskCircle</code> won't be centered on the actual fiducial position.</p>
<p>Recalibrate using a known reference — a fiducial that you measured with calipers:</p>
<ol>
<li class="">Place the reference board at staging plate height.</li>
<li class=""><strong>Machine Setup → Cameras → Top Camera → Calibration → mm/Pixel Calibration</strong>.</li>
<li class="">Follow the wizard with the known fiducial diameter.</li>
<li class="">Save. Re-run fiducial detection.</li>
</ol>
<p>Symptom that points here: detection finds <em>something</em> but it's offset from the actual fiducial by 1–3 mm consistently.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-the-fiducial-is-not-where-openpnp-thinks-it-is">5. The fiducial is not where OpenPnP thinks it is<a href="https://blog.pikkobot.com/openpnp-fiducial-detection-fixes#5-the-fiducial-is-not-where-openpnp-thinks-it-is" class="hash-link" aria-label="Direct link to 5. The fiducial is not where OpenPnP thinks it is" title="Direct link to 5. The fiducial is not where OpenPnP thinks it is" translate="no">​</a></h2>
<p>If you've imported a PCB but the fiducial coordinates in the PCB file don't match the physical board (e.g., wrong origin, mirrored design, or you flipped the board), OpenPnP looks in empty space.</p>
<p>Verify by:</p>
<ul>
<li class="">Opening the PCB file in OpenPnP and noting the fiducial X/Y.</li>
<li class="">Manually jog the head to that coordinate.</li>
<li class="">Look at the live camera feed. The fiducial should be roughly centered.</li>
</ul>
<p>If it's off by exactly the board's width or height, you've got an origin mismatch. Re-export the PCB with the origin set to the bottom-left fiducial.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-checklist">Quick checklist<a href="https://blog.pikkobot.com/openpnp-fiducial-detection-fixes#quick-checklist" class="hash-link" aria-label="Direct link to Quick checklist" title="Direct link to Quick checklist" translate="no">​</a></h2>
<p>When fiducial detection fails, run through this:</p>
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->PCB cleaned with IPA</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Ring light not pointing directly into the camera</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Top camera exposure not maxed out</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Vision pipeline <code>Threshold</code> and <code>BlobDetector</code> reviewed in the pipeline editor</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Camera in focus at PCB height</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->mm/pixel calibration done within the last month</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->PCB file coordinates verified against physical board</li>
</ul>
<p>If you've ticked every box and it still fails, the issue is usually the soldermask itself. Try a different test board or a different fiducial shape (1.5 mm circle instead of 1.0 mm).</p>
<hr>
<p>For machine setup that comes pre-calibrated for fiducial detection out of the box, see the <a href="https://wiki.pikkobot.com/lumenpnp/software-setup/load-config" target="_blank" rel="noopener noreferrer" class="">PikkoBot JUKI config</a> — it includes a tuned pipeline for standard green and black soldermasks. For hands-on testing of camera and lighting outside OpenPnP, use the <a href="https://wiki.pikkobot.com/lumenpnp/debug/" target="_blank" rel="noopener noreferrer" class="">PikkoBot Debug Tool</a>.</p>]]></content:encoded>
            <category>OpenPnP</category>
            <category>Calibration</category>
            <category>Guide</category>
        </item>
        <item>
            <title><![CDATA[Welcome to the PikkoBot Blog]]></title>
            <link>https://blog.pikkobot.com/hello</link>
            <guid>https://blog.pikkobot.com/hello</guid>
            <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[This is where we'll share field notes from running PikkoBot machines: real builds, calibration tricks, feeder firmware tweaks, and case studies from users.]]></description>
            <content:encoded><![CDATA[<p>This is where we'll share field notes from running PikkoBot machines: real builds, calibration tricks, feeder firmware tweaks, and case studies from users.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-youll-find-here">What you'll find here<a href="https://blog.pikkobot.com/hello#what-youll-find-here" class="hash-link" aria-label="Direct link to What you'll find here" title="Direct link to What you'll find here" translate="no">​</a></h2>
<ul>
<li class=""><strong>Case studies</strong> — PCBs we've assembled, what worked, what didn't.</li>
<li class=""><strong>Calibration deep dives</strong> — JUKI nozzle runout, fiducial vision tuning, feeder zero alignment.</li>
<li class=""><strong>OpenPnP tips</strong> — config patterns, G-code recipes, debug techniques.</li>
<li class=""><strong>Hardware mods</strong> — community-tested upgrades to the LumenPnP platform.</li>
</ul>
<p>For step-by-step setup and reference documentation, see the <a href="https://wiki.pikkobot.com/lumenpnp/" target="_blank" rel="noopener noreferrer" class="">PikkoBot Wiki</a>. For browser-based hardware testing, use the <a href="https://wiki.pikkobot.com/lumenpnp/debug/" target="_blank" rel="noopener noreferrer" class="">Debug Tool</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contributing">Contributing<a href="https://blog.pikkobot.com/hello#contributing" class="hash-link" aria-label="Direct link to Contributing" title="Direct link to Contributing" translate="no">​</a></h2>
<p>This blog is open. If you've solved a tricky calibration or have a build to share, email <a href="mailto:support@pikkobot.com" target="_blank" rel="noopener noreferrer" class="">support@pikkobot.com</a>.</p>]]></content:encoded>
            <category>Guide</category>
        </item>
    </channel>
</rss>