<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://community.element14.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>A DIY Test and Programming Rig Built for Small-Batch Electronics Production -- Episode 695</title><link>https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/72007/a-diy-test-and-programming-rig-built-for-small-batch-electronics-production----episode-695</link><description /><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><item><title>A DIY Test and Programming Rig Built for Small-Batch Electronics Production -- Episode 695</title><link>https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/72007/a-diy-test-and-programming-rig-built-for-small-batch-electronics-production----episode-695</link><pubDate>Thu, 18 Dec 2025 13:43:50 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:d3055533-cdb8-4e2a-8de9-5fe4ce9a0e72</guid><dc:creator>e14sbhargav</dc:creator><comments>https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/72007/a-diy-test-and-programming-rig-built-for-small-batch-electronics-production----episode-695#comments</comments><description>Current Revision posted to Documents by e14sbhargav on 12/18/2025 1:43:50 PM&lt;br /&gt;
&lt;p&gt;Clem Mayer (Mayer Makes) walks through a fully homemade programming and test rig designed for small-batch electronics production. Built around a Raspberry Pi and the Arduino command line tools, the system combines a touchscreen interface, custom hardware and Python-based automation to flash and test boards quickly and repeatably. In the video, Clem explains the design decisions, shows how the software and routing hardware work together, and demonstrates how makers can build production-style test setups without industrial budgets.&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoj25is0"&gt;Watch the Episode&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://youtu.be/CyCpV5uCS1U"&gt;https://youtu.be/CyCpV5uCS1U&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po0"&gt;&lt;span&gt;A homemade answer to a real manufacturing problem&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;At Electronica 2024, tucked in among the polished industrial systems on show, was a project that stood out for different reasons. Built by Clem Mayer, also known as Mayer Makes, this small‑batch programming and testing rig is a fully homemade alternative to the sort of bespoke fixtures normally reserved for larger manufacturers. It was designed specifically for makers and engineers who need to flash and test their own boards without investing in expensive, specialist equipment.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As Clem explains early on, the motivation was simple: he has designed &amp;ldquo;a lot of projects that I may want to produce in bigger numbers&amp;rdquo;, but the usual production test solutions are &amp;ldquo;bespoke made by experts&amp;rdquo;. His conclusion was equally straightforward: &amp;ldquo;I could make that myself.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-03-81/5001.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po1"&gt;&lt;span&gt;Defining the goal: one box, many products&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The aim was to create a standalone system that could handle both programming and testing for multiple designs. The workflow is intentionally direct: plug in a board, select the relevant firmware and test procedure from a menu, and let the system do the rest.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Clem describes the requirement in the video as a single device that handles the user interface, programming and testing, while also interfacing with custom hardware designed for each product. That decision shaped everything that followed, from the software stack through to the mechanical design.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-03-81/60478.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po2"&gt;&lt;span&gt;A text interface that behaves like a GUI&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Rather than building a traditional desktop GUI, Clem opted for a text‑based user interface built using the Python &lt;/span&gt;&lt;em&gt;&lt;span&gt;Textual&lt;/span&gt;&lt;/em&gt;&lt;span&gt; framework. It runs entirely in the terminal, but is designed to be used on a touchscreen.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;I&amp;rsquo;m very bad at programming graphical user interfaces,&amp;rdquo; Clem admits, &amp;ldquo;so I made a 2D text user interface&amp;hellip; it&amp;rsquo;s still a touch screen interface, but it&amp;rsquo;s made in Textual.&amp;rdquo; The result looks and behaves like a lightweight GUI, complete with menus, notifications and status messages, without the overhead of a full graphical environment.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The interface allows the user to:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Select firmware files and test scripts&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Choose the appropriate toolchain&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Pick the serial port&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Flash devices or run test routines&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;Pop‑up notifications confirm actions as they happen, and a running log gives immediate feedback during flashing and testing.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-03-81/2352.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po3"&gt;&lt;span&gt;Modest hardware, deliberate choices&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Despite how polished the interface looks, the entire system runs on a Raspberry Pi 3 Model B. Not a Pi 4 or Pi 5, and not even the B+ variant.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;This all runs on a Raspberry Pi three,&amp;rdquo; Clem notes. &amp;ldquo;It doesn&amp;rsquo;t really need much horsepower.&amp;rdquo; Compilation times are naturally slower than on a desktop machine, but that trade‑off is acceptable for the intended use case. In practice, pre‑compiled HEX files can be flashed directly, avoiding the need to compile on the device at all.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The Raspberry Pi runs Raspberry Pi OS, with an X server installed purely to support the touchscreen. The underlying interface remains a terminal application throughout.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-03-81/0218.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po4"&gt;&lt;span&gt;Arduino CLI at the core&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The key software component behind the scenes is Arduino CLI. This command‑line version of the Arduino IDE provides the same core functionality &amp;mdash; compiling sketches, selecting boards and flashing devices &amp;mdash; without any graphical layer.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Because Arduino CLI runs entirely in the terminal, it can be controlled directly from Python. Clem uses a Python wrapper to call compile and upload commands programmatically, making it possible to integrate flashing directly into the test rig interface.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;In the project&amp;rsquo;s &lt;/span&gt;&lt;code&gt;&lt;span&gt;rig.py&lt;/span&gt;&lt;/code&gt;&lt;span&gt; file, the flashing logic is explicit and readable. For example, firmware selection determines whether a sketch is compiled or a pre‑built binary is uploaded:&lt;/span&gt;&lt;/p&gt;
&lt;div data-is-code-block-view="true"&gt;
&lt;div class="cm-announced"&gt;&lt;pre class="ui-code" data-mode="python"&gt;if Firmware.endswith(&amp;#39;.ino&amp;#39;):
arduino.compile(fqbn=fqbn, sketch=Firmware)
arduino.upload(fqbn=fqbn, sketch=Firmware, port=port)
elif Firmware.endswith(&amp;#39;.hex&amp;#39;) or Firmware.endswith(&amp;#39;.bin&amp;#39;):
arduino.upload(fqbn=fqbn, input_file=Firmware, port=port)&lt;/pre&gt;&lt;/div&gt;
&lt;div class="cm-scroller"&gt;
&lt;div class="cm-layer cm-selectionLayer"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;This approach keeps the system flexible while relying on well‑understood tools.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-03-81/8713.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po5"&gt;&lt;span&gt;Hardware designed for adaptability&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The electronics are split into three main parts: the Raspberry Pi, a main routing board, and a project‑specific interface board.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The routing board sits between the Pi and the device under test (DUT). It uses analogue multiplexers and shift registers to dynamically route signals to different pins, allowing UART, I&amp;sup2;C and GPIO lines to be reassigned as needed. Clem explains that this gives him the ability to test communication interfaces properly, rather than just toggling pins blindly.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The final stage is a bespoke interface board designed specifically for each product. This board includes the programming circuitry, pogo‑pin contacts for quick connection, and buffered outputs driving indicator LEDs. These LEDs provide immediate visual feedback during testing, showing pin states and device behaviour in real time.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For Clem, this modular approach is essential. Each new product only requires a new interface board, while the main system stays the same.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-03-81/6560.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po6"&gt;&lt;span&gt;From laser‑cut wood to 3D‑printed plastic&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Mechanically, the enclosure went through at least one rethink. The original plan was a laser‑cut plywood case, but warped sheets and glue‑ups proved time‑consuming. Transport was also a concern, particularly with Electronica looming.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The final version is a 3D‑printed PLA enclosure, complete with rear‑mounted cooling fan and angled legs that tilt the unit towards the user. The tilt makes the touchscreen easier to use on a bench, and also leaves room for cabling and power at the rear.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Power comes from a Mean Well supply, delivering enough current at 12 V to run the screen and the Raspberry Pi comfortably.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-03-81/2867.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po7"&gt;&lt;span&gt;Testing, flashing, and feedback&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Once a device is clamped into place on the pogo pins, the workflow is straightforward. The user selects the test script, chooses the toolchain and port, and runs the procedure.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Test scripts are written in Python and executed directly by the rig. During a test run, signals are routed automatically, responses are checked, and the system reports a pass or fail using on‑screen notifications.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;It got very complicated very quickly,&amp;rdquo; Clem admits, but that complexity is hidden behind the interface. From the operator&amp;rsquo;s perspective, it feels like using a small industrial tester.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po8"&gt;&lt;span&gt;Open source by design&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;All files for the project, code, PCB designs and build details, have been made available below in the &amp;#39;Supporting Files and Links&amp;#39; section. Clem is clear that the project as open source is intentional. The system is meant to be adapted, extended and improved by others.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;This is more focused on the maker crowd,&amp;rdquo; he says, particularly those producing small runs or still refining their designs. The combination of open‑source software, readily available hardware and clear design intent makes the project easy to re-purpose.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-03-81/3438.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po9"&gt;&lt;span&gt;A homemade system that earns its place&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Clem&amp;rsquo;s rig holds its own. It delivers many of the same core functions, flashing, automated testing, repeatability, but in a form that should prove itself accessible to individual engineers and small teams, but you can let us know if that&amp;#39;s the case.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As Clem sums it up, it is &amp;ldquo;basically a professional testing and flashing solution for your own products&amp;hellip; completely homemade based on the Raspberry Pi and the Arduino command line&amp;rdquo;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For makers looking to bridge the gap between prototype and production, it is a practical reminder that industrial‑style solutions do not have to be industrial‑scale.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcopvuv60"&gt;Supporting Files and Links&lt;/h2&gt;
&lt;p&gt;- &lt;a title="Textual Python Framework to make TUIs" href="https://textualize.io" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;Textual Python Framework to make TUIs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- &lt;a title="Arduino-cli" href="https://github.com/arduino/arduino-cli" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;Arduino-cli&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- &lt;a title="Pyduinocli python wrapper for the arduino-cli" href="https://github.com/Renaud11232/pyduinocli" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;Pyduinocli python wrapper for the arduino-cli&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- &lt;a title="Electronica 2024" href="https://exhibitors.electronica.de/ausstellerportal/2024/aussteller/ausstellerdetails/farnell-gmbh/?elb=807.1100.1598.2.111" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;Electronica 2024&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;-&amp;nbsp;&amp;nbsp;&lt;a href="https://community.element14.com/challenges-projects/element14-presents/m/files/150860"&gt;Episode 695 Supporting Files&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcofummkb"&gt;Bill of Materials&lt;/h2&gt;
&lt;table class="e14-product-bom-main"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Product Name&lt;/th&gt;
&lt;th&gt;Manufacturer&lt;/th&gt;
&lt;th&gt;Quantity&lt;/th&gt;
&lt;th&gt;&lt;a id="e14-product-link-7a33c" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2212779,2525225,2445200~6,1201327~6,3263444,3441816~6,3002939,2845500,1378201&amp;nsku=45W6205,77Y6519,85X2967~6,11N8540~6,40AH2496,74AH2441~6,01AH7138,MC002553,54M1434&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_BUY_KIT" class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('7a33c'));" data-farnell="2212779,2525225,2445200~6,1201327~6,3263444,3441816~6,3002939,2845500,1378201" data-newark="45W6205,77Y6519,85X2967~6,11N8540~6,40AH2496,74AH2441~6,01AH7138,MC002553,54M1434" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Kit&lt;/a&gt; &lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arduino mega&lt;/td&gt;
&lt;td&gt;ARDUINO&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-3a831" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2212779&amp;nsku=45W6205&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('3a831'));" data-farnell="2212779" data-newark="45W6205" data-comoverride="" data-cmpoverride="" data-cpc="SC13721" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RASPBERRYPI3-MODB-1GB&lt;/td&gt;
&lt;td&gt;Raspberry pi&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-6e4eb" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2525225&amp;nsku=77Y6519&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('6e4eb'));" data-farnell="2525225" data-newark="77Y6519" data-comoverride="" data-cmpoverride="" data-cpc="SC14012" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC595PW-Q100,118&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-75c44" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2445200~6&amp;nsku=85X2967~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('75c44'));" data-farnell="2445200~6" data-newark="85X2967~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC4051D,653&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-e907d" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=1201327~6&amp;nsku=11N8540~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('e907d'));" data-farnell="1201327~6" data-newark="11N8540~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TOUCHSCREEN 10.1&lt;/td&gt;
&lt;td&gt;Multicomp pro&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-22f76" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3263444&amp;nsku=40AH2496&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('22f76'));" data-farnell="3263444" data-newark="40AH2496" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC241D,653&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-ab5b0" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3441816~6&amp;nsku=74AH2441~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('ab5b0'));" data-farnell="3441816~6" data-newark="74AH2441~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSM60E12-P1J&lt;/td&gt;
&lt;td&gt;MEAN WELL&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-ea888" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3002939&amp;nsku=01AH7138&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('ea888'));" data-farnell="3002939" data-newark="01AH7138" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3D Printer Filament, PLA, Blue, 205 &amp;deg;C to 225 &amp;deg;C, 1.75 mm Diameter, 1 kg&lt;/td&gt;
&lt;td&gt;Multicomp pro&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-fe85c" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2845500&amp;nsku=MC002553&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('fe85c'));" data-farnell="2845500" data-newark="MC002553" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toggle Clamp, Vertical, 70 N Holding Force, 35 mm x 56.3 mm&lt;/td&gt;
&lt;td&gt;Brauer&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-21de6" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=1378201&amp;nsku=54M1434&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('21de6'));" data-farnell="1378201" data-newark="54M1434" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="xs-hide"&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: maker manufacturing tools, Raspberry Pi touchscreen project, automated hardware testing, Python electronics testing, electronica 2024, PCB programming and testing, arudino cli workflow, Raspberry Pi test rig, custom electronics test setup, programming jig for pcbs, small batch electronics production, open source test equipment, electronica, electronics test fixture, DIY production testing, hardware test automation, friday_release, Arduino programming rig&lt;/div&gt;
</description></item><item><title>A DIY Test and Programming Rig Built for Small-Batch Electronics Production -- Episode 695</title><link>https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/72007/a-diy-test-and-programming-rig-built-for-small-batch-electronics-production----episode-695/revision/5</link><pubDate>Thu, 18 Dec 2025 13:43:50 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:d3055533-cdb8-4e2a-8de9-5fe4ce9a0e72</guid><dc:creator>cstanton</dc:creator><comments>https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/72007/a-diy-test-and-programming-rig-built-for-small-batch-electronics-production----episode-695#comments</comments><description>Revision 5 posted to Documents by cstanton on 12/18/2025 1:43:50 PM&lt;br /&gt;
&lt;p&gt;Clem Mayer (Mayer Makes) walks through a fully homemade programming and test rig designed for small-batch electronics production. Built around a Raspberry Pi and the Arduino command line tools, the system combines a touchscreen interface, custom hardware and Python-based automation to flash and test boards quickly and repeatably. In the video, Clem explains the design decisions, shows how the software and routing hardware work together, and demonstrates how makers can build production-style test setups without industrial budgets.&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoj25is0"&gt;Watch the Episode&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://youtu.be/CyCpV5uCS1U"&gt;https://youtu.be/CyCpV5uCS1U&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po0"&gt;&lt;span&gt;A homemade answer to a real manufacturing problem&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;At Electronica 2024, tucked in among the polished industrial systems on show, was a project that stood out for different reasons. Built by Clem Mayer, also known as Mayer Makes, this small‑batch programming and testing rig is a fully homemade alternative to the sort of bespoke fixtures normally reserved for larger manufacturers. It was designed specifically for makers and engineers who need to flash and test their own boards without investing in expensive, specialist equipment.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As Clem explains early on, the motivation was simple: he has designed &amp;ldquo;a lot of projects that I may want to produce in bigger numbers&amp;rdquo;, but the usual production test solutions are &amp;ldquo;bespoke made by experts&amp;rdquo;. His conclusion was equally straightforward: &amp;ldquo;I could make that myself.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-04-35/5001.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po1"&gt;&lt;span&gt;Defining the goal: one box, many products&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The aim was to create a standalone system that could handle both programming and testing for multiple designs. The workflow is intentionally direct: plug in a board, select the relevant firmware and test procedure from a menu, and let the system do the rest.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Clem describes the requirement in the video as a single device that handles the user interface, programming and testing, while also interfacing with custom hardware designed for each product. That decision shaped everything that followed, from the software stack through to the mechanical design.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-04-35/60478.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po2"&gt;&lt;span&gt;A text interface that behaves like a GUI&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Rather than building a traditional desktop GUI, Clem opted for a text‑based user interface built using the Python &lt;/span&gt;&lt;em&gt;&lt;span&gt;Textual&lt;/span&gt;&lt;/em&gt;&lt;span&gt; framework. It runs entirely in the terminal, but is designed to be used on a touchscreen.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;I&amp;rsquo;m very bad at programming graphical user interfaces,&amp;rdquo; Clem admits, &amp;ldquo;so I made a 2D text user interface&amp;hellip; it&amp;rsquo;s still a touch screen interface, but it&amp;rsquo;s made in Textual.&amp;rdquo; The result looks and behaves like a lightweight GUI, complete with menus, notifications and status messages, without the overhead of a full graphical environment.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The interface allows the user to:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Select firmware files and test scripts&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Choose the appropriate toolchain&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Pick the serial port&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Flash devices or run test routines&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;Pop‑up notifications confirm actions as they happen, and a running log gives immediate feedback during flashing and testing.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-04-35/2352.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po3"&gt;&lt;span&gt;Modest hardware, deliberate choices&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Despite how polished the interface looks, the entire system runs on a Raspberry Pi 3 Model B. Not a Pi 4 or Pi 5, and not even the B+ variant.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;This all runs on a Raspberry Pi three,&amp;rdquo; Clem notes. &amp;ldquo;It doesn&amp;rsquo;t really need much horsepower.&amp;rdquo; Compilation times are naturally slower than on a desktop machine, but that trade‑off is acceptable for the intended use case. In practice, pre‑compiled HEX files can be flashed directly, avoiding the need to compile on the device at all.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The Raspberry Pi runs Raspberry Pi OS, with an X server installed purely to support the touchscreen. The underlying interface remains a terminal application throughout.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-04-35/0218.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po4"&gt;&lt;span&gt;Arduino CLI at the core&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The key software component behind the scenes is Arduino CLI. This command‑line version of the Arduino IDE provides the same core functionality &amp;mdash; compiling sketches, selecting boards and flashing devices &amp;mdash; without any graphical layer.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Because Arduino CLI runs entirely in the terminal, it can be controlled directly from Python. Clem uses a Python wrapper to call compile and upload commands programmatically, making it possible to integrate flashing directly into the test rig interface.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;In the project&amp;rsquo;s &lt;/span&gt;&lt;code&gt;&lt;span&gt;rig.py&lt;/span&gt;&lt;/code&gt;&lt;span&gt; file, the flashing logic is explicit and readable. For example, firmware selection determines whether a sketch is compiled or a pre‑built binary is uploaded:&lt;/span&gt;&lt;/p&gt;
&lt;div data-is-code-block-view="true"&gt;
&lt;div class="cm-announced"&gt;&lt;pre class="ui-code" data-mode="python"&gt;if Firmware.endswith(&amp;#39;.ino&amp;#39;):
arduino.compile(fqbn=fqbn, sketch=Firmware)
arduino.upload(fqbn=fqbn, sketch=Firmware, port=port)
elif Firmware.endswith(&amp;#39;.hex&amp;#39;) or Firmware.endswith(&amp;#39;.bin&amp;#39;):
arduino.upload(fqbn=fqbn, input_file=Firmware, port=port)&lt;/pre&gt;&lt;/div&gt;
&lt;div class="cm-scroller"&gt;
&lt;div class="cm-layer cm-selectionLayer"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;This approach keeps the system flexible while relying on well‑understood tools.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-04-35/8713.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po5"&gt;&lt;span&gt;Hardware designed for adaptability&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The electronics are split into three main parts: the Raspberry Pi, a main routing board, and a project‑specific interface board.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The routing board sits between the Pi and the device under test (DUT). It uses analogue multiplexers and shift registers to dynamically route signals to different pins, allowing UART, I&amp;sup2;C and GPIO lines to be reassigned as needed. Clem explains that this gives him the ability to test communication interfaces properly, rather than just toggling pins blindly.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The final stage is a bespoke interface board designed specifically for each product. This board includes the programming circuitry, pogo‑pin contacts for quick connection, and buffered outputs driving indicator LEDs. These LEDs provide immediate visual feedback during testing, showing pin states and device behaviour in real time.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For Clem, this modular approach is essential. Each new product only requires a new interface board, while the main system stays the same.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-04-35/6560.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po6"&gt;&lt;span&gt;From laser‑cut wood to 3D‑printed plastic&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Mechanically, the enclosure went through at least one rethink. The original plan was a laser‑cut plywood case, but warped sheets and glue‑ups proved time‑consuming. Transport was also a concern, particularly with Electronica looming.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The final version is a 3D‑printed PLA enclosure, complete with rear‑mounted cooling fan and angled legs that tilt the unit towards the user. The tilt makes the touchscreen easier to use on a bench, and also leaves room for cabling and power at the rear.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Power comes from a Mean Well supply, delivering enough current at 12 V to run the screen and the Raspberry Pi comfortably.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-04-35/2867.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po7"&gt;&lt;span&gt;Testing, flashing, and feedback&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Once a device is clamped into place on the pogo pins, the workflow is straightforward. The user selects the test script, chooses the toolchain and port, and runs the procedure.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Test scripts are written in Python and executed directly by the rig. During a test run, signals are routed automatically, responses are checked, and the system reports a pass or fail using on‑screen notifications.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;It got very complicated very quickly,&amp;rdquo; Clem admits, but that complexity is hidden behind the interface. From the operator&amp;rsquo;s perspective, it feels like using a small industrial tester.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po8"&gt;&lt;span&gt;Open source by design&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;All files for the project, code, PCB designs and build details, have been made available below in the &amp;#39;Supporting Files and Links&amp;#39; section. Clem is clear that the project as open source is intentional. The system is meant to be adapted, extended and improved by others.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;This is more focused on the maker crowd,&amp;rdquo; he says, particularly those producing small runs or still refining their designs. The combination of open‑source software, readily available hardware and clear design intent makes the project easy to re-purpose.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img loading="lazy" alt="image" style="max-height:360px;max-width:640px;"  src="/resized-image/__size/1280x720/__key/communityserver-wikis-components-files/00-00-00-04-35/3438.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po9"&gt;&lt;span&gt;A homemade system that earns its place&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Clem&amp;rsquo;s rig holds its own. It delivers many of the same core functions, flashing, automated testing, repeatability, but in a form that should prove itself accessible to individual engineers and small teams, but you can let us know if that&amp;#39;s the case.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As Clem sums it up, it is &amp;ldquo;basically a professional testing and flashing solution for your own products&amp;hellip; completely homemade based on the Raspberry Pi and the Arduino command line&amp;rdquo;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For makers looking to bridge the gap between prototype and production, it is a practical reminder that industrial‑style solutions do not have to be industrial‑scale.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcopvuv60"&gt;Supporting Files and Links&lt;/h2&gt;
&lt;p&gt;- &lt;a title="Textual Python Framework to make TUIs" href="https://textualize.io" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;Textual Python Framework to make TUIs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- &lt;a title="Arduino-cli" href="https://github.com/arduino/arduino-cli" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;Arduino-cli&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- &lt;a title="Pyduinocli python wrapper for the arduino-cli" href="https://github.com/Renaud11232/pyduinocli" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;Pyduinocli python wrapper for the arduino-cli&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- &lt;a title="Electronica 2024" href="https://exhibitors.electronica.de/ausstellerportal/2024/aussteller/ausstellerdetails/farnell-gmbh/?elb=807.1100.1598.2.111" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;Electronica 2024&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;-&amp;nbsp;&amp;nbsp;&lt;a href="https://community.element14.com/challenges-projects/element14-presents/m/files/150860"&gt;Episode 695 Supporting Files&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcofummkb"&gt;Bill of Materials&lt;/h2&gt;
&lt;table class="e14-product-bom-main"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Product Name&lt;/th&gt;
&lt;th&gt;Manufacturer&lt;/th&gt;
&lt;th&gt;Quantity&lt;/th&gt;
&lt;th&gt;&lt;a id="e14-product-link-7a7f9" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2212779,2525225,2445200~6,1201327~6,3263444,3441816~6,3002939,2845500,1378201&amp;nsku=45W6205,77Y6519,85X2967~6,11N8540~6,40AH2496,74AH2441~6,01AH7138,MC002553,54M1434&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_BUY_KIT" class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('7a7f9'));" data-farnell="2212779,2525225,2445200~6,1201327~6,3263444,3441816~6,3002939,2845500,1378201" data-newark="45W6205,77Y6519,85X2967~6,11N8540~6,40AH2496,74AH2441~6,01AH7138,MC002553,54M1434" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Kit&lt;/a&gt; &lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arduino mega&lt;/td&gt;
&lt;td&gt;ARDUINO&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-f13ed" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2212779&amp;nsku=45W6205&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('f13ed'));" data-farnell="2212779" data-newark="45W6205" data-comoverride="" data-cmpoverride="" data-cpc="SC13721" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RASPBERRYPI3-MODB-1GB&lt;/td&gt;
&lt;td&gt;Raspberry pi&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-e0665" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2525225&amp;nsku=77Y6519&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('e0665'));" data-farnell="2525225" data-newark="77Y6519" data-comoverride="" data-cmpoverride="" data-cpc="SC14012" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC595PW-Q100,118&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-1e32b" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2445200~6&amp;nsku=85X2967~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('1e32b'));" data-farnell="2445200~6" data-newark="85X2967~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC4051D,653&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-cbc76" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=1201327~6&amp;nsku=11N8540~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('cbc76'));" data-farnell="1201327~6" data-newark="11N8540~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TOUCHSCREEN 10.1&lt;/td&gt;
&lt;td&gt;Multicomp pro&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-db76f" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3263444&amp;nsku=40AH2496&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('db76f'));" data-farnell="3263444" data-newark="40AH2496" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC241D,653&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-57183" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3441816~6&amp;nsku=74AH2441~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('57183'));" data-farnell="3441816~6" data-newark="74AH2441~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSM60E12-P1J&lt;/td&gt;
&lt;td&gt;MEAN WELL&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-f5173" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3002939&amp;nsku=01AH7138&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('f5173'));" data-farnell="3002939" data-newark="01AH7138" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3D Printer Filament, PLA, Blue, 205 &amp;deg;C to 225 &amp;deg;C, 1.75 mm Diameter, 1 kg&lt;/td&gt;
&lt;td&gt;Multicomp pro&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-7742e" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2845500&amp;nsku=MC002553&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('7742e'));" data-farnell="2845500" data-newark="MC002553" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toggle Clamp, Vertical, 70 N Holding Force, 35 mm x 56.3 mm&lt;/td&gt;
&lt;td&gt;Brauer&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-eab6a" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=1378201&amp;nsku=54M1434&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('eab6a'));" data-farnell="1378201" data-newark="54M1434" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="xs-hide"&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: maker manufacturing tools, Raspberry Pi touchscreen project, automated hardware testing, Python electronics testing, electronica 2024, PCB programming and testing, arudino cli workflow, Raspberry Pi test rig, custom electronics test setup, programming jig for pcbs, small batch electronics production, open source test equipment, electronica, electronics test fixture, DIY production testing, hardware test automation, friday_release, Arduino programming rig&lt;/div&gt;
</description></item><item><title>A DIY Test and Programming Rig Built for Small-Batch Electronics Production -- Episode 695</title><link>https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/72007/a-diy-test-and-programming-rig-built-for-small-batch-electronics-production----episode-695/revision/4</link><pubDate>Thu, 18 Dec 2025 13:24:56 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:d3055533-cdb8-4e2a-8de9-5fe4ce9a0e72</guid><dc:creator>cstanton</dc:creator><comments>https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/72007/a-diy-test-and-programming-rig-built-for-small-batch-electronics-production----episode-695#comments</comments><description>Revision 4 posted to Documents by cstanton on 12/18/2025 1:24:56 PM&lt;br /&gt;
&lt;p&gt;Clem Mayer (Mayer Makes) walks through a fully homemade programming and test rig designed for small-batch electronics production. Built around a Raspberry Pi and the Arduino command line tools, the system combines a touchscreen interface, custom hardware and Python-based automation to flash and test boards quickly and repeatably. In the video, Clem explains the design decisions, shows how the software and routing hardware work together, and demonstrates how makers can build production-style test setups without industrial budgets.&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoj25is0"&gt;Watch the Episode&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://youtu.be/CyCpV5uCS1U"&gt;https://youtu.be/CyCpV5uCS1U&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po0"&gt;&lt;span&gt;A homemade answer to a real manufacturing problem&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;At Electronica 2024, tucked in among the polished industrial systems on show, was a project that stood out for different reasons. Built by Clem Mayer, also known as Mayer Makes, this small‑batch programming and testing rig is a fully homemade alternative to the sort of bespoke fixtures normally reserved for larger manufacturers. It was designed specifically for makers and engineers who need to flash and test their own boards without investing in expensive, specialist equipment.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As Clem explains early on, the motivation was simple: he has designed &amp;ldquo;a lot of projects that I may want to produce in bigger numbers&amp;rdquo;, but the usual production test solutions are &amp;ldquo;bespoke made by experts&amp;rdquo;. His conclusion was equally straightforward: &amp;ldquo;I could make that myself.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po1"&gt;&lt;span&gt;Defining the goal: one box, many products&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The aim was to create a standalone system that could handle both programming and testing for multiple designs. The workflow is intentionally direct: plug in a board, select the relevant firmware and test procedure from a menu, and let the system do the rest.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Clem describes the requirement in the video as a single device that handles the user interface, programming and testing, while also interfacing with custom hardware designed for each product. That decision shaped everything that followed, from the software stack through to the mechanical design.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po2"&gt;&lt;span&gt;A text interface that behaves like a GUI&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Rather than building a traditional desktop GUI, Clem opted for a text‑based user interface built using the Python &lt;/span&gt;&lt;em&gt;&lt;span&gt;Textual&lt;/span&gt;&lt;/em&gt;&lt;span&gt; framework. It runs entirely in the terminal, but is designed to be used on a touchscreen.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;I&amp;rsquo;m very bad at programming graphical user interfaces,&amp;rdquo; Clem admits, &amp;ldquo;so I made a 2D text user interface&amp;hellip; it&amp;rsquo;s still a touch screen interface, but it&amp;rsquo;s made in Textual.&amp;rdquo; The result looks and behaves like a lightweight GUI, complete with menus, notifications and status messages, without the overhead of a full graphical environment.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The interface allows the user to:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Select firmware files and test scripts&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Choose the appropriate toolchain&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Pick the serial port&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Flash devices or run test routines&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;Pop‑up notifications confirm actions as they happen, and a running log gives immediate feedback during flashing and testing.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po3"&gt;&lt;span&gt;Modest hardware, deliberate choices&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Despite how polished the interface looks, the entire system runs on a Raspberry Pi 3 Model B. Not a Pi 4 or Pi 5, and not even the B+ variant.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;This all runs on a Raspberry Pi three,&amp;rdquo; Clem notes. &amp;ldquo;It doesn&amp;rsquo;t really need much horsepower.&amp;rdquo; Compilation times are naturally slower than on a desktop machine, but that trade‑off is acceptable for the intended use case. In practice, pre‑compiled HEX files can be flashed directly, avoiding the need to compile on the device at all.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The Raspberry Pi runs Raspberry Pi OS, with an X server installed purely to support the touchscreen. The underlying interface remains a terminal application throughout.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po4"&gt;&lt;span&gt;Arduino CLI at the core&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The key software component behind the scenes is Arduino CLI. This command‑line version of the Arduino IDE provides the same core functionality &amp;mdash; compiling sketches, selecting boards and flashing devices &amp;mdash; without any graphical layer.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Because Arduino CLI runs entirely in the terminal, it can be controlled directly from Python. Clem uses a Python wrapper to call compile and upload commands programmatically, making it possible to integrate flashing directly into the test rig interface.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;In the project&amp;rsquo;s &lt;/span&gt;&lt;code&gt;&lt;span&gt;rig.py&lt;/span&gt;&lt;/code&gt;&lt;span&gt; file, the flashing logic is explicit and readable. For example, firmware selection determines whether a sketch is compiled or a pre‑built binary is uploaded:&lt;/span&gt;&lt;/p&gt;
&lt;div data-is-code-block-view="true"&gt;
&lt;div class="cm-announced"&gt;&lt;pre class="ui-code" data-mode="python"&gt;if Firmware.endswith(&amp;#39;.ino&amp;#39;):
arduino.compile(fqbn=fqbn, sketch=Firmware)
arduino.upload(fqbn=fqbn, sketch=Firmware, port=port)
elif Firmware.endswith(&amp;#39;.hex&amp;#39;) or Firmware.endswith(&amp;#39;.bin&amp;#39;):
arduino.upload(fqbn=fqbn, input_file=Firmware, port=port)&lt;/pre&gt;&lt;/div&gt;
&lt;div class="cm-scroller"&gt;
&lt;div class="cm-layer cm-selectionLayer"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;This approach keeps the system flexible while relying on well‑understood tools.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po5"&gt;&lt;span&gt;Hardware designed for adaptability&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The electronics are split into three main parts: the Raspberry Pi, a main routing board, and a project‑specific interface board.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The routing board sits between the Pi and the device under test (DUT). It uses analogue multiplexers and shift registers to dynamically route signals to different pins, allowing UART, I&amp;sup2;C and GPIO lines to be reassigned as needed. Clem explains that this gives him the ability to test communication interfaces properly, rather than just toggling pins blindly.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The final stage is a bespoke interface board designed specifically for each product. This board includes the programming circuitry, pogo‑pin contacts for quick connection, and buffered outputs driving indicator LEDs. These LEDs provide immediate visual feedback during testing, showing pin states and device behaviour in real time.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For Clem, this modular approach is essential. Each new product only requires a new interface board, while the main system stays the same.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po6"&gt;&lt;span&gt;From laser‑cut wood to 3D‑printed plastic&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Mechanically, the enclosure went through at least one rethink. The original plan was a laser‑cut plywood case, but warped sheets and glue‑ups proved time‑consuming. Transport was also a concern, particularly with Electronica looming.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The final version is a 3D‑printed PLA enclosure, complete with rear‑mounted cooling fan and angled legs that tilt the unit towards the user. The tilt makes the touchscreen easier to use on a bench, and also leaves room for cabling and power at the rear.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Power comes from a Mean Well supply, delivering enough current at 12 V to run the screen and the Raspberry Pi comfortably.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po7"&gt;&lt;span&gt;Testing, flashing, and feedback&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Once a device is clamped into place on the pogo pins, the workflow is straightforward. The user selects the test script, chooses the toolchain and port, and runs the procedure.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Test scripts are written in Python and executed directly by the rig. During a test run, signals are routed automatically, responses are checked, and the system reports a pass or fail using on‑screen notifications.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;It got very complicated very quickly,&amp;rdquo; Clem admits, but that complexity is hidden behind the interface. From the operator&amp;rsquo;s perspective, it feels like using a small industrial tester.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po8"&gt;&lt;span&gt;Open source by design&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;All files for the project &amp;mdash; code, PCB designs and build details &amp;mdash; have been made available through the element14 Community. Clem is clear that this is intentional. The system is meant to be adapted, extended and improved by others.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;This is more focused on the maker crowd,&amp;rdquo; he says, particularly those producing small runs or still refining their designs. The combination of open‑source software, readily available hardware and clear design intent makes the project easy to repurpose.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po9"&gt;&lt;span&gt;A homemade system that earns its place&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Seen on the Electronica show floor, surrounded by professional test equipment, Clem&amp;rsquo;s rig holds its own. It delivers many of the same core functions &amp;mdash; flashing, automated testing, repeatability &amp;mdash; but in a form that is accessible to individual engineers and small teams.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As Clem sums it up at the booth, it is &amp;ldquo;basically a professional testing and flashing solution for your own products&amp;hellip; completely homemade based on the Raspberry Pi and the Arduino command line&amp;rdquo;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For makers looking to bridge the gap between prototype and production, it is a practical reminder that industrial‑style solutions do not have to be industrial‑scale.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcopvuv60"&gt;Supporting Files and Links&lt;/h2&gt;
&lt;p&gt;- &lt;a title="Textual Python Framework to make TUIs" href="https://textualize.io" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;Textual Python Framework to make TUIs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- &lt;a title="Arduino-cli" href="https://github.com/arduino/arduino-cli" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;Arduino-cli&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- &lt;a title="Pyduinocli python wrapper for the arduino-cli" href="https://github.com/Renaud11232/pyduinocli" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;Pyduinocli python wrapper for the arduino-cli&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- &lt;a title="Electronica 2024" href="https://exhibitors.electronica.de/ausstellerportal/2024/aussteller/ausstellerdetails/farnell-gmbh/?elb=807.1100.1598.2.111" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;Electronica 2024&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;-&amp;nbsp;&amp;nbsp;&lt;a href="https://community.element14.com/challenges-projects/element14-presents/m/files/150860"&gt;Episode 695 Supporting Files&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcofummkb"&gt;Bill of Materials&lt;/h2&gt;
&lt;table class="e14-product-bom-main"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Product Name&lt;/th&gt;
&lt;th&gt;Manufacturer&lt;/th&gt;
&lt;th&gt;Quantity&lt;/th&gt;
&lt;th&gt;&lt;a id="e14-product-link-ac8ab" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2212779,2525225,2445200~6,1201327~6,3263444,3441816~6,3002939,2845500,1378201&amp;nsku=45W6205,77Y6519,85X2967~6,11N8540~6,40AH2496,74AH2441~6,01AH7138,MC002553,54M1434&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_BUY_KIT" class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('ac8ab'));" data-farnell="2212779,2525225,2445200~6,1201327~6,3263444,3441816~6,3002939,2845500,1378201" data-newark="45W6205,77Y6519,85X2967~6,11N8540~6,40AH2496,74AH2441~6,01AH7138,MC002553,54M1434" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Kit&lt;/a&gt; &lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arduino mega&lt;/td&gt;
&lt;td&gt;ARDUINO&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-ae991" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2212779&amp;nsku=45W6205&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('ae991'));" data-farnell="2212779" data-newark="45W6205" data-comoverride="" data-cmpoverride="" data-cpc="SC13721" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RASPBERRYPI3-MODB-1GB&lt;/td&gt;
&lt;td&gt;Raspberry pi&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-32281" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2525225&amp;nsku=77Y6519&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('32281'));" data-farnell="2525225" data-newark="77Y6519" data-comoverride="" data-cmpoverride="" data-cpc="SC14012" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC595PW-Q100,118&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-dfd72" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2445200~6&amp;nsku=85X2967~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('dfd72'));" data-farnell="2445200~6" data-newark="85X2967~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC4051D,653&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-4eb50" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=1201327~6&amp;nsku=11N8540~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('4eb50'));" data-farnell="1201327~6" data-newark="11N8540~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TOUCHSCREEN 10.1&lt;/td&gt;
&lt;td&gt;Multicomp pro&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-1f121" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3263444&amp;nsku=40AH2496&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('1f121'));" data-farnell="3263444" data-newark="40AH2496" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC241D,653&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-005ae" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3441816~6&amp;nsku=74AH2441~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('005ae'));" data-farnell="3441816~6" data-newark="74AH2441~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSM60E12-P1J&lt;/td&gt;
&lt;td&gt;MEAN WELL&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-46d36" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3002939&amp;nsku=01AH7138&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('46d36'));" data-farnell="3002939" data-newark="01AH7138" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3D Printer Filament, PLA, Blue, 205 &amp;deg;C to 225 &amp;deg;C, 1.75 mm Diameter, 1 kg&lt;/td&gt;
&lt;td&gt;Multicomp pro&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-9f1ef" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2845500&amp;nsku=MC002553&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('9f1ef'));" data-farnell="2845500" data-newark="MC002553" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toggle Clamp, Vertical, 70 N Holding Force, 35 mm x 56.3 mm&lt;/td&gt;
&lt;td&gt;Brauer&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-1f254" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=1378201&amp;nsku=54M1434&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('1f254'));" data-farnell="1378201" data-newark="54M1434" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="xs-hide"&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: maker manufacturing tools, Raspberry Pi touchscreen project, automated hardware testing, Python electronics testing, electronica 2024, PCB programming and testing, arudino cli workflow, Raspberry Pi test rig, custom electronics test setup, programming jig for pcbs, small batch electronics production, open source test equipment, electronica, electronics test fixture, DIY production testing, hardware test automation, friday_release, Arduino programming rig&lt;/div&gt;
</description></item><item><title>A DIY Test and Programming Rig Built for Small-Batch Electronics Production -- Episode 695</title><link>https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/72007/a-diy-test-and-programming-rig-built-for-small-batch-electronics-production----episode-695/revision/3</link><pubDate>Thu, 18 Dec 2025 11:21:11 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:d3055533-cdb8-4e2a-8de9-5fe4ce9a0e72</guid><dc:creator>cstanton</dc:creator><comments>https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/72007/a-diy-test-and-programming-rig-built-for-small-batch-electronics-production----episode-695#comments</comments><description>Revision 3 posted to Documents by cstanton on 12/18/2025 11:21:11 AM&lt;br /&gt;
&lt;p&gt;Clem Mayer (Mayer Makes) walks through a fully homemade programming and test rig designed for small-batch electronics production. Built around a Raspberry Pi and the Arduino command line tools, the system combines a touchscreen interface, custom hardware and Python-based automation to flash and test boards quickly and repeatably. In the video, Clem explains the design decisions, shows how the software and routing hardware work together, and demonstrates how makers can build production-style test setups without industrial budgets.&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoj25is0"&gt;Watch the Episode&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://youtu.be/CyCpV5uCS1U"&gt;https://youtu.be/CyCpV5uCS1U&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po0"&gt;&lt;span&gt;A homemade answer to a real manufacturing problem&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;At Electronica 2024, tucked in among the polished industrial systems on show, was a project that stood out for different reasons. Built by Clem Mayer, also known as Mayer Makes, this small‑batch programming and testing rig is a fully homemade alternative to the sort of bespoke fixtures normally reserved for larger manufacturers. It was designed specifically for makers and engineers who need to flash and test their own boards without investing in expensive, specialist equipment.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As Clem explains early on, the motivation was simple: he has designed &amp;ldquo;a lot of projects that I may want to produce in bigger numbers&amp;rdquo;, but the usual production test solutions are &amp;ldquo;bespoke made by experts&amp;rdquo;. His conclusion was equally straightforward: &amp;ldquo;I could make that myself.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po1"&gt;&lt;span&gt;Defining the goal: one box, many products&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The aim was to create a standalone system that could handle both programming and testing for multiple designs. The workflow is intentionally direct: plug in a board, select the relevant firmware and test procedure from a menu, and let the system do the rest.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Clem describes the requirement in the video as a single device that handles the user interface, programming and testing, while also interfacing with custom hardware designed for each product. That decision shaped everything that followed, from the software stack through to the mechanical design.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po2"&gt;&lt;span&gt;A text interface that behaves like a GUI&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Rather than building a traditional desktop GUI, Clem opted for a text‑based user interface built using the Python &lt;/span&gt;&lt;em&gt;&lt;span&gt;Textual&lt;/span&gt;&lt;/em&gt;&lt;span&gt; framework. It runs entirely in the terminal, but is designed to be used on a touchscreen.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;I&amp;rsquo;m very bad at programming graphical user interfaces,&amp;rdquo; Clem admits, &amp;ldquo;so I made a 2D text user interface&amp;hellip; it&amp;rsquo;s still a touch screen interface, but it&amp;rsquo;s made in Textual.&amp;rdquo; The result looks and behaves like a lightweight GUI, complete with menus, notifications and status messages, without the overhead of a full graphical environment.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The interface allows the user to:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Select firmware files and test scripts&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Choose the appropriate toolchain&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Pick the serial port&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Flash devices or run test routines&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;Pop‑up notifications confirm actions as they happen, and a running log gives immediate feedback during flashing and testing.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po3"&gt;&lt;span&gt;Modest hardware, deliberate choices&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Despite how polished the interface looks, the entire system runs on a Raspberry Pi 3 Model B. Not a Pi 4 or Pi 5, and not even the B+ variant.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;This all runs on a Raspberry Pi three,&amp;rdquo; Clem notes. &amp;ldquo;It doesn&amp;rsquo;t really need much horsepower.&amp;rdquo; Compilation times are naturally slower than on a desktop machine, but that trade‑off is acceptable for the intended use case. In practice, pre‑compiled HEX files can be flashed directly, avoiding the need to compile on the device at all.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The Raspberry Pi runs Raspberry Pi OS, with an X server installed purely to support the touchscreen. The underlying interface remains a terminal application throughout.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po4"&gt;&lt;span&gt;Arduino CLI at the core&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The key software component behind the scenes is Arduino CLI. This command‑line version of the Arduino IDE provides the same core functionality &amp;mdash; compiling sketches, selecting boards and flashing devices &amp;mdash; without any graphical layer.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Because Arduino CLI runs entirely in the terminal, it can be controlled directly from Python. Clem uses a Python wrapper to call compile and upload commands programmatically, making it possible to integrate flashing directly into the test rig interface.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;In the project&amp;rsquo;s &lt;/span&gt;&lt;code&gt;&lt;span&gt;rig.py&lt;/span&gt;&lt;/code&gt;&lt;span&gt; file, the flashing logic is explicit and readable. For example, firmware selection determines whether a sketch is compiled or a pre‑built binary is uploaded:&lt;/span&gt;&lt;/p&gt;
&lt;div data-is-code-block-view="true"&gt;
&lt;div class="cm-announced"&gt;&lt;/div&gt;
&lt;div class="cm-scroller"&gt;
&lt;div class="cm-content" data-language="python"&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;if&lt;/span&gt; &lt;span&gt;Firmware&lt;/span&gt;.&lt;span&gt;endswith&lt;/span&gt;(&lt;span&gt;&amp;#39;.ino&amp;#39;&lt;/span&gt;):&lt;/div&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;arduino&lt;/span&gt;.&lt;span&gt;compile&lt;/span&gt;(&lt;span&gt;fqbn&lt;/span&gt;=&lt;span&gt;fqbn&lt;/span&gt;, &lt;span&gt;sketch&lt;/span&gt;=&lt;span&gt;Firmware&lt;/span&gt;)&lt;/div&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;arduino&lt;/span&gt;.&lt;span&gt;upload&lt;/span&gt;(&lt;span&gt;fqbn&lt;/span&gt;=&lt;span&gt;fqbn&lt;/span&gt;, &lt;span&gt;sketch&lt;/span&gt;=&lt;span&gt;Firmware&lt;/span&gt;, &lt;span&gt;port&lt;/span&gt;=&lt;span&gt;port&lt;/span&gt;)&lt;/div&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;elif&lt;/span&gt; &lt;span&gt;Firmware&lt;/span&gt;.&lt;span&gt;endswith&lt;/span&gt;(&lt;span&gt;&amp;#39;.hex&amp;#39;&lt;/span&gt;) &lt;span&gt;or&lt;/span&gt; &lt;span&gt;Firmware&lt;/span&gt;.&lt;span&gt;endswith&lt;/span&gt;(&lt;span&gt;&amp;#39;.bin&amp;#39;&lt;/span&gt;):&lt;/div&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;arduino&lt;/span&gt;.&lt;span&gt;upload&lt;/span&gt;(&lt;span&gt;fqbn&lt;/span&gt;=&lt;span&gt;fqbn&lt;/span&gt;, &lt;span&gt;input_file&lt;/span&gt;=&lt;span&gt;Firmware&lt;/span&gt;, &lt;span&gt;port&lt;/span&gt;=&lt;span&gt;port&lt;/span&gt;)&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cm-layer cm-layer-above cm-cursorLayer"&gt;
&lt;div class="cm-cursor cm-cursor-primary"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cm-layer cm-selectionLayer"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;This approach keeps the system flexible while relying on well‑understood tools.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po5"&gt;&lt;span&gt;Hardware designed for adaptability&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The electronics are split into three main parts: the Raspberry Pi, a main routing board, and a project‑specific interface board.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The routing board sits between the Pi and the device under test (DUT). It uses analogue multiplexers and shift registers to dynamically route signals to different pins, allowing UART, I&amp;sup2;C and GPIO lines to be reassigned as needed. Clem explains that this gives him the ability to test communication interfaces properly, rather than just toggling pins blindly.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The final stage is a bespoke interface board designed specifically for each product. This board includes the programming circuitry, pogo‑pin contacts for quick connection, and buffered outputs driving indicator LEDs. These LEDs provide immediate visual feedback during testing, showing pin states and device behaviour in real time.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For Clem, this modular approach is essential. Each new product only requires a new interface board, while the main system stays the same.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po6"&gt;&lt;span&gt;From laser‑cut wood to 3D‑printed plastic&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Mechanically, the enclosure went through at least one rethink. The original plan was a laser‑cut plywood case, but warped sheets and glue‑ups proved time‑consuming. Transport was also a concern, particularly with Electronica looming.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The final version is a 3D‑printed PLA enclosure, complete with rear‑mounted cooling fan and angled legs that tilt the unit towards the user. The tilt makes the touchscreen easier to use on a bench, and also leaves room for cabling and power at the rear.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Power comes from a Mean Well supply, delivering enough current at 12 V to run the screen and the Raspberry Pi comfortably.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po7"&gt;&lt;span&gt;Testing, flashing, and feedback&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Once a device is clamped into place on the pogo pins, the workflow is straightforward. The user selects the test script, chooses the toolchain and port, and runs the procedure.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Test scripts are written in Python and executed directly by the rig. During a test run, signals are routed automatically, responses are checked, and the system reports a pass or fail using on‑screen notifications.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;It got very complicated very quickly,&amp;rdquo; Clem admits, but that complexity is hidden behind the interface. From the operator&amp;rsquo;s perspective, it feels like using a small industrial tester.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po8"&gt;&lt;span&gt;Open source by design&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;All files for the project &amp;mdash; code, PCB designs and build details &amp;mdash; have been made available through the element14 Community. Clem is clear that this is intentional. The system is meant to be adapted, extended and improved by others.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;This is more focused on the maker crowd,&amp;rdquo; he says, particularly those producing small runs or still refining their designs. The combination of open‑source software, readily available hardware and clear design intent makes the project easy to repurpose.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po9"&gt;&lt;span&gt;A homemade system that earns its place&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Seen on the Electronica show floor, surrounded by professional test equipment, Clem&amp;rsquo;s rig holds its own. It delivers many of the same core functions &amp;mdash; flashing, automated testing, repeatability &amp;mdash; but in a form that is accessible to individual engineers and small teams.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As Clem sums it up at the booth, it is &amp;ldquo;basically a professional testing and flashing solution for your own products&amp;hellip; completely homemade based on the Raspberry Pi and the Arduino command line&amp;rdquo;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For makers looking to bridge the gap between prototype and production, it is a practical reminder that industrial‑style solutions do not have to be industrial‑scale.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3 id="mcetoc_1jcofummkb"&gt;Bill of Materials&lt;/h3&gt;
&lt;p&gt;&lt;/p&gt;
&lt;table class="e14-product-bom-main"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Product Name&lt;/th&gt;
&lt;th&gt;Manufacturer&lt;/th&gt;
&lt;th&gt;Quantity&lt;/th&gt;
&lt;th&gt;&lt;a id="e14-product-link-eef25" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2212779,2525225,2445200~6,1201327~6,3263444,3441816~6,3002939,2845500,1378201&amp;nsku=45W6205,77Y6519,85X2967~6,11N8540~6,40AH2496,74AH2441~6,01AH7138,MC002553,54M1434&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_BUY_KIT" class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('eef25'));" data-farnell="2212779,2525225,2445200~6,1201327~6,3263444,3441816~6,3002939,2845500,1378201" data-newark="45W6205,77Y6519,85X2967~6,11N8540~6,40AH2496,74AH2441~6,01AH7138,MC002553,54M1434" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Kit&lt;/a&gt; &lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arduino mega&lt;/td&gt;
&lt;td&gt;ARDUINO&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-51ba7" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2212779&amp;nsku=45W6205&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('51ba7'));" data-farnell="2212779" data-newark="45W6205" data-comoverride="" data-cmpoverride="" data-cpc="SC13721" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RASPBERRYPI3-MODB-1GB&lt;/td&gt;
&lt;td&gt;Raspberry pi&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-07d83" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2525225&amp;nsku=77Y6519&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('07d83'));" data-farnell="2525225" data-newark="77Y6519" data-comoverride="" data-cmpoverride="" data-cpc="SC14012" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC595PW-Q100,118&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-2e5ca" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2445200~6&amp;nsku=85X2967~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('2e5ca'));" data-farnell="2445200~6" data-newark="85X2967~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC4051D,653&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-42df7" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=1201327~6&amp;nsku=11N8540~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('42df7'));" data-farnell="1201327~6" data-newark="11N8540~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TOUCHSCREEN 10.1&lt;/td&gt;
&lt;td&gt;Multicomp pro&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-8f3de" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3263444&amp;nsku=40AH2496&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('8f3de'));" data-farnell="3263444" data-newark="40AH2496" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC241D,653&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-fa663" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3441816~6&amp;nsku=74AH2441~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('fa663'));" data-farnell="3441816~6" data-newark="74AH2441~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSM60E12-P1J&lt;/td&gt;
&lt;td&gt;MEAN WELL&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-93e5a" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3002939&amp;nsku=01AH7138&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('93e5a'));" data-farnell="3002939" data-newark="01AH7138" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3D Printer Filament, PLA, Blue, 205 &amp;deg;C to 225 &amp;deg;C, 1.75 mm Diameter, 1 kg&lt;/td&gt;
&lt;td&gt;Multicomp pro&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-90f67" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2845500&amp;nsku=MC002553&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('90f67'));" data-farnell="2845500" data-newark="MC002553" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toggle Clamp, Vertical, 70 N Holding Force, 35 mm x 56.3 mm&lt;/td&gt;
&lt;td&gt;Brauer&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-019cd" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=1378201&amp;nsku=54M1434&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('019cd'));" data-farnell="1378201" data-newark="54M1434" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="xs-hide"&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>A DIY Test and Programming Rig Built for Small-Batch Electronics Production -- Episode 695</title><link>https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/72007/a-diy-test-and-programming-rig-built-for-small-batch-electronics-production----episode-695/revision/2</link><pubDate>Thu, 18 Dec 2025 10:26:47 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:d3055533-cdb8-4e2a-8de9-5fe4ce9a0e72</guid><dc:creator>cstanton</dc:creator><comments>https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/72007/a-diy-test-and-programming-rig-built-for-small-batch-electronics-production----episode-695#comments</comments><description>Revision 2 posted to Documents by cstanton on 12/18/2025 10:26:47 AM&lt;br /&gt;
&lt;p&gt;Clem Mayer (Mayer Makes) walks through a fully homemade programming and test rig designed for small-batch electronics production. Built around a Raspberry Pi and the Arduino command line tools, the system combines a touchscreen interface, custom hardware and Python-based automation to flash and test boards quickly and repeatably. In the video, Clem explains the design decisions, shows how the software and routing hardware work together, and demonstrates how makers can build production-style test setups without industrial budgets.&lt;/p&gt;
&lt;p&gt;Watch the Episode&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po0"&gt;&lt;span&gt;A homemade answer to a real manufacturing problem&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;At Electronica 2024, tucked in among the polished industrial systems on show, was a project that stood out for different reasons. Built by Clem Mayer, also known as Mayer Makes, this small‑batch programming and testing rig is a fully homemade alternative to the sort of bespoke fixtures normally reserved for larger manufacturers. It was designed specifically for makers and engineers who need to flash and test their own boards without investing in expensive, specialist equipment.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As Clem explains early on, the motivation was simple: he has designed &amp;ldquo;a lot of projects that I may want to produce in bigger numbers&amp;rdquo;, but the usual production test solutions are &amp;ldquo;bespoke made by experts&amp;rdquo;. His conclusion was equally straightforward: &amp;ldquo;I could make that myself.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po1"&gt;&lt;span&gt;Defining the goal: one box, many products&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The aim was to create a standalone system that could handle both programming and testing for multiple designs. The workflow is intentionally direct: plug in a board, select the relevant firmware and test procedure from a menu, and let the system do the rest.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Clem describes the requirement in the video as a single device that handles the user interface, programming and testing, while also interfacing with custom hardware designed for each product. That decision shaped everything that followed, from the software stack through to the mechanical design.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po2"&gt;&lt;span&gt;A text interface that behaves like a GUI&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Rather than building a traditional desktop GUI, Clem opted for a text‑based user interface built using the Python &lt;/span&gt;&lt;em&gt;&lt;span&gt;Textual&lt;/span&gt;&lt;/em&gt;&lt;span&gt; framework. It runs entirely in the terminal, but is designed to be used on a touchscreen.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;I&amp;rsquo;m very bad at programming graphical user interfaces,&amp;rdquo; Clem admits, &amp;ldquo;so I made a 2D text user interface&amp;hellip; it&amp;rsquo;s still a touch screen interface, but it&amp;rsquo;s made in Textual.&amp;rdquo; The result looks and behaves like a lightweight GUI, complete with menus, notifications and status messages, without the overhead of a full graphical environment.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The interface allows the user to:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Select firmware files and test scripts&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Choose the appropriate toolchain&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Pick the serial port&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Flash devices or run test routines&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;Pop‑up notifications confirm actions as they happen, and a running log gives immediate feedback during flashing and testing.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po3"&gt;&lt;span&gt;Modest hardware, deliberate choices&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Despite how polished the interface looks, the entire system runs on a Raspberry Pi 3 Model B. Not a Pi 4 or Pi 5, and not even the B+ variant.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;This all runs on a Raspberry Pi three,&amp;rdquo; Clem notes. &amp;ldquo;It doesn&amp;rsquo;t really need much horsepower.&amp;rdquo; Compilation times are naturally slower than on a desktop machine, but that trade‑off is acceptable for the intended use case. In practice, pre‑compiled HEX files can be flashed directly, avoiding the need to compile on the device at all.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The Raspberry Pi runs Raspberry Pi OS, with an X server installed purely to support the touchscreen. The underlying interface remains a terminal application throughout.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po4"&gt;&lt;span&gt;Arduino CLI at the core&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The key software component behind the scenes is Arduino CLI. This command‑line version of the Arduino IDE provides the same core functionality &amp;mdash; compiling sketches, selecting boards and flashing devices &amp;mdash; without any graphical layer.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Because Arduino CLI runs entirely in the terminal, it can be controlled directly from Python. Clem uses a Python wrapper to call compile and upload commands programmatically, making it possible to integrate flashing directly into the test rig interface.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;In the project&amp;rsquo;s &lt;/span&gt;&lt;code&gt;&lt;span&gt;rig.py&lt;/span&gt;&lt;/code&gt;&lt;span&gt; file, the flashing logic is explicit and readable. For example, firmware selection determines whether a sketch is compiled or a pre‑built binary is uploaded:&lt;/span&gt;&lt;/p&gt;
&lt;div data-is-code-block-view="true"&gt;
&lt;div class="cm-announced"&gt;&lt;/div&gt;
&lt;div class="cm-scroller"&gt;
&lt;div class="cm-content" data-language="python"&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;if&lt;/span&gt; &lt;span&gt;Firmware&lt;/span&gt;.&lt;span&gt;endswith&lt;/span&gt;(&lt;span&gt;&amp;#39;.ino&amp;#39;&lt;/span&gt;):&lt;/div&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;arduino&lt;/span&gt;.&lt;span&gt;compile&lt;/span&gt;(&lt;span&gt;fqbn&lt;/span&gt;=&lt;span&gt;fqbn&lt;/span&gt;, &lt;span&gt;sketch&lt;/span&gt;=&lt;span&gt;Firmware&lt;/span&gt;)&lt;/div&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;arduino&lt;/span&gt;.&lt;span&gt;upload&lt;/span&gt;(&lt;span&gt;fqbn&lt;/span&gt;=&lt;span&gt;fqbn&lt;/span&gt;, &lt;span&gt;sketch&lt;/span&gt;=&lt;span&gt;Firmware&lt;/span&gt;, &lt;span&gt;port&lt;/span&gt;=&lt;span&gt;port&lt;/span&gt;)&lt;/div&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;elif&lt;/span&gt; &lt;span&gt;Firmware&lt;/span&gt;.&lt;span&gt;endswith&lt;/span&gt;(&lt;span&gt;&amp;#39;.hex&amp;#39;&lt;/span&gt;) &lt;span&gt;or&lt;/span&gt; &lt;span&gt;Firmware&lt;/span&gt;.&lt;span&gt;endswith&lt;/span&gt;(&lt;span&gt;&amp;#39;.bin&amp;#39;&lt;/span&gt;):&lt;/div&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;arduino&lt;/span&gt;.&lt;span&gt;upload&lt;/span&gt;(&lt;span&gt;fqbn&lt;/span&gt;=&lt;span&gt;fqbn&lt;/span&gt;, &lt;span&gt;input_file&lt;/span&gt;=&lt;span&gt;Firmware&lt;/span&gt;, &lt;span&gt;port&lt;/span&gt;=&lt;span&gt;port&lt;/span&gt;)&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cm-layer cm-layer-above cm-cursorLayer"&gt;
&lt;div class="cm-cursor cm-cursor-primary"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cm-layer cm-selectionLayer"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;This approach keeps the system flexible while relying on well‑understood tools.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po5"&gt;&lt;span&gt;Hardware designed for adaptability&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The electronics are split into three main parts: the Raspberry Pi, a main routing board, and a project‑specific interface board.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The routing board sits between the Pi and the device under test (DUT). It uses analogue multiplexers and shift registers to dynamically route signals to different pins, allowing UART, I&amp;sup2;C and GPIO lines to be reassigned as needed. Clem explains that this gives him the ability to test communication interfaces properly, rather than just toggling pins blindly.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The final stage is a bespoke interface board designed specifically for each product. This board includes the programming circuitry, pogo‑pin contacts for quick connection, and buffered outputs driving indicator LEDs. These LEDs provide immediate visual feedback during testing, showing pin states and device behaviour in real time.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For Clem, this modular approach is essential. Each new product only requires a new interface board, while the main system stays the same.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po6"&gt;&lt;span&gt;From laser‑cut wood to 3D‑printed plastic&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Mechanically, the enclosure went through at least one rethink. The original plan was a laser‑cut plywood case, but warped sheets and glue‑ups proved time‑consuming. Transport was also a concern, particularly with Electronica looming.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The final version is a 3D‑printed PLA enclosure, complete with rear‑mounted cooling fan and angled legs that tilt the unit towards the user. The tilt makes the touchscreen easier to use on a bench, and also leaves room for cabling and power at the rear.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Power comes from a Mean Well supply, delivering enough current at 12 V to run the screen and the Raspberry Pi comfortably.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po7"&gt;&lt;span&gt;Testing, flashing, and feedback&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Once a device is clamped into place on the pogo pins, the workflow is straightforward. The user selects the test script, chooses the toolchain and port, and runs the procedure.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Test scripts are written in Python and executed directly by the rig. During a test run, signals are routed automatically, responses are checked, and the system reports a pass or fail using on‑screen notifications.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;It got very complicated very quickly,&amp;rdquo; Clem admits, but that complexity is hidden behind the interface. From the operator&amp;rsquo;s perspective, it feels like using a small industrial tester.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po8"&gt;&lt;span&gt;Open source by design&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;All files for the project &amp;mdash; code, PCB designs and build details &amp;mdash; have been made available through the element14 Community. Clem is clear that this is intentional. The system is meant to be adapted, extended and improved by others.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;This is more focused on the maker crowd,&amp;rdquo; he says, particularly those producing small runs or still refining their designs. The combination of open‑source software, readily available hardware and clear design intent makes the project easy to repurpose.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jcoft6po9"&gt;&lt;span&gt;A homemade system that earns its place&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Seen on the Electronica show floor, surrounded by professional test equipment, Clem&amp;rsquo;s rig holds its own. It delivers many of the same core functions &amp;mdash; flashing, automated testing, repeatability &amp;mdash; but in a form that is accessible to individual engineers and small teams.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As Clem sums it up at the booth, it is &amp;ldquo;basically a professional testing and flashing solution for your own products&amp;hellip; completely homemade based on the Raspberry Pi and the Arduino command line&amp;rdquo;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For makers looking to bridge the gap between prototype and production, it is a practical reminder that industrial‑style solutions do not have to be industrial‑scale.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3 id="mcetoc_1jcofummkb"&gt;Bill of Materials&lt;/h3&gt;
&lt;p&gt;&lt;/p&gt;
&lt;table class="e14-product-bom-main"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Product Name&lt;/th&gt;
&lt;th&gt;Manufacturer&lt;/th&gt;
&lt;th&gt;Quantity&lt;/th&gt;
&lt;th&gt;&lt;a id="e14-product-link-5fda7" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2212779,2525225,2445200~6,1201327~6,3263444,3441816~6,3002939,2845500,1378201&amp;nsku=45W6205,77Y6519,85X2967~6,11N8540~6,40AH2496,74AH2441~6,01AH7138,MC002553,54M1434&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_BUY_KIT" class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('5fda7'));" data-farnell="2212779,2525225,2445200~6,1201327~6,3263444,3441816~6,3002939,2845500,1378201" data-newark="45W6205,77Y6519,85X2967~6,11N8540~6,40AH2496,74AH2441~6,01AH7138,MC002553,54M1434" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Kit&lt;/a&gt; &lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arduino mega&lt;/td&gt;
&lt;td&gt;ARDUINO&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-3bf34" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2212779&amp;nsku=45W6205&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('3bf34'));" data-farnell="2212779" data-newark="45W6205" data-comoverride="" data-cmpoverride="" data-cpc="SC13721" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RASPBERRYPI3-MODB-1GB&lt;/td&gt;
&lt;td&gt;Raspberry pi&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-e7c4c" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2525225&amp;nsku=77Y6519&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('e7c4c'));" data-farnell="2525225" data-newark="77Y6519" data-comoverride="" data-cmpoverride="" data-cpc="SC14012" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC595PW-Q100,118&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-049cc" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2445200~6&amp;nsku=85X2967~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('049cc'));" data-farnell="2445200~6" data-newark="85X2967~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC4051D,653&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-20e9a" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=1201327~6&amp;nsku=11N8540~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('20e9a'));" data-farnell="1201327~6" data-newark="11N8540~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TOUCHSCREEN 10.1&lt;/td&gt;
&lt;td&gt;Multicomp pro&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-f508c" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3263444&amp;nsku=40AH2496&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('f508c'));" data-farnell="3263444" data-newark="40AH2496" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74HC241D,653&lt;/td&gt;
&lt;td&gt;NEXPERIA&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-d8de6" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3441816~6&amp;nsku=74AH2441~6&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('d8de6'));" data-farnell="3441816~6" data-newark="74AH2441~6" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSM60E12-P1J&lt;/td&gt;
&lt;td&gt;MEAN WELL&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-8d197" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=3002939&amp;nsku=01AH7138&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('8d197'));" data-farnell="3002939" data-newark="01AH7138" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3D Printer Filament, PLA, Blue, 205 &amp;deg;C to 225 &amp;deg;C, 1.75 mm Diameter, 1 kg&lt;/td&gt;
&lt;td&gt;Multicomp pro&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-36d01" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=2845500&amp;nsku=MC002553&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('36d01'));" data-farnell="2845500" data-newark="MC002553" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toggle Clamp, Vertical, 70 N Holding Force, 35 mm x 56.3 mm&lt;/td&gt;
&lt;td&gt;Brauer&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a id="e14-product-link-d9835" data-at-areainteracted="rte-content" data-at-type="click" data-at-link-type="button" href="https://referral.element14.com/OrderCodeView?fsku=1378201&amp;nsku=54M1434&amp;COM=e14c-noscript&amp;CMP=e14c-noscript&amp;osetc=e14-noscript-tracking-loss" data-at-label="PRODUCT_POPUP_OPEN"class="e14-embedded e14_shopping-cart-far e14-button" onclick="event.preventDefault();e14.func.displayProduct(e14.meta.user.country, this, 'embedded-link', e14.func.getProductLinkJSON('d9835'));" data-farnell="1378201" data-newark="54M1434" data-comoverride="" data-cmpoverride="" data-cpc="" data-avnetemea="" data-avnetema="" data-avnetasia="" &gt;Buy Now&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="xs-hide"&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>A DIY Test and Programming Rig Built for Small-Batch Electronics Production -- Episode 695</title><link>https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/72007/a-diy-test-and-programming-rig-built-for-small-batch-electronics-production----episode-695/revision/1</link><pubDate>Wed, 17 Dec 2025 17:37:19 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:d3055533-cdb8-4e2a-8de9-5fe4ce9a0e72</guid><dc:creator>cstanton</dc:creator><comments>https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/72007/a-diy-test-and-programming-rig-built-for-small-batch-electronics-production----episode-695#comments</comments><description>Revision 1 posted to Documents by cstanton on 12/17/2025 5:37:19 PM&lt;br /&gt;
&lt;p&gt;Clem Mayer (Mayer Makes) walks through a fully homemade programming and test rig designed for small-batch electronics production. Built around a Raspberry Pi and the Arduino command line tools, the system combines a touchscreen interface, custom hardware and Python-based automation to flash and test boards quickly and repeatably. In the video, Clem explains the design decisions, shows how the software and routing hardware work together, and demonstrates how makers can build production-style test setups without industrial budgets.&lt;/p&gt;
&lt;p&gt;Watch the Episode&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;A homemade answer to a real manufacturing problem&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;At Electronica 2024, tucked in among the polished industrial systems on show, was a project that stood out for different reasons. Built by Clem Mayer, also known as Mayer Makes, this small‑batch programming and testing rig is a fully homemade alternative to the sort of bespoke fixtures normally reserved for larger manufacturers. It was designed specifically for makers and engineers who need to flash and test their own boards without investing in expensive, specialist equipment.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As Clem explains early on, the motivation was simple: he has designed &amp;ldquo;a lot of projects that I may want to produce in bigger numbers&amp;rdquo;, but the usual production test solutions are &amp;ldquo;bespoke made by experts&amp;rdquo;. His conclusion was equally straightforward: &amp;ldquo;I could make that myself.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;Defining the goal: one box, many products&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The aim was to create a standalone system that could handle both programming and testing for multiple designs. The workflow is intentionally direct: plug in a board, select the relevant firmware and test procedure from a menu, and let the system do the rest.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Clem describes the requirement in the video as a single device that handles the user interface, programming and testing, while also interfacing with custom hardware designed for each product. That decision shaped everything that followed, from the software stack through to the mechanical design.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;A text interface that behaves like a GUI&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Rather than building a traditional desktop GUI, Clem opted for a text‑based user interface built using the Python &lt;/span&gt;&lt;em&gt;&lt;span&gt;Textual&lt;/span&gt;&lt;/em&gt;&lt;span&gt; framework. It runs entirely in the terminal, but is designed to be used on a touchscreen.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;I&amp;rsquo;m very bad at programming graphical user interfaces,&amp;rdquo; Clem admits, &amp;ldquo;so I made a 2D text user interface&amp;hellip; it&amp;rsquo;s still a touch screen interface, but it&amp;rsquo;s made in Textual.&amp;rdquo; The result looks and behaves like a lightweight GUI, complete with menus, notifications and status messages, without the overhead of a full graphical environment.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The interface allows the user to:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-spread="false"&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Select firmware files and test scripts&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Choose the appropriate toolchain&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Pick the serial port&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;Flash devices or run test routines&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;Pop‑up notifications confirm actions as they happen, and a running log gives immediate feedback during flashing and testing.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;Modest hardware, deliberate choices&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Despite how polished the interface looks, the entire system runs on a Raspberry Pi 3 Model B. Not a Pi 4 or Pi 5, and not even the B+ variant.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;This all runs on a Raspberry Pi three,&amp;rdquo; Clem notes. &amp;ldquo;It doesn&amp;rsquo;t really need much horsepower.&amp;rdquo; Compilation times are naturally slower than on a desktop machine, but that trade‑off is acceptable for the intended use case. In practice, pre‑compiled HEX files can be flashed directly, avoiding the need to compile on the device at all.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The Raspberry Pi runs Raspberry Pi OS, with an X server installed purely to support the touchscreen. The underlying interface remains a terminal application throughout.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;Arduino CLI at the core&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The key software component behind the scenes is Arduino CLI. This command‑line version of the Arduino IDE provides the same core functionality &amp;mdash; compiling sketches, selecting boards and flashing devices &amp;mdash; without any graphical layer.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Because Arduino CLI runs entirely in the terminal, it can be controlled directly from Python. Clem uses a Python wrapper to call compile and upload commands programmatically, making it possible to integrate flashing directly into the test rig interface.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;In the project&amp;rsquo;s &lt;/span&gt;&lt;code&gt;&lt;span&gt;rig.py&lt;/span&gt;&lt;/code&gt;&lt;span&gt; file, the flashing logic is explicit and readable. For example, firmware selection determines whether a sketch is compiled or a pre‑built binary is uploaded:&lt;/span&gt;&lt;/p&gt;
&lt;div data-is-code-block-view="true"&gt;
&lt;div class="cm-announced"&gt;&lt;/div&gt;
&lt;div class="cm-scroller"&gt;
&lt;div class="cm-content" data-language="python"&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;if&lt;/span&gt; &lt;span&gt;Firmware&lt;/span&gt;.&lt;span&gt;endswith&lt;/span&gt;(&lt;span&gt;&amp;#39;.ino&amp;#39;&lt;/span&gt;):&lt;/div&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;arduino&lt;/span&gt;.&lt;span&gt;compile&lt;/span&gt;(&lt;span&gt;fqbn&lt;/span&gt;=&lt;span&gt;fqbn&lt;/span&gt;, &lt;span&gt;sketch&lt;/span&gt;=&lt;span&gt;Firmware&lt;/span&gt;)&lt;/div&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;arduino&lt;/span&gt;.&lt;span&gt;upload&lt;/span&gt;(&lt;span&gt;fqbn&lt;/span&gt;=&lt;span&gt;fqbn&lt;/span&gt;, &lt;span&gt;sketch&lt;/span&gt;=&lt;span&gt;Firmware&lt;/span&gt;, &lt;span&gt;port&lt;/span&gt;=&lt;span&gt;port&lt;/span&gt;)&lt;/div&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;elif&lt;/span&gt; &lt;span&gt;Firmware&lt;/span&gt;.&lt;span&gt;endswith&lt;/span&gt;(&lt;span&gt;&amp;#39;.hex&amp;#39;&lt;/span&gt;) &lt;span&gt;or&lt;/span&gt; &lt;span&gt;Firmware&lt;/span&gt;.&lt;span&gt;endswith&lt;/span&gt;(&lt;span&gt;&amp;#39;.bin&amp;#39;&lt;/span&gt;):&lt;/div&gt;
&lt;div class="cm-line"&gt;&lt;span&gt;arduino&lt;/span&gt;.&lt;span&gt;upload&lt;/span&gt;(&lt;span&gt;fqbn&lt;/span&gt;=&lt;span&gt;fqbn&lt;/span&gt;, &lt;span&gt;input_file&lt;/span&gt;=&lt;span&gt;Firmware&lt;/span&gt;, &lt;span&gt;port&lt;/span&gt;=&lt;span&gt;port&lt;/span&gt;)&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cm-layer cm-layer-above cm-cursorLayer"&gt;
&lt;div class="cm-cursor cm-cursor-primary"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cm-layer cm-selectionLayer"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;This approach keeps the system flexible while relying on well‑understood tools.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;Hardware designed for adaptability&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;The electronics are split into three main parts: the Raspberry Pi, a main routing board, and a project‑specific interface board.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The routing board sits between the Pi and the device under test (DUT). It uses analogue multiplexers and shift registers to dynamically route signals to different pins, allowing UART, I&amp;sup2;C and GPIO lines to be reassigned as needed. Clem explains that this gives him the ability to test communication interfaces properly, rather than just toggling pins blindly.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The final stage is a bespoke interface board designed specifically for each product. This board includes the programming circuitry, pogo‑pin contacts for quick connection, and buffered outputs driving indicator LEDs. These LEDs provide immediate visual feedback during testing, showing pin states and device behaviour in real time.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For Clem, this modular approach is essential. Each new product only requires a new interface board, while the main system stays the same.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;From laser‑cut wood to 3D‑printed plastic&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Mechanically, the enclosure went through at least one rethink. The original plan was a laser‑cut plywood case, but warped sheets and glue‑ups proved time‑consuming. Transport was also a concern, particularly with Electronica looming.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;The final version is a 3D‑printed PLA enclosure, complete with rear‑mounted cooling fan and angled legs that tilt the unit towards the user. The tilt makes the touchscreen easier to use on a bench, and also leaves room for cabling and power at the rear.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Power comes from a Mean Well supply, delivering enough current at 12 V to run the screen and the Raspberry Pi comfortably.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;Testing, flashing, and feedback&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Once a device is clamped into place on the pogo pins, the workflow is straightforward. The user selects the test script, chooses the toolchain and port, and runs the procedure.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Test scripts are written in Python and executed directly by the rig. During a test run, signals are routed automatically, responses are checked, and the system reports a pass or fail using on‑screen notifications.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;It got very complicated very quickly,&amp;rdquo; Clem admits, but that complexity is hidden behind the interface. From the operator&amp;rsquo;s perspective, it feels like using a small industrial tester.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;Open source by design&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;All files for the project &amp;mdash; code, PCB designs and build details &amp;mdash; have been made available through the element14 Community. Clem is clear that this is intentional. The system is meant to be adapted, extended and improved by others.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;ldquo;This is more focused on the maker crowd,&amp;rdquo; he says, particularly those producing small runs or still refining their designs. The combination of open‑source software, readily available hardware and clear design intent makes the project easy to repurpose.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;A homemade system that earns its place&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Seen on the Electronica show floor, surrounded by professional test equipment, Clem&amp;rsquo;s rig holds its own. It delivers many of the same core functions &amp;mdash; flashing, automated testing, repeatability &amp;mdash; but in a form that is accessible to individual engineers and small teams.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;As Clem sums it up at the booth, it is &amp;ldquo;basically a professional testing and flashing solution for your own products&amp;hellip; completely homemade based on the Raspberry Pi and the Arduino command line&amp;rdquo;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For makers looking to bridge the gap between prototype and production, it is a practical reminder that industrial‑style solutions do not have to be industrial‑scale.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item></channel></rss>