<script data-pm-proxy="intercept"></script><?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Excamera Labs Substack]]></title><description><![CDATA[What I'm working on here at Excamera Labs, every Tuesday ]]></description><link>https://excamera.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!pzCm!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29902391-fe60-471f-985b-d67fa9da3433_220x220.png</url><title>Excamera Labs Substack</title><link>https://excamera.substack.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 04 Sep 2026 23:27:52 GMT</lastBuildDate><atom:link href="/__u/excamera.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[James Bowman]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[excamera@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[excamera@substack.com]]></itunes:email><itunes:name><![CDATA[James Bowman]]></itunes:name></itunes:owner><itunes:author><![CDATA[James Bowman]]></itunes:author><googleplay:owner><![CDATA[excamera@substack.com]]></googleplay:owner><googleplay:email><![CDATA[excamera@substack.com]]></googleplay:email><googleplay:author><![CDATA[James Bowman]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[3D PCB previews are a delight]]></title><description><![CDATA[Seeing your circuit board in living color]]></description><link>https://excamera.substack.com/p/3d-pcb-previews-are-a-delight</link><guid isPermaLink="false">https://excamera.substack.com/p/3d-pcb-previews-are-a-delight</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 01 Sep 2026 22:02:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jYvk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c48b213-29dd-4851-b6cc-678034d83ff5_2816x1582.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When I was designing the <a href="https://www.termdriver.com">TermDriver</a> hardware, below is how I saw the board. I&#8217;d endlessly zoom in and out, checking the layers. The components were represented only by their silkscreen outlines. So what the finished board would look like was an exercise of the imagination.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Zmxn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6f9d062-1634-4644-b283-7ddedb1ca613_1432x1444.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Zmxn!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6f9d062-1634-4644-b283-7ddedb1ca613_1432x1444.png 424w, /__u/substackcdn.com/image/fetch/$s_!Zmxn!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6f9d062-1634-4644-b283-7ddedb1ca613_1432x1444.png 848w, /__u/substackcdn.com/image/fetch/$s_!Zmxn!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6f9d062-1634-4644-b283-7ddedb1ca613_1432x1444.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Zmxn!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6f9d062-1634-4644-b283-7ddedb1ca613_1432x1444.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Zmxn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6f9d062-1634-4644-b283-7ddedb1ca613_1432x1444.png" width="1432" height="1444" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e6f9d062-1634-4644-b283-7ddedb1ca613_1432x1444.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1444,&quot;width&quot;:1432,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:304110,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/213615903?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6f9d062-1634-4644-b283-7ddedb1ca613_1432x1444.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Zmxn!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6f9d062-1634-4644-b283-7ddedb1ca613_1432x1444.png 424w, /__u/substackcdn.com/image/fetch/$s_!Zmxn!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6f9d062-1634-4644-b283-7ddedb1ca613_1432x1444.png 848w, /__u/substackcdn.com/image/fetch/$s_!Zmxn!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6f9d062-1634-4644-b283-7ddedb1ca613_1432x1444.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Zmxn!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6f9d062-1634-4644-b283-7ddedb1ca613_1432x1444.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Just recently, <a href="https://github.com/jamesbowman/cuflow">cuflow</a> has gained the ability to generate 3D previews, just like real PCB CAD software.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Even better, the previews are a simple web page. Take a live look <a href="https://excamera.com/files/private/c942a22269/td2e2.html">here</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!xajE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a73bf3-5134-47a5-8a7a-b7d6d67a1833_2816x1582.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!xajE!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a73bf3-5134-47a5-8a7a-b7d6d67a1833_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!xajE!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a73bf3-5134-47a5-8a7a-b7d6d67a1833_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!xajE!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a73bf3-5134-47a5-8a7a-b7d6d67a1833_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!xajE!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a73bf3-5134-47a5-8a7a-b7d6d67a1833_2816x1582.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!xajE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a73bf3-5134-47a5-8a7a-b7d6d67a1833_2816x1582.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32a73bf3-5134-47a5-8a7a-b7d6d67a1833_2816x1582.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1457684,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/213615903?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a73bf3-5134-47a5-8a7a-b7d6d67a1833_2816x1582.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!xajE!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a73bf3-5134-47a5-8a7a-b7d6d67a1833_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!xajE!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a73bf3-5134-47a5-8a7a-b7d6d67a1833_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!xajE!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a73bf3-5134-47a5-8a7a-b7d6d67a1833_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!xajE!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a73bf3-5134-47a5-8a7a-b7d6d67a1833_2816x1582.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!vG_V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3aa38f7d-a9b6-42e0-8d09-2b004692a7be_2816x1582.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!vG_V!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3aa38f7d-a9b6-42e0-8d09-2b004692a7be_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!vG_V!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3aa38f7d-a9b6-42e0-8d09-2b004692a7be_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!vG_V!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3aa38f7d-a9b6-42e0-8d09-2b004692a7be_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!vG_V!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3aa38f7d-a9b6-42e0-8d09-2b004692a7be_2816x1582.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!vG_V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3aa38f7d-a9b6-42e0-8d09-2b004692a7be_2816x1582.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3aa38f7d-a9b6-42e0-8d09-2b004692a7be_2816x1582.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2159999,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/213615903?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3aa38f7d-a9b6-42e0-8d09-2b004692a7be_2816x1582.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!vG_V!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3aa38f7d-a9b6-42e0-8d09-2b004692a7be_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!vG_V!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3aa38f7d-a9b6-42e0-8d09-2b004692a7be_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!vG_V!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3aa38f7d-a9b6-42e0-8d09-2b004692a7be_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!vG_V!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3aa38f7d-a9b6-42e0-8d09-2b004692a7be_2816x1582.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If I&#8217;d had this view when designing TermDriver I would <em>surely</em> have noticed that the EXCAMERA LABS text is covered up by the header. Oh well.</p><p>The slider at the side strips down the layers. Here&#8217;s the copper:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!MLHi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4834dc73-4a2b-42ff-8268-ebefec8579d8_2816x1582.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!MLHi!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4834dc73-4a2b-42ff-8268-ebefec8579d8_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!MLHi!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4834dc73-4a2b-42ff-8268-ebefec8579d8_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!MLHi!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4834dc73-4a2b-42ff-8268-ebefec8579d8_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!MLHi!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4834dc73-4a2b-42ff-8268-ebefec8579d8_2816x1582.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!MLHi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4834dc73-4a2b-42ff-8268-ebefec8579d8_2816x1582.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4834dc73-4a2b-42ff-8268-ebefec8579d8_2816x1582.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2377332,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/213615903?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4834dc73-4a2b-42ff-8268-ebefec8579d8_2816x1582.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!MLHi!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4834dc73-4a2b-42ff-8268-ebefec8579d8_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!MLHi!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4834dc73-4a2b-42ff-8268-ebefec8579d8_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!MLHi!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4834dc73-4a2b-42ff-8268-ebefec8579d8_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!MLHi!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4834dc73-4a2b-42ff-8268-ebefec8579d8_2816x1582.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Then the solder mask. The traces underneath are still visible if you look closely.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!MKmD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1022dbbb-5214-4fab-91ba-3f506edc3361_2816x1582.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!MKmD!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1022dbbb-5214-4fab-91ba-3f506edc3361_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!MKmD!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1022dbbb-5214-4fab-91ba-3f506edc3361_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!MKmD!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1022dbbb-5214-4fab-91ba-3f506edc3361_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!MKmD!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1022dbbb-5214-4fab-91ba-3f506edc3361_2816x1582.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!MKmD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1022dbbb-5214-4fab-91ba-3f506edc3361_2816x1582.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1022dbbb-5214-4fab-91ba-3f506edc3361_2816x1582.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1970111,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/213615903?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1022dbbb-5214-4fab-91ba-3f506edc3361_2816x1582.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!MKmD!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1022dbbb-5214-4fab-91ba-3f506edc3361_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!MKmD!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1022dbbb-5214-4fab-91ba-3f506edc3361_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!MKmD!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1022dbbb-5214-4fab-91ba-3f506edc3361_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!MKmD!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1022dbbb-5214-4fab-91ba-3f506edc3361_2816x1582.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Then the silk screen:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Lz-v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989cc437-ed93-4ac9-92d2-7ea12ca6a83b_2816x1582.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Lz-v!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989cc437-ed93-4ac9-92d2-7ea12ca6a83b_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!Lz-v!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989cc437-ed93-4ac9-92d2-7ea12ca6a83b_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!Lz-v!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989cc437-ed93-4ac9-92d2-7ea12ca6a83b_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Lz-v!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989cc437-ed93-4ac9-92d2-7ea12ca6a83b_2816x1582.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Lz-v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989cc437-ed93-4ac9-92d2-7ea12ca6a83b_2816x1582.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/989cc437-ed93-4ac9-92d2-7ea12ca6a83b_2816x1582.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2117457,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/213615903?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989cc437-ed93-4ac9-92d2-7ea12ca6a83b_2816x1582.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Lz-v!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989cc437-ed93-4ac9-92d2-7ea12ca6a83b_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!Lz-v!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989cc437-ed93-4ac9-92d2-7ea12ca6a83b_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!Lz-v!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989cc437-ed93-4ac9-92d2-7ea12ca6a83b_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Lz-v!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989cc437-ed93-4ac9-92d2-7ea12ca6a83b_2816x1582.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Then the paste mask. I&#8217;ve messed the paste mask up a few times in the past, and it&#8217;s not always clear in a gerber viewer, so this is a valuable view.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!aPwz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0214e905-ac5a-4d55-b143-065e53ae8052_2816x1582.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!aPwz!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0214e905-ac5a-4d55-b143-065e53ae8052_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!aPwz!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0214e905-ac5a-4d55-b143-065e53ae8052_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!aPwz!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0214e905-ac5a-4d55-b143-065e53ae8052_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!aPwz!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0214e905-ac5a-4d55-b143-065e53ae8052_2816x1582.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!aPwz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0214e905-ac5a-4d55-b143-065e53ae8052_2816x1582.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0214e905-ac5a-4d55-b143-065e53ae8052_2816x1582.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2126564,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/213615903?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0214e905-ac5a-4d55-b143-065e53ae8052_2816x1582.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!aPwz!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0214e905-ac5a-4d55-b143-065e53ae8052_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!aPwz!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0214e905-ac5a-4d55-b143-065e53ae8052_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!aPwz!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0214e905-ac5a-4d55-b143-065e53ae8052_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!aPwz!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0214e905-ac5a-4d55-b143-065e53ae8052_2816x1582.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One nice detail; the paste is slightly thick, about 0.050 mm, just like the real thing</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!TMSf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ad73cf8-a993-4cf8-bf4a-3e0e941f9d8f_2816x1582.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!TMSf!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ad73cf8-a993-4cf8-bf4a-3e0e941f9d8f_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!TMSf!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ad73cf8-a993-4cf8-bf4a-3e0e941f9d8f_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!TMSf!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ad73cf8-a993-4cf8-bf4a-3e0e941f9d8f_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!TMSf!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ad73cf8-a993-4cf8-bf4a-3e0e941f9d8f_2816x1582.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!TMSf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ad73cf8-a993-4cf8-bf4a-3e0e941f9d8f_2816x1582.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ad73cf8-a993-4cf8-bf4a-3e0e941f9d8f_2816x1582.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:839540,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/213615903?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ad73cf8-a993-4cf8-bf4a-3e0e941f9d8f_2816x1582.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!TMSf!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ad73cf8-a993-4cf8-bf4a-3e0e941f9d8f_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!TMSf!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ad73cf8-a993-4cf8-bf4a-3e0e941f9d8f_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!TMSf!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ad73cf8-a993-4cf8-bf4a-3e0e941f9d8f_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!TMSf!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ad73cf8-a993-4cf8-bf4a-3e0e941f9d8f_2816x1582.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And the components, of course:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!jYvk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c48b213-29dd-4851-b6cc-678034d83ff5_2816x1582.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!jYvk!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c48b213-29dd-4851-b6cc-678034d83ff5_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!jYvk!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c48b213-29dd-4851-b6cc-678034d83ff5_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!jYvk!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c48b213-29dd-4851-b6cc-678034d83ff5_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!jYvk!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c48b213-29dd-4851-b6cc-678034d83ff5_2816x1582.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!jYvk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c48b213-29dd-4851-b6cc-678034d83ff5_2816x1582.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4c48b213-29dd-4851-b6cc-678034d83ff5_2816x1582.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2159999,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/213615903?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c48b213-29dd-4851-b6cc-678034d83ff5_2816x1582.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!jYvk!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c48b213-29dd-4851-b6cc-678034d83ff5_2816x1582.png 424w, /__u/substackcdn.com/image/fetch/$s_!jYvk!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c48b213-29dd-4851-b6cc-678034d83ff5_2816x1582.png 848w, /__u/substackcdn.com/image/fetch/$s_!jYvk!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c48b213-29dd-4851-b6cc-678034d83ff5_2816x1582.png 1272w, /__u/substackcdn.com/image/fetch/$s_!jYvk!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c48b213-29dd-4851-b6cc-678034d83ff5_2816x1582.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A few things have come together to make this possible:</p><ul><li><p>Browser 3D support is much better than when I started cuflow six years ago. <a href="https://threejs.org">three.js</a> in particular seems to work everywhere.</p></li><li><p>Models for parts are available on LCSC, and the Python package <a href="https://pypi.org/project/easyeda2kicad/">easyeda2kicad</a> downloads them, well, easily.</p></li><li><p>Of course, agentic coding means this somewhat daunting side-quest has been really just a quite pleasurable series of aesthetic tweaks. For example, there has been a lot of back-and-forth on lighting and materials setups.</p></li></ul><p>Thanks for reading.</p>]]></content:encoded></item><item><title><![CDATA[Way too much detail about the blinking lights of TermDriver2]]></title><description><![CDATA[A lot of design into very few pixels]]></description><link>https://excamera.substack.com/p/way-too-much-detail-about-the-blinking</link><guid isPermaLink="false">https://excamera.substack.com/p/way-too-much-detail-about-the-blinking</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 25 Aug 2026 16:22:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3oc1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe42895de-5d9f-4a1b-b96e-a82c304f0aad_1920x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I spent a surprisingly long time getting the four status indicators of a <a href="https://www.termdriver.com">TermDriver2</a> looking just right.</p><p>These are four little simulated indicator lights in the corner of the TermDriver2 display. The top two (TX, TX)  flicker and light up as traffic flows, and the bottom two show the current state of the control lines.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!3oc1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe42895de-5d9f-4a1b-b96e-a82c304f0aad_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!3oc1!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe42895de-5d9f-4a1b-b96e-a82c304f0aad_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!3oc1!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe42895de-5d9f-4a1b-b96e-a82c304f0aad_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!3oc1!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe42895de-5d9f-4a1b-b96e-a82c304f0aad_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!3oc1!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe42895de-5d9f-4a1b-b96e-a82c304f0aad_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!3oc1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe42895de-5d9f-4a1b-b96e-a82c304f0aad_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e42895de-5d9f-4a1b-b96e-a82c304f0aad_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!3oc1!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe42895de-5d9f-4a1b-b96e-a82c304f0aad_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!3oc1!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe42895de-5d9f-4a1b-b96e-a82c304f0aad_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!3oc1!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe42895de-5d9f-4a1b-b96e-a82c304f0aad_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!3oc1!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe42895de-5d9f-4a1b-b96e-a82c304f0aad_1920x1080.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>On/off didn&#8217;t seem good enough. For TX and RX in particular, I wanted the lights to remain on for longer than the transmission time, otherwise you can easily miss the flash. (FTDI&#8217;s UART chips do the same; they implement a pulse stretch on their LED outputs for just the same reason.)</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>But I also wanted a more analog feel to the lights. Something like the wonderful indicators from the Apollo era.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!DTqb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22684701-94a1-48da-b71d-0e10c6cb734a_11600x8700.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!DTqb!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22684701-94a1-48da-b71d-0e10c6cb734a_11600x8700.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!DTqb!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22684701-94a1-48da-b71d-0e10c6cb734a_11600x8700.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!DTqb!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22684701-94a1-48da-b71d-0e10c6cb734a_11600x8700.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!DTqb!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22684701-94a1-48da-b71d-0e10c6cb734a_11600x8700.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!DTqb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22684701-94a1-48da-b71d-0e10c6cb734a_11600x8700.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22684701-94a1-48da-b71d-0e10c6cb734a_11600x8700.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:10041788,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/212619674?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22684701-94a1-48da-b71d-0e10c6cb734a_11600x8700.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!DTqb!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22684701-94a1-48da-b71d-0e10c6cb734a_11600x8700.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!DTqb!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22684701-94a1-48da-b71d-0e10c6cb734a_11600x8700.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!DTqb!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22684701-94a1-48da-b71d-0e10c6cb734a_11600x8700.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!DTqb!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22684701-94a1-48da-b71d-0e10c6cb734a_11600x8700.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So to start with, no more instant on/off. Incandescent bulbs don&#8217;t work that way. Each of the four lamps is animated from off-to-on in 16 steps:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!u40N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b867cd2-7314-4cfb-aa7a-10a4c08b5d50_384x64.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!u40N!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b867cd2-7314-4cfb-aa7a-10a4c08b5d50_384x64.png 424w, /__u/substackcdn.com/image/fetch/$s_!u40N!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b867cd2-7314-4cfb-aa7a-10a4c08b5d50_384x64.png 848w, /__u/substackcdn.com/image/fetch/$s_!u40N!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b867cd2-7314-4cfb-aa7a-10a4c08b5d50_384x64.png 1272w, /__u/substackcdn.com/image/fetch/$s_!u40N!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b867cd2-7314-4cfb-aa7a-10a4c08b5d50_384x64.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!u40N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b867cd2-7314-4cfb-aa7a-10a4c08b5d50_384x64.png" width="614" height="102.33333333333333" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b867cd2-7314-4cfb-aa7a-10a4c08b5d50_384x64.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:64,&quot;width&quot;:384,&quot;resizeWidth&quot;:614,&quot;bytes&quot;:38017,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/212619674?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b867cd2-7314-4cfb-aa7a-10a4c08b5d50_384x64.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!u40N!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b867cd2-7314-4cfb-aa7a-10a4c08b5d50_384x64.png 424w, /__u/substackcdn.com/image/fetch/$s_!u40N!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b867cd2-7314-4cfb-aa7a-10a4c08b5d50_384x64.png 848w, /__u/substackcdn.com/image/fetch/$s_!u40N!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b867cd2-7314-4cfb-aa7a-10a4c08b5d50_384x64.png 1272w, /__u/substackcdn.com/image/fetch/$s_!u40N!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b867cd2-7314-4cfb-aa7a-10a4c08b5d50_384x64.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>The firmware keeps a 0-15 counter for each lamp. If the signal is on, it increments the counter by 5, and if it&#8217;s off it decrements it by 1. So the lamps get brighter a lot faster than they get dimmer. This produces a nice bulb-like time response.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!xXxE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c3b2cbd-2547-47fb-8ac9-9af5337be0b8_1472x560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!xXxE!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c3b2cbd-2547-47fb-8ac9-9af5337be0b8_1472x560.png 424w, /__u/substackcdn.com/image/fetch/$s_!xXxE!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c3b2cbd-2547-47fb-8ac9-9af5337be0b8_1472x560.png 848w, /__u/substackcdn.com/image/fetch/$s_!xXxE!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c3b2cbd-2547-47fb-8ac9-9af5337be0b8_1472x560.png 1272w, /__u/substackcdn.com/image/fetch/$s_!xXxE!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c3b2cbd-2547-47fb-8ac9-9af5337be0b8_1472x560.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!xXxE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c3b2cbd-2547-47fb-8ac9-9af5337be0b8_1472x560.png" width="1456" height="554" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c3b2cbd-2547-47fb-8ac9-9af5337be0b8_1472x560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:554,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:18786,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/212619674?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c3b2cbd-2547-47fb-8ac9-9af5337be0b8_1472x560.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!xXxE!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c3b2cbd-2547-47fb-8ac9-9af5337be0b8_1472x560.png 424w, /__u/substackcdn.com/image/fetch/$s_!xXxE!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c3b2cbd-2547-47fb-8ac9-9af5337be0b8_1472x560.png 848w, /__u/substackcdn.com/image/fetch/$s_!xXxE!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c3b2cbd-2547-47fb-8ac9-9af5337be0b8_1472x560.png 1272w, /__u/substackcdn.com/image/fetch/$s_!xXxE!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c3b2cbd-2547-47fb-8ac9-9af5337be0b8_1472x560.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A single byte produces a perceptible but dim flicker. A steady stream of traffic produces maximum brightness. When the traffic stops, the bulb takes about 1/4 of a second to go fully dark.</p><p>But that&#8217;s not all. The bulb graphics themselves (which are a very tiny 24x16 pixels) contain a surprising amount of detail. First, the outline isn&#8217;t a simple round-cornered rectangle, it&#8217;s a <a href="https://en.wikipedia.org/wiki/Superellipse">superellipse</a>, beloved by geometry fans for their pleasing curved outline.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!YIbN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F623432f6-9490-4dca-bc9d-a6403975f782_330x284.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!YIbN!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F623432f6-9490-4dca-bc9d-a6403975f782_330x284.png 424w, /__u/substackcdn.com/image/fetch/$s_!YIbN!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F623432f6-9490-4dca-bc9d-a6403975f782_330x284.png 848w, /__u/substackcdn.com/image/fetch/$s_!YIbN!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F623432f6-9490-4dca-bc9d-a6403975f782_330x284.png 1272w, /__u/substackcdn.com/image/fetch/$s_!YIbN!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F623432f6-9490-4dca-bc9d-a6403975f782_330x284.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!YIbN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F623432f6-9490-4dca-bc9d-a6403975f782_330x284.png" width="330" height="284" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/623432f6-9490-4dca-bc9d-a6403975f782_330x284.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:284,&quot;width&quot;:330,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!YIbN!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F623432f6-9490-4dca-bc9d-a6403975f782_330x284.png 424w, /__u/substackcdn.com/image/fetch/$s_!YIbN!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F623432f6-9490-4dca-bc9d-a6403975f782_330x284.png 848w, /__u/substackcdn.com/image/fetch/$s_!YIbN!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F623432f6-9490-4dca-bc9d-a6403975f782_330x284.png 1272w, /__u/substackcdn.com/image/fetch/$s_!YIbN!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F623432f6-9490-4dca-bc9d-a6403975f782_330x284.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The brightness isn&#8217;t flat across the lamp. There&#8217;s a quadratic falloff from bulb-center to bulb-edge. You can see it in the three colored lamps most clearly. The center is fully bright, becoming less saturated towards the bulb edges.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Tc2L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4dbaf255-21f7-4c92-8fc3-681d8b414eac_576x384.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Tc2L!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4dbaf255-21f7-4c92-8fc3-681d8b414eac_576x384.png 424w, /__u/substackcdn.com/image/fetch/$s_!Tc2L!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4dbaf255-21f7-4c92-8fc3-681d8b414eac_576x384.png 848w, /__u/substackcdn.com/image/fetch/$s_!Tc2L!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4dbaf255-21f7-4c92-8fc3-681d8b414eac_576x384.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Tc2L!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4dbaf255-21f7-4c92-8fc3-681d8b414eac_576x384.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Tc2L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4dbaf255-21f7-4c92-8fc3-681d8b414eac_576x384.png" width="576" height="384" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4dbaf255-21f7-4c92-8fc3-681d8b414eac_576x384.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:384,&quot;width&quot;:576,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Black pixel grid&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Black pixel grid" title="Black pixel grid" srcset="/__u/substackcdn.com/image/fetch/$s_!Tc2L!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4dbaf255-21f7-4c92-8fc3-681d8b414eac_576x384.png 424w, /__u/substackcdn.com/image/fetch/$s_!Tc2L!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4dbaf255-21f7-4c92-8fc3-681d8b414eac_576x384.png 848w, /__u/substackcdn.com/image/fetch/$s_!Tc2L!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4dbaf255-21f7-4c92-8fc3-681d8b414eac_576x384.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Tc2L!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4dbaf255-21f7-4c92-8fc3-681d8b414eac_576x384.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But again that&#8217;s not all. There&#8217;s a final pass that adds a Gaussian glow to simulate the bright light of the bulb starting to leak through the black text, making it appear brighter.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!0kOs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74392321-4075-48fd-ade5-146cd6036c96_1162x384.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!0kOs!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74392321-4075-48fd-ade5-146cd6036c96_1162x384.png 424w, /__u/substackcdn.com/image/fetch/$s_!0kOs!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74392321-4075-48fd-ade5-146cd6036c96_1162x384.png 848w, /__u/substackcdn.com/image/fetch/$s_!0kOs!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74392321-4075-48fd-ade5-146cd6036c96_1162x384.png 1272w, /__u/substackcdn.com/image/fetch/$s_!0kOs!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74392321-4075-48fd-ade5-146cd6036c96_1162x384.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!0kOs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74392321-4075-48fd-ade5-146cd6036c96_1162x384.png" width="1162" height="384" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74392321-4075-48fd-ade5-146cd6036c96_1162x384.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:384,&quot;width&quot;:1162,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:62023,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/212619674?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74392321-4075-48fd-ade5-146cd6036c96_1162x384.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!0kOs!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74392321-4075-48fd-ade5-146cd6036c96_1162x384.png 424w, /__u/substackcdn.com/image/fetch/$s_!0kOs!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74392321-4075-48fd-ade5-146cd6036c96_1162x384.png 848w, /__u/substackcdn.com/image/fetch/$s_!0kOs!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74392321-4075-48fd-ade5-146cd6036c96_1162x384.png 1272w, /__u/substackcdn.com/image/fetch/$s_!0kOs!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74392321-4075-48fd-ade5-146cd6036c96_1162x384.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Without glow on the left, with glow on the right</figcaption></figure></div><p>And <strong>of course</strong> all these steps are rendered at 96x64 resolution, then filtered down 4x to the final 24x16 that&#8217;s used in the hardware. </p><p>Overall I think I spent a whole afternoon getting the bulbs looking this way. Time well spent? My feelings on this are a bit complicated. In 2024 when I did it, perhaps not really. There was a lot of other work I could have been doing: getting the TermDriver2 firmware ready, writing test suites, doing acceptance testing.</p><p>But in 2026? Yes, very much so. A lot of that other work can be automated. Writing pretty good test suites, for example, is no problem for coding agents. But the aesthetic work can&#8217;t be automated. And all of the decisions I made above were matters of <em>taste</em>. We have taste, and exercising that taste in places where it shows seems like time and effort well-spent.</p><p>Thanks for reading.</p>]]></content:encoded></item><item><title><![CDATA[Works-like vs looks-like prototypes]]></title><description><![CDATA[Not like in the movies]]></description><link>https://excamera.substack.com/p/works-like-vs-looks-like-prototypes</link><guid isPermaLink="false">https://excamera.substack.com/p/works-like-vs-looks-like-prototypes</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 18 Aug 2026 18:53:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-QDs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0839c575-86a5-4b8e-b397-df449d1206f5_640x466.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the movies, the inventor just makes something. That&#8217;s all we see, the finished article, ready to go.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!-QDs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0839c575-86a5-4b8e-b397-df449d1206f5_640x466.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!-QDs!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0839c575-86a5-4b8e-b397-df449d1206f5_640x466.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!-QDs!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0839c575-86a5-4b8e-b397-df449d1206f5_640x466.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!-QDs!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0839c575-86a5-4b8e-b397-df449d1206f5_640x466.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!-QDs!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0839c575-86a5-4b8e-b397-df449d1206f5_640x466.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!-QDs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0839c575-86a5-4b8e-b397-df449d1206f5_640x466.jpeg" width="640" height="466" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0839c575-86a5-4b8e-b397-df449d1206f5_640x466.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:466,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!-QDs!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0839c575-86a5-4b8e-b397-df449d1206f5_640x466.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!-QDs!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0839c575-86a5-4b8e-b397-df449d1206f5_640x466.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!-QDs!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0839c575-86a5-4b8e-b397-df449d1206f5_640x466.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!-QDs!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0839c575-86a5-4b8e-b397-df449d1206f5_640x466.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The Time Machine (1960) &#8212; look what I made!</figcaption></figure></div><p>In the non-movie world, we make prototypes. Some rules:</p><ul><li><p>At least one prototype before production</p></li><li><p>Not too may prototypes</p></li><li><p>You don&#8217;t ship the prototype</p></li></ul><p>I&#8217;ve worked at places that broke all these. Maybe you have too. But here at Excamera Labs, we do it right!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>I normally break prototyping into two parts. The &#8220;works-like&#8221; prototype is functionally the same as the final product, but doesn&#8217;t look like it. It usually looks like a mess. You show it to people and then ask them to use their imagination.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!fYDd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9e2c8b-7cdb-40be-8a84-d9dccb8c85a3_720x540.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!fYDd!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9e2c8b-7cdb-40be-8a84-d9dccb8c85a3_720x540.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!fYDd!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9e2c8b-7cdb-40be-8a84-d9dccb8c85a3_720x540.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!fYDd!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9e2c8b-7cdb-40be-8a84-d9dccb8c85a3_720x540.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!fYDd!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9e2c8b-7cdb-40be-8a84-d9dccb8c85a3_720x540.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!fYDd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9e2c8b-7cdb-40be-8a84-d9dccb8c85a3_720x540.jpeg" width="720" height="540" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fc9e2c8b-7cdb-40be-8a84-d9dccb8c85a3_720x540.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:540,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;On a breadboard.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="On a breadboard." title="On a breadboard." srcset="/__u/substackcdn.com/image/fetch/$s_!fYDd!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9e2c8b-7cdb-40be-8a84-d9dccb8c85a3_720x540.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!fYDd!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9e2c8b-7cdb-40be-8a84-d9dccb8c85a3_720x540.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!fYDd!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9e2c8b-7cdb-40be-8a84-d9dccb8c85a3_720x540.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!fYDd!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9e2c8b-7cdb-40be-8a84-d9dccb8c85a3_720x540.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The original <a href="https://spidriver.com">SPIDriver</a> on a breadboard, 2018</figcaption></figure></div><p>It may not impress bystanders, but the &#8220;works-like&#8221; prototype is where it all happens. The firmware gets written. Any impossible design decisions get exposed. First usability feedback comes in.</p><p>These days I don&#8217;t use breadboards. Every Excamera Labs product consists of a microcontroller and some peripherals. So I use a Python generator that puts them on a PCB together. The PCB is 100mm x 100mm, the maximum size for cheap JLCPCB 2-layer boards. There&#8217;s no clever signal routing, just a dumb bus running from microcontroller to the peripherals.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!JY9X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece0f82f-349e-4e0c-bff4-d3e78d48a657_1534x1034.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!JY9X!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece0f82f-349e-4e0c-bff4-d3e78d48a657_1534x1034.png 424w, /__u/substackcdn.com/image/fetch/$s_!JY9X!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece0f82f-349e-4e0c-bff4-d3e78d48a657_1534x1034.png 848w, /__u/substackcdn.com/image/fetch/$s_!JY9X!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece0f82f-349e-4e0c-bff4-d3e78d48a657_1534x1034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!JY9X!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece0f82f-349e-4e0c-bff4-d3e78d48a657_1534x1034.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!JY9X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece0f82f-349e-4e0c-bff4-d3e78d48a657_1534x1034.png" width="1456" height="981" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ece0f82f-349e-4e0c-bff4-d3e78d48a657_1534x1034.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:981,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:194274,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/211711377?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece0f82f-349e-4e0c-bff4-d3e78d48a657_1534x1034.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!JY9X!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece0f82f-349e-4e0c-bff4-d3e78d48a657_1534x1034.png 424w, /__u/substackcdn.com/image/fetch/$s_!JY9X!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece0f82f-349e-4e0c-bff4-d3e78d48a657_1534x1034.png 848w, /__u/substackcdn.com/image/fetch/$s_!JY9X!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece0f82f-349e-4e0c-bff4-d3e78d48a657_1534x1034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!JY9X!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece0f82f-349e-4e0c-bff4-d3e78d48a657_1534x1034.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The RPi pico is on the left. Every trace is broken out into a big East-West bus. The peripherals are plugged into it on the North and South edges. Electrically and physically it&#8217;s far from ideal. But it does function just like the finished article, while design time is very short. Design time is short because this board is a shopping list:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;36e3b525-297c-416c-86f1-28e397c08dc0&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">def spiq_2():
    nm = "spiq_2"
    pb = Protoboard(nm)
    pb.logo_center = (83, 13)
    pb.mcu_pico(flush = True)

    pb.add_module(Module_LCD240x240)
    pb.add_module(Module_spiq_pwr)
    pb.add_module(Module_spiq_ios)
    pb.add_module(Module_Serial_Debug, (56, 4), 180)

    pb.finish(mount_holes = False)
    pb.save(nm)</code></pre></div><p>The Python program lays them out. The most recent board came back yesterday. It looks like this</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!O3NS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44909987-3c1c-43e5-b687-62651c05e22a_1920x1282.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!O3NS!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44909987-3c1c-43e5-b687-62651c05e22a_1920x1282.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!O3NS!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44909987-3c1c-43e5-b687-62651c05e22a_1920x1282.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!O3NS!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44909987-3c1c-43e5-b687-62651c05e22a_1920x1282.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!O3NS!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44909987-3c1c-43e5-b687-62651c05e22a_1920x1282.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!O3NS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44909987-3c1c-43e5-b687-62651c05e22a_1920x1282.jpeg" width="1456" height="972" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/44909987-3c1c-43e5-b687-62651c05e22a_1920x1282.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1675568,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/211711377?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44909987-3c1c-43e5-b687-62651c05e22a_1920x1282.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!O3NS!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44909987-3c1c-43e5-b687-62651c05e22a_1920x1282.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!O3NS!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44909987-3c1c-43e5-b687-62651c05e22a_1920x1282.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!O3NS!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44909987-3c1c-43e5-b687-62651c05e22a_1920x1282.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!O3NS!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44909987-3c1c-43e5-b687-62651c05e22a_1920x1282.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I did a quick check for shorts, then soldered in the three important things: the microcontroller (a RPi Pico), the debug header and the LCD panel.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!yITI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966195a6-d39e-4f54-8bce-e7130038b661_1920x1282.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!yITI!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966195a6-d39e-4f54-8bce-e7130038b661_1920x1282.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!yITI!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966195a6-d39e-4f54-8bce-e7130038b661_1920x1282.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!yITI!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966195a6-d39e-4f54-8bce-e7130038b661_1920x1282.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!yITI!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966195a6-d39e-4f54-8bce-e7130038b661_1920x1282.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!yITI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966195a6-d39e-4f54-8bce-e7130038b661_1920x1282.jpeg" width="1456" height="972" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/966195a6-d39e-4f54-8bce-e7130038b661_1920x1282.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1783703,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/211711377?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966195a6-d39e-4f54-8bce-e7130038b661_1920x1282.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!yITI!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966195a6-d39e-4f54-8bce-e7130038b661_1920x1282.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!yITI!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966195a6-d39e-4f54-8bce-e7130038b661_1920x1282.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!yITI!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966195a6-d39e-4f54-8bce-e7130038b661_1920x1282.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!yITI!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966195a6-d39e-4f54-8bce-e7130038b661_1920x1282.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Does it work? Initially I thought that answer was a resounding <strong>no</strong>. But after 25 minutes of investigation, I discovered that I had made a bad solder connection to the panel&#8217;s VCC contact.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!gQ7k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71f8e63-b202-4e2c-9c67-7ea36b4a8703_1920x1282.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!gQ7k!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71f8e63-b202-4e2c-9c67-7ea36b4a8703_1920x1282.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!gQ7k!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71f8e63-b202-4e2c-9c67-7ea36b4a8703_1920x1282.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!gQ7k!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71f8e63-b202-4e2c-9c67-7ea36b4a8703_1920x1282.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!gQ7k!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71f8e63-b202-4e2c-9c67-7ea36b4a8703_1920x1282.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!gQ7k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71f8e63-b202-4e2c-9c67-7ea36b4a8703_1920x1282.jpeg" width="1456" height="972" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f71f8e63-b202-4e2c-9c67-7ea36b4a8703_1920x1282.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1918301,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/211711377?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71f8e63-b202-4e2c-9c67-7ea36b4a8703_1920x1282.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!gQ7k!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71f8e63-b202-4e2c-9c67-7ea36b4a8703_1920x1282.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!gQ7k!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71f8e63-b202-4e2c-9c67-7ea36b4a8703_1920x1282.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!gQ7k!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71f8e63-b202-4e2c-9c67-7ea36b4a8703_1920x1282.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!gQ7k!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff71f8e63-b202-4e2c-9c67-7ea36b4a8703_1920x1282.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The panel is alive, and the firmware is loadable over the debug connection. Excellent progress. I&#8217;m waiting for some parts for this section:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!9LEW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc38bd4e8-0de2-4432-8f96-8150df83cec2_632x356.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!9LEW!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc38bd4e8-0de2-4432-8f96-8150df83cec2_632x356.png 424w, /__u/substackcdn.com/image/fetch/$s_!9LEW!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc38bd4e8-0de2-4432-8f96-8150df83cec2_632x356.png 848w, /__u/substackcdn.com/image/fetch/$s_!9LEW!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc38bd4e8-0de2-4432-8f96-8150df83cec2_632x356.png 1272w, /__u/substackcdn.com/image/fetch/$s_!9LEW!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc38bd4e8-0de2-4432-8f96-8150df83cec2_632x356.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!9LEW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc38bd4e8-0de2-4432-8f96-8150df83cec2_632x356.png" width="464" height="261.36708860759495" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c38bd4e8-0de2-4432-8f96-8150df83cec2_632x356.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:356,&quot;width&quot;:632,&quot;resizeWidth&quot;:464,&quot;bytes&quot;:441245,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/211711377?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc38bd4e8-0de2-4432-8f96-8150df83cec2_632x356.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!9LEW!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc38bd4e8-0de2-4432-8f96-8150df83cec2_632x356.png 424w, /__u/substackcdn.com/image/fetch/$s_!9LEW!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc38bd4e8-0de2-4432-8f96-8150df83cec2_632x356.png 848w, /__u/substackcdn.com/image/fetch/$s_!9LEW!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc38bd4e8-0de2-4432-8f96-8150df83cec2_632x356.png 1272w, /__u/substackcdn.com/image/fetch/$s_!9LEW!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc38bd4e8-0de2-4432-8f96-8150df83cec2_632x356.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Which is a fairly high precision I<sup>2</sup>C current sensor using the TI <a href="https://www.ti.com/product/INA226">INA226</a>. More on that next week, hopefully.</p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p> </p><p></p>]]></content:encoded></item><item><title><![CDATA[Make everything look like a software project]]></title><description><![CDATA[When life gives you hammers...]]></description><link>https://excamera.substack.com/p/make-everything-look-like-a-software</link><guid isPermaLink="false">https://excamera.substack.com/p/make-everything-look-like-a-software</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 11 Aug 2026 16:58:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Q36f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd9ebe4-4d62-42f9-9600-c3424e5c4a21_1160x1102.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>If all you have is a hammer, everything looks like a nail</p></blockquote><p>For me, software has changed a lot this year. Agentic coding tools have got really good. When I give the tool a contained task on an established code base, it usually does a great job. (It usually does a slightly better job than I would have done, to be honest.)</p><p>I decide how the task gets broken down, and what the steps are. The agent does the coding, in steps that usually take a few minutes. I know some people let it run for hours, but my experience has been that it lacks good taste, and when unsupervised will write code that&#8217;s hard to follow. Or &#8220;slop&#8221; if you prefer.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Having a tireless assistant means that more gets done every day. By quite a margin. Writing software has got cheaper. However, non-software tasks remain as they were before. So their cost relative to software has increased.</p><p>So there&#8217;s now a strong incentive to make every project look like a software project.</p><p>Normally, PCB design is a CAD task, not a software task. At least for most people. But for many years now I have been playing around with cuflow, a software PCB design system.</p><p><a href="https://github.com/jamesbowman/cuflow">cuflow</a> is a Python program that draws the PCB, then outputs the Gerber-format design files. There&#8217;s no CAD step. Just Python code to place components and trace out wires. cuflow has a lot of conveniences to make layout somewhat automatic, but it&#8217;s still been quite laborious. For example <a href="https://www.termdriver.com">TermDriver</a>&#8217;s PCB ended up about 600 lines of Python and took me about a week to finish in cuflow (<a href="https://github.com/jamesbowman/cuflow/blob/master/td2e2.py">source</a>).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!UEuz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa23a88b-5fb4-4433-a0bc-dd00cd66e2e2_1600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!UEuz!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa23a88b-5fb4-4433-a0bc-dd00cd66e2e2_1600x900.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!UEuz!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa23a88b-5fb4-4433-a0bc-dd00cd66e2e2_1600x900.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!UEuz!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa23a88b-5fb4-4433-a0bc-dd00cd66e2e2_1600x900.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!UEuz!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa23a88b-5fb4-4433-a0bc-dd00cd66e2e2_1600x900.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!UEuz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa23a88b-5fb4-4433-a0bc-dd00cd66e2e2_1600x900.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa23a88b-5fb4-4433-a0bc-dd00cd66e2e2_1600x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!UEuz!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa23a88b-5fb4-4433-a0bc-dd00cd66e2e2_1600x900.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!UEuz!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa23a88b-5fb4-4433-a0bc-dd00cd66e2e2_1600x900.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!UEuz!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa23a88b-5fb4-4433-a0bc-dd00cd66e2e2_1600x900.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!UEuz!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa23a88b-5fb4-4433-a0bc-dd00cd66e2e2_1600x900.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But not any more. Now I chat to the agent, it edits the Python, runs the generator, looks at the output Gerbers, and iterates until it&#8217;s got a good layout. This morning I&#8217;ve been wiring up a USBC connector for the first time, and this is the kind of thing I&#8217;ve been saying to the agent. </p><div class="callout-block" data-callout="true"><p><code>Move R4, R5 so they are 1mm south of the USBC, and route D+,D- underneath the connector to their respective resistor pads.</code></p><p></p><p><code>Exchange locations of R4, R5. This will fixed the wire crossing.</code><br><br><code>Rotate R6, R7 90 degrees counterclockwise. Place R7 So that its bottom pad is level with the USBC connector. Place R6 1.1mm right of R7.</code></p></div><p>And that&#8217;s how layout goes. The agent doesn&#8217;t only think about layout and code; it also knows how a USBC connector works. Which is more than I did, to be honest.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Q36f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd9ebe4-4d62-42f9-9600-c3424e5c4a21_1160x1102.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Q36f!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd9ebe4-4d62-42f9-9600-c3424e5c4a21_1160x1102.png 424w, /__u/substackcdn.com/image/fetch/$s_!Q36f!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd9ebe4-4d62-42f9-9600-c3424e5c4a21_1160x1102.png 848w, /__u/substackcdn.com/image/fetch/$s_!Q36f!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd9ebe4-4d62-42f9-9600-c3424e5c4a21_1160x1102.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Q36f!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd9ebe4-4d62-42f9-9600-c3424e5c4a21_1160x1102.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Q36f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd9ebe4-4d62-42f9-9600-c3424e5c4a21_1160x1102.png" width="1160" height="1102" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8bd9ebe4-4d62-42f9-9600-c3424e5c4a21_1160x1102.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1102,&quot;width&quot;:1160,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:81158,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/210756243?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd9ebe4-4d62-42f9-9600-c3424e5c4a21_1160x1102.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Q36f!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd9ebe4-4d62-42f9-9600-c3424e5c4a21_1160x1102.png 424w, /__u/substackcdn.com/image/fetch/$s_!Q36f!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd9ebe4-4d62-42f9-9600-c3424e5c4a21_1160x1102.png 848w, /__u/substackcdn.com/image/fetch/$s_!Q36f!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd9ebe4-4d62-42f9-9600-c3424e5c4a21_1160x1102.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Q36f!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd9ebe4-4d62-42f9-9600-c3424e5c4a21_1160x1102.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The code it&#8217;s generating is not too bad. Here&#8217;s the block that connects the two USB GND pins to the ground plane using extra-wide wires:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;8f570614-72ed-4a89-b7a9-031344fffcf8&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">        power_width = 2 * self.board.trace
        for name in ("A1/B12", "B1/A12"):
            self.s(name).setwidth(power_width).w("o -")</code></pre></div><p>This seems fine, that&#8217;s probably how I would have expressed it.</p><p>It&#8217;s all working very well. I don&#8217;t know if conversational interfaces for PCB CAD software exist right now, but it does seem that&#8217;s what I&#8217;ve accidentally arrived at.</p><p>I&#8217;m not suggesting for a moment that you design a PCB in cuflow. But if there&#8217;s a project that&#8217;s current not a software project, and could plausibly be turned into a software project, there&#8217;s never been a better time to switch and reap the rewards.</p><p>Thanks for reading.</p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[GPIO announcer]]></title><description><![CDATA[A quick hack for checking out microcontroller pin assignments]]></description><link>https://excamera.substack.com/p/gpio-announcer</link><guid isPermaLink="false">https://excamera.substack.com/p/gpio-announcer</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 04 Aug 2026 17:05:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-GT7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f925c9b-dce9-449e-abbb-651bdb5a0db6_2323x1307.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="callout-block" data-callout="true"><p>Excamera Labs shop note: the ever-popular <a href="https://store.excamera.com/product/spidriver">SPIDriver</a> is back in stock.</p></div><p>Your PCB comes back. You put a microcontroller on it. It powers up, wonderful! Then you start testing all the pin connections. Maybe there&#8217;s a bad solder joint, a short, maybe you even messed up the design?</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/excamera.substack.com/subscribe"><span>Subscribe now</span></a></p><p>It&#8217;s an important step, and being certain of all the GPIO connections before connecting any peripherals is a lot better than crossing your fingers and carrying on.</p><p>But how do you check the signals? I guess everyone has their own method.</p><p>What I used to do until yesterday was write a little hack on the microcontroller to toggle each pin, and then probe the signal on the PCB. After confirming that it toggles, I&#8217;d change the code, recompile, and test the next pin. A laborious process.</p><p><strong>Well</strong> <strong>not anymore</strong>, now that I have <a href="https://github.com/jamesbowman/gpio-announcer">gpio-announcer</a>. It&#8217;s a tiny CircuitPython script (or dedicated .uf2, see below) that drives all the GPIOs simultaneously, each one saying their name at 115200 baud. All you have to do is connect a serial converter (e.g. the wonderful <a href="https://termdriver.com/">TermDriver</a>) to the signal and it literally shouts its name nonstop!</p><p>Here the RP2040 Pico&#8217;s pin GP14 is being probed, and the string &#8220;GP14&#8221;  is continuously being sent out at 115200 baud.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!-GT7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f925c9b-dce9-449e-abbb-651bdb5a0db6_2323x1307.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!-GT7!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f925c9b-dce9-449e-abbb-651bdb5a0db6_2323x1307.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!-GT7!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f925c9b-dce9-449e-abbb-651bdb5a0db6_2323x1307.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!-GT7!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f925c9b-dce9-449e-abbb-651bdb5a0db6_2323x1307.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!-GT7!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f925c9b-dce9-449e-abbb-651bdb5a0db6_2323x1307.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!-GT7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f925c9b-dce9-449e-abbb-651bdb5a0db6_2323x1307.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f925c9b-dce9-449e-abbb-651bdb5a0db6_2323x1307.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2915354,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/209714424?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f925c9b-dce9-449e-abbb-651bdb5a0db6_2323x1307.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!-GT7!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f925c9b-dce9-449e-abbb-651bdb5a0db6_2323x1307.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!-GT7!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f925c9b-dce9-449e-abbb-651bdb5a0db6_2323x1307.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!-GT7!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f925c9b-dce9-449e-abbb-651bdb5a0db6_2323x1307.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!-GT7!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f925c9b-dce9-449e-abbb-651bdb5a0db6_2323x1307.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!z6HT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3ee0ec2-c6a5-4b71-8e47-f80114ddcf11_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!z6HT!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3ee0ec2-c6a5-4b71-8e47-f80114ddcf11_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!z6HT!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3ee0ec2-c6a5-4b71-8e47-f80114ddcf11_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!z6HT!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3ee0ec2-c6a5-4b71-8e47-f80114ddcf11_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!z6HT!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3ee0ec2-c6a5-4b71-8e47-f80114ddcf11_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!z6HT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3ee0ec2-c6a5-4b71-8e47-f80114ddcf11_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e3ee0ec2-c6a5-4b71-8e47-f80114ddcf11_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1421777,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/209714424?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3ee0ec2-c6a5-4b71-8e47-f80114ddcf11_1920x1080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!z6HT!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3ee0ec2-c6a5-4b71-8e47-f80114ddcf11_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!z6HT!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3ee0ec2-c6a5-4b71-8e47-f80114ddcf11_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!z6HT!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3ee0ec2-c6a5-4b71-8e47-f80114ddcf11_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!z6HT!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3ee0ec2-c6a5-4b71-8e47-f80114ddcf11_1920x1080.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is the development board I wanted to check out. I can just quickly probe all the hookups, confirming each one against the schematic.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!aov3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e52c9ae-167b-4cf5-8064-870f75b32b25_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!aov3!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e52c9ae-167b-4cf5-8064-870f75b32b25_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!aov3!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e52c9ae-167b-4cf5-8064-870f75b32b25_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!aov3!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e52c9ae-167b-4cf5-8064-870f75b32b25_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!aov3!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e52c9ae-167b-4cf5-8064-870f75b32b25_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!aov3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e52c9ae-167b-4cf5-8064-870f75b32b25_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2e52c9ae-167b-4cf5-8064-870f75b32b25_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1739861,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/209714424?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e52c9ae-167b-4cf5-8064-870f75b32b25_1920x1080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!aov3!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e52c9ae-167b-4cf5-8064-870f75b32b25_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!aov3!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e52c9ae-167b-4cf5-8064-870f75b32b25_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!aov3!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e52c9ae-167b-4cf5-8064-870f75b32b25_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!aov3!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e52c9ae-167b-4cf5-8064-870f75b32b25_1920x1080.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Pretty handy. The script has a little bit of smarts. It first probes every pin, and only transmits the pattern on ones that are floating. So if the PCB has a GPIO already hooked up to an input, that&#8217;s not included in the test pattern.</p><p>It&#8217;s directly inspired by this FPGA implementation by Alex Forencich in 2023 (<a href="https://youtu.be/H1sD4KoFcVk">youtube</a>, and <a href="https://github.com/alexforencich/pin-uart">github repo pin-uart</a>). As far as I could find out there wasn&#8217;t an existing RP2040 implementation, or indeed much else for any microcontroller.</p><p>If you&#8217;re familiar with the RP2040, you might be wondering how it makes every pin function as a serial output, when only a few of them (the <mark data-color="#d5a6bd" style="background-color: rgb(213, 166, 189); color: rgb(0, 0, 0);">UART TX</mark> ones below) support hardware serial out.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!f7mP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fa1d728-aeb6-4568-8988-2ad00c191dae_1382x888.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!f7mP!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fa1d728-aeb6-4568-8988-2ad00c191dae_1382x888.png 424w, /__u/substackcdn.com/image/fetch/$s_!f7mP!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fa1d728-aeb6-4568-8988-2ad00c191dae_1382x888.png 848w, /__u/substackcdn.com/image/fetch/$s_!f7mP!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fa1d728-aeb6-4568-8988-2ad00c191dae_1382x888.png 1272w, /__u/substackcdn.com/image/fetch/$s_!f7mP!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fa1d728-aeb6-4568-8988-2ad00c191dae_1382x888.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!f7mP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fa1d728-aeb6-4568-8988-2ad00c191dae_1382x888.png" width="1382" height="888" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2fa1d728-aeb6-4568-8988-2ad00c191dae_1382x888.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:888,&quot;width&quot;:1382,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:238679,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/209714424?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fa1d728-aeb6-4568-8988-2ad00c191dae_1382x888.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!f7mP!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fa1d728-aeb6-4568-8988-2ad00c191dae_1382x888.png 424w, /__u/substackcdn.com/image/fetch/$s_!f7mP!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fa1d728-aeb6-4568-8988-2ad00c191dae_1382x888.png 848w, /__u/substackcdn.com/image/fetch/$s_!f7mP!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fa1d728-aeb6-4568-8988-2ad00c191dae_1382x888.png 1272w, /__u/substackcdn.com/image/fetch/$s_!f7mP!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fa1d728-aeb6-4568-8988-2ad00c191dae_1382x888.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The code uses a tiny PIO program to send out data on all pins at the same time. Codex and I wrote it together over the course of an hour. The implementation is brutally simple: it blasts the different bit patterns out across all 23 GPIOs at 115200 Hz.</p><p>Codex also made a C port thats in the repository under <code>pico/</code>. That single C program builds <code>gpio_announcer.uf2</code> that&#8217;s in this <a href="https://github.com/jamesbowman/gpio-announcer/releases/tag/v0.1.0">release</a>. Just drop it into a blank RP2040 and it will announce its pins.</p><p>Thanks for reading.</p><p></p>]]></content:encoded></item><item><title><![CDATA[PulseTrain]]></title><description><![CDATA[One bitbanger to rule them all...]]></description><link>https://excamera.substack.com/p/pulsetrain</link><guid isPermaLink="false">https://excamera.substack.com/p/pulsetrain</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 05 May 2026 16:12:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!PMTn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F285cd010-8308-43d3-bd4f-6d344494e0df_689x431.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What do these things have in common?</p><ul><li><p>The Silicon Labs workhorse EFM8 microcontroller, used in SPIDriver and I2CDriver</p></li><li><p>The WS2812B RGB LED, better known as the Adafruit NeoPixel</p></li><li><p>The CH32V003 RISC-V microcontroller, famously priced at about 10&#162;</p></li><li><p>DHT11 / DHT22 / AM2302 temperature-humidity sensors</p></li><li><p>Dallas / Maxim 1-Wire devices, like DS18B20</p></li></ul><p>They&#8217;re all configured with a 1- or 2-wire protocol that requires timed pulses. Because pulse shape and line turnaround are timing-critical, they require custom low-level code on a microcontroller to implement the protocol.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://gitlab.com/BlueSyncLine/arduino-ch32v003-swio/-/blob/main/swio.c?ref_type=heads">Here&#8217;s an example</a> I was looking at recently. It implements the debug protocol for the CH32V003, in AVR assembly. It&#8217;s technical, fiddly stuff. I&#8217;ve written my share of this kind of thing over the years.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://gitlab.com/BlueSyncLine/arduino-ch32v003-swio/-/blob/main/swio.c?ref_type=heads" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!PMTn!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F285cd010-8308-43d3-bd4f-6d344494e0df_689x431.png 424w, /__u/substackcdn.com/image/fetch/$s_!PMTn!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F285cd010-8308-43d3-bd4f-6d344494e0df_689x431.png 848w, /__u/substackcdn.com/image/fetch/$s_!PMTn!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F285cd010-8308-43d3-bd4f-6d344494e0df_689x431.png 1272w, /__u/substackcdn.com/image/fetch/$s_!PMTn!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F285cd010-8308-43d3-bd4f-6d344494e0df_689x431.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!PMTn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F285cd010-8308-43d3-bd4f-6d344494e0df_689x431.png" width="689" height="431" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/285cd010-8308-43d3-bd4f-6d344494e0df_689x431.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:431,&quot;width&quot;:689,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:69085,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://gitlab.com/BlueSyncLine/arduino-ch32v003-swio/-/blob/main/swio.c?ref_type=heads&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/195753914?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F285cd010-8308-43d3-bd4f-6d344494e0df_689x431.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!PMTn!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F285cd010-8308-43d3-bd4f-6d344494e0df_689x431.png 424w, /__u/substackcdn.com/image/fetch/$s_!PMTn!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F285cd010-8308-43d3-bd4f-6d344494e0df_689x431.png 848w, /__u/substackcdn.com/image/fetch/$s_!PMTn!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F285cd010-8308-43d3-bd4f-6d344494e0df_689x431.png 1272w, /__u/substackcdn.com/image/fetch/$s_!PMTn!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F285cd010-8308-43d3-bd4f-6d344494e0df_689x431.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But all these protocols aren&#8217;t so different, really. They all specify pulse high and low times, within a certain margin. For instance here&#8217;s Adafruit&#8217;s <a href="https://learn.adafruit.com/adafruit-neopixel-uberguide/advanced-coding">documentation</a> on the NeoPixel 1-wire protocol.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!G6Zr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aec001e-c397-4a97-b275-ccd9510063b9_420x200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!G6Zr!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aec001e-c397-4a97-b275-ccd9510063b9_420x200.png 424w, /__u/substackcdn.com/image/fetch/$s_!G6Zr!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aec001e-c397-4a97-b275-ccd9510063b9_420x200.png 848w, /__u/substackcdn.com/image/fetch/$s_!G6Zr!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aec001e-c397-4a97-b275-ccd9510063b9_420x200.png 1272w, /__u/substackcdn.com/image/fetch/$s_!G6Zr!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aec001e-c397-4a97-b275-ccd9510063b9_420x200.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!G6Zr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aec001e-c397-4a97-b275-ccd9510063b9_420x200.png" width="420" height="200" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2aec001e-c397-4a97-b275-ccd9510063b9_420x200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:200,&quot;width&quot;:420,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;leds_timing.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="leds_timing.png" title="leds_timing.png" srcset="/__u/substackcdn.com/image/fetch/$s_!G6Zr!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aec001e-c397-4a97-b275-ccd9510063b9_420x200.png 424w, /__u/substackcdn.com/image/fetch/$s_!G6Zr!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aec001e-c397-4a97-b275-ccd9510063b9_420x200.png 848w, /__u/substackcdn.com/image/fetch/$s_!G6Zr!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aec001e-c397-4a97-b275-ccd9510063b9_420x200.png 1272w, /__u/substackcdn.com/image/fetch/$s_!G6Zr!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aec001e-c397-4a97-b275-ccd9510063b9_420x200.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ntN3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45984e1e-3a5e-460f-923b-00a91c959318_912x175.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ntN3!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45984e1e-3a5e-460f-923b-00a91c959318_912x175.png 424w, /__u/substackcdn.com/image/fetch/$s_!ntN3!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45984e1e-3a5e-460f-923b-00a91c959318_912x175.png 848w, /__u/substackcdn.com/image/fetch/$s_!ntN3!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45984e1e-3a5e-460f-923b-00a91c959318_912x175.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ntN3!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45984e1e-3a5e-460f-923b-00a91c959318_912x175.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ntN3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45984e1e-3a5e-460f-923b-00a91c959318_912x175.png" width="912" height="175" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45984e1e-3a5e-460f-923b-00a91c959318_912x175.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:175,&quot;width&quot;:912,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;leds_times.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="leds_times.png" title="leds_times.png" srcset="/__u/substackcdn.com/image/fetch/$s_!ntN3!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45984e1e-3a5e-460f-923b-00a91c959318_912x175.png 424w, /__u/substackcdn.com/image/fetch/$s_!ntN3!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45984e1e-3a5e-460f-923b-00a91c959318_912x175.png 848w, /__u/substackcdn.com/image/fetch/$s_!ntN3!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45984e1e-3a5e-460f-923b-00a91c959318_912x175.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ntN3!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45984e1e-3a5e-460f-923b-00a91c959318_912x175.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>Imagine you could write some CircuitPython that did this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;76198100-0854-48f2-8602-98d13d67c51c&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">import pulsetrain

pt = pulsetrain.PulseTrain(board.GP0, 2_500_000) # each tick is 0.4 us
code0 = "HLL"
code1 = "HHL"
pt.drive("H")              # line high by default
pt.drive(code0 * 24 + "H") # set neopixel to black, 24 zeroes
pt.drive(code1 * 24 + "H") # set neopixel to white, 24 ones</code></pre></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!KNSx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d1a4bbf-baf2-4e11-90c9-cd806fef703d_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!KNSx!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d1a4bbf-baf2-4e11-90c9-cd806fef703d_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!KNSx!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d1a4bbf-baf2-4e11-90c9-cd806fef703d_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!KNSx!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d1a4bbf-baf2-4e11-90c9-cd806fef703d_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!KNSx!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d1a4bbf-baf2-4e11-90c9-cd806fef703d_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!KNSx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d1a4bbf-baf2-4e11-90c9-cd806fef703d_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d1a4bbf-baf2-4e11-90c9-cd806fef703d_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3364955,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/195753914?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d1a4bbf-baf2-4e11-90c9-cd806fef703d_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!KNSx!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d1a4bbf-baf2-4e11-90c9-cd806fef703d_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!KNSx!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d1a4bbf-baf2-4e11-90c9-cd806fef703d_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!KNSx!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d1a4bbf-baf2-4e11-90c9-cd806fef703d_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!KNSx!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d1a4bbf-baf2-4e11-90c9-cd806fef703d_1920x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You wouldn&#8217;t need to count cycles; pulseTrain takes care of the bit timing. Each call to <code>pt.drive() </code>guarantees a precise pulse train. The control string is made of single characters for line operations, and integers for pauses.</p><ul><li><p><code>L</code> line low</p></li><li><p><code>H</code> line high</p></li><li><p><code>z</code> tristate bus</p></li><li><p><code>i</code> read input</p></li><li><p><em>n</em> delay n ticks</p></li></ul><p>Some examples, rendered with the excellent <a href="https://wavedrom.com/">wavedrom</a>. A single pulse</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!CjAh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5190280b-55a8-4bc5-ab13-90ed01664942_740x96.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!CjAh!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5190280b-55a8-4bc5-ab13-90ed01664942_740x96.png 424w, /__u/substackcdn.com/image/fetch/$s_!CjAh!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5190280b-55a8-4bc5-ab13-90ed01664942_740x96.png 848w, /__u/substackcdn.com/image/fetch/$s_!CjAh!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5190280b-55a8-4bc5-ab13-90ed01664942_740x96.png 1272w, /__u/substackcdn.com/image/fetch/$s_!CjAh!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5190280b-55a8-4bc5-ab13-90ed01664942_740x96.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!CjAh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5190280b-55a8-4bc5-ab13-90ed01664942_740x96.png" width="740" height="96" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5190280b-55a8-4bc5-ab13-90ed01664942_740x96.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:96,&quot;width&quot;:740,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3768,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/195753914?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5190280b-55a8-4bc5-ab13-90ed01664942_740x96.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!CjAh!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5190280b-55a8-4bc5-ab13-90ed01664942_740x96.png 424w, /__u/substackcdn.com/image/fetch/$s_!CjAh!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5190280b-55a8-4bc5-ab13-90ed01664942_740x96.png 848w, /__u/substackcdn.com/image/fetch/$s_!CjAh!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5190280b-55a8-4bc5-ab13-90ed01664942_740x96.png 1272w, /__u/substackcdn.com/image/fetch/$s_!CjAh!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5190280b-55a8-4bc5-ab13-90ed01664942_740x96.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>A repeating 7-tick square wave with a 4:3 duty cycle </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!kEme!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9372a93-257c-494f-8e6f-d2be25f821df_660x96.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!kEme!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9372a93-257c-494f-8e6f-d2be25f821df_660x96.png 424w, /__u/substackcdn.com/image/fetch/$s_!kEme!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9372a93-257c-494f-8e6f-d2be25f821df_660x96.png 848w, /__u/substackcdn.com/image/fetch/$s_!kEme!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9372a93-257c-494f-8e6f-d2be25f821df_660x96.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kEme!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9372a93-257c-494f-8e6f-d2be25f821df_660x96.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!kEme!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9372a93-257c-494f-8e6f-d2be25f821df_660x96.png" width="660" height="96" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9372a93-257c-494f-8e6f-d2be25f821df_660x96.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:96,&quot;width&quot;:660,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4666,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/195753914?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9372a93-257c-494f-8e6f-d2be25f821df_660x96.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!kEme!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9372a93-257c-494f-8e6f-d2be25f821df_660x96.png 424w, /__u/substackcdn.com/image/fetch/$s_!kEme!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9372a93-257c-494f-8e6f-d2be25f821df_660x96.png 848w, /__u/substackcdn.com/image/fetch/$s_!kEme!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9372a93-257c-494f-8e6f-d2be25f821df_660x96.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kEme!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9372a93-257c-494f-8e6f-d2be25f821df_660x96.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Two single cycle high pulses separated by 8 low ticks.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Aa2Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F109832b6-a8ca-432a-aaed-d5ce8cca901e_580x96.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Aa2Z!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F109832b6-a8ca-432a-aaed-d5ce8cca901e_580x96.png 424w, /__u/substackcdn.com/image/fetch/$s_!Aa2Z!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F109832b6-a8ca-432a-aaed-d5ce8cca901e_580x96.png 848w, /__u/substackcdn.com/image/fetch/$s_!Aa2Z!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F109832b6-a8ca-432a-aaed-d5ce8cca901e_580x96.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Aa2Z!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F109832b6-a8ca-432a-aaed-d5ce8cca901e_580x96.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Aa2Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F109832b6-a8ca-432a-aaed-d5ce8cca901e_580x96.png" width="580" height="96" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/109832b6-a8ca-432a-aaed-d5ce8cca901e_580x96.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:96,&quot;width&quot;:580,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4223,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/195753914?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F109832b6-a8ca-432a-aaed-d5ce8cca901e_580x96.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Aa2Z!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F109832b6-a8ca-432a-aaed-d5ce8cca901e_580x96.png 424w, /__u/substackcdn.com/image/fetch/$s_!Aa2Z!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F109832b6-a8ca-432a-aaed-d5ce8cca901e_580x96.png 848w, /__u/substackcdn.com/image/fetch/$s_!Aa2Z!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F109832b6-a8ca-432a-aaed-d5ce8cca901e_580x96.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Aa2Z!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F109832b6-a8ca-432a-aaed-d5ce8cca901e_580x96.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>So much for output. Input uses the &#8220;<code>i</code>&#8221; code, which samples one bit from the line. The library packs these bits into bytes which can be read out with <code>pt.read()</code>. So a protocol that sends a pulse then expects a transmitted bit (like the microcontroller 1-wire debug schemes), we have:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;2e9159eb-1150-40dc-a009-0a312f64c52f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">H L z i</code></pre></div><p>Which outputs a high/low pulse, then tristates the line and reads a bit.</p><p>Currently the implementation runs on RP2040 CircuitPython. It only supports a single I/O line right now, but it seems not too difficult to get it running with 2 or more lines. It doesn&#8217;t have any external dependencies. It&#8217;s in <a href="https://github.com/jamesbowman/rp2040-circuitpython-pulsetrain">https://github.com/jamesbowman/rp2040-circuitpython-pulsetrain</a>. There are a couple of examples there. <code>example-neopixel.py</code> drives the neopixel strip in the photo above. <code>example-ch32v.py</code> is a simple but complete programmer for the CH32V003 microcontroller.</p><p>The implementation uses RP2040&#8217;s PIO block, and was, ah, interesting. PIO is hard, and I&#8217;m feeling that PulseTrain is an easier way to get results.  The library is a work-in-progress right now, but I&#8217;ll be adding some more features soon, including multi-signal support.</p><p>Thanks for reading.</p><p></p><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Printable wifi code ornament]]></title><description><![CDATA[Yes, I vibe coded this]]></description><link>https://excamera.substack.com/p/printable-wifi-code-ornament</link><guid isPermaLink="false">https://excamera.substack.com/p/printable-wifi-code-ornament</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 27 Jan 2026 17:46:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!b18J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05c4342-07d1-46ac-900c-ff017269fa6a_1920x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We are expecting houseguests next week. This concentrates the mind wonderfully. One small thing is sharing the wifi details with our millenial visitors.  QR codes for wifi work great &#8212; you just point your phone camera at the code and it adds the network details. I&#8217;ve previously printed these out on a piece of paper (so lame!). In the shower this morning I thought of turning the code onto a dangling mobile (so cool!).</p><p>Here&#8217;s the result.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!b18J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05c4342-07d1-46ac-900c-ff017269fa6a_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!b18J!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05c4342-07d1-46ac-900c-ff017269fa6a_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!b18J!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05c4342-07d1-46ac-900c-ff017269fa6a_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!b18J!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05c4342-07d1-46ac-900c-ff017269fa6a_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!b18J!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05c4342-07d1-46ac-900c-ff017269fa6a_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!b18J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05c4342-07d1-46ac-900c-ff017269fa6a_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f05c4342-07d1-46ac-900c-ff017269fa6a_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1582958,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/185903359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05c4342-07d1-46ac-900c-ff017269fa6a_1920x1080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!b18J!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05c4342-07d1-46ac-900c-ff017269fa6a_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!b18J!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05c4342-07d1-46ac-900c-ff017269fa6a_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!b18J!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05c4342-07d1-46ac-900c-ff017269fa6a_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!b18J!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05c4342-07d1-46ac-900c-ff017269fa6a_1920x1080.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>All you do is line up a light background behind the mobile, turn on the camera, and your phone joins the network.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/excamera.substack.com/subscribe"><span>Subscribe now</span></a></p><p>The code is at <a href="https://github.com/jamesbowman/wifi_qr_mobile">https://github.com/jamesbowman/wifi_qr_mobile</a><br>Usage instructions are in the README.md - the script generates the .scad file.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!y68u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1f99274-424a-4089-b6e1-fe29075a1dc4_1214x683.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!y68u!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1f99274-424a-4089-b6e1-fe29075a1dc4_1214x683.png 424w, /__u/substackcdn.com/image/fetch/$s_!y68u!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1f99274-424a-4089-b6e1-fe29075a1dc4_1214x683.png 848w, /__u/substackcdn.com/image/fetch/$s_!y68u!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1f99274-424a-4089-b6e1-fe29075a1dc4_1214x683.png 1272w, /__u/substackcdn.com/image/fetch/$s_!y68u!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1f99274-424a-4089-b6e1-fe29075a1dc4_1214x683.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!y68u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1f99274-424a-4089-b6e1-fe29075a1dc4_1214x683.png" width="1214" height="683" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1f99274-424a-4089-b6e1-fe29075a1dc4_1214x683.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:683,&quot;width&quot;:1214,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:62687,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/185903359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1f99274-424a-4089-b6e1-fe29075a1dc4_1214x683.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!y68u!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1f99274-424a-4089-b6e1-fe29075a1dc4_1214x683.png 424w, /__u/substackcdn.com/image/fetch/$s_!y68u!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1f99274-424a-4089-b6e1-fe29075a1dc4_1214x683.png 848w, /__u/substackcdn.com/image/fetch/$s_!y68u!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1f99274-424a-4089-b6e1-fe29075a1dc4_1214x683.png 1272w, /__u/substackcdn.com/image/fetch/$s_!y68u!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1f99274-424a-4089-b6e1-fe29075a1dc4_1214x683.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Printing time on the Bambu is about 90 minutes.</p><h2>Also lasers</h2><p>It also supports an <code>&#8212;svg_out</code> option for use with laser cutters. This is a lot quicker.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!_n1N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f283aee-b4f2-4346-b578-93467da61015_889x516.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!_n1N!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f283aee-b4f2-4346-b578-93467da61015_889x516.png 424w, /__u/substackcdn.com/image/fetch/$s_!_n1N!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f283aee-b4f2-4346-b578-93467da61015_889x516.png 848w, /__u/substackcdn.com/image/fetch/$s_!_n1N!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f283aee-b4f2-4346-b578-93467da61015_889x516.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_n1N!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f283aee-b4f2-4346-b578-93467da61015_889x516.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!_n1N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f283aee-b4f2-4346-b578-93467da61015_889x516.png" width="889" height="516" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2f283aee-b4f2-4346-b578-93467da61015_889x516.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:516,&quot;width&quot;:889,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20045,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/185903359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f283aee-b4f2-4346-b578-93467da61015_889x516.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!_n1N!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f283aee-b4f2-4346-b578-93467da61015_889x516.png 424w, /__u/substackcdn.com/image/fetch/$s_!_n1N!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f283aee-b4f2-4346-b578-93467da61015_889x516.png 848w, /__u/substackcdn.com/image/fetch/$s_!_n1N!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f283aee-b4f2-4346-b578-93467da61015_889x516.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_n1N!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f283aee-b4f2-4346-b578-93467da61015_889x516.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!1byR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20452a8a-99f5-46fe-b6d3-2f61859feb9a_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!1byR!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20452a8a-99f5-46fe-b6d3-2f61859feb9a_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!1byR!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20452a8a-99f5-46fe-b6d3-2f61859feb9a_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!1byR!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20452a8a-99f5-46fe-b6d3-2f61859feb9a_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!1byR!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20452a8a-99f5-46fe-b6d3-2f61859feb9a_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!1byR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20452a8a-99f5-46fe-b6d3-2f61859feb9a_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20452a8a-99f5-46fe-b6d3-2f61859feb9a_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1478453,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/185903359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20452a8a-99f5-46fe-b6d3-2f61859feb9a_1920x1080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!1byR!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20452a8a-99f5-46fe-b6d3-2f61859feb9a_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!1byR!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20452a8a-99f5-46fe-b6d3-2f61859feb9a_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!1byR!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20452a8a-99f5-46fe-b6d3-2f61859feb9a_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!1byR!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20452a8a-99f5-46fe-b6d3-2f61859feb9a_1920x1080.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">laser cut from thick paper</figcaption></figure></div><p></p><h2>How it works</h2><p>The script takes some wifi options, generates a QR code image, then outputs an OpenSCAD model with a hole for every white pixel in the code. It can also generate a similar SVG file for a laser cutter.</p><h2>AI wrote the code</h2><p>Firstly, none of this post&#8217;s text was AI generated.</p><p>However, ChatGPT Codex wrote the code. I built it up step by step, with a couple of git commits when things were looking ok. I did make a couple of manual edits for aesthetics. I was really impressed when it refactored the OpenSCAD generator to optimize rendering time. It would have taken me an maybe half an hour. It took Codex 30 seconds.</p><p>I&#8217;ve always been able to make things out of code. It&#8217;s much easier to do that now.</p><p>Thanks for reading.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Losing things less often, part one]]></title><description><![CDATA[Printed codes expedite retrieval]]></description><link>https://excamera.substack.com/p/losing-things-less-often-part-one</link><guid isPermaLink="false">https://excamera.substack.com/p/losing-things-less-often-part-one</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 06 Jan 2026 17:45:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!J1Ru!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f602df-39ed-4925-b3e3-06c037193f85_1944x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>How much time do you spend looking for stuff? For me a few years ago, the answer was &#8220;a lot.&#8221; Then I started to store items in standard-sized labeled boxes.  &#8220;Pizza&#8221; boxes for larger things. Mailing boxes for smaller things.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!J1Ru!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f602df-39ed-4925-b3e3-06c037193f85_1944x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!J1Ru!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f602df-39ed-4925-b3e3-06c037193f85_1944x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!J1Ru!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f602df-39ed-4925-b3e3-06c037193f85_1944x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!J1Ru!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f602df-39ed-4925-b3e3-06c037193f85_1944x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!J1Ru!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f602df-39ed-4925-b3e3-06c037193f85_1944x720.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!J1Ru!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f602df-39ed-4925-b3e3-06c037193f85_1944x720.png" width="1456" height="539" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3f602df-39ed-4925-b3e3-06c037193f85_1944x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:539,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2216980,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/182219904?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f602df-39ed-4925-b3e3-06c037193f85_1944x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!J1Ru!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f602df-39ed-4925-b3e3-06c037193f85_1944x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!J1Ru!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f602df-39ed-4925-b3e3-06c037193f85_1944x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!J1Ru!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f602df-39ed-4925-b3e3-06c037193f85_1944x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!J1Ru!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f602df-39ed-4925-b3e3-06c037193f85_1944x720.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This worked well. Perhaps too well, as there are now about 150 boxes. I find that I&#8217;m spending an increasing amount of time searching for any particular box.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>So I&#8217;ve been experimenting with a scheme of:</p><ol><li><p>labeling the boxes with printed QR codes</p></li><li><p>taking photographs of the shelves</p></li><li><p>making some software to make a physical search engine. The goal is to type &#8220;metric&#8221; (for example) and be shown the locations of boxes with &#8220;metric&#8221; on the label.</p></li></ol><p>Talking this plan over with ChatGPT, it pointed out that <a href="https://fukuchi.org/works/qrencode/">qrencode</a> supports something called &#8220;Micro QR Code.&#8221; This is a version of QR Code that uses a smaller area than the usual version, but with a very limited data capacity. That&#8217;s good: simpler QR codes mean that they will be more legible in photographs.</p><p>Here&#8217;s the string &#8220;254&#8221; encoded as a regular QR code, and as a Micro QR code. For the Micro QR the active area is just 11x11 pixels.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!mEjz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133bfe21-1920-4a9f-ada9-71e75a6918a0_624x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!mEjz!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133bfe21-1920-4a9f-ada9-71e75a6918a0_624x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!mEjz!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133bfe21-1920-4a9f-ada9-71e75a6918a0_624x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!mEjz!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133bfe21-1920-4a9f-ada9-71e75a6918a0_624x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!mEjz!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133bfe21-1920-4a9f-ada9-71e75a6918a0_624x300.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!mEjz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133bfe21-1920-4a9f-ada9-71e75a6918a0_624x300.png" width="624" height="300" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/133bfe21-1920-4a9f-ada9-71e75a6918a0_624x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:624,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2127,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/182219904?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133bfe21-1920-4a9f-ada9-71e75a6918a0_624x300.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!mEjz!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133bfe21-1920-4a9f-ada9-71e75a6918a0_624x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!mEjz!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133bfe21-1920-4a9f-ada9-71e75a6918a0_624x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!mEjz!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133bfe21-1920-4a9f-ada9-71e75a6918a0_624x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!mEjz!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133bfe21-1920-4a9f-ada9-71e75a6918a0_624x300.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Support for Micro codes is not universal. Many packages only handle regular QR codes. But fortunately qrencode supports it for encode, and <a href="https://pypi.org/project/zxing/">zxing</a> supports it for decode. </p><p>Just to be clear, instead of encoding the box text on the label, the idea is to use a 3-digit code which is an index into a database.</p><p>After some quick experiments, I had a run of of labels for a test, and I wasted no time in sticking them onto the boxes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Wf_R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff14fe8bc-d6aa-46d9-95c4-1488b0ff0221_3840x2977.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Wf_R!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff14fe8bc-d6aa-46d9-95c4-1488b0ff0221_3840x2977.png 424w, /__u/substackcdn.com/image/fetch/$s_!Wf_R!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff14fe8bc-d6aa-46d9-95c4-1488b0ff0221_3840x2977.png 848w, /__u/substackcdn.com/image/fetch/$s_!Wf_R!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff14fe8bc-d6aa-46d9-95c4-1488b0ff0221_3840x2977.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Wf_R!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff14fe8bc-d6aa-46d9-95c4-1488b0ff0221_3840x2977.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Wf_R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff14fe8bc-d6aa-46d9-95c4-1488b0ff0221_3840x2977.png" width="1456" height="1129" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f14fe8bc-d6aa-46d9-95c4-1488b0ff0221_3840x2977.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1129,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:13670084,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/182219904?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff14fe8bc-d6aa-46d9-95c4-1488b0ff0221_3840x2977.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Wf_R!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff14fe8bc-d6aa-46d9-95c4-1488b0ff0221_3840x2977.png 424w, /__u/substackcdn.com/image/fetch/$s_!Wf_R!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff14fe8bc-d6aa-46d9-95c4-1488b0ff0221_3840x2977.png 848w, /__u/substackcdn.com/image/fetch/$s_!Wf_R!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff14fe8bc-d6aa-46d9-95c4-1488b0ff0221_3840x2977.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Wf_R!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff14fe8bc-d6aa-46d9-95c4-1488b0ff0221_3840x2977.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The &#8220;database&#8221; is just a Python module that lists each code and the box label. It looks like this:</p><pre><code>stuff = [
(100, "Flash 8-DIP 3.3v"),
(101, "USB UARTs"),
(102, "Crimp Terminals"),
(103, "IMXS MIPI"),
(104, "18650 Holders"),
(105, "space IMX577"),
(106, "VA800-SPI"),
(107, "FF Jumpers"),
(108, "Fixture Clamps"),
(109, "IPS 240x320"),
(110, "Brushes"),
...</code></pre><p>So how will it do? Reliably recognizing QR codes needs plenty of resolution for each code. Here&#8217;s a blow-up from the above cell-phone picture. The code itself is about 150x150 pixels. That&#8217;s encouraging.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!359I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa725a40d-00a5-47a8-ab5c-73702cd0618a_546x341.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!359I!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa725a40d-00a5-47a8-ab5c-73702cd0618a_546x341.png 424w, /__u/substackcdn.com/image/fetch/$s_!359I!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa725a40d-00a5-47a8-ab5c-73702cd0618a_546x341.png 848w, /__u/substackcdn.com/image/fetch/$s_!359I!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa725a40d-00a5-47a8-ab5c-73702cd0618a_546x341.png 1272w, /__u/substackcdn.com/image/fetch/$s_!359I!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa725a40d-00a5-47a8-ab5c-73702cd0618a_546x341.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!359I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa725a40d-00a5-47a8-ab5c-73702cd0618a_546x341.png" width="546" height="341" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a725a40d-00a5-47a8-ab5c-73702cd0618a_546x341.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:341,&quot;width&quot;:546,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:228270,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/182219904?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa725a40d-00a5-47a8-ab5c-73702cd0618a_546x341.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!359I!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa725a40d-00a5-47a8-ab5c-73702cd0618a_546x341.png 424w, /__u/substackcdn.com/image/fetch/$s_!359I!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa725a40d-00a5-47a8-ab5c-73702cd0618a_546x341.png 848w, /__u/substackcdn.com/image/fetch/$s_!359I!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa725a40d-00a5-47a8-ab5c-73702cd0618a_546x341.png 1272w, /__u/substackcdn.com/image/fetch/$s_!359I!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa725a40d-00a5-47a8-ab5c-73702cd0618a_546x341.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And plugging the image into zxing returned matches for every code. zxing does appear to have a limit of 255 codes per image. I doubt I&#8217;ll run into this with my use case.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!qobi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb811ffe-1b53-49e1-8977-61ae64044fb1_3840x1392.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!qobi!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb811ffe-1b53-49e1-8977-61ae64044fb1_3840x1392.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!qobi!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb811ffe-1b53-49e1-8977-61ae64044fb1_3840x1392.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!qobi!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb811ffe-1b53-49e1-8977-61ae64044fb1_3840x1392.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!qobi!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb811ffe-1b53-49e1-8977-61ae64044fb1_3840x1392.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!qobi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb811ffe-1b53-49e1-8977-61ae64044fb1_3840x1392.jpeg" width="1456" height="528" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb811ffe-1b53-49e1-8977-61ae64044fb1_3840x1392.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:528,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:486554,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/182219904?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb811ffe-1b53-49e1-8977-61ae64044fb1_3840x1392.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!qobi!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb811ffe-1b53-49e1-8977-61ae64044fb1_3840x1392.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!qobi!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb811ffe-1b53-49e1-8977-61ae64044fb1_3840x1392.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!qobi!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb811ffe-1b53-49e1-8977-61ae64044fb1_3840x1392.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!qobi!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb811ffe-1b53-49e1-8977-61ae64044fb1_3840x1392.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And the final part is to make a self-contained page that does the search and shows the results. Here&#8217;s <a href="https://excamera.com/files/private/879b36a7a4/index.html">the one-page app</a>, set up as a quick demo for just a couple of shelves.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!4ZfB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6597ce1-7f44-4b7f-8097-1dd5690a78c1_1903x807.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!4ZfB!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6597ce1-7f44-4b7f-8097-1dd5690a78c1_1903x807.png 424w, /__u/substackcdn.com/image/fetch/$s_!4ZfB!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6597ce1-7f44-4b7f-8097-1dd5690a78c1_1903x807.png 848w, /__u/substackcdn.com/image/fetch/$s_!4ZfB!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6597ce1-7f44-4b7f-8097-1dd5690a78c1_1903x807.png 1272w, /__u/substackcdn.com/image/fetch/$s_!4ZfB!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6597ce1-7f44-4b7f-8097-1dd5690a78c1_1903x807.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!4ZfB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6597ce1-7f44-4b7f-8097-1dd5690a78c1_1903x807.png" width="1456" height="617" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6597ce1-7f44-4b7f-8097-1dd5690a78c1_1903x807.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:617,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1792694,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/182219904?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6597ce1-7f44-4b7f-8097-1dd5690a78c1_1903x807.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!4ZfB!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6597ce1-7f44-4b7f-8097-1dd5690a78c1_1903x807.png 424w, /__u/substackcdn.com/image/fetch/$s_!4ZfB!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6597ce1-7f44-4b7f-8097-1dd5690a78c1_1903x807.png 848w, /__u/substackcdn.com/image/fetch/$s_!4ZfB!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6597ce1-7f44-4b7f-8097-1dd5690a78c1_1903x807.png 1272w, /__u/substackcdn.com/image/fetch/$s_!4ZfB!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6597ce1-7f44-4b7f-8097-1dd5690a78c1_1903x807.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The code for all this is in the <a href="https://github.com/jamesbowman/findstuff">findstuff</a> repo on github.  </p><h1>Next steps, thoughts</h1><p>Now that the basic idea seems to be working, I&#8217;m going to apply labels to all 150 boxes.</p><p>Then probably tidy up a bit. Throw out old boxes, consolidate contents. Maybe split some boxes. But here&#8217;s the thing. Because the box catalog is in git, these changes are more like a refactor than a tidy up.</p><p>This system means that I can have a lot more boxes. As long as I can remember the name of something, I can find it again. This will likely change how I keep and organize my stuff in the future.</p><h1>How ChatGPT helped</h1><p>I use ChatGPT a lot, and this weekend project was no exception.</p><p>It helped generate the box labels for the initial import. I uploaded photographs of all the boxes and it did a pretty good job (~90% accuracy) of extracting the text of the labels.</p><p>Some of the pieces of the Python scripts to generate the labels was written by ChatGPT, as was the interactive web page search.</p><p><a href="https://chatgpt.com/share/69591ae2-c250-8006-8ae5-1058f159f3a1">This conversation</a> about the most legible (for humans) font for the labels was pretty helpful.</p><p>None of this article was written with AI. The typos, digressions and non-sequiturs are all human-generated.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Chicken coop tech stack]]></title><description><![CDATA[Cluck cluck, beep beep]]></description><link>https://excamera.substack.com/p/chicken-coop-tech-stack</link><guid isPermaLink="false">https://excamera.substack.com/p/chicken-coop-tech-stack</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 04 Nov 2025 20:08:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mkIG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1303c5-cd88-4844-b4b6-8cf1527da704_1080x1471.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>(First a brief note about products and shipping. <a href="https://store.excamera.com/product/spidriver">SPIDriver</a> and the <a href="https://store.excamera.com/product/spidriver-expert-pack">SPIDriver Expert Pack</a> are back in stock. <a href="https://termdriver.com/">TermDriver</a> has shipped to all the backers, and it&#8217;s available to buy from <a href="https://www.crowdsupply.com/excamera/termdriver-2#products">Crowd Supply</a>, <a href="https://www.mouser.com/ProductDetail/Crowd-Supply/TERMDRIVER-01?qs=HMhDvBYWqvNnjB%252BPuU7MTg%3D%3D">Mouser</a>, and <a href="https://store.excamera.com/product/termdriver-2">directly from us</a>. If you are a new owner of a TermDriver, you can get the preliminary user guide <a href="https://termdriver.com/termdriver2.pdf">here</a>.)</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/excamera.substack.com/subscribe"><span>Subscribe now</span></a></p><p>Our chicken coop is a short distance away from our house. Far enough away that it doesn&#8217;t have electricity. This led me to install a small solar panel and a battery in the coop, to power indoor lights. The lights run on 12V DC from the battery, and are a great convenience when locking the birds up in the winter nights.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!u5nJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbca6e0-543b-407c-b573-2087cb2b94ec_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!u5nJ!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbca6e0-543b-407c-b573-2087cb2b94ec_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!u5nJ!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbca6e0-543b-407c-b573-2087cb2b94ec_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!u5nJ!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbca6e0-543b-407c-b573-2087cb2b94ec_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!u5nJ!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbca6e0-543b-407c-b573-2087cb2b94ec_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!u5nJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbca6e0-543b-407c-b573-2087cb2b94ec_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cbbca6e0-543b-407c-b573-2087cb2b94ec_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1640266,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/177894407?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbca6e0-543b-407c-b573-2087cb2b94ec_1920x1080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!u5nJ!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbca6e0-543b-407c-b573-2087cb2b94ec_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!u5nJ!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbca6e0-543b-407c-b573-2087cb2b94ec_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!u5nJ!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbca6e0-543b-407c-b573-2087cb2b94ec_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!u5nJ!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbbca6e0-543b-407c-b573-2087cb2b94ec_1920x1080.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>At this point, of course, I was filled with an irresistible desire to remotely monitor the solar battery voltage. And if I was going to monitor that, I&#8217;d also like to know if the coop door was open or not. (The coop must be locked up every night, and opened up every morning.)</p><p>So this got made. Not pretty, of course, like everything about the chicken coop, but it&#8217;s worked very well.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!mkIG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1303c5-cd88-4844-b4b6-8cf1527da704_1080x1471.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!mkIG!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1303c5-cd88-4844-b4b6-8cf1527da704_1080x1471.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!mkIG!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1303c5-cd88-4844-b4b6-8cf1527da704_1080x1471.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!mkIG!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1303c5-cd88-4844-b4b6-8cf1527da704_1080x1471.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!mkIG!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1303c5-cd88-4844-b4b6-8cf1527da704_1080x1471.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!mkIG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1303c5-cd88-4844-b4b6-8cf1527da704_1080x1471.jpeg" width="1080" height="1471" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b1303c5-cd88-4844-b4b6-8cf1527da704_1080x1471.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1471,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1100441,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/177894407?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1303c5-cd88-4844-b4b6-8cf1527da704_1080x1471.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!mkIG!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1303c5-cd88-4844-b4b6-8cf1527da704_1080x1471.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!mkIG!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1303c5-cd88-4844-b4b6-8cf1527da704_1080x1471.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!mkIG!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1303c5-cd88-4844-b4b6-8cf1527da704_1080x1471.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!mkIG!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b1303c5-cd88-4844-b4b6-8cf1527da704_1080x1471.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The box is cut from plywood using a customized design from the excellent <a href="https://boxes.hackerspace-bamberg.de/ElectronicsBox?language=en">boxes.py</a>. Running the show is a Raspberry Pi Pico. It&#8217;s powered by the 12V the solar battery supply. A regulator drops it to 5V. The Pico has three sensors:</p><ul><li><p>battery voltage, connected through a resistor divider to an ADC pin</p></li><li><p>an I&#178;C temperature sensor from <a href="https://electricdollarstore.com/temp.html">Electric Dollar Store</a></p></li><li><p>an I&#178;C magnetic compass, also from <a href="https://electricdollarstore.com/magnet.html">EDS</a></p></li></ul><p>The Pico is collects the data and sends it back via the <a href="https://amzn.to/4hEnCGK">Reyax LORA</a> module at the top of the box. The Reyax uses a simple serial interface at 115200 baud, with a good old AT-style command set for sending messages.</p><p>Every 60 seconds the Pico wakes up, samples the sensors, and sends a packet over the Lora with the sensors in JSON format like this:</p><pre><code>{&#8221;magnet&#8221;: [-138, 104, -774], &#8220;vbatt&#8221;: 12.9571, &#8220;temp&#8221;: 13.625}</code></pre><p>At this point you might be wondering why I&#8217;m interested in the direction and magnitude of Earth&#8217;s magnetic field in the henhouse. Well, the whole box is mounted on the henhouse door:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!herz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F573d0b2e-6988-4d1d-b7f5-41abd39e5827_6016x4016.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!herz!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F573d0b2e-6988-4d1d-b7f5-41abd39e5827_6016x4016.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!herz!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F573d0b2e-6988-4d1d-b7f5-41abd39e5827_6016x4016.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!herz!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F573d0b2e-6988-4d1d-b7f5-41abd39e5827_6016x4016.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!herz!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F573d0b2e-6988-4d1d-b7f5-41abd39e5827_6016x4016.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!herz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F573d0b2e-6988-4d1d-b7f5-41abd39e5827_6016x4016.jpeg" width="1456" height="2181" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/573d0b2e-6988-4d1d-b7f5-41abd39e5827_6016x4016.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2181,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16003692,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/177894407?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F573d0b2e-6988-4d1d-b7f5-41abd39e5827_6016x4016.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!herz!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F573d0b2e-6988-4d1d-b7f5-41abd39e5827_6016x4016.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!herz!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F573d0b2e-6988-4d1d-b7f5-41abd39e5827_6016x4016.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!herz!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F573d0b2e-6988-4d1d-b7f5-41abd39e5827_6016x4016.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!herz!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F573d0b2e-6988-4d1d-b7f5-41abd39e5827_6016x4016.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When the door is opened, it swings through almost 180&#176; and the resultant change in compass bearing is easily turned into a door open/door closed flag. I was particularly pleased with this cunning scheme - the door sensor uses no moving parts! (Unless you count the whole electronics package itself as a moving part, which I don&#8217;t).</p><p>Back at the base, another Reyax receives the packets and is connected through a <a href="https://termdriver.com/">TermDriver</a> to a Raspberry Pi.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!lHVo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc5ffa7-0bc0-41e9-bec3-ad90205a9e4f_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!lHVo!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc5ffa7-0bc0-41e9-bec3-ad90205a9e4f_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!lHVo!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc5ffa7-0bc0-41e9-bec3-ad90205a9e4f_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!lHVo!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc5ffa7-0bc0-41e9-bec3-ad90205a9e4f_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!lHVo!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc5ffa7-0bc0-41e9-bec3-ad90205a9e4f_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!lHVo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc5ffa7-0bc0-41e9-bec3-ad90205a9e4f_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fcc5ffa7-0bc0-41e9-bec3-ad90205a9e4f_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1705009,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/177894407?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc5ffa7-0bc0-41e9-bec3-ad90205a9e4f_1920x1080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!lHVo!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc5ffa7-0bc0-41e9-bec3-ad90205a9e4f_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!lHVo!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc5ffa7-0bc0-41e9-bec3-ad90205a9e4f_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!lHVo!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc5ffa7-0bc0-41e9-bec3-ad90205a9e4f_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!lHVo!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc5ffa7-0bc0-41e9-bec3-ad90205a9e4f_1920x1080.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The Pi reads the JSON data and sends it on to the house MQTT server, which is <a href="https://mosquitto.org/">Mosquitto</a> running on another Raspberry Pi.</p><p>One improvement I made last year is to hook up a lamp in the house to the door open/closed logic, using a <a href="https://amzn.to/3JHdznU">Shelly Smart Plug</a>. Besides all their cloud/smarthome features (which I don&#8217;t use) they have a simple web server for off/on control. So you can switch the socket off or on by fetching a single URL from the Shelly like:</p><pre><code>http://192.168.0.60/relay/0?turn=on</code></pre><p>As soon as the receiver sees that the door has been closed, it turns on the lamp in the house. This works very well; we can easily confirm that one of us has locked the chickens in each evening just because the lamp has gone on. We don&#8217;t have to look at a screen or remember to check anything. I particularly like this kind of invisible technology.</p><p>I should say a few words about the software. The Pico in the coop runs a small CircuitPython loop. The receiver Lora/MQTT gateway indoors is just a small Python script. It&#8217;s simple stuff, reliable and easy to diagnose if anything goes wrong.</p><p>Thanks for reading.</p><p></p>]]></content:encoded></item><item><title><![CDATA[The great ADS1115 pricing mystery, part two]]></title><description><![CDATA[Is ignorance bliss?]]></description><link>https://excamera.substack.com/p/the-great-ads1115-pricing-mystery</link><guid isPermaLink="false">https://excamera.substack.com/p/the-great-ads1115-pricing-mystery</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 21 Oct 2025 16:45:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RFAf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87def192-3ba7-41b7-97a4-070f077625b8_862x485.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week I <a href="/__u/excamera.substack.com/p/how-bad-can-a-297-adc-be">talked</a> about the peculiar pricing of the very popular TI ADC, the ADS1115. In a nutshell, you can buy it for either about $4 or for $0.50, depending on the supplier. US suppliers like Mouser and Digikey sell at the high price, Chinese LCSC sells at the lower. This definitely prompted a lot of discussion. This week the authentic ADS1115 arrived, and I have some new findings to report.</p><p>I&#8217;ll do my best to describe the theories, and <em>then</em> list objections.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/excamera.substack.com/subscribe"><span>Subscribe now</span></a></p><h2>Simple price discrimination</h2><p>Price discrimination is the economics term for charging different prices to different customers. For example in some places taxis charge different prices for tourists and locals. It&#8217;s a well-understood phenomenon, and the excellent MRU economics course <a href="https://mru.org/courses/principles-economics-microeconomics/price-discrimination-examples-airlines-arbitrage">explains it in full</a>.</p><p>This situation looks like price discrimination. TI is the monopoly supplier of ADS1115 chips &#8212; nobody else can make and sell an ADS1115. TI knows that US customers are much less price-sensitive than Chinese customers, so sets a higher price in the US.</p><p>Alternately, US distributors (Mouser and Digikey) set the higher price, using their dominant supply position and reputation to sell to customers who are prepared to pay a premium to be certain about authenticity.</p><p>In the MRU video, note that the price setters in the examples like ambiguity. They won&#8217;t confirm or deny that they&#8217;re selling the same product at two different prices. In fact they often do things to increase ambiguity, because the uncertainty encourages people to buy the premium parts.</p><h2>Failed units, or &#8220;third shift&#8221;</h2><p>During manufacturing, some chips fail. What happens to them? Well, it depends. They might get destroyed, or they might get sold on to a third party. The failed parts can be packaged up and sold through gray market channels. I&#8217;ve experienced this with LCD panels for the <a href="https://store.excamera.com/product/gameduino-3x-5">Gameduino</a>.</p><p>Something similar happens when a contract manufacturer makes the official part, but does extra production that they then sell themselves. This is called &#8220;third shift&#8221; &#8212; the idea being that two shifts are assigned to legitimate production, the third to this extra contraband production.</p><p>In both these cases, the parts get sold at a lower price than the genuine article.</p><h2>Outright fakes</h2><p>Many have pointed out the striking similarity between the ADS1115 and the Analogy ADX111. <a href="https://www.lcsc.com/datasheet/C5187476.pdf">Here</a> is the (part-Chinese part-English) datasheet. The datasheets are so alike it&#8217;s like an old spot-the-difference game:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!DaES!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4da7286-ce3f-4cc8-91fd-5d9f4a8d146e_1714x484.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!DaES!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4da7286-ce3f-4cc8-91fd-5d9f4a8d146e_1714x484.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!DaES!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4da7286-ce3f-4cc8-91fd-5d9f4a8d146e_1714x484.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!DaES!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4da7286-ce3f-4cc8-91fd-5d9f4a8d146e_1714x484.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!DaES!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4da7286-ce3f-4cc8-91fd-5d9f4a8d146e_1714x484.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!DaES!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4da7286-ce3f-4cc8-91fd-5d9f4a8d146e_1714x484.jpeg" width="1456" height="411" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4da7286-ce3f-4cc8-91fd-5d9f4a8d146e_1714x484.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:411,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70352,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/176646438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4da7286-ce3f-4cc8-91fd-5d9f4a8d146e_1714x484.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!DaES!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4da7286-ce3f-4cc8-91fd-5d9f4a8d146e_1714x484.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!DaES!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4da7286-ce3f-4cc8-91fd-5d9f4a8d146e_1714x484.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!DaES!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4da7286-ce3f-4cc8-91fd-5d9f4a8d146e_1714x484.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!DaES!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4da7286-ce3f-4cc8-91fd-5d9f4a8d146e_1714x484.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Certainly at the I&#178;C register level, I can see no way to distinguish between an ADS1115 and an ADX111. The TI datasheet says that timing is guaranteed within 10%, the Analogy 7%. So that might be a way. On the other hand the fact that the Analogy data sheet switches at random between two languages, and copies large sections of the TI sheet makes me skeptical of its truthiness.</p><p>The ADX sells for <a href="https://www.lcsc.com/product-detail/C5187476.html">$1.77 qty 1K</a> on LCSC.</p><h2>Arguments, for and against</h2><p>Several people expressed the opinion that LCSC is a reputable supplier, and that they have never received counterfeit parts when buying from them.</p><p>Some also stated that TI runs tight manufacturing operations, which makes sense given that they are a top-tier brand. Part of this is (a) making sure that failed parts get destroyed, and don&#8217;t escape through the factory back door, and (b) preventing &#8220;third shift&#8221; production.</p><p>When I tested the four cheap samples, three were ~5% out of timing spec. The fourth had a completely non-functional clock generator, but in a way that most customers would probably not notice. The accuracy of all four did not match the claims in either the TI datasheet or the Analogy sheet. All had gain errors of about 0.5%.</p><p>The marking on the cheap chips&#8217; packages looks authentic to me. Of course this means nothing. The days of easily detectable fakery are long past.</p><p>One Hacker News commenter suggested decapping the chips and comparing microphotographs of the two dies. Apart from the effort involved in doing this, it might not actually prove much. The ADX111 die could look very much like the ADS1115 die, depending on whether it&#8217;s a functional replica or a straight die copy. Third shift production is the same product as legit production, but potentially with less stringent QA. The same goes for upcycled failed units. So you could easily spend a whole day sloshing boiling nitric acid around and be none the wiser.</p><h2>And now, the real thing</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!RFAf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87def192-3ba7-41b7-97a4-070f077625b8_862x485.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!RFAf!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87def192-3ba7-41b7-97a4-070f077625b8_862x485.png 424w, /__u/substackcdn.com/image/fetch/$s_!RFAf!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87def192-3ba7-41b7-97a4-070f077625b8_862x485.png 848w, /__u/substackcdn.com/image/fetch/$s_!RFAf!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87def192-3ba7-41b7-97a4-070f077625b8_862x485.png 1272w, /__u/substackcdn.com/image/fetch/$s_!RFAf!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87def192-3ba7-41b7-97a4-070f077625b8_862x485.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!RFAf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87def192-3ba7-41b7-97a4-070f077625b8_862x485.png" width="862" height="485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87def192-3ba7-41b7-97a4-070f077625b8_862x485.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:485,&quot;width&quot;:862,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:705267,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/176646438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87def192-3ba7-41b7-97a4-070f077625b8_862x485.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!RFAf!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87def192-3ba7-41b7-97a4-070f077625b8_862x485.png 424w, /__u/substackcdn.com/image/fetch/$s_!RFAf!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87def192-3ba7-41b7-97a4-070f077625b8_862x485.png 848w, /__u/substackcdn.com/image/fetch/$s_!RFAf!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87def192-3ba7-41b7-97a4-070f077625b8_862x485.png 1272w, /__u/substackcdn.com/image/fetch/$s_!RFAf!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87def192-3ba7-41b7-97a4-070f077625b8_862x485.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Dropping the <a href="https://www.adafruit.com/product/1085">Adafruit ADS1115 breakout</a> into the test setup was a breeze. The build quality of the PCB is in a different league from the no-name parts. There&#8217;s a power LED, dual Stemma/QWICC ports, and a separate analog ground. So the testbench changed from a wire tangle to this minimalist setup.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!qeS_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fd45ab5-5421-46d3-b274-949256bc3517_1280x1281.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!qeS_!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fd45ab5-5421-46d3-b274-949256bc3517_1280x1281.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!qeS_!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fd45ab5-5421-46d3-b274-949256bc3517_1280x1281.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!qeS_!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fd45ab5-5421-46d3-b274-949256bc3517_1280x1281.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!qeS_!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fd45ab5-5421-46d3-b274-949256bc3517_1280x1281.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!qeS_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fd45ab5-5421-46d3-b274-949256bc3517_1280x1281.jpeg" width="1280" height="1281" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7fd45ab5-5421-46d3-b274-949256bc3517_1280x1281.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1281,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1254999,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/176646438?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fd45ab5-5421-46d3-b274-949256bc3517_1280x1281.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!qeS_!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fd45ab5-5421-46d3-b274-949256bc3517_1280x1281.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!qeS_!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fd45ab5-5421-46d3-b274-949256bc3517_1280x1281.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!qeS_!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fd45ab5-5421-46d3-b274-949256bc3517_1280x1281.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!qeS_!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fd45ab5-5421-46d3-b274-949256bc3517_1280x1281.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Running with the same test script immediately showed the differences. Timing is within 2% of nominal, better than the 10% promised in the TI datasheet. And the gain error is so low there&#8217;s not much point in calibrating it.  </p><pre><code>timing difference 99%
       raw=03415 v=2.4999
timing difference 99%
       raw=03415 v=2.4999
timing difference 98%
       raw=03415 v=2.4999
timing difference 99%
       raw=03415 v=2.4999</code></pre><p>Overall, I was surprised at how much better this thing is.</p><h2>Conclusions</h2><p>There&#8217;s a clear difference in the performance of these parts. The Adafruit board was a lot better than claimed in the TI datasheet. The cheap boards were much worse. So that rules out price discrimination by TI.</p><p>Looking at the pricing and gain accuracy, I&#8217;d say that the cheap ADS1115 parts in the breakouts are fails, either from TI (unlikely), from Analogy, or from some other nameless vendor selling fakes.</p><p>I&#8217;m still curious about the bare chips from LCSC. I might use them in a short run of breakouts for <a href="https://electricdollarstore.com/">Electric Dollar Store</a> to see how they perform. </p><h2>A final note</h2><p>There&#8217;s <a href="https://screenrant.com/the-matrix-steak-scene-joe-pantoliano-keanu-reeves-fight-factoid/">a scene</a> in the Matrix where Cypher simply decides to live without knowing the truth.</p><blockquote><p>&#8220;You know, I know this steak doesn&#8217;t exist. I know that when I put it in my mouth, the Matrix is telling my brain that it is juicy and delicious. After nine years, you know what I realize? Ignorance is bliss.&#8221;</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!k2Wh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9871c8-941a-47a3-8719-5162f86315b6_1650x825.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!k2Wh!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9871c8-941a-47a3-8719-5162f86315b6_1650x825.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!k2Wh!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9871c8-941a-47a3-8719-5162f86315b6_1650x825.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!k2Wh!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9871c8-941a-47a3-8719-5162f86315b6_1650x825.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!k2Wh!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9871c8-941a-47a3-8719-5162f86315b6_1650x825.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!k2Wh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9871c8-941a-47a3-8719-5162f86315b6_1650x825.jpeg" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c9871c8-941a-47a3-8719-5162f86315b6_1650x825.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Joe Pantoliano Eats Steak iN The Matrix&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Joe Pantoliano Eats Steak iN The Matrix" title="Joe Pantoliano Eats Steak iN The Matrix" srcset="/__u/substackcdn.com/image/fetch/$s_!k2Wh!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9871c8-941a-47a3-8719-5162f86315b6_1650x825.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!k2Wh!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9871c8-941a-47a3-8719-5162f86315b6_1650x825.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!k2Wh!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9871c8-941a-47a3-8719-5162f86315b6_1650x825.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!k2Wh!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c9871c8-941a-47a3-8719-5162f86315b6_1650x825.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>At the end of the day, if the imitation is so like the real thing you can&#8217;t tell the difference, then <em>how much it does it matter if it&#8217;s real or not?</em></p><p>It&#8217;s a choice for each of us. Be like Cypher and settle for &#8220;close enough.&#8221; Or like Neo and pay the high price for insisting on the real thing.</p><p>Thanks for reading. Next week: my somewhat impressive chicken coop tech stack.</p>]]></content:encoded></item><item><title><![CDATA[How bad can a $2.97 ADC be?]]></title><description><![CDATA[A tale of suspiciously cheap ADS1115s]]></description><link>https://excamera.substack.com/p/how-bad-can-a-297-adc-be</link><guid isPermaLink="false">https://excamera.substack.com/p/how-bad-can-a-297-adc-be</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 14 Oct 2025 16:45:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!IblS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbca6743-431a-44d9-8e31-7d996b228cb9_970x728.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For almost all of my embedded work I&#8217;ve used the ADCs included with microcontrollers. These are cheap, relatively fast, and not particularly good. While they sport impressive-sounding 12- and 16-bit readouts, the effective number of bits (ENOB) is usually around 8 or 9.</p><p>Recently I&#8217;ve been playing with the ADS1115. It&#8217;s a dedicated ADC from TI module which plausibly delivers 16 bit accuracy.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>One really cool thing about the ADS111x family is a dynamic range feature that gives you up to 20 times finer measurement for small amplitude voltages. It&#8217;s accuracy where it matters.</p><p>The ADS1115&#8217;s programmable gain amplifier lets you shrink the full-scale range from &#177;6.144 V down to &#177;0.256 V. That means a single LSB can represent as little as ~7.8 &#181;V (0.256 V &#247; 32768). Compare that with a microcontroller ADC with a fixed 3.3 V range: 9 ENOB steps are ~6 mV.</p><p>Another nice thing is that it uses an internal voltage reference. The RP2040, for example, requires an external 3.3V analog reference. </p><p>But there&#8217;s something fishy about the pricing of the ADS1115. At quantity 1K it&#8217;s around $4 from Digikey, yet $0.60 on LCSC. That&#8217;s quite a spread. I picked up breakout boards from Amazon for <a href="https://amzn.to/4pK4Mlm">$2.97 if you buy four</a>, and I very much think these are made with the $0.60 parts from LCSC or similar.</p><p>I&#8217;ve also ordered this <a href="https://www.adafruit.com/product/1085">very handsome breakout</a> from Adafruit, which I assume uses the pricier version of the ADS1115. I&#8217;ll report back next week.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!IblS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbca6743-431a-44d9-8e31-7d996b228cb9_970x728.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!IblS!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbca6743-431a-44d9-8e31-7d996b228cb9_970x728.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!IblS!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbca6743-431a-44d9-8e31-7d996b228cb9_970x728.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!IblS!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbca6743-431a-44d9-8e31-7d996b228cb9_970x728.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!IblS!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbca6743-431a-44d9-8e31-7d996b228cb9_970x728.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!IblS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbca6743-431a-44d9-8e31-7d996b228cb9_970x728.jpeg" width="336" height="252.17319587628867" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fbca6743-431a-44d9-8e31-7d996b228cb9_970x728.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:970,&quot;resizeWidth&quot;:336,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Angled shot of a black rectangular ADC breakout board.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Angled shot of a black rectangular ADC breakout board." title="Angled shot of a black rectangular ADC breakout board." srcset="/__u/substackcdn.com/image/fetch/$s_!IblS!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbca6743-431a-44d9-8e31-7d996b228cb9_970x728.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!IblS!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbca6743-431a-44d9-8e31-7d996b228cb9_970x728.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!IblS!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbca6743-431a-44d9-8e31-7d996b228cb9_970x728.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!IblS!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbca6743-431a-44d9-8e31-7d996b228cb9_970x728.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So how bad are these cheap ones? I hooked one up to an <a href="https://i2cdriver.com/mini.html">I&#178;CMini</a> and my trusty precision DC voltage source and tried to find out.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!bEyp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff84c1b9b-9e99-48b2-b1ca-26cb84ecc248_1920x1781.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!bEyp!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff84c1b9b-9e99-48b2-b1ca-26cb84ecc248_1920x1781.png 424w, /__u/substackcdn.com/image/fetch/$s_!bEyp!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff84c1b9b-9e99-48b2-b1ca-26cb84ecc248_1920x1781.png 848w, /__u/substackcdn.com/image/fetch/$s_!bEyp!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff84c1b9b-9e99-48b2-b1ca-26cb84ecc248_1920x1781.png 1272w, /__u/substackcdn.com/image/fetch/$s_!bEyp!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff84c1b9b-9e99-48b2-b1ca-26cb84ecc248_1920x1781.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!bEyp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff84c1b9b-9e99-48b2-b1ca-26cb84ecc248_1920x1781.png" width="1456" height="1351" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f84c1b9b-9e99-48b2-b1ca-26cb84ecc248_1920x1781.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1351,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4703826,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/174667033?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff84c1b9b-9e99-48b2-b1ca-26cb84ecc248_1920x1781.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!bEyp!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff84c1b9b-9e99-48b2-b1ca-26cb84ecc248_1920x1781.png 424w, /__u/substackcdn.com/image/fetch/$s_!bEyp!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff84c1b9b-9e99-48b2-b1ca-26cb84ecc248_1920x1781.png 848w, /__u/substackcdn.com/image/fetch/$s_!bEyp!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff84c1b9b-9e99-48b2-b1ca-26cb84ecc248_1920x1781.png 1272w, /__u/substackcdn.com/image/fetch/$s_!bEyp!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff84c1b9b-9e99-48b2-b1ca-26cb84ecc248_1920x1781.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>First check, are these functioning according to spec, or are they a cheaper part that&#8217;s being passed off as an ADS1115, as reported on forums?</p><p>As far as I can tell, they behave as if they are real ADS1115s. The readout is true 16-bits. The PGA (Programmable Gain Amplifier) appears functional. The readout rate is variable from 8 to 860 samples per second, and this approximately matches the TI datasheet.</p><p>I tested mostly in differential mode, and with the two inputs tied together, the ADC read consistently zero. With a calibrated 2.5V differential, the ADC measured very close to 2.5V, and with the polarity reversed gave exactly the same number negated. So far so good.</p><p>But closer inspection showed some deviations.</p><p>The TI datasheet says that the Data Rate, DR is &#177;10% of the nominal. So at 8 samples per second mode, samples should arrive 7.2 - 8.8 times per second. Three of the ADCs were close but slow (6.5-7 samples per second). One of the ADCs was nowhere near: 300 samples per second. That one didn&#8217;t get any further testing; there&#8217;s obviously something broken with its timing system. (But how many end users would actually notice that it&#8217;s running faster (and hence noisier) than it&#8217;s meant to?)</p><p>Looking more closely at the actual measurement, my calibrated 2.50067V source was being reported by the ADS1115 as 2.4883V. That&#8217;s a 12 mV error, and a 0.5% difference. Much bigger than the claim in the TI datasheet:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ln8X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefb8417f-a5bd-41a6-9331-278011c81524_484x382.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ln8X!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefb8417f-a5bd-41a6-9331-278011c81524_484x382.png 424w, /__u/substackcdn.com/image/fetch/$s_!ln8X!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefb8417f-a5bd-41a6-9331-278011c81524_484x382.png 848w, /__u/substackcdn.com/image/fetch/$s_!ln8X!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefb8417f-a5bd-41a6-9331-278011c81524_484x382.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ln8X!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefb8417f-a5bd-41a6-9331-278011c81524_484x382.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ln8X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefb8417f-a5bd-41a6-9331-278011c81524_484x382.png" width="484" height="382" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/efb8417f-a5bd-41a6-9331-278011c81524_484x382.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:382,&quot;width&quot;:484,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30861,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/174667033?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefb8417f-a5bd-41a6-9331-278011c81524_484x382.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!ln8X!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefb8417f-a5bd-41a6-9331-278011c81524_484x382.png 424w, /__u/substackcdn.com/image/fetch/$s_!ln8X!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefb8417f-a5bd-41a6-9331-278011c81524_484x382.png 848w, /__u/substackcdn.com/image/fetch/$s_!ln8X!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefb8417f-a5bd-41a6-9331-278011c81524_484x382.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ln8X!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefb8417f-a5bd-41a6-9331-278011c81524_484x382.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This isn&#8217;t quite the catastrophe that it might seem. After a simple linear correction on the MCU, I was getting results accurate to within 10 &#181;V.</p><p>So what&#8217;s going on with the cheap parts? My best guess is that these are either quite good copies, or failed parts that <em>somehow</em> made their way into the hobbyist supply chain. When the more respectable part arrives next week I&#8217;ll put it through the same tests and report the result. However I only bought one of these, because it&#8217;s 4X the price!</p><p>Thanks for reading.</p>]]></content:encoded></item><item><title><![CDATA[Dad! My display stopped working!]]></title><description><![CDATA[A family request leads to software bridge building]]></description><link>https://excamera.substack.com/p/dad-dad-my-display-stopped-working</link><guid isPermaLink="false">https://excamera.substack.com/p/dad-dad-my-display-stopped-working</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 30 Sep 2025 16:45:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KwNm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f84a8fd-5061-457e-8ecd-5a5e983a4d9c_951x522.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>My children are adults, long departed the nest. That doesn&#8217;t seem to stop them from bringing me everyday problems as they come up. Last week my son Felix hit a snag using an OLED display. It worked fine for a while, then simply stopped. Here it is in the happy time when it was not an inert black rectangle.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!KwNm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f84a8fd-5061-457e-8ecd-5a5e983a4d9c_951x522.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!KwNm!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f84a8fd-5061-457e-8ecd-5a5e983a4d9c_951x522.png 424w, /__u/substackcdn.com/image/fetch/$s_!KwNm!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f84a8fd-5061-457e-8ecd-5a5e983a4d9c_951x522.png 848w, /__u/substackcdn.com/image/fetch/$s_!KwNm!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f84a8fd-5061-457e-8ecd-5a5e983a4d9c_951x522.png 1272w, /__u/substackcdn.com/image/fetch/$s_!KwNm!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f84a8fd-5061-457e-8ecd-5a5e983a4d9c_951x522.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!KwNm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f84a8fd-5061-457e-8ecd-5a5e983a4d9c_951x522.png" width="951" height="522" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f84a8fd-5061-457e-8ecd-5a5e983a4d9c_951x522.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:522,&quot;width&quot;:951,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:795789,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/174661631?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f84a8fd-5061-457e-8ecd-5a5e983a4d9c_951x522.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!KwNm!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f84a8fd-5061-457e-8ecd-5a5e983a4d9c_951x522.png 424w, /__u/substackcdn.com/image/fetch/$s_!KwNm!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f84a8fd-5061-457e-8ecd-5a5e983a4d9c_951x522.png 848w, /__u/substackcdn.com/image/fetch/$s_!KwNm!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f84a8fd-5061-457e-8ecd-5a5e983a4d9c_951x522.png 1272w, /__u/substackcdn.com/image/fetch/$s_!KwNm!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f84a8fd-5061-457e-8ecd-5a5e983a4d9c_951x522.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Felix had it hooked up to a Pico, as well as to a <a href="https://spidriver.com/">SPIDriver</a> for bringup. Both worked fine, then both eventually stopped working at all. The display is an <a href="https://amzn.to/46EZajp">SSD1306</a>, which uses the pretty-common &#8220;SPI plus a couple of control lines&#8221; hookup. Lots of panels use the same kind of scheme.</p><p>When we started working the problem, the suspicion was that something might have gone wrong with the software. After all, it&#8217;s very easy to make an innocuous-looking change that stops the hardware from working. I do it about once a day, so it seemed not completely impossible that my offspring had done the same. The apple never falls far from the tree, as they say.</p><p>What we really wanted was to run some known-good driver with the SPIDriver and the SSD1306. Enter Adafruit, and their impressive commitment to Open Source. They provide drivers and examples for a huge range of hardware. Including <a href="https://github.com/adafruit/Adafruit_CircuitPython_DisplayIO_SSD1306">this</a> ready-to-run Python module for the SSD1306.</p><p>In the past, I&#8217;ve taken the Adafruit Python drivers and ported them to SPIDriver&#8217;s API. The hardware SPI interface is a little different, but after a bit of rearranging, it generally works. But then what? I can&#8217;t port every driver &#8212; there are hundreds, and the maintenance would be continuous.</p><p>How much better it would be if the all the wonderful Adafruit libraries <em>just worked</em> with SPIDriver? Then we could run the sample code unchanged, and really confirm if the problem was software or hardware. And even better, anyone else who wanted to use an Adafruit driver could run with their SPIDriver.</p><p>The way Adafruit solved the portability problem between CircuitPython (on microcontrollers) and CPython (on PCs and SBCs) is using a library called <a href="https://github.com/adafruit/Adafruit_Blinka">Blinka</a>. Blinka runs on the PC, and reproduces all the hardware interfaces (like SPI, I2C and GPIOs). Blinka supports all kinds of hardware, including many USB adapters. Adding SPIDriver and I2CDriver support to the list should be fairly straightforward.</p><p>And it was. After a bit of hacking, I had SPIDriver working under Blinka.</p><p>Then I took Adafruit&#8217;s example code for the SSD1306, changing the pin assignments for SPIDriver:</p><pre><code>import board
import fourwire
import adafruit_displayio_ssd1306
import displayio
import busio

displayio.release_displays()

# This pinout is for the SPIDriver
spi = busio.SPI(board.SCK, board.MOSI)
tft_cs = board.CS
tft_dc = board.A
tft_reset = board.B

display_bus = fourwire.FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=tft_reset, baudrate=1000000)
display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=128, height=64)</code></pre><p>and it came up immediately</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!19T6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03a6196d-7c4f-40f1-a83e-aac041d989cc_4935x2776.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!19T6!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03a6196d-7c4f-40f1-a83e-aac041d989cc_4935x2776.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!19T6!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03a6196d-7c4f-40f1-a83e-aac041d989cc_4935x2776.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!19T6!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03a6196d-7c4f-40f1-a83e-aac041d989cc_4935x2776.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!19T6!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03a6196d-7c4f-40f1-a83e-aac041d989cc_4935x2776.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!19T6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03a6196d-7c4f-40f1-a83e-aac041d989cc_4935x2776.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/03a6196d-7c4f-40f1-a83e-aac041d989cc_4935x2776.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9812453,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/174661631?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03a6196d-7c4f-40f1-a83e-aac041d989cc_4935x2776.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!19T6!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03a6196d-7c4f-40f1-a83e-aac041d989cc_4935x2776.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!19T6!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03a6196d-7c4f-40f1-a83e-aac041d989cc_4935x2776.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!19T6!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03a6196d-7c4f-40f1-a83e-aac041d989cc_4935x2776.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!19T6!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03a6196d-7c4f-40f1-a83e-aac041d989cc_4935x2776.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>then I added some code to draw a bitmap:</p><pre><code>splash = displayio.Group()
bitmap = displayio.Bitmap(128, 64, 1)  # 1 color slot
palette = displayio.Palette(2)
palette[0] = 0x000000
palette[1] = 0xFFFFFF

from PIL import Image

pixels = Image.open(&#8221;logo128.png&#8221;).load()
for y in range(64):
    for x in range(128):
        bitmap[x, y] = pixels[x, y]
 background=/__u/excamera.substack.com/displayio.TileGrid(bitmap, pixel_shader=palette)
splash.append(background)
display.root_group = splash</code></pre><p>and here&#8217;s the proof. It all just works.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!7vcX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59937e1-119a-4ff1-b025-660e92b21894_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!7vcX!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59937e1-119a-4ff1-b025-660e92b21894_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!7vcX!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59937e1-119a-4ff1-b025-660e92b21894_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!7vcX!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59937e1-119a-4ff1-b025-660e92b21894_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!7vcX!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59937e1-119a-4ff1-b025-660e92b21894_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!7vcX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59937e1-119a-4ff1-b025-660e92b21894_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d59937e1-119a-4ff1-b025-660e92b21894_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1064947,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/174661631?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59937e1-119a-4ff1-b025-660e92b21894_1920x1080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!7vcX!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59937e1-119a-4ff1-b025-660e92b21894_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!7vcX!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59937e1-119a-4ff1-b025-660e92b21894_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!7vcX!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59937e1-119a-4ff1-b025-660e92b21894_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!7vcX!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd59937e1-119a-4ff1-b025-660e92b21894_1920x1080.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Next step is adding <a href="https://i2cdriver.com/">I&#178;CDriver</a> support to Blinka as well, then I&#8217;ll submit a PR to the maintainers of Adafruit_Blinka.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Revenge of the Mandrel]]></title><description><![CDATA[Box forming gets serious]]></description><link>https://excamera.substack.com/p/revenge-of-the-mandrel</link><guid isPermaLink="false">https://excamera.substack.com/p/revenge-of-the-mandrel</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 23 Sep 2025 16:42:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2h9a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c4c566-0437-4322-9717-6053d8e6c08d_1920x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last time I wrote about <a href="/__u/excamera.substack.com/p/a-box-forming-mandrel">some success</a> experimenting with box-forming mandrels. A couple of days ago the boxes for <a href="https://www.crowdsupply.com/excamera/termdriver-2">TermDriver2</a> arrived. Thousands of them. All flat.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Hvhc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F322ac780-6f68-46b7-a835-ddfc230935b4_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Hvhc!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F322ac780-6f68-46b7-a835-ddfc230935b4_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!Hvhc!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F322ac780-6f68-46b7-a835-ddfc230935b4_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!Hvhc!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F322ac780-6f68-46b7-a835-ddfc230935b4_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!Hvhc!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F322ac780-6f68-46b7-a835-ddfc230935b4_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Hvhc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F322ac780-6f68-46b7-a835-ddfc230935b4_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/322ac780-6f68-46b7-a835-ddfc230935b4_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1366163,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/174209697?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F322ac780-6f68-46b7-a835-ddfc230935b4_1920x1080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Hvhc!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F322ac780-6f68-46b7-a835-ddfc230935b4_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!Hvhc!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F322ac780-6f68-46b7-a835-ddfc230935b4_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!Hvhc!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F322ac780-6f68-46b7-a835-ddfc230935b4_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!Hvhc!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F322ac780-6f68-46b7-a835-ddfc230935b4_1920x1080.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>When carefully assembled, they look great. We&#8217;re very happy with them. But they are extremely fiddly to assemble by hand. The box is slim, so opening it out is tricky.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!2h9a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c4c566-0437-4322-9717-6053d8e6c08d_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!2h9a!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c4c566-0437-4322-9717-6053d8e6c08d_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!2h9a!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c4c566-0437-4322-9717-6053d8e6c08d_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!2h9a!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c4c566-0437-4322-9717-6053d8e6c08d_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!2h9a!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c4c566-0437-4322-9717-6053d8e6c08d_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!2h9a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c4c566-0437-4322-9717-6053d8e6c08d_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73c4c566-0437-4322-9717-6053d8e6c08d_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1003121,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/174209697?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c4c566-0437-4322-9717-6053d8e6c08d_1920x1080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!2h9a!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c4c566-0437-4322-9717-6053d8e6c08d_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!2h9a!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c4c566-0437-4322-9717-6053d8e6c08d_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!2h9a!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c4c566-0437-4322-9717-6053d8e6c08d_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!2h9a!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c4c566-0437-4322-9717-6053d8e6c08d_1920x1080.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So here&#8217;s a fixture to help. Technically, it&#8217;s a box forming mandrel. The piece (in this case the flat box) fits over it. As it&#8217;s pushed down, the mandrel progressively opens the box until it reaches its final shape.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!6L3N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8148bfb7-3350-4c42-b483-67d1b41ffe21_1031x580.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!6L3N!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8148bfb7-3350-4c42-b483-67d1b41ffe21_1031x580.png 424w, /__u/substackcdn.com/image/fetch/$s_!6L3N!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8148bfb7-3350-4c42-b483-67d1b41ffe21_1031x580.png 848w, /__u/substackcdn.com/image/fetch/$s_!6L3N!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8148bfb7-3350-4c42-b483-67d1b41ffe21_1031x580.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6L3N!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8148bfb7-3350-4c42-b483-67d1b41ffe21_1031x580.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!6L3N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8148bfb7-3350-4c42-b483-67d1b41ffe21_1031x580.png" width="1031" height="580" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8148bfb7-3350-4c42-b483-67d1b41ffe21_1031x580.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:580,&quot;width&quot;:1031,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:27867,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/174209697?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8148bfb7-3350-4c42-b483-67d1b41ffe21_1031x580.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!6L3N!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8148bfb7-3350-4c42-b483-67d1b41ffe21_1031x580.png 424w, /__u/substackcdn.com/image/fetch/$s_!6L3N!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8148bfb7-3350-4c42-b483-67d1b41ffe21_1031x580.png 848w, /__u/substackcdn.com/image/fetch/$s_!6L3N!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8148bfb7-3350-4c42-b483-67d1b41ffe21_1031x580.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6L3N!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8148bfb7-3350-4c42-b483-67d1b41ffe21_1031x580.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The top edge is just a blade. The right-hand curve pushes the box edge open from the inside. The left-hand curve does the same on the outside. The bar on the right gives a bit of stability. The bottom half of the mandrel is a simple rectangle, to hold the box square.</p><p>It took several prints to get the mandrel right. I found a 0.25 mm fit works well. It&#8217;s printed flat in extra-fine quality, to reduce the layer lines that can snag on the box. This is the mandrel ready for use, with a few test boxes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!8j56!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac880d91-876d-4312-ac3f-82945868dede_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!8j56!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac880d91-876d-4312-ac3f-82945868dede_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!8j56!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac880d91-876d-4312-ac3f-82945868dede_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!8j56!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac880d91-876d-4312-ac3f-82945868dede_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!8j56!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac880d91-876d-4312-ac3f-82945868dede_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!8j56!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac880d91-876d-4312-ac3f-82945868dede_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac880d91-876d-4312-ac3f-82945868dede_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1092025,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/174209697?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac880d91-876d-4312-ac3f-82945868dede_1920x1080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!8j56!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac880d91-876d-4312-ac3f-82945868dede_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!8j56!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac880d91-876d-4312-ac3f-82945868dede_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!8j56!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac880d91-876d-4312-ac3f-82945868dede_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!8j56!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac880d91-876d-4312-ac3f-82945868dede_1920x1080.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here&#8217;s a video of me assembling a box. It takes about 12 seconds. But the more nimble hands of our workers should be able to do it in half that. 600 boxes an hour is a satisfactory rate.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;ff9becb4-dcc3-4c9e-ba3c-11d00dfb3893&quot;,&quot;duration&quot;:null}"></div><p>We gave it a short test run to see how it performed. It worked great. We did hundreds of boxes assembled and ready to accept their <a href="https://www.crowdsupply.com/excamera/termdriver-2">TermDriver</a>s. It will all be shipping in the next few days.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!AA1Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5c37d9-714b-4782-9a79-a8de61d5edf9_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!AA1Z!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5c37d9-714b-4782-9a79-a8de61d5edf9_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!AA1Z!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5c37d9-714b-4782-9a79-a8de61d5edf9_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!AA1Z!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5c37d9-714b-4782-9a79-a8de61d5edf9_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!AA1Z!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5c37d9-714b-4782-9a79-a8de61d5edf9_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!AA1Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5c37d9-714b-4782-9a79-a8de61d5edf9_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc5c37d9-714b-4782-9a79-a8de61d5edf9_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1138508,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/174209697?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5c37d9-714b-4782-9a79-a8de61d5edf9_1920x1080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!AA1Z!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5c37d9-714b-4782-9a79-a8de61d5edf9_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!AA1Z!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5c37d9-714b-4782-9a79-a8de61d5edf9_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!AA1Z!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5c37d9-714b-4782-9a79-a8de61d5edf9_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!AA1Z!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5c37d9-714b-4782-9a79-a8de61d5edf9_1920x1080.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Thanks for reading.</p><p></p>]]></content:encoded></item><item><title><![CDATA[A box forming mandrel]]></title><description><![CDATA[Another small step towards tiny factories]]></description><link>https://excamera.substack.com/p/a-box-forming-mandrel</link><guid isPermaLink="false">https://excamera.substack.com/p/a-box-forming-mandrel</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 09 Sep 2025 18:45:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fqt8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26ffbd99-f653-45a6-a30b-2201c0cdf9db_1024x722.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We&#8217;re gearing up here at <a href="https://excamera.com/sphinx/index.html">Excamera Labs</a> for the big effort to ship <a href="https://www.crowdsupply.com/excamera/termdriver-2">TermDriver2</a>. One part of this is folding boxes. It might not sound like much, but assembling thousands of boxes is surprisingly time-consuming. There is help on hand, but for some time I&#8217;ve been thinking about better tooling for box assembly. Last night, folllowing a brief discussion with AI, inspiration struck:</p><blockquote><p>That&#8217;s called a <strong>box former</strong> (or <strong>carton former</strong>). In packaging, it&#8217;s usually a tapered mandrel or jig: you set the flat box blank over it and press down, and the box pops open into its proper 3D shape around the form.</p></blockquote><p>This morning I have a prototype box-forming mandrel. These mandrels are normally the domain of huge industrial scale production. But thanks to 3D printing, we can now have them for desktop-scale production. Truly we live in an age of wonders.  </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Our printer supplies the boxes packed flat, we then pop them open and tuck in the end flaps. Each one takes about 30 seconds. Later this month we&#8217;ll be assembling 2000 TermDriver2 boxes, that&#8217;s 16 hours of folding. Cue the obligatory <a href="https://xkcd.com/1205/">xkcd</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!fqt8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26ffbd99-f653-45a6-a30b-2201c0cdf9db_1024x722.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!fqt8!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26ffbd99-f653-45a6-a30b-2201c0cdf9db_1024x722.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!fqt8!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26ffbd99-f653-45a6-a30b-2201c0cdf9db_1024x722.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!fqt8!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26ffbd99-f653-45a6-a30b-2201c0cdf9db_1024x722.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!fqt8!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26ffbd99-f653-45a6-a30b-2201c0cdf9db_1024x722.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!fqt8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26ffbd99-f653-45a6-a30b-2201c0cdf9db_1024x722.jpeg" width="1024" height="722" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/26ffbd99-f653-45a6-a30b-2201c0cdf9db_1024x722.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:722,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:580298,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/173192984?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26ffbd99-f653-45a6-a30b-2201c0cdf9db_1024x722.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!fqt8!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26ffbd99-f653-45a6-a30b-2201c0cdf9db_1024x722.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!fqt8!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26ffbd99-f653-45a6-a30b-2201c0cdf9db_1024x722.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!fqt8!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26ffbd99-f653-45a6-a30b-2201c0cdf9db_1024x722.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!fqt8!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26ffbd99-f653-45a6-a30b-2201c0cdf9db_1024x722.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The idea for the mandrel is that it has a bladed top. As you push the box down, it opens the box. The rectangular section at the bottom holds the box in shape. The mandrel&#8217;s height matches the height of the box, so a single downward motion is all it takes. Then the top flaps can be closed.</p><p>The math for the mandrel shape took some thought. It&#8217;s a series of stacked parallelograms. The topmost parallelogram is very flat, the bottom parallelogram is a rectangle. The layers in between smoothly interpolate between these two shapes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!nO45!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37271535-7727-45e9-afd8-ddb0f37eeabc_917x469.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!nO45!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37271535-7727-45e9-afd8-ddb0f37eeabc_917x469.png 424w, /__u/substackcdn.com/image/fetch/$s_!nO45!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37271535-7727-45e9-afd8-ddb0f37eeabc_917x469.png 848w, /__u/substackcdn.com/image/fetch/$s_!nO45!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37271535-7727-45e9-afd8-ddb0f37eeabc_917x469.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nO45!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37271535-7727-45e9-afd8-ddb0f37eeabc_917x469.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!nO45!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37271535-7727-45e9-afd8-ddb0f37eeabc_917x469.png" width="917" height="469" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37271535-7727-45e9-afd8-ddb0f37eeabc_917x469.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:469,&quot;width&quot;:917,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:45241,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/173192984?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37271535-7727-45e9-afd8-ddb0f37eeabc_917x469.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!nO45!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37271535-7727-45e9-afd8-ddb0f37eeabc_917x469.png 424w, /__u/substackcdn.com/image/fetch/$s_!nO45!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37271535-7727-45e9-afd8-ddb0f37eeabc_917x469.png 848w, /__u/substackcdn.com/image/fetch/$s_!nO45!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37271535-7727-45e9-afd8-ddb0f37eeabc_917x469.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nO45!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37271535-7727-45e9-afd8-ddb0f37eeabc_917x469.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://i2cdriver.com/">I&#178;CDriver</a> and <a href="https://spidriver.com/">SPIDriver</a> are fairly large boxes, 106mm wide and 137mm high. So the mandrel is quite large. After about two hours of printing, it looks ready:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!fxIy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e4036c7-90fa-4867-bbf0-3d4049d96612_1280x864.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!fxIy!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e4036c7-90fa-4867-bbf0-3d4049d96612_1280x864.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!fxIy!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e4036c7-90fa-4867-bbf0-3d4049d96612_1280x864.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!fxIy!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e4036c7-90fa-4867-bbf0-3d4049d96612_1280x864.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!fxIy!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e4036c7-90fa-4867-bbf0-3d4049d96612_1280x864.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!fxIy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e4036c7-90fa-4867-bbf0-3d4049d96612_1280x864.jpeg" width="1280" height="864" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1e4036c7-90fa-4867-bbf0-3d4049d96612_1280x864.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:864,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:708606,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/173192984?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e4036c7-90fa-4867-bbf0-3d4049d96612_1280x864.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!fxIy!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e4036c7-90fa-4867-bbf0-3d4049d96612_1280x864.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!fxIy!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e4036c7-90fa-4867-bbf0-3d4049d96612_1280x864.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!fxIy!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e4036c7-90fa-4867-bbf0-3d4049d96612_1280x864.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!fxIy!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e4036c7-90fa-4867-bbf0-3d4049d96612_1280x864.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I set up in a vise for a first test. The flat box fits over the bladed top just fine.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!XTV9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d49b8c-6801-43dd-96ec-f78f1f871da0_791x1280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!XTV9!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d49b8c-6801-43dd-96ec-f78f1f871da0_791x1280.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!XTV9!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d49b8c-6801-43dd-96ec-f78f1f871da0_791x1280.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!XTV9!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d49b8c-6801-43dd-96ec-f78f1f871da0_791x1280.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!XTV9!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d49b8c-6801-43dd-96ec-f78f1f871da0_791x1280.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!XTV9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d49b8c-6801-43dd-96ec-f78f1f871da0_791x1280.jpeg" width="791" height="1280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61d49b8c-6801-43dd-96ec-f78f1f871da0_791x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:791,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:569297,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/173192984?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d49b8c-6801-43dd-96ec-f78f1f871da0_791x1280.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!XTV9!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d49b8c-6801-43dd-96ec-f78f1f871da0_791x1280.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!XTV9!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d49b8c-6801-43dd-96ec-f78f1f871da0_791x1280.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!XTV9!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d49b8c-6801-43dd-96ec-f78f1f871da0_791x1280.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!XTV9!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d49b8c-6801-43dd-96ec-f78f1f871da0_791x1280.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And then the moment of truth. I excitedly pushed the box down. It works!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!A9Uy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F218d6d80-bf68-4f1b-a7ca-82f0f9d1bac6_1280x1044.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!A9Uy!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F218d6d80-bf68-4f1b-a7ca-82f0f9d1bac6_1280x1044.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!A9Uy!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F218d6d80-bf68-4f1b-a7ca-82f0f9d1bac6_1280x1044.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!A9Uy!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F218d6d80-bf68-4f1b-a7ca-82f0f9d1bac6_1280x1044.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!A9Uy!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F218d6d80-bf68-4f1b-a7ca-82f0f9d1bac6_1280x1044.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!A9Uy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F218d6d80-bf68-4f1b-a7ca-82f0f9d1bac6_1280x1044.jpeg" width="1280" height="1044" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/218d6d80-bf68-4f1b-a7ca-82f0f9d1bac6_1280x1044.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1044,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:688799,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/173192984?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F218d6d80-bf68-4f1b-a7ca-82f0f9d1bac6_1280x1044.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!A9Uy!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F218d6d80-bf68-4f1b-a7ca-82f0f9d1bac6_1280x1044.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!A9Uy!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F218d6d80-bf68-4f1b-a7ca-82f0f9d1bac6_1280x1044.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!A9Uy!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F218d6d80-bf68-4f1b-a7ca-82f0f9d1bac6_1280x1044.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!A9Uy!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F218d6d80-bf68-4f1b-a7ca-82f0f9d1bac6_1280x1044.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Something I&#8217;m really appreciating about 3D printing is it&#8217;s easy iteration. If you&#8217;re a woodworker and you&#8217;ve made a table, you might want to adjust the design a bit. To do this you have to make another table, starting over. But with 3D printing, you tweak the design file, and send it to the printer.</p><p>As soon as I  had this first mandrel in front of me, potential improvements were immediately obvious. The mandrel only twists one side of the box. A second exterior mandrel could twist the opposite, external side. Adding a guide on the right-hand-side would help make the box more rigid. Here&#8217;s the mark II.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!MiIy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23f9717-eeba-45cc-a028-30e668a7a28d_562x565.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!MiIy!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23f9717-eeba-45cc-a028-30e668a7a28d_562x565.png 424w, /__u/substackcdn.com/image/fetch/$s_!MiIy!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23f9717-eeba-45cc-a028-30e668a7a28d_562x565.png 848w, /__u/substackcdn.com/image/fetch/$s_!MiIy!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23f9717-eeba-45cc-a028-30e668a7a28d_562x565.png 1272w, /__u/substackcdn.com/image/fetch/$s_!MiIy!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23f9717-eeba-45cc-a028-30e668a7a28d_562x565.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!MiIy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23f9717-eeba-45cc-a028-30e668a7a28d_562x565.png" width="562" height="565" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c23f9717-eeba-45cc-a028-30e668a7a28d_562x565.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:565,&quot;width&quot;:562,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20952,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/173192984?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23f9717-eeba-45cc-a028-30e668a7a28d_562x565.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!MiIy!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23f9717-eeba-45cc-a028-30e668a7a28d_562x565.png 424w, /__u/substackcdn.com/image/fetch/$s_!MiIy!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23f9717-eeba-45cc-a028-30e668a7a28d_562x565.png 848w, /__u/substackcdn.com/image/fetch/$s_!MiIy!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23f9717-eeba-45cc-a028-30e668a7a28d_562x565.png 1272w, /__u/substackcdn.com/image/fetch/$s_!MiIy!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23f9717-eeba-45cc-a028-30e668a7a28d_562x565.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s printing right now. I&#8217;ll report back on how well it works. Thanks for reading, and please subscribe if you&#8217;d like to follow the progress.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/excamera.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Lights for the winter]]></title><description><![CDATA[Getting ready for winter]]></description><link>https://excamera.substack.com/p/lights-for-the-winter</link><guid isPermaLink="false">https://excamera.substack.com/p/lights-for-the-winter</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 02 Sep 2025 16:45:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QsgD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e5a335e-899b-4088-bf24-63a872ccdb35_1280x960.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;m originally from the UK, but have now lived in California for about 30 years. I will mention two aspects of this Californian life. Firstly, the weather is so mild an outdoor shower is completely reasonable year-round. We all love it. Secondly, the electricity goes off with alarming frequency. You just can&#8217;t rely on it at all. Neither of these things are true in the UK.</p><p>This week I decided to add proper lighting to the outdoor shower. One thing I dislike about power outages is the feeble light from emergency lanterns. I wanted a <strong>lot</strong> of cheerful, warm light.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!QsgD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e5a335e-899b-4088-bf24-63a872ccdb35_1280x960.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!QsgD!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e5a335e-899b-4088-bf24-63a872ccdb35_1280x960.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!QsgD!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e5a335e-899b-4088-bf24-63a872ccdb35_1280x960.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!QsgD!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e5a335e-899b-4088-bf24-63a872ccdb35_1280x960.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!QsgD!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e5a335e-899b-4088-bf24-63a872ccdb35_1280x960.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!QsgD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e5a335e-899b-4088-bf24-63a872ccdb35_1280x960.jpeg" width="1280" height="960" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e5a335e-899b-4088-bf24-63a872ccdb35_1280x960.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:960,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:528319,&quot;alt&quot;:&quot;fiat lux-ury&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/171942476?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e5a335e-899b-4088-bf24-63a872ccdb35_1280x960.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="fiat lux-ury" title="fiat lux-ury" srcset="/__u/substackcdn.com/image/fetch/$s_!QsgD!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e5a335e-899b-4088-bf24-63a872ccdb35_1280x960.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!QsgD!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e5a335e-899b-4088-bf24-63a872ccdb35_1280x960.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!QsgD!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e5a335e-899b-4088-bf24-63a872ccdb35_1280x960.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!QsgD!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e5a335e-899b-4088-bf24-63a872ccdb35_1280x960.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The bulbs themselves are these <a href="https://amzn.to/41TzPRi">6W warm LED filament-style bulbs</a>. I tested them out on the bench, and found they stay lit anywhere from 7-24 V. They take a constant 18W for the whole set. The wiring is a spouse-approved <a href="https://amzn.to/41TzPRi">3-way pendant set</a>.</p><p>The actual supply is in the box on the right. It&#8217;s a 3D printed enclosure with a pop-on/off lid.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!l905!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7fbaf12-0f27-410b-be23-f16e4282bf8d_1000x668.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!l905!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7fbaf12-0f27-410b-be23-f16e4282bf8d_1000x668.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!l905!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7fbaf12-0f27-410b-be23-f16e4282bf8d_1000x668.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!l905!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7fbaf12-0f27-410b-be23-f16e4282bf8d_1000x668.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!l905!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7fbaf12-0f27-410b-be23-f16e4282bf8d_1000x668.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!l905!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7fbaf12-0f27-410b-be23-f16e4282bf8d_1000x668.jpeg" width="1000" height="668" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7fbaf12-0f27-410b-be23-f16e4282bf8d_1000x668.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:668,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:610911,&quot;alt&quot;:&quot;just a box&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/171942476?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7fbaf12-0f27-410b-be23-f16e4282bf8d_1000x668.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="just a box" title="just a box" srcset="/__u/substackcdn.com/image/fetch/$s_!l905!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7fbaf12-0f27-410b-be23-f16e4282bf8d_1000x668.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!l905!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7fbaf12-0f27-410b-be23-f16e4282bf8d_1000x668.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!l905!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7fbaf12-0f27-410b-be23-f16e4282bf8d_1000x668.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!l905!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7fbaf12-0f27-410b-be23-f16e4282bf8d_1000x668.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In black PLA, it only took 1 hour to print. I&#8217;m getting a bit more fluent in <a href="https://openscad.org/">OpenSCAD</a> with practice. Designing the enclosure and lid took about an hour. Some of that was genuine thinking about shapes. But most of it messing around with the code. It&#8217;s a lot of fun.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!FZU0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a429a6-e79e-4ff0-94e2-ebeaeb578814_932x483.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!FZU0!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a429a6-e79e-4ff0-94e2-ebeaeb578814_932x483.png 424w, /__u/substackcdn.com/image/fetch/$s_!FZU0!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a429a6-e79e-4ff0-94e2-ebeaeb578814_932x483.png 848w, /__u/substackcdn.com/image/fetch/$s_!FZU0!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a429a6-e79e-4ff0-94e2-ebeaeb578814_932x483.png 1272w, /__u/substackcdn.com/image/fetch/$s_!FZU0!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a429a6-e79e-4ff0-94e2-ebeaeb578814_932x483.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!FZU0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a429a6-e79e-4ff0-94e2-ebeaeb578814_932x483.png" width="932" height="483" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8a429a6-e79e-4ff0-94e2-ebeaeb578814_932x483.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:483,&quot;width&quot;:932,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26075,&quot;alt&quot;:&quot;OpenSCAD: making 3D printing even nerdier &quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/171942476?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a429a6-e79e-4ff0-94e2-ebeaeb578814_932x483.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="OpenSCAD: making 3D printing even nerdier " title="OpenSCAD: making 3D printing even nerdier " srcset="/__u/substackcdn.com/image/fetch/$s_!FZU0!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a429a6-e79e-4ff0-94e2-ebeaeb578814_932x483.png 424w, /__u/substackcdn.com/image/fetch/$s_!FZU0!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a429a6-e79e-4ff0-94e2-ebeaeb578814_932x483.png 848w, /__u/substackcdn.com/image/fetch/$s_!FZU0!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a429a6-e79e-4ff0-94e2-ebeaeb578814_932x483.png 1272w, /__u/substackcdn.com/image/fetch/$s_!FZU0!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a429a6-e79e-4ff0-94e2-ebeaeb578814_932x483.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here&#8217;s the installed enclosure with the internals. Batteries, holder, and a switch.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!tId8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65075210-973c-4203-941a-49dbffcdcb80_1280x1672.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!tId8!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65075210-973c-4203-941a-49dbffcdcb80_1280x1672.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!tId8!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65075210-973c-4203-941a-49dbffcdcb80_1280x1672.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!tId8!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65075210-973c-4203-941a-49dbffcdcb80_1280x1672.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!tId8!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65075210-973c-4203-941a-49dbffcdcb80_1280x1672.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!tId8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65075210-973c-4203-941a-49dbffcdcb80_1280x1672.jpeg" width="1280" height="1672" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65075210-973c-4203-941a-49dbffcdcb80_1280x1672.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1672,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1532263,&quot;alt&quot;:&quot;I love it when a plan comes together&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/171942476?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65075210-973c-4203-941a-49dbffcdcb80_1280x1672.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="I love it when a plan comes together" title="I love it when a plan comes together" srcset="/__u/substackcdn.com/image/fetch/$s_!tId8!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65075210-973c-4203-941a-49dbffcdcb80_1280x1672.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!tId8!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65075210-973c-4203-941a-49dbffcdcb80_1280x1672.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!tId8!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65075210-973c-4203-941a-49dbffcdcb80_1280x1672.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!tId8!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65075210-973c-4203-941a-49dbffcdcb80_1280x1672.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The box uses a 4-way 18650 <a href="https://amzn.to/4muWo77">battery holder</a>, so the voltage at full charge is about 16V. That&#8217;s about 2&#189; hours of light, so I might expect to have to recharge the pack every two weeks or so. A few years ago I discovered <a href="https://amzn.to/4n0Rw9R">lever wire connectors</a> and my life was slightly improved. Recommended.</p><p>This was my first time using 18650 Li-ion batteries. Amazon is full of 18650 batteries with utterly implausible capacity claims. <a href="https://amzn.to/4g2y76c">These ones</a> turned out to be the real thing. I did test them for a few cycles, and they are indeed 3300mAh. Phew! Though next time I&#8217;ll likely follow <a href="https://old.reddit.com/r/18650masterrace/comments/qp21o8/buying_18650_batteries_start_here/">this buying advice</a> on reddit.</p><p>Thanks for reading.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Excamera Labs: what's in store?]]></title><description><![CDATA[Buy my wares]]></description><link>https://excamera.substack.com/p/excamera-labs-whats-in-store</link><guid isPermaLink="false">https://excamera.substack.com/p/excamera-labs-whats-in-store</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 26 Aug 2025 17:02:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9_2I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52805e4e-fb7a-4783-b588-4d31739ed557_650x365.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For the last few weeks a lot of energy has been taken up by the launch of <a href="https://www.crowdsupply.com/excamera/termdriver-2">TermDriver</a>. It&#8217;s exciting to introduce a new product. But of course there&#8217;s always a lot going on with running a small independent hardware maker. Here&#8217;s a roundup of what else has been happening.</p><h2>Gameduino 3X</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!9_2I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52805e4e-fb7a-4783-b588-4d31739ed557_650x365.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!9_2I!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52805e4e-fb7a-4783-b588-4d31739ed557_650x365.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!9_2I!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52805e4e-fb7a-4783-b588-4d31739ed557_650x365.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!9_2I!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52805e4e-fb7a-4783-b588-4d31739ed557_650x365.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!9_2I!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52805e4e-fb7a-4783-b588-4d31739ed557_650x365.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!9_2I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52805e4e-fb7a-4783-b588-4d31739ed557_650x365.jpeg" width="650" height="365" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52805e4e-fb7a-4783-b588-4d31739ed557_650x365.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:365,&quot;width&quot;:650,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Gameduino 3X 5\&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Gameduino 3X 5&quot;" title="Gameduino 3X 5&quot;" srcset="/__u/substackcdn.com/image/fetch/$s_!9_2I!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52805e4e-fb7a-4783-b588-4d31739ed557_650x365.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!9_2I!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52805e4e-fb7a-4783-b588-4d31739ed557_650x365.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!9_2I!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52805e4e-fb7a-4783-b588-4d31739ed557_650x365.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!9_2I!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52805e4e-fb7a-4783-b588-4d31739ed557_650x365.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We have these <a href="https://store.excamera.com/product/gameduino-3x-5">in stock</a> in the Excamera Labs store. The bright 5&#8221; 800x480 premium touchscreen looks great. I&#8217;ve been working with <a href="https://circuitpython.org/">CircuitPython</a> over the last couple of years, and the <a href="https://bteve.readthedocs.io/en/latest/?badge=latest">EVE/Gameduino bindings</a> in CircuitPython work very nicely. It&#8217;s probably the easiest way to put an interactive display on a microcontroller.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>I&#178;CDriver, I&#178;CMini and SPIDriver</h2><p>The price hasn&#8217;t changed over the years - still $29 - but there have been some improvements. The I&#178;CDriver now includes with a cable for the popular Qwiic/Stemma connector.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!OqQc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc1640b-6c42-4e56-8b6a-f32e149e4175_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!OqQc!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc1640b-6c42-4e56-8b6a-f32e149e4175_800x533.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!OqQc!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc1640b-6c42-4e56-8b6a-f32e149e4175_800x533.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!OqQc!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc1640b-6c42-4e56-8b6a-f32e149e4175_800x533.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!OqQc!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc1640b-6c42-4e56-8b6a-f32e149e4175_800x533.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!OqQc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc1640b-6c42-4e56-8b6a-f32e149e4175_800x533.jpeg" width="270" height="179.8875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adc1640b-6c42-4e56-8b6a-f32e149e4175_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:533,&quot;width&quot;:800,&quot;resizeWidth&quot;:270,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!OqQc!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc1640b-6c42-4e56-8b6a-f32e149e4175_800x533.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!OqQc!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc1640b-6c42-4e56-8b6a-f32e149e4175_800x533.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!OqQc!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc1640b-6c42-4e56-8b6a-f32e149e4175_800x533.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!OqQc!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadc1640b-6c42-4e56-8b6a-f32e149e4175_800x533.jpeg 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>If you bought either of the original products, they shipped in an antistatic bag. But a couple of years ago we added very nice product packaging for both:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!aMSg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a77277-f291-4024-be16-d546f5f91923_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!aMSg!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a77277-f291-4024-be16-d546f5f91923_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!aMSg!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a77277-f291-4024-be16-d546f5f91923_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!aMSg!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a77277-f291-4024-be16-d546f5f91923_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!aMSg!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a77277-f291-4024-be16-d546f5f91923_1280x720.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!aMSg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a77277-f291-4024-be16-d546f5f91923_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00a77277-f291-4024-be16-d546f5f91923_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1517100,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/171935484?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a77277-f291-4024-be16-d546f5f91923_1280x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!aMSg!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a77277-f291-4024-be16-d546f5f91923_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!aMSg!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a77277-f291-4024-be16-d546f5f91923_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!aMSg!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a77277-f291-4024-be16-d546f5f91923_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!aMSg!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a77277-f291-4024-be16-d546f5f91923_1280x720.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>All of these interface tools continue to sell through the <a href="https://store.excamera.com/">Excamera Store</a>, <a href="https://www.adafruit.com/product/4267?gQT=0">Adafruit</a>, <a href="https://www.mouser.com/manufacturer/excamera-labs/">Mouser</a> and <a href="https://www.crowdsupply.com/excamera">Crowd Supply</a>.</p><p>After a complicated and frustrating series of mixups with Amazon, both <a href="https://amzn.to/2VaWjMp">I&#178;CDriver</a> and <a href="https://amzn.to/2TTlHFA">I&#178;CMini</a> are available from Amazon again. Hurrah!</p><h2>Electric Dollar Store</h2><p><a href="https://electricdollarstore.com/">Electric Dollar Store</a> was a spin-off from I&#178;CDriver. The idea is a standardized breakout for I&#178;C devices with lots of interesting peripherals to choose from. They&#8217;re packaged and tested here in the USA, and all very reasonably priced.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!4aiL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23eb0207-251d-45f6-ae13-b4b1ce8d1a6f_321x718.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!4aiL!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23eb0207-251d-45f6-ae13-b4b1ce8d1a6f_321x718.png 424w, /__u/substackcdn.com/image/fetch/$s_!4aiL!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23eb0207-251d-45f6-ae13-b4b1ce8d1a6f_321x718.png 848w, /__u/substackcdn.com/image/fetch/$s_!4aiL!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23eb0207-251d-45f6-ae13-b4b1ce8d1a6f_321x718.png 1272w, /__u/substackcdn.com/image/fetch/$s_!4aiL!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23eb0207-251d-45f6-ae13-b4b1ce8d1a6f_321x718.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!4aiL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23eb0207-251d-45f6-ae13-b4b1ce8d1a6f_321x718.png" width="321" height="718" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23eb0207-251d-45f6-ae13-b4b1ce8d1a6f_321x718.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:718,&quot;width&quot;:321,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131602,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/171935484?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23eb0207-251d-45f6-ae13-b4b1ce8d1a6f_321x718.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!4aiL!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23eb0207-251d-45f6-ae13-b4b1ce8d1a6f_321x718.png 424w, /__u/substackcdn.com/image/fetch/$s_!4aiL!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23eb0207-251d-45f6-ae13-b4b1ce8d1a6f_321x718.png 848w, /__u/substackcdn.com/image/fetch/$s_!4aiL!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23eb0207-251d-45f6-ae13-b4b1ce8d1a6f_321x718.png 1272w, /__u/substackcdn.com/image/fetch/$s_!4aiL!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23eb0207-251d-45f6-ae13-b4b1ce8d1a6f_321x718.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Thanks for reading, and if you&#8217;re a customer, thanks very much for supporting independent hardware.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[TermDriver at 300 baud]]></title><description><![CDATA[Keeping it low and slow with the TRS-80 Model 100]]></description><link>https://excamera.substack.com/p/termdriver-at-300-baud</link><guid isPermaLink="false">https://excamera.substack.com/p/termdriver-at-300-baud</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 12 Aug 2025 19:16:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nLWg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7714ff79-99a9-4255-a152-9496c43abd27_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When you run a crowdfunding campaign, people ask questions. This is often surprising. I find that the things that I think are important are not necessarily what other people consider important. For <a href="https://www.crowdsupply.com/excamera/termdriver-2">TermDriver</a> I really thought that unicode support would be requested given how many backers are from Europe. But actually the top questions were (1) why doesn&#8217;t it have a USB-C socket? (it&#8217;s coming, after the main version launches) and (2) can it run at 300 baud? I&#8217;d only tested it at the ridiculously slow speed of 1200 baud. Who needs 300 baud in 2025?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Turns out people with antique computers do. I have a couple of antiques around the place, including a TRS-80 Model 100. So I spent a few minutes making sure that TermDriver can talk to it at 300 baud.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!nLWg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7714ff79-99a9-4255-a152-9496c43abd27_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!nLWg!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7714ff79-99a9-4255-a152-9496c43abd27_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!nLWg!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7714ff79-99a9-4255-a152-9496c43abd27_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!nLWg!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7714ff79-99a9-4255-a152-9496c43abd27_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nLWg!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7714ff79-99a9-4255-a152-9496c43abd27_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!nLWg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7714ff79-99a9-4255-a152-9496c43abd27_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7714ff79-99a9-4255-a152-9496c43abd27_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3475721,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/170812529?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7714ff79-99a9-4255-a152-9496c43abd27_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!nLWg!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7714ff79-99a9-4255-a152-9496c43abd27_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!nLWg!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7714ff79-99a9-4255-a152-9496c43abd27_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!nLWg!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7714ff79-99a9-4255-a152-9496c43abd27_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nLWg!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7714ff79-99a9-4255-a152-9496c43abd27_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The Model 100 was introduced in 1983. Wikipedia calls it &#8220;one of the first notebook computers ever released.&#8221; Yes it is like a notebook. But using it is a reminder that things have improved <em>a lot</em> in 42 years.</p><p>But not everything has improved. The keyboard is pretty good by the standards of today&#8217;s laptops, with deep key travel and a positive action. And the accompanying spiral bound manual is surprisingly good.</p><p>Hooking up the serial hardware was surprisingly simple. The TermDriver outputs 3.3 V serial levels, not old-school RS232 levels, so I&#8217;ve plugged it into this <a href="https://amzn.to/4mbVtZ4">level shifter</a> from Amazon. It&#8217;s just the minimum: given 3.3 V and TX and RX from the TermDriver, it outputs RS232 levels on the DB-9.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!yrNO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9392ebed-345b-497f-bfae-e03789435073_683x579.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!yrNO!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9392ebed-345b-497f-bfae-e03789435073_683x579.png 424w, /__u/substackcdn.com/image/fetch/$s_!yrNO!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9392ebed-345b-497f-bfae-e03789435073_683x579.png 848w, /__u/substackcdn.com/image/fetch/$s_!yrNO!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9392ebed-345b-497f-bfae-e03789435073_683x579.png 1272w, /__u/substackcdn.com/image/fetch/$s_!yrNO!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9392ebed-345b-497f-bfae-e03789435073_683x579.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!yrNO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9392ebed-345b-497f-bfae-e03789435073_683x579.png" width="367" height="311.11713030746705" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9392ebed-345b-497f-bfae-e03789435073_683x579.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:579,&quot;width&quot;:683,&quot;resizeWidth&quot;:367,&quot;bytes&quot;:381398,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/170812529?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9392ebed-345b-497f-bfae-e03789435073_683x579.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!yrNO!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9392ebed-345b-497f-bfae-e03789435073_683x579.png 424w, /__u/substackcdn.com/image/fetch/$s_!yrNO!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9392ebed-345b-497f-bfae-e03789435073_683x579.png 848w, /__u/substackcdn.com/image/fetch/$s_!yrNO!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9392ebed-345b-497f-bfae-e03789435073_683x579.png 1272w, /__u/substackcdn.com/image/fetch/$s_!yrNO!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9392ebed-345b-497f-bfae-e03789435073_683x579.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>With all the hardware hooked up, and the TermDriver set up at 300 baud, I could use TRS-80 BASIC to save and load programs over the serial line. It was fun to see ancient BASIC code scrolling up the TermDriver&#8217;s screen. I must admit to a tiny pang of nostalgia.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!XNWR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff786df27-afe0-4dcc-a2f0-9fd86aec5ac1_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!XNWR!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff786df27-afe0-4dcc-a2f0-9fd86aec5ac1_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!XNWR!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff786df27-afe0-4dcc-a2f0-9fd86aec5ac1_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!XNWR!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff786df27-afe0-4dcc-a2f0-9fd86aec5ac1_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!XNWR!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff786df27-afe0-4dcc-a2f0-9fd86aec5ac1_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!XNWR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff786df27-afe0-4dcc-a2f0-9fd86aec5ac1_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f786df27-afe0-4dcc-a2f0-9fd86aec5ac1_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3011956,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/170812529?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff786df27-afe0-4dcc-a2f0-9fd86aec5ac1_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!XNWR!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff786df27-afe0-4dcc-a2f0-9fd86aec5ac1_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!XNWR!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff786df27-afe0-4dcc-a2f0-9fd86aec5ac1_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!XNWR!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff786df27-afe0-4dcc-a2f0-9fd86aec5ac1_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!XNWR!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff786df27-afe0-4dcc-a2f0-9fd86aec5ac1_1920x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So for all the retro fans out there: yes <a href="https://www.crowdsupply.com/excamera/termdriver-2">TermDriver</a> runs reliably at 300 baud. And it&#8217;s been confirmed on a machine from an age when 300 baud was considered pretty ok.</p>]]></content:encoded></item><item><title><![CDATA[Instant tiny console for the Raspberry Pi]]></title><link>https://excamera.substack.com/p/instant-tiny-console-for-the-raspberry</link><guid isPermaLink="false">https://excamera.substack.com/p/instant-tiny-console-for-the-raspberry</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 29 Jul 2025 15:16:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Mo84!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd6fdb4d-5d29-4dc2-9d17-8daa4a4c63a0_694x538.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Dear readers, the <a href="https://www.crowdsupply.com/excamera/termdriver-2">TermDriver2 campaign</a> is currently running over on Crowd Supply. Thank you very much for making its first two weeks such a success. </p></blockquote><p>Do you ever wonder what your Raspberry Pi is doing? I do, particularly when rebooting. Of course you can plug in a bulky monitor, but the whole point of a Raspberry Pi is compactness. <em>If only</em> there was a miniature console that attaches directly to the Pi&#8217;s serial pins. Well rejoice, because you can now use TermDriver to do it &#8212; here&#8217;s how.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>First, I wanted to make a holder for the TermDriver. Here&#8217;s my attempt, made  using OpenSCAD.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Mo84!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd6fdb4d-5d29-4dc2-9d17-8daa4a4c63a0_694x538.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Mo84!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd6fdb4d-5d29-4dc2-9d17-8daa4a4c63a0_694x538.png 424w, /__u/substackcdn.com/image/fetch/$s_!Mo84!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd6fdb4d-5d29-4dc2-9d17-8daa4a4c63a0_694x538.png 848w, /__u/substackcdn.com/image/fetch/$s_!Mo84!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd6fdb4d-5d29-4dc2-9d17-8daa4a4c63a0_694x538.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Mo84!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd6fdb4d-5d29-4dc2-9d17-8daa4a4c63a0_694x538.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Mo84!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd6fdb4d-5d29-4dc2-9d17-8daa4a4c63a0_694x538.png" width="694" height="538" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fd6fdb4d-5d29-4dc2-9d17-8daa4a4c63a0_694x538.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:538,&quot;width&quot;:694,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:25323,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/169511647?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd6fdb4d-5d29-4dc2-9d17-8daa4a4c63a0_694x538.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Mo84!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd6fdb4d-5d29-4dc2-9d17-8daa4a4c63a0_694x538.png 424w, /__u/substackcdn.com/image/fetch/$s_!Mo84!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd6fdb4d-5d29-4dc2-9d17-8daa4a4c63a0_694x538.png 848w, /__u/substackcdn.com/image/fetch/$s_!Mo84!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd6fdb4d-5d29-4dc2-9d17-8daa4a4c63a0_694x538.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Mo84!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd6fdb4d-5d29-4dc2-9d17-8daa4a4c63a0_694x538.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s just a first draft; and it needs supports to print, so I think it would be better split into two pieces. If there are any 3D printing/OpenSCAD experts reading who want to have a crack at it, I&#8217;d be very grateful. The model is <a href="https://github.com/jamesbowman/termdriver2/blob/main/openscad/desk-stand.stl">here</a> and the source is <a href="https://github.com/jamesbowman/termdriver2/tree/main/openscad">here</a>.</p><p>It&#8217;s an exact fit for the TermDriver, and holds it very nicely in place.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!tnRR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc53ae9d0-5db6-4fe1-b570-441d262430df_1920x1640.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!tnRR!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc53ae9d0-5db6-4fe1-b570-441d262430df_1920x1640.png 424w, /__u/substackcdn.com/image/fetch/$s_!tnRR!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc53ae9d0-5db6-4fe1-b570-441d262430df_1920x1640.png 848w, /__u/substackcdn.com/image/fetch/$s_!tnRR!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc53ae9d0-5db6-4fe1-b570-441d262430df_1920x1640.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tnRR!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc53ae9d0-5db6-4fe1-b570-441d262430df_1920x1640.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!tnRR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc53ae9d0-5db6-4fe1-b570-441d262430df_1920x1640.png" width="1456" height="1244" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c53ae9d0-5db6-4fe1-b570-441d262430df_1920x1640.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1244,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5884295,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/169511647?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc53ae9d0-5db6-4fe1-b570-441d262430df_1920x1640.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!tnRR!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc53ae9d0-5db6-4fe1-b570-441d262430df_1920x1640.png 424w, /__u/substackcdn.com/image/fetch/$s_!tnRR!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc53ae9d0-5db6-4fe1-b570-441d262430df_1920x1640.png 848w, /__u/substackcdn.com/image/fetch/$s_!tnRR!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc53ae9d0-5db6-4fe1-b570-441d262430df_1920x1640.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tnRR!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc53ae9d0-5db6-4fe1-b570-441d262430df_1920x1640.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>With the TermDriver securely in its tiny frame, it was a simple matter of hooking up the Raspberry Pi and powering on.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!WFnf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe646583d-2445-4deb-98b9-c305e5a7f8d6_1557x1920.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!WFnf!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe646583d-2445-4deb-98b9-c305e5a7f8d6_1557x1920.png 424w, /__u/substackcdn.com/image/fetch/$s_!WFnf!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe646583d-2445-4deb-98b9-c305e5a7f8d6_1557x1920.png 848w, /__u/substackcdn.com/image/fetch/$s_!WFnf!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe646583d-2445-4deb-98b9-c305e5a7f8d6_1557x1920.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WFnf!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe646583d-2445-4deb-98b9-c305e5a7f8d6_1557x1920.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!WFnf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe646583d-2445-4deb-98b9-c305e5a7f8d6_1557x1920.png" width="1456" height="1795" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e646583d-2445-4deb-98b9-c305e5a7f8d6_1557x1920.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1795,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5995109,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/169511647?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe646583d-2445-4deb-98b9-c305e5a7f8d6_1557x1920.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!WFnf!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe646583d-2445-4deb-98b9-c305e5a7f8d6_1557x1920.png 424w, /__u/substackcdn.com/image/fetch/$s_!WFnf!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe646583d-2445-4deb-98b9-c305e5a7f8d6_1557x1920.png 848w, /__u/substackcdn.com/image/fetch/$s_!WFnf!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe646583d-2445-4deb-98b9-c305e5a7f8d6_1557x1920.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WFnf!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe646583d-2445-4deb-98b9-c305e5a7f8d6_1557x1920.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The wire connections are from the Raspberry Pi&#8217;s serial lines to the TermDriver, plus ground and 3.3 V. While TermDriver is normally used with USB power, it&#8217;s also perfectly happy running from the 3.3 V supplied by the RPi.</p><p>Of course you can plug in a USB cable and log in as well. It&#8217;s been invaluable as I&#8217;ve recently been debugging the RPi Zero W wifi link.</p><p>Simple as that. Again, you can pre-order a <a href="https://www.crowdsupply.com/excamera/termdriver-2">TermDriver</a> now. Thanks for reading.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Tiny Code Reader: a $7 QR code sensor]]></title><description><![CDATA[So cheap I bought three]]></description><link>https://excamera.substack.com/p/tiny-code-reader-a-7-qr-code-sensor</link><guid isPermaLink="false">https://excamera.substack.com/p/tiny-code-reader-a-7-qr-code-sensor</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 22 Jul 2025 16:18:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XJK8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff25da6f3-08d0-4c95-98de-e874e3849163_1440x1920.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Tiny Code Reader (TCR) caught my eye when it came out in 2023. It&#8217;s a very appealing idea: a self-contained seeing module that just decodes any QR code it sees. I immediately imagined applications in desktop manufacturing, a subject very dear to my heart.</p><p>You can buy it from Adafruit, Sparkfun, and elsewhere. There&#8217;s a <a href="https://usfl.ink/tcr_dev">main page</a> with a clear getting started guide, and a <a href="https://uploads-ssl.webflow.com/662f20944f7a8202d9d5f549/666a4e00ce9b13ca1c313722_TCR_Datasheet.pdf">datasheet</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!XJK8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff25da6f3-08d0-4c95-98de-e874e3849163_1440x1920.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!XJK8!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff25da6f3-08d0-4c95-98de-e874e3849163_1440x1920.png 424w, /__u/substackcdn.com/image/fetch/$s_!XJK8!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff25da6f3-08d0-4c95-98de-e874e3849163_1440x1920.png 848w, /__u/substackcdn.com/image/fetch/$s_!XJK8!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff25da6f3-08d0-4c95-98de-e874e3849163_1440x1920.png 1272w, /__u/substackcdn.com/image/fetch/$s_!XJK8!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff25da6f3-08d0-4c95-98de-e874e3849163_1440x1920.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!XJK8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff25da6f3-08d0-4c95-98de-e874e3849163_1440x1920.png" width="1440" height="1920" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f25da6f3-08d0-4c95-98de-e874e3849163_1440x1920.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1920,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4163097,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/168889713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff25da6f3-08d0-4c95-98de-e874e3849163_1440x1920.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!XJK8!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff25da6f3-08d0-4c95-98de-e874e3849163_1440x1920.png 424w, /__u/substackcdn.com/image/fetch/$s_!XJK8!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff25da6f3-08d0-4c95-98de-e874e3849163_1440x1920.png 848w, /__u/substackcdn.com/image/fetch/$s_!XJK8!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff25da6f3-08d0-4c95-98de-e874e3849163_1440x1920.png 1272w, /__u/substackcdn.com/image/fetch/$s_!XJK8!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff25da6f3-08d0-4c95-98de-e874e3849163_1440x1920.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Because it uses the Qwiic connector standard, setting it up is a breeze . It plugs directly into <a href="https://i2cdriver.com/">I&#178;CDriver</a> or <a href="https://i2cdriver.com/mini.html">I&#178;CMini</a> - both ship with qwiic cables included. TCR has a color LED on the front side that blinks blue on power-on, and helpfully blinks green when it detects a QR code in front of it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!FzbH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7cc8e50-04f1-4f46-a7c6-a5ad8a293996_1440x1920.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!FzbH!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7cc8e50-04f1-4f46-a7c6-a5ad8a293996_1440x1920.png 424w, /__u/substackcdn.com/image/fetch/$s_!FzbH!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7cc8e50-04f1-4f46-a7c6-a5ad8a293996_1440x1920.png 848w, /__u/substackcdn.com/image/fetch/$s_!FzbH!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7cc8e50-04f1-4f46-a7c6-a5ad8a293996_1440x1920.png 1272w, /__u/substackcdn.com/image/fetch/$s_!FzbH!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7cc8e50-04f1-4f46-a7c6-a5ad8a293996_1440x1920.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!FzbH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7cc8e50-04f1-4f46-a7c6-a5ad8a293996_1440x1920.png" width="1440" height="1920" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7cc8e50-04f1-4f46-a7c6-a5ad8a293996_1440x1920.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1920,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4459333,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/168889713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7cc8e50-04f1-4f46-a7c6-a5ad8a293996_1440x1920.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!FzbH!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7cc8e50-04f1-4f46-a7c6-a5ad8a293996_1440x1920.png 424w, /__u/substackcdn.com/image/fetch/$s_!FzbH!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7cc8e50-04f1-4f46-a7c6-a5ad8a293996_1440x1920.png 848w, /__u/substackcdn.com/image/fetch/$s_!FzbH!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7cc8e50-04f1-4f46-a7c6-a5ad8a293996_1440x1920.png 1272w, /__u/substackcdn.com/image/fetch/$s_!FzbH!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7cc8e50-04f1-4f46-a7c6-a5ad8a293996_1440x1920.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Within a a couple of minutes I had a Python loop that printed out the current QR code using the  <a href="https://i2cdriver.com/">I&#178;CDriver</a>:</p><pre><code>import sys
import struct
from i2cdriver import I2CDriver

class TCR:
    pass

if __name__ == '__main__':
    i2 = I2CDriver(sys.argv[1])
    i2.setspeed(400)
    i2.scan()
    while 1:
        i2.start(0x0c, 1)
        b = i2.read(256)
        i2.stop()
        (l, ) = struct.unpack("&lt;H", b[0:2])
        s = b[2:2+l]
        if l:
            print(s)
        else:
            print('nothing')</code></pre><p>That&#8217;s all it took. Sure enough, it worked immediately, decoding the code in front of it:</p><pre><code>b'http://en.m.wikipedia.org'
b'http://en.m.wikipedia.org'
b'http://en.m.wikipedia.org'
b'http://en.m.wikipedia.org'</code></pre><p>I didn&#8217;t test it with longer codes. The developer documentation hints that longer codes might be a problem. The I&#178;C protocol itself limits the code size it can report to 254 bytes.</p><p>But the biggest limitation seems to be that it needs the code to be almost dead center in front of the camera sensor. The documentation says </p><blockquote><p>The sensor has approximately a 110 degree field of view.</p></blockquote><p>but using my setup above I found it to only recognize the code if it&#8217;s centered with 5 degrees in both vertical and horizontal directions. That&#8217;s about 10mm with a 130mm lens-to-code distance. Pretty tight. I have opened <a href="https://github.com/moonshine-ai/tiny_code_reader_docs/issues/7">a github issue</a> with the maker for clarification.</p><p>What&#8217;s inside the TCR is a pretty interesting exercise in minimalism. The microcontroller is a RP2040 (just like <a href="https://www.crowdsupply.com/excamera/termdriver-2">TermDriver</a>), hooked up to the I&#178;C lines on one side and the image sensor from Arducam on the other. The image sensor module is glued down to the main board, but easily comes apart to reveal a 30-pin connector.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!u17X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651444cb-d2e0-4791-a076-76dbde257504_1920x1164.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!u17X!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651444cb-d2e0-4791-a076-76dbde257504_1920x1164.png 424w, /__u/substackcdn.com/image/fetch/$s_!u17X!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651444cb-d2e0-4791-a076-76dbde257504_1920x1164.png 848w, /__u/substackcdn.com/image/fetch/$s_!u17X!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651444cb-d2e0-4791-a076-76dbde257504_1920x1164.png 1272w, /__u/substackcdn.com/image/fetch/$s_!u17X!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651444cb-d2e0-4791-a076-76dbde257504_1920x1164.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!u17X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651444cb-d2e0-4791-a076-76dbde257504_1920x1164.png" width="1456" height="883" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/651444cb-d2e0-4791-a076-76dbde257504_1920x1164.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:883,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2947980,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/168889713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651444cb-d2e0-4791-a076-76dbde257504_1920x1164.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!u17X!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651444cb-d2e0-4791-a076-76dbde257504_1920x1164.png 424w, /__u/substackcdn.com/image/fetch/$s_!u17X!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651444cb-d2e0-4791-a076-76dbde257504_1920x1164.png 848w, /__u/substackcdn.com/image/fetch/$s_!u17X!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651444cb-d2e0-4791-a076-76dbde257504_1920x1164.png 1272w, /__u/substackcdn.com/image/fetch/$s_!u17X!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651444cb-d2e0-4791-a076-76dbde257504_1920x1164.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The rest is software. It&#8217;s possible to imagine all sorts of useful applications for this hardware with different software. In fact the same company makes a <a href="https://www.sparkfun.com/person-sensor-by-useful-sensors.html">person detector</a>, using a slightly different hardware platform.</p><p>The most surprising thing about this product is the price. At $7 retail, I imagine the maker is selling them for around $4, which must be very close to the BOM for the product itself. I&#8217;m tempted to see if I can use it as a development platform  &#8212; the $7 price for a stock RP2040 <em>and</em> an image sensor is pretty appealing.</p><p>Thanks for reading.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://excamera.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Excamera Labs Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[TermDriver's firmware]]></title><description><![CDATA[Clever but not too clever]]></description><link>https://excamera.substack.com/p/termdrivers-firmware</link><guid isPermaLink="false">https://excamera.substack.com/p/termdrivers-firmware</guid><dc:creator><![CDATA[James Bowman]]></dc:creator><pubDate>Tue, 15 Jul 2025 17:36:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!IQWY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d873bf-96b9-4ae5-842b-0e0a9f39b23d_1047x1047.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><em>This post is all about TermDriver, a USB/serial adapter that is now available on <a href="https://www.crowdsupply.com/excamera/termdriver-2">Crowd Supply</a>. You can be first in line for the world&#8217;s coolest USB serial adapter. Thanks.</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!IQWY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d873bf-96b9-4ae5-842b-0e0a9f39b23d_1047x1047.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!IQWY!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d873bf-96b9-4ae5-842b-0e0a9f39b23d_1047x1047.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!IQWY!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d873bf-96b9-4ae5-842b-0e0a9f39b23d_1047x1047.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!IQWY!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d873bf-96b9-4ae5-842b-0e0a9f39b23d_1047x1047.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!IQWY!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d873bf-96b9-4ae5-842b-0e0a9f39b23d_1047x1047.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!IQWY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d873bf-96b9-4ae5-842b-0e0a9f39b23d_1047x1047.jpeg" width="1047" height="1047" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84d873bf-96b9-4ae5-842b-0e0a9f39b23d_1047x1047.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1047,&quot;width&quot;:1047,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:249444,&quot;alt&quot;:&quot;TermDriver2&quot;,&quot;title&quot;:&quot;TermDriver2&quot;,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/166026423?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d873bf-96b9-4ae5-842b-0e0a9f39b23d_1047x1047.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="TermDriver2" title="TermDriver2" srcset="/__u/substackcdn.com/image/fetch/$s_!IQWY!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d873bf-96b9-4ae5-842b-0e0a9f39b23d_1047x1047.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!IQWY!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d873bf-96b9-4ae5-842b-0e0a9f39b23d_1047x1047.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!IQWY!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d873bf-96b9-4ae5-842b-0e0a9f39b23d_1047x1047.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!IQWY!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84d873bf-96b9-4ae5-842b-0e0a9f39b23d_1047x1047.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Earlier I wrote about the TermDriver <a href="/__u/excamera.substack.com/p/what-ive-been-making-termdriver2">hardware development</a>, and the technology of <a href="/__u/excamera.substack.com/p/can-3-point-text-be-readable">making tiny text readable</a>. Something that I&#8217;m quite pleased about is the firmware that&#8217;s inside TermDriver.</p><h2>The main thing</h2><p>First and foremost, TermDriver&#8217;s job is to pass traffic between the UART and the USB port. That&#8217;s obviously what you want from this device. But it also needs to update the screen, redrawing it for every single character that comes through.  For the terminal to be an accurate log of the traffic, TermDriver cannot ever drop a single character, otherwise the screen would be corrupt.</p><h2>Graphics bandwidth</h2><p>The screen on TermDriver is a surprisingly bright 240x240 LCD, controlled by an ST7789. The RP2040 that&#8217;s running the show is connected by an SPI interface to the ST7789, which refreshes the LCD at around 60 Hz. That sets the goal: to look crisp and snappy, the RP2040 needs to redraw the screen at 60 Hz. That&#8217;s 13.3 ms per redraw.</p><p>Can this be done? Yes, but it&#8217;s a lot of bandwidth for a microcontroller. 240x240 pixels at 18 bits per pixel at 60 fps comes out at 62 Mbit/s over the SPI bus. That&#8217;s on the edge of the maximum rate for the RP2040. </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!pR6K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1885b06a-44d3-4377-8d74-d65b0f365b12_1312x258.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!pR6K!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1885b06a-44d3-4377-8d74-d65b0f365b12_1312x258.png 424w, /__u/substackcdn.com/image/fetch/$s_!pR6K!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1885b06a-44d3-4377-8d74-d65b0f365b12_1312x258.png 848w, /__u/substackcdn.com/image/fetch/$s_!pR6K!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1885b06a-44d3-4377-8d74-d65b0f365b12_1312x258.png 1272w, /__u/substackcdn.com/image/fetch/$s_!pR6K!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1885b06a-44d3-4377-8d74-d65b0f365b12_1312x258.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!pR6K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1885b06a-44d3-4377-8d74-d65b0f365b12_1312x258.png" width="1312" height="258" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1885b06a-44d3-4377-8d74-d65b0f365b12_1312x258.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:258,&quot;width&quot;:1312,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:54980,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/168326745?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1885b06a-44d3-4377-8d74-d65b0f365b12_1312x258.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!pR6K!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1885b06a-44d3-4377-8d74-d65b0f365b12_1312x258.png 424w, /__u/substackcdn.com/image/fetch/$s_!pR6K!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1885b06a-44d3-4377-8d74-d65b0f365b12_1312x258.png 848w, /__u/substackcdn.com/image/fetch/$s_!pR6K!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1885b06a-44d3-4377-8d74-d65b0f365b12_1312x258.png 1272w, /__u/substackcdn.com/image/fetch/$s_!pR6K!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1885b06a-44d3-4377-8d74-d65b0f365b12_1312x258.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>There&#8217;s a clever trick, although it costs a little bit of image quality. Instead of running 18 bits per pixel, the ST7798 can run in a 12 bit per pixel mode (i.e. 4 bits each for red, green and blue). This reduces the theoretical SPI bandwidth to 41 Mbit/s. Much safer. Cutting this corner also makes the RP2040 color code considerably faster.</p><h2>Dual core action</h2><p>RP2040 is a true dual-core microcontroller. This is what makes TermDriver possible. One core handles the communications between USB and the UART, and updates a block of memory that represents the screen as an array of characters and colors.</p><p>The second core reads from this in-memory screen, does the math to figure out the pixels, and writes it over SPI (using RP2040&#8217;s awesome DMA) to the display.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ZiKX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8294384d-9996-4638-9844-f1da34b0b245_1920x874.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ZiKX!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8294384d-9996-4638-9844-f1da34b0b245_1920x874.png 424w, /__u/substackcdn.com/image/fetch/$s_!ZiKX!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8294384d-9996-4638-9844-f1da34b0b245_1920x874.png 848w, /__u/substackcdn.com/image/fetch/$s_!ZiKX!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8294384d-9996-4638-9844-f1da34b0b245_1920x874.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ZiKX!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_webp, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8294384d-9996-4638-9844-f1da34b0b245_1920x874.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ZiKX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8294384d-9996-4638-9844-f1da34b0b245_1920x874.png" width="1456" height="663" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8294384d-9996-4638-9844-f1da34b0b245_1920x874.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:663,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2533042,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://excamera.substack.com/i/168326745?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8294384d-9996-4638-9844-f1da34b0b245_1920x874.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!ZiKX!, /__u/excamera.substack.com/w_424, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8294384d-9996-4638-9844-f1da34b0b245_1920x874.png 424w, /__u/substackcdn.com/image/fetch/$s_!ZiKX!, /__u/excamera.substack.com/w_848, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8294384d-9996-4638-9844-f1da34b0b245_1920x874.png 848w, /__u/substackcdn.com/image/fetch/$s_!ZiKX!, /__u/excamera.substack.com/w_1272, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8294384d-9996-4638-9844-f1da34b0b245_1920x874.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ZiKX!, /__u/excamera.substack.com/w_1456, /__u/excamera.substack.com/c_limit, /__u/excamera.substack.com/f_auto, /__u/excamera.substack.com/q_auto:good, /__u/excamera.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8294384d-9996-4638-9844-f1da34b0b245_1920x874.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The beauty of this cunning scheme is that even if the data is coming through <em>really fast</em>, changing the whole screen hundreds of times per second, the display updates still happen at a steady 60 Hz. Each 60 Hz tick you see a snapshot of the instantaneous terminal state, guaranteed.</p><h2>Racing the beam</h2><p>One thing that increases visual quality is reducing &#8220;tearing&#8221; &#8212; seeing visible partial updates on the screen at the same time. The expensive solution to this is double-buffering, something that the EVE chip in the <a href="https://store.excamera.com/product/gameduino-3x-5">Gameduino</a> supports in hardware. The ST7789 doesn&#8217;t support double-buffering; there&#8217;s only enough RAM inside for the visible pixels. But again there is a simple old-school trick that helps. Sometimes called &#8220;<a href="https://amzn.to/4lsDJZh">racing the beam</a>,&#8221; it is to time the video writes exactly so they just follow the scanout line. That&#8217;s what the rendering thread does. It waits for the vertical refresh, then repaints all the pixels slightly more slowly than the scanout, so on the next frame. Result - smoother scrolling and updates.</p><p>Thanks for reading. Please subscribe &#8212; every week I write about what I&#8217;m making. And if you think a TermDriver would be a useful addition to your workbench, by all means <a href="https://www.crowdsupply.com/excamera/termdriver-2">place an order</a>. Thanks again.</p><p></p>]]></content:encoded></item></channel></rss>