<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Maskset | Manufacturing, Electronics, Software, Mechanics, &amp; IC Design Notes to Self on Maskset</title><link>https://www.maskset.net/</link><description>Recent content in Maskset | Manufacturing, Electronics, Software, Mechanics, &amp; IC Design Notes to Self on Maskset</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 29 Sep 2025 20:18:47 -0400</lastBuildDate><atom:link href="https://www.maskset.net/index.xml" rel="self" type="application/rss+xml"/><item><title>About</title><link>https://www.maskset.net/about/</link><pubDate>Sat, 08 May 2021 00:00:00 -0400</pubDate><guid>https://www.maskset.net/about/</guid><description>&lt;div&gt;&lt;a id="td-block-0" class="td-offset-anchor"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;section class="row td-box td-box--0 td-box--height-auto"&gt;
&lt;div class="col"&gt;
&lt;div class="container"&gt;
&lt;p class="h1" id="contact"&gt;Contact&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Shoot me an email: &lt;a href="mailto:simon@maskset.net"&gt;simon@maskset.net&lt;/a&gt;. I&amp;rsquo;m always happy to hear comments or help out motivated people build useful things.&lt;/li&gt;
&lt;li&gt;If you&amp;rsquo;re in New York come to a Fat Cat Fab Lab open house! &lt;a href="https://www.meetup.com/fat-cat-fab-lab/events/"&gt;Meetup Link&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;When I&amp;rsquo;m in Houston you can usually find me at &lt;a href="https://iondistrict.com/"&gt;the ION&lt;/a&gt; or hacking at &lt;a href="https://apps.txrxlabs.org/"&gt;TXRX&lt;/a&gt;.
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;div&gt;&lt;a id="td-block-1" class="td-offset-anchor"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;section class="row td-box td-box--1 td-box--height-auto"&gt;
&lt;div class="col"&gt;
&lt;div class="container"&gt;
&lt;p class="h1" id="about-me"&gt;About Me&lt;/p&gt;
&lt;p&gt;This is my personal blog mostly focused on the various nonconfidential discoveries and tools made as a measurements system designer with &lt;a href="https://electrooptical.net"&gt;ElectroOptical Innovations&lt;/a&gt;.
We&amp;rsquo;re a small highly technical shop designing a wide breadth of challenging systems. Some of the products that we develop are available from &lt;a href="https://hobbs-eo.com"&gt;Hobbs ElectroOptics&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>FreeCAD FEM Workbench Setup</title><link>https://www.maskset.net/blog/2025/09/29/freecad-fem-workbench-setup/</link><pubDate>Mon, 29 Sep 2025 20:18:47 -0400</pubDate><guid>https://www.maskset.net/blog/2025/09/29/freecad-fem-workbench-setup/</guid><description>&lt;p&gt;Getting started with a new simulation tool is hard enough without needing to worry about the installation.
There&amp;rsquo;s a lot to love about the FEM Workbench that ships with FreeCAD. Interoperability and ease of setup isn&amp;rsquo;t it.&lt;/p&gt;
&lt;p&gt;Out of the box, the Flatpak build includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gmsh (mesher)&lt;/li&gt;
&lt;li&gt;CalculiX (solver)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But it’s missing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Netgen&lt;/li&gt;
&lt;li&gt;Elmer&lt;/li&gt;
&lt;li&gt;Z88&lt;/li&gt;
&lt;li&gt;Mystran&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This Dockerfile pulls in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The FreeCAD AppImage (which includes Netgen)&lt;/li&gt;
&lt;li&gt;Elmer FEM (via PPA)&lt;/li&gt;
&lt;li&gt;Z88 Aurora (via official tarball)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mystran isn’t included — they don’t provide Linux binaries. I may add a build later if needed.&lt;/p&gt;</description></item><item><title>Zephyr and MCUBoot</title><link>https://www.maskset.net/blog/2025/09/12/zephyr-and-mcuboot/</link><pubDate>Fri, 12 Sep 2025 14:38:27 -0400</pubDate><guid>https://www.maskset.net/blog/2025/09/12/zephyr-and-mcuboot/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;The following goes through a recommended Zephyr project setup and integrates it with a single stage MCUBoot bootloader.
The first section uses the Renode emulator and then moves to actual hardware.&lt;/p&gt;
&lt;p&gt;In previous posts we introduced &lt;a href="https://www.maskset.net/blog/2025/08/27/renode-docker-setup-on-ubuntu-24.04/"&gt;Renode Docker Setup on Ubuntu 24.04&lt;/a&gt; and a &lt;a href="https://www.maskset.net/blog/2025/08/29/bare-metal-mcuboot-port-on-renode/"&gt;Bare-metal MCUBoot Port on Renode&lt;/a&gt;.
This article moves up an abstraction layer and uses Zephyr with MCUBoot.
Zephyr and the build tools are installed locally (Ubuntu 24.04), in a way similar to the instructions in the &lt;a href="https://docs.zephyrproject.org/latest/develop/getting_started/index.html"&gt;Docs&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Shuffling Strategies in War</title><link>https://www.maskset.net/blog/2025/09/07/simulating-war-shuffling-strategy/</link><pubDate>Sun, 07 Sep 2025 17:24:26 -0400</pubDate><guid>https://www.maskset.net/blog/2025/09/07/simulating-war-shuffling-strategy/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR: Bury your Aces&lt;/strong&gt;
Counterintuitively, in War you don’t want your hand to be packed with strong cards.&lt;/p&gt;
&lt;p&gt;Simulation code available &lt;a href="https://github.com/snhobbs/maskset-examples/tree/master/war-card-game-monte-carlo"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;The card game War is, at its core, a game of dumb luck. Whoever gets the better draw usually walks away with the win. But there&amp;rsquo;s at least one way to get an edge.&lt;/p&gt;
&lt;p&gt;Here’s the version I grew up playing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cards you win go into a discard pile.&lt;/li&gt;
&lt;li&gt;When your hand runs out, you fold the discard pile back in.&lt;/li&gt;
&lt;li&gt;When you recombine you may shuffle.&lt;/li&gt;
&lt;li&gt;If your opponent recombines, you can combine and shuffle too.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That single choice of when to shuffle cracks open a surprising little window of strategy in an otherwise mindless game.&lt;/p&gt;</description></item><item><title>Bare-metal MCUBoot Port on Renode</title><link>https://www.maskset.net/blog/2025/08/29/bare-metal-mcuboot-port-on-renode/</link><pubDate>Fri, 29 Aug 2025 15:20:35 -0400</pubDate><guid>https://www.maskset.net/blog/2025/08/29/bare-metal-mcuboot-port-on-renode/</guid><description>&lt;p&gt;The code for this project is available &lt;a href="https://github.com/snhobbs/maskset-examples/tree/master/renode-bootloader/project"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="why-use-renode"&gt;Why use Renode?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Faster Iterations: It allows faster testing without the delays of physical hardware, especially useful when tweaking bootloader and firmware behavior.&lt;/li&gt;
&lt;li&gt;Flash Wear Prevention: Running tests in Renode prevents flash from being worn out due to frequent writes (especially useful while you&amp;rsquo;re still debugging).&lt;/li&gt;
&lt;li&gt;Continuous Integration (CI): Test your actual build in CI setups.&lt;/li&gt;
&lt;li&gt;Development Without Hardware: Enables software developers to work on embedded projects without needing the actual hardware.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="setup"&gt;Setup&lt;/h2&gt;
&lt;div class="alert alert-primary" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;Note&lt;/div&gt;


Zephyr's CMake or west manager will look after almost all of this for you.
&lt;/div&gt;

&lt;p&gt;I started with the Interrupt article &lt;a href="https://interrupt.memfault.com/blog/mcuboot-overview"&gt;here&lt;/a&gt; on porting MCUBoot to a bare-metal project, ported it to a CMake project and added the Renode and VSCode scripts, building on my previous post: &lt;a href="https://www.maskset.net/blog/2025/08/27/renode-docker-setup-on-ubuntu-24.04/"&gt;Renode Docker Setup on Ubuntu 24.04&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Renode Docker Setup on Ubuntu 24.04</title><link>https://www.maskset.net/blog/2025/08/27/renode-docker-setup-on-ubuntu-24.04/</link><pubDate>Wed, 27 Aug 2025 12:24:29 -0400</pubDate><guid>https://www.maskset.net/blog/2025/08/27/renode-docker-setup-on-ubuntu-24.04/</guid><description>&lt;p&gt;&lt;a href="https://github.com/renode/renode"&gt;Renode&lt;/a&gt; is a C# based emulator for embedded architecture, it&amp;rsquo;s like if QEMU was focused only on embedded.
It&amp;rsquo;s lightweight and effective with several preconfigured chips ready to use.&lt;/p&gt;
&lt;h2 id="what-to-use-it-for-and-why-you-should-care"&gt;What to use it for and why you should care&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Easier, automated testing of distributed systems (think CANBus networks, distributed control robotics, mutli-sensor systems etc)&lt;/li&gt;
&lt;li&gt;CI/CD: Integration and smoke tests done with your actual build, one step down from hardware-in-the-loop with way less setup&lt;/li&gt;
&lt;li&gt;Low level development (i.e bootloaders): Bootloaders are a pain to write and need to be rock solid. You spend a lot of time dealing with the low level details which you can&amp;rsquo;t test with unittests on a different architecture without emulation. Emulation lets you speed up iteration time and increase visibility.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="goals"&gt;Goals&lt;/h2&gt;
&lt;p&gt;The following uses the Renode Docker container distribution and integrates it into VSCode for
visual debugging. The code and configuration for this example can be found &lt;a href="https://github.com/snhobbs/maskset-examples/tree/master/renode-docker"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>SCPI for Embedded Systems</title><link>https://www.maskset.net/blog/2025/08/26/scpi-for-embedded-systems/</link><pubDate>Tue, 26 Aug 2025 20:36:53 -0400</pubDate><guid>https://www.maskset.net/blog/2025/08/26/scpi-for-embedded-systems/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;When I&amp;rsquo;m designing the control interface for a new device intended for lab equipment use or an OEM device that doesn&amp;rsquo;t require constant high data rates, SCPI is the obvious first consideration. It&amp;rsquo;s human-readable and ASCII-based, which makes it suitable for debugging over serial terminals but less suitable for high-throughput or lossy links (though you could add manual CRCs to detect corrupted responses).
It is also the language that every other lab device speaks so sticking to the standard is a good first step.&lt;/p&gt;</description></item><item><title>Ceramic Capacitor Characteristics: Pay attention to C(V)</title><link>https://www.maskset.net/blog/2025/08/26/ceramic-capacitor-characteristics-pay-attention-to-cv/</link><pubDate>Tue, 26 Aug 2025 14:45:32 -0400</pubDate><guid>https://www.maskset.net/blog/2025/08/26/ceramic-capacitor-characteristics-pay-attention-to-cv/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;During electronics design reviews, it&amp;rsquo;s overwhelmingly common to find changes are needed for basic bypass and DC storage caps due to ignoring the C(V).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;em&gt;Voltage Rating&lt;/em&gt; is the maximum operating voltage that doesn&amp;rsquo;t risk (immediate) damage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;C(V)&lt;/em&gt; refers to the the change in capacitance with DC bias (voltage).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For high-density capacitors, the capacitance drop is frequently near 90% at the rated voltage. If this isn&amp;rsquo;t designed around then it can lead to instability, brownouts, and excess noise.&lt;/p&gt;</description></item><item><title>Setting Up Compile Commands for C &amp; C++ for Neovim</title><link>https://www.maskset.net/blog/2025/08/26/setting-up-compile-commands-for-c-c-for-neovim/</link><pubDate>Tue, 26 Aug 2025 12:19:56 -0400</pubDate><guid>https://www.maskset.net/blog/2025/08/26/setting-up-compile-commands-for-c-c-for-neovim/</guid><description>&lt;p&gt;&lt;em&gt;Quick tip on enabling Neovim LSP for C/C++ using Clangd&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;
Add this to your &lt;code&gt;CMakeLists.txt&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmake" data-lang="cmake"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set(&lt;span style="color:#e6db74"&gt;CMAKE_EXPORT_COMPILE_COMMANDS&lt;/span&gt; &lt;span style="color:#e6db74"&gt;ON&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will generate a compile_commands.json file in your build directory.
Copy or symlink it into your project root so that clangd (and Neovim) can use it.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Language servers are wonderful for navigating large codebases. Being able to jump to a definition
really speeds up understanding the code you&amp;rsquo;re staring at (especially in library heavy codebases).
Neovim (especially with distros like &lt;a href="https://www.lazyvim.org/"&gt;LazyVim&lt;/a&gt; has excellent LSP support, but C and C++ require extra setup compared to languages like Python.&lt;/p&gt;</description></item><item><title>Method for Reading Thermistors</title><link>https://www.maskset.net/blog/2025/08/02/method-for-reading-thermistors/</link><pubDate>Sat, 02 Aug 2025 10:02:45 -0400</pubDate><guid>https://www.maskset.net/blog/2025/08/02/method-for-reading-thermistors/</guid><description>&lt;p&gt;The thermistor model, jupyter notebook and C++ code I used is available
&lt;a href="https://github.com/snhobbs/maskset-examples/tree/master/thermistors"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;So you&amp;rsquo;re using a thermistor to measure temperature and need to digitize it.
Let&amp;rsquo;s assume you&amp;rsquo;re trying to get an accurate temperature reading in real units (I&amp;rsquo;ll use kelvin for that scientific flair).
Let&amp;rsquo;s see how good we can make this measurement.&lt;/p&gt;
&lt;p&gt;Thermistors have been around for a long time which usually means we should start by looking in &lt;a href="https://artofelectronics.net/"&gt;The AoE&lt;/a&gt; and browsing &lt;a href="https://www.edn.com"&gt;EDN&amp;rsquo;s old issues&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Pulse Transitions Library</title><link>https://www.maskset.net/blog/2025/07/26/pulse-transitions-library/</link><pubDate>Sat, 26 Jul 2025 23:15:27 -0400</pubDate><guid>https://www.maskset.net/blog/2025/07/26/pulse-transitions-library/</guid><description>&lt;p&gt;&lt;a href="https://github.com/snhobbs/pulse_transitions.git"&gt;Github Repo: pulse_transitions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Over the past few months, I’ve found myself repeatedly needing step response analysis for control systems, TDR work, pulsed light sources, photoreceivers, and flash lidar applications.
Matlab has a &lt;a href="https://www.mathworks.com/help/signal/pulse-and-transition-metrics.html"&gt;solid set of tools&lt;/a&gt;, but nothing equivalent existed in Python so here&amp;rsquo;s that library.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://python-control.readthedocs.io/en/0.10.2/"&gt;control library&lt;/a&gt; has a &lt;code&gt;step_info&lt;/code&gt;
function, but it’s built around transfer functions rather than real waveforms.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://github.com/snhobbs/pulse_transitions/raw/master/second-order.png"&gt;&lt;figcaption&gt;
 &lt;h4&gt;Second order transfer function analysis plot&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="matpulse-pulse-transition-library-inspired"&gt;matpulse: Pulse Transition Library Inspired&lt;/h2&gt;
&lt;p&gt;I haven&amp;rsquo;t gotten to the multiple transitions yet but the pulse analysis functions are done.
The library has a &lt;code&gt;matpulse&lt;/code&gt; module that tries to stay as close to the Matlab interface as python can. The same functionality with more reasonable naming schemes are available in the main namespace.&lt;/p&gt;</description></item><item><title>Compact Time Domain Reflectometer</title><link>https://www.maskset.net/blog/2025/07/25/compact-time-domain-reflectometer/</link><pubDate>Fri, 25 Jul 2025 14:02:57 -0400</pubDate><guid>https://www.maskset.net/blog/2025/07/25/compact-time-domain-reflectometer/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;TDRs don&amp;rsquo;t exclusively belong in $10K benchtop boxes. Ours fits in your hand,
handles field abuse, and still gets sub-100 ps resolution.
We&amp;rsquo;ve been developing this one for a few precision agriculture and infrastructure monitoring applications.
TDR has a lot
going for it as a measurement scheme, particularly in industrial, agriculture,
and field applications. It&amp;rsquo;s insanely robust compared to other common methods
and can be embedded directly into the sensing element if you design it right.&lt;/p&gt;</description></item><item><title>Enforcing Type Safety in C++</title><link>https://www.maskset.net/blog/2025/07/14/enforcing-type-safety-in-c/</link><pubDate>Mon, 14 Jul 2025 09:24:52 -0400</pubDate><guid>https://www.maskset.net/blog/2025/07/14/enforcing-type-safety-in-c/</guid><description>&lt;h2 id="correction"&gt;Correction&lt;/h2&gt;
&lt;p&gt;The examples here are all in microvolts but includes multiplication and division which is dimensionally incorrect. I prefer to remove operator* and operator/ in favor of explicit functions for those calculations which can be done for all the referenced libraries.&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;C++ is a statically typed language with relatively weak type safety. This can be useful and definitely cuts down on the lines of code. Of course so does removing all newlines and comments.
Operations like multiplying floats and ints almost always behave as expected, allowing you to ignore the type differences (provided you turn off enough of your compiler warnings).
Strong typing helps force the intent of the author to be literal: improving readability while adding compile-time checks. One example I&amp;rsquo;ve been burned on before is changing the order of operations in an arithmetic statement leading to precision loss. This is not something that we want to happen.&lt;/p&gt;</description></item><item><title>Product Announcement LP870</title><link>https://www.maskset.net/blog/2025/07/09/product-announcement-lp870/</link><pubDate>Wed, 09 Jul 2025 10:59:54 -0400</pubDate><guid>https://www.maskset.net/blog/2025/07/09/product-announcement-lp870/</guid><description>&lt;p&gt;It&amp;rsquo;s been a busy couple of decades but one thing that is helping us get some time back is
our (relatively) recently launched &lt;a href="https://hobbs-eo.com/products/ns-digital-led-pulser"&gt;LP870 Nanosecond LED Pulser&lt;/a&gt;.
We&amp;rsquo;re now on &lt;strong&gt;Version 2&lt;/strong&gt;, which improves further on the original&amp;rsquo;s performance achieving &lt;strong&gt;typical 10–90% rise/fall times of 2.2/1.3 ns&lt;/strong&gt;. This makes the LP870 suitable for testing even some of the fastest photodetectors.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://hobbs-eo.com/cdn/shop/files/LP870_Top_Front_Angled.jpg?v=1740003454" width="1200"&gt;&lt;figcaption&gt;
 &lt;h4&gt;LP870 LED Source&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;We designed the LP870 as a general-purpose high-speed light source ideal for testing &lt;strong&gt;photodiodes, APDs, SPADs, and SiPMs&lt;/strong&gt;. In most setups, its serves as an infinitely fast optical source perfect for characterizing transient response or bandwidth.&lt;/p&gt;</description></item><item><title>Improving Python CLIs with Pydantic and Dataclasses</title><link>https://www.maskset.net/blog/2025/07/01/improving-python-clis-with-pydantic-and-dataclasses/</link><pubDate>Tue, 01 Jul 2025 09:19:26 -0400</pubDate><guid>https://www.maskset.net/blog/2025/07/01/improving-python-clis-with-pydantic-and-dataclasses/</guid><description>&lt;p&gt;I&amp;rsquo;ve been updating and upgrading some of my favorite CLI tools recently and writing a few parametric
tools that benefit from fairly long configuration files.
I was originally using vanilla dataclasses with some organic, homemade, grass-fed validation code
until I caved and used Pydantic.&lt;/p&gt;
&lt;p&gt;Pydantic builds on the dataclass foundation but makes clearly specifying and validating structured
data input surprisingly pleasant. Say you&amp;rsquo;re using a JSON, TOML, YAML, SExpressions, XLSX or whatever input.
At some point you&amp;rsquo;re going to turn that into a dictionary or a dataframe. With Pydantic you can
described the whole nested structure as classes with classes as member and shove the entire dictionary into it.
If the data is valid and the validation passes then you&amp;rsquo;ll end up with an instance of your schema that
looks and feels like a dataclass.&lt;/p&gt;</description></item><item><title>Using Kicad With Docker to Manage and Upgrade Release Versions</title><link>https://www.maskset.net/blog/2025/06/30/using-kicad-with-docker-to-manage-and-upgrade-release-versions/</link><pubDate>Mon, 30 Jun 2025 09:13:34 -0400</pubDate><guid>https://www.maskset.net/blog/2025/06/30/using-kicad-with-docker-to-manage-and-upgrade-release-versions/</guid><description>&lt;h3 id="introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;KiCad is a wonderful tool that is constantly improving. Part of that is the steady release of new features, along with major version updates (approximately) once per year.
Changing versions will give you some new features, fix some bugs, and introduce some new ones just like any other software update.
If your system has only one version installed, upgrading becomes a significant decision.
Once you update what do you do with older projects made with previous releases?
It&amp;rsquo;s not just the main program either, there are the different parts libraries, the script control bindings, as well as any scripts or tooling that might need to be updated for the new version.
All these components need to be managed in a reliable, repeatable way to ensure our designs remain accessible over time.
Managing those changes, especially in a production or long-term support environment, isn’t trivial. Designs depend on stable libraries, predictable behavior, and consistent tool outputs. If you’re maintaining a complex board or a product family, one thing you don’t want is for your designs to churn.&lt;/p&gt;</description></item><item><title>FreeCAD 2D Projections</title><link>https://www.maskset.net/blog/2025/06/18/freecad-2d-projections/</link><pubDate>Wed, 18 Jun 2025 11:52:47 -0400</pubDate><guid>https://www.maskset.net/blog/2025/06/18/freecad-2d-projections/</guid><description>&lt;p&gt;Quick note here. SVG export of a 3D part in FreeCAD&amp;rsquo;s PartDesign/Part workbench has some flaws. It only works in one dimension and all the edges are superimposed which reliably confuses all the systems I&amp;rsquo;ve tried. Instead use the draft workbench to do the projection.&lt;/p&gt;
&lt;p&gt;Arrange the viewport (the camera) to the angle you want to project.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.maskset.net/media/uploads/blog/freecad-projections/baseplate.png"&gt;&lt;figcaption&gt;
 &lt;h4&gt;3D part that we want to take a top down projection of.&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Select the part and select &amp;lsquo;Shape 2D View&amp;rsquo;.&lt;/p&gt;</description></item><item><title>Optimal SMA Launch Layout</title><link>https://www.maskset.net/blog/2025/06/14/optimal-sma-launch-layout/</link><pubDate>Sat, 14 Jun 2025 17:38:04 -0400</pubDate><guid>https://www.maskset.net/blog/2025/06/14/optimal-sma-launch-layout/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve recently been working on several compact, robust, and cost effective time domain reflectometers (TDR) devices for integration into larger systems.
Our most recent one, the TDR01, has 60ps sampled edges with a unit cost under $15 which we were pretty happy with. This version is a bit more fully featured then our single diode sampler. Phil has a post up on EOI&amp;rsquo;s page about the project &lt;a href="https://electrooptical.net/News/a-high-performance-time-domain-reflectometer/"&gt;here&lt;/a&gt;.
We&amp;rsquo;re working on releasing those as a headless USB controlled model later this year, get in touch if you&amp;rsquo;re interested in evaluating those.&lt;/p&gt;</description></item><item><title>Tuning PI Controllers for Thermoelectric Coolers</title><link>https://www.maskset.net/blog/2025/06/12/tuning-pi-controllers-for-thermoelectric-coolers/</link><pubDate>Thu, 12 Jun 2025 08:53:34 -0400</pubDate><guid>https://www.maskset.net/blog/2025/06/12/tuning-pi-controllers-for-thermoelectric-coolers/</guid><description>&lt;p&gt;The code and plotting notebook for the following is available &lt;a href="https://github.com/snhobbs/tec-pid-tuning.git"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;This article discusses tuning a thermoelectric cooler (TEC) controller for real-world applications and highlights the unique advantages of TECs. The plant is characterized as a delay-integrator thermal system using a step response and applies Skogestad’s SIMC method for PI tuning. We then explore considerations specific to systems that both heat and cool versus those that only do one and how the models respond to external forcing.&lt;/p&gt;</description></item><item><title>Antmicro Kmake</title><link>https://www.maskset.net/blog/2025/06/09/antmicro-kmake/</link><pubDate>Mon, 09 Jun 2025 19:22:21 -0400</pubDate><guid>https://www.maskset.net/blog/2025/06/09/antmicro-kmake/</guid><description>&lt;p&gt;I came across this tool recently: &lt;a href="https://antmicro.github.io/kicad-make/"&gt;kicad-make&lt;/a&gt; and tried it out.
Well it&amp;rsquo;s actually be floating around in my collection of GitHub stars I periodically extend whenever
there&amp;rsquo;s a new problem to solve. I’ll let the fact that they named their repo the same as mine, &lt;a href="https://github.com/snhobbs/kicad-make/"&gt;kicad-make&lt;/a&gt;, slide for now.
&lt;a href="https://antmicro.com/"&gt;Antmicro&lt;/a&gt; has a solid track record—particularly in contributing to open-source tools for hardware development, which is something I deeply appreciate. So I had high expectations going into this.&lt;/p&gt;</description></item><item><title>Hugo Comments With Docsy and Giscus</title><link>https://www.maskset.net/blog/2025/05/29/hugo-comments-with-docsy-and-giscus/</link><pubDate>Thu, 29 May 2025 10:55:03 -0400</pubDate><guid>https://www.maskset.net/blog/2025/05/29/hugo-comments-with-docsy-and-giscus/</guid><description>&lt;p&gt;Giscus is a super lightweight comment system powered by GitHub Discussions.
It uses a GitHub app plus a small JavaScript snippet to embed a comment section on your site.
If someone comments, it automatically creates a GitHub Discussion and syncs replies.
See the bottom of this post for a live example.
There’s no backend, no database, and if your readers have a GitHub account, that’s all they need.
Here’s how I integrated it into a Hugo site using the Docsy theme.&lt;/p&gt;</description></item><item><title>Making an Appimage</title><link>https://www.maskset.net/blog/2025/05/26/making-an-appimage/</link><pubDate>Mon, 26 May 2025 19:53:21 -0400</pubDate><guid>https://www.maskset.net/blog/2025/05/26/making-an-appimage/</guid><description>&lt;p&gt;When I updated to Ubuntu 24.04 I had an upsetting number of packages break. One of these
was &lt;a href="https://github.com/thliebig/AppCSXCAD/"&gt;AppCSXCAD&lt;/a&gt;. It reads OpenEMS XML geometry files and shows them in a GUI. Nothing exciting until you need it.
My first move was making sure I could use the Dockerized version in my OpenEMS Docker build &lt;a href="https://github.com/snhobbs/openEMS_docker"&gt;here&lt;/a&gt;. That needed some attention but it worked in the end.
What I really want is an appimage that I can pull down when needed.&lt;/p&gt;</description></item><item><title>Ordering From Macrofab with KiCad</title><link>https://www.maskset.net/blog/2025/05/24/ordering-from-macrofab-with-kicad/</link><pubDate>Sat, 24 May 2025 18:59:14 -0400</pubDate><guid>https://www.maskset.net/blog/2025/05/24/ordering-from-macrofab-with-kicad/</guid><description>&lt;hr&gt;
&lt;h2 id="tldr"&gt;TLDR&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s an example project manufacturing package of the Scopefun V2 up &lt;a href="https://www.maskset.net/media/uploads/blog/Scopefun_v2_1.1.X_macrofab.zip"&gt;here&lt;/a&gt;.
Checkout &lt;a href="https://github.com/snhobbs/kicad-xyrs"&gt;&lt;code&gt;kicad-xyrs&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/snhobbs/kicad-make"&gt;&lt;code&gt;kicad-make&lt;/code&gt;&lt;/a&gt; for ordering KiCad projects with &lt;a href="https://macrofab.com"&gt;Macrofab&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I recently toured &lt;a href="https://macrofab.com"&gt;MacroFab’s&lt;/a&gt; Houston facility and came away impressed. It&amp;rsquo;s a clean, efficient shop with a solid reputation among engineers I trust. They have a hybrid model with in-house manufacturing with a North American partner network. That’s a win for prototyping speed, reliability, and a healthier domestic supply chain. For projects that don&amp;rsquo;t need white glove service this is a great solution.
They have an auto-quote engine which does a DFM check when you upload. They have some demos that are worth exploring &lt;a href="https://factory.macrofab.com/pcb/dp7rrbe/1/design"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>EDA Tools</title><link>https://www.maskset.net/docs/eda-tools/</link><pubDate>Wed, 21 May 2025 10:49:02 -0400</pubDate><guid>https://www.maskset.net/docs/eda-tools/</guid><description>&lt;p&gt;Efficient design depends just as much on project management as on technical tools.
Below is a curated list of tools I use and some I maintain for managing electronics design projects.&lt;/p&gt;
&lt;p&gt;The majority of the functions eventually
make there way into my KiCad Makefile (&lt;a href="https://github.com/snhobbs/kicad-make"&gt;kicad-make&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;There are similar systems, including ones with many more features such as &lt;a href="https://github.com/INTI-CMNB/KiBot"&gt;KiBot&lt;/a&gt;.
I steered away from these methods once kicad-cli was introduced as they are fairly heavy weight in comparison.&lt;/p&gt;</description></item><item><title>Semantic Versioning for Electronics Design</title><link>https://www.maskset.net/docs/semantic-versioning-for-electronics-design/</link><pubDate>Tue, 20 May 2025 19:26:59 -0400</pubDate><guid>https://www.maskset.net/docs/semantic-versioning-for-electronics-design/</guid><description>&lt;p&gt;&lt;strong&gt;Updated: 2025-05-20&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;This is a practical system for versioning and tagging electronics to streamline prototyping and development. It mirrors Semantic Versioning 2.0 described &lt;a href="https://semver.org/spec/v2.0.0.html"&gt;here&lt;/a&gt; but adapts to the realities of hardware.
This convention is intended for printed circuit boards (PCBs) and printed circuit board assemblies (PCBAs).&lt;/p&gt;
&lt;p&gt;Here we change &lt;code&gt;PATCH&lt;/code&gt; to &lt;code&gt;SUBREVISION&lt;/code&gt; as &lt;code&gt;PATCH&lt;/code&gt; is a software specific term.
Given a version number &lt;code&gt;MAJOR.MINOR.SUBREVISION&lt;/code&gt; (analog of &lt;code&gt;MAJOR.MINOR.PATCH&lt;/code&gt;), increment the:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;MAJOR: When you change the &lt;strong&gt;interface or mechanical form factor&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;MINOR: When you change the &lt;strong&gt;layout or schematic&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;SUBREVISION: When you change the &lt;strong&gt;BOM or population option&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="major-version-interface--form-factor"&gt;Major Version: Interface &amp;amp; Form Factor&lt;/h2&gt;
&lt;p&gt;Roll the &lt;strong&gt;MAJOR&lt;/strong&gt; when any of the following occur:&lt;/p&gt;</description></item><item><title>Electromagnetic Simulators List</title><link>https://www.maskset.net/blog/2025/05/19/electromagnetic-simulators-list/</link><pubDate>Mon, 19 May 2025 11:47:46 -0400</pubDate><guid>https://www.maskset.net/blog/2025/05/19/electromagnetic-simulators-list/</guid><description>&lt;script src="https://gist.github.com/snhobbs/2b5131a87db6c635fae03919a9a948fc.js"&gt;&lt;/script&gt;</description></item><item><title>OpenEMS Optimizing Simulator</title><link>https://www.maskset.net/blog/2025/05/17/openems-optimizing-simulator/</link><pubDate>Sat, 17 May 2025 10:59:51 -0400</pubDate><guid>https://www.maskset.net/blog/2025/05/17/openems-optimizing-simulator/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Over at &lt;a href="https://www.electrooptical.net"&gt;EOI&lt;/a&gt; we&amp;rsquo;ve been working on a time domain reflectometer (TDR) for precision agriculture for the past few months.
The waveguide assembly has several competing design constraints. The following is an overview of a
a surprisingly effective parameterization and optimization strategy for designing the waveguides structure.
Using OpenEMS, OpenSCAD, SciPy, Docker, and a bit of Python we had an optimized form factor after a few days.&lt;/p&gt;
&lt;p&gt;Here’s an example of the resulting waveform, showing a 214 ps rise time.&lt;/p&gt;</description></item><item><title>Managing Openscad Projects</title><link>https://www.maskset.net/blog/2025/05/16/managing-openscad-projects/</link><pubDate>Fri, 16 May 2025 00:00:00 -0400</pubDate><guid>https://www.maskset.net/blog/2025/05/16/managing-openscad-projects/</guid><description>&lt;h2 id="why-structure-your-openscad-projects"&gt;Why Structure Your OpenSCAD Projects?&lt;/h2&gt;
&lt;p&gt;OpenSCAD is powerful, but as projects grow, managing complexity becomes critical.
Plus you&amp;rsquo;re already ditching the GUI for a descriptive language, are you going to be chained to the GUI for exporting files?&lt;/p&gt;
&lt;p&gt;Properly organizing your files and code enables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Design abstractions with no concrete data. ex. evenly spaced grid of holes in a square plane, holes in a test jig pressure plate, etc.&lt;/li&gt;
&lt;li&gt;Simple reuse and updating of a design&lt;/li&gt;
&lt;li&gt;Reduced duplication&lt;/li&gt;
&lt;li&gt;Scalable part creation and layout logic&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="common-challenges-and-solutions"&gt;Common Challenges and Solutions&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;strong&gt;Challenge&lt;/strong&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Reusing code and libraries&lt;/td&gt;
 &lt;td&gt;Use &lt;code&gt;OPENSCADPATH&lt;/code&gt; to add custom library directories to search path&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Need access to high-level modules from lower-level files&lt;/td&gt;
 &lt;td&gt;Instead use dictionary lists for data that must be shared with abstractions&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Sharing variables across files&lt;/td&gt;
 &lt;td&gt;Define accessor functions (e.g., &lt;code&gt;get_param()&lt;/code&gt;) to expose variable. Avoid if possible.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Sharing parameterized code&lt;/td&gt;
 &lt;td&gt;Encapsulate reusable abstractions in a dedicated library file and specialize only in top-level designs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Generating manufacturing files&lt;/td&gt;
 &lt;td&gt;Create a new file for each output type. Put into a separate directory. Each of these files should call out only a single use statement and a single module call.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="project-structure"&gt;Project Structure&lt;/h2&gt;
&lt;p&gt;The project structure I use for OpenSCAD is the same as I use for FreeCAD or &lt;strong&gt;shudder&lt;/strong&gt; with closed source CAD.
For a complicated project there&amp;rsquo;s an Assembly which has all the parts fitting together. Much of the design is done with the Assembly itself.
If the project has been decoupled elegantly this may not be as necessary.
So you have an assembly of parts composed of abstractions with specialized data passed into the component modules.&lt;/p&gt;</description></item><item><title>Tariff Math for Two-Layer Prototype PCBs: OshPark vs Imported Fabs</title><link>https://www.maskset.net/blog/2025/05/15/tariff-math-for-two-layer-prototype-pcbs-oshpark-vs-imported-fabs/</link><pubDate>Thu, 15 May 2025 00:00:00 -0400</pubDate><guid>https://www.maskset.net/blog/2025/05/15/tariff-math-for-two-layer-prototype-pcbs-oshpark-vs-imported-fabs/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re a US-based hobbyist, consultant, or small-batch hardware developer, PCB manufacturing has just changed a bit. Back in 2018 when the first batch of Chinese tariffs were introduced we got hit with a surprise bill and an import nightmare (well minor inconvenience but it felt dramatic at the time). Those tariffs landed during a government shutdown and a CBP computer glitch so our boards ended up doing two laps of the globe before we got them. I use a lot of 2 layer boards as I prefer them to just about any amount of hand-wiring. With the various price cliffs that have been introduced I was interested in what the most cost effective way to get boards are and maybe to justify an &lt;a href="https://www.botfactory.co/shop/product/sv2-pro-starter-4305"&gt;SV2 Pro&lt;/a&gt;. That&amp;rsquo;s a joke but The ION Prototyping lab does have a &lt;a href="https://www.voltera.io/products/v-one"&gt;V-One&lt;/a&gt;, maybe it&amp;rsquo;s time to learn how to use it!&lt;/p&gt;</description></item><item><title>FreeCAD Make</title><link>https://www.maskset.net/blog/2025/04/13/freecad-make/</link><pubDate>Sun, 13 Apr 2025 20:54:33 -0500</pubDate><guid>https://www.maskset.net/blog/2025/04/13/freecad-make/</guid><description>&lt;p&gt;&lt;a href="https://github.com/snhobbs/freecad-make"&gt;Github Repo&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re new to FreeCAD scripting, start with &lt;a href="https://www.maskset.net/blog/2023/03/22/scripting-freecad-from-an-appimage/"&gt;this guide&lt;/a&gt; on setting up FreeCAD on Linux.&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve recently been working on a waveguide assembly for a time-domain reflectometer (TDR), designed in OpenSCAD and FreeCAD with simulation in openEMS. FreeCAD&amp;rsquo;s ability to export solid models (eg. STEP files) means I often do the design in vanilla OpenSCAD and then finalize it in FreeCAD.&lt;/p&gt;
&lt;p&gt;This particular design includes multiple interdependent parts that must stay consistent.
They tend to change together as the design evolves, so managing them in a coordinated way is critical.&lt;/p&gt;</description></item><item><title>Product Announcement: QL03 Photoreceiver</title><link>https://www.maskset.net/blog/2025/03/16/product-announcement-ql03-photoreceiver/</link><pubDate>Sun, 16 Mar 2025 11:25:26 -0400</pubDate><guid>https://www.maskset.net/blog/2025/03/16/product-announcement-ql03-photoreceiver/</guid><description>&lt;p&gt;We’ve just launched a new photoreceiver over at our sister site, &lt;a href="https://hobbs-eo.com/"&gt;Hobbs ElectroOptics&lt;/a&gt;: the &lt;strong&gt;QL03 Photoreceiver&lt;/strong&gt;.
It’s designed for low-light applications that demand high sensitivity and low noise.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://hobbs-eo.com/cdn/shop/files/IMG_4895.jpg?v=1739847977" alt="QL03 Photoreceiver"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="highlights"&gt;Highlights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;150 mm² photodiode&lt;/strong&gt; with immersion lens for large-area light collection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1 MΩ transimpedance gain&lt;/strong&gt;, &lt;strong&gt;DC–750 kHz bandwidth&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shot-noise-limited&lt;/strong&gt; above 100 nA input current across its full bandwidth.&lt;/li&gt;
&lt;li&gt;Excellent for &lt;strong&gt;diffuse sources, spectroscopy, and fluorescence&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bootstrap amplifier topology&lt;/strong&gt; enables this unusual balance of speed, noise performance, and collection area.&lt;/li&gt;
&lt;li&gt;Built for real lab use — not just the datasheet. Faraday cage enclosure keeps the ambient noise down.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This receiver makes alignment easy (you’re aiming at a barn door), while delivering professional-grade performance for demanding optical measurements.
Great for lab use, bread / brass board designs, and proof of concepts. When you&amp;rsquo;re ready to move to production we can help you integrate the design into your product.
Whether you’re in a research lab or prototyping a product, it’s ready to go.&lt;/p&gt;</description></item><item><title>Installing OpenEMS on Linux</title><link>https://www.maskset.net/blog/2024/11/17/a-guide-to-fdtd-simulation-with-openems-setup-on-linux/</link><pubDate>Sun, 17 Nov 2024 15:41:15 -0600</pubDate><guid>https://www.maskset.net/blog/2024/11/17/a-guide-to-fdtd-simulation-with-openems-setup-on-linux/</guid><description>&lt;p&gt;&lt;strong&gt;Docker Source Files are available &lt;a href="https://github.com/snhobbs/openEMS_docker"&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;OpenEMS is an open-source Finite-Difference Time-Domain (FDTD) simulator that has seen some significant adoption.
As I go through the setup for the second time, I’m noting down all the steps, common pitfalls, and useful resources to help others get up and running quickly.
In this guide, I’ll walk you through the installation process, highlight some useful tools, and share the sections that stumped me.&lt;/p&gt;
&lt;h2 id="interface-choice"&gt;Interface Choice&lt;/h2&gt;
&lt;p&gt;There are three fully featured interfaces to openEMS:&lt;/p&gt;</description></item><item><title>System Diagrams / Schematics</title><link>https://www.maskset.net/blog/2024/09/01/system-diagrams-/-schematics/</link><pubDate>Sun, 01 Sep 2024 16:56:44 -0400</pubDate><guid>https://www.maskset.net/blog/2024/09/01/system-diagrams-/-schematics/</guid><description>&lt;p&gt;Most engineering projects begin as rough sketches on napkins, whiteboards, or air diagrams furiously traced with a finger.
But as complexity grows, especially when multiple components or teams are involved, a structured system diagram becomes essential.
When dealing with designs that involve multiple separately developed components, a system
diagram (sometimes referred to interchangeably with system architecture or system schematic) becomes valuable.&lt;/p&gt;
&lt;p&gt;A system diagram helps break the problem into manageable and manufacturable chunks,
providing a visual guide for the development.&lt;/p&gt;</description></item><item><title>Device Control GUI and Binary Distribution</title><link>https://www.maskset.net/blog/2024/06/23/device-control-gui-and-binary-distribution/</link><pubDate>Sun, 23 Jun 2024 11:47:33 -0400</pubDate><guid>https://www.maskset.net/blog/2024/06/23/device-control-gui-and-binary-distribution/</guid><description>&lt;h2 id="abstract"&gt;Abstract&lt;/h2&gt;
&lt;p&gt;Built a basic GUI wrapping a CLI and packaged it into a standalone executable to control embedded software updating and diagnostics.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.maskset.net/media/uploads/blog/mwir-update-gui.png"&gt;&lt;figcaption&gt;
 &lt;h4&gt;Firmware Updating GUI&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="background--goal"&gt;Background &amp;amp; Goal&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve been working with an agricultural fire prevention company to built ruggedized optical fire detection systems.
The installed system is a self contained unit with 2 to 6 detectors that have an analog alert signal and a
half-duplex RS-485 MODBUS RTU bus for status and monitoring.&lt;/p&gt;</description></item><item><title>KiCad Coordinate System</title><link>https://www.maskset.net/blog/2024/06/16/kicad-coordinate-system/</link><pubDate>Sun, 16 Jun 2024 06:53:50 -0400</pubDate><guid>https://www.maskset.net/blog/2024/06/16/kicad-coordinate-system/</guid><description>&lt;p&gt;The KiCad coordinate system can be unintuitive, especially when scripting or developing plugins.
Here&amp;rsquo;s what I learned while building the &lt;a href="https://www.thejigsapp.com"&gt;JigsApp&lt;/a&gt; system and the &lt;a href="https://www.maskset.net/blog/2024/06/04/kicad-testpoints-plugin/"&gt;kicad-testpoints&lt;/a&gt; plugin.&lt;/p&gt;
&lt;p&gt;The origin and axis settings are global &lt;em&gt;display&lt;/em&gt; preferences for the PCB editor (pcbnew) and can be accessed
from all of the KiCad programs (eeschema, project, pcbnew, Symbol Editor, Footprint Editor, Gerber Viewer, Image Converter, Calculator Tools, Drawing Sheet Editor, and 3D Viewer).&lt;/p&gt;
&lt;p&gt;The origin type and axes settings can only be changed for the PCB Editor.&lt;/p&gt;</description></item><item><title>KiCad 8 Makefile</title><link>https://www.maskset.net/blog/2024/06/04/kicad-8-makefile/</link><pubDate>Tue, 04 Jun 2024 09:45:28 -0400</pubDate><guid>https://www.maskset.net/blog/2024/06/04/kicad-8-makefile/</guid><description>&lt;p&gt;KiCad 7 introduced the CLI tool which made creating a design release insanely easy.
There are other great tools that met the need before
like KiBot and KiKit but having the functionality in the main line release is so much nicer.
I wrote a post on my KiCad 7 makefile &lt;a href="https://www.maskset.net/blog/2023/02/26/kicad-7-build-environment/"&gt;here&lt;/a&gt; which made the fast and correct ordering of boards
a breeze. All the files are named correctly, it&amp;rsquo;s all up to date, I can rely on all the same files being in each release, my vias actually get connected, etc.&lt;/p&gt;</description></item><item><title>KiCad Testpoints Plugin</title><link>https://www.maskset.net/blog/2024/06/04/kicad-testpoints-plugin/</link><pubDate>Tue, 04 Jun 2024 01:32:04 -0400</pubDate><guid>https://www.maskset.net/blog/2024/06/04/kicad-testpoints-plugin/</guid><description>&lt;p&gt;Over the past few months I&amp;rsquo;ve been working on turning the internal tools we&amp;rsquo;ve developed at EOI/HEO for various projects
into a new company. We recently launched &lt;a href="https://www.thejigsapp.com"&gt;TheJigsApp&lt;/a&gt; to make the design and manufacturing of test
jigs fast and painless. As will be obvious from this blog I really enjoy KiCad which I recently discovered has the
dubious distinction of being one of three EDA programs listed on Wikipedia that has had an update in the last decade that doesn&amp;rsquo;t have
a test point report generation function in the GUI. I know this might be a bit specific but whatever, there&amp;rsquo;s only so many hours in the day and I&amp;rsquo;m writing this at 2 am.&lt;/p&gt;</description></item><item><title>KiCad 8 Contributor Shirt</title><link>https://www.maskset.net/blog/2024/05/21/kicad-8-contributor-shirt/</link><pubDate>Tue, 21 May 2024 18:29:46 -0400</pubDate><guid>https://www.maskset.net/blog/2024/05/21/kicad-8-contributor-shirt/</guid><description>&lt;p&gt;KiCad 8 has been released, and they were kind enough to send us a
contributor shirt! It&amp;rsquo;s amazing how much the tool has improved over the past five years.
I&amp;rsquo;m looking forward to the API-based version, even though it&amp;rsquo;s going to break all my plugins.&lt;/p&gt;
&lt;p&gt;If you haven&amp;rsquo;t used the tool before, give it a
&lt;a href="https://hackaday.com/2024/02/26/kicad-8-makes-your-life-better-without-caveats/"&gt;try&lt;/a&gt;, check out the &lt;a href="https://kicon.kicad.org/about/"&gt;events coming up&lt;/a&gt;, and check out &lt;a href="https://www.kipro-pcb.com/"&gt;KiCad Services Corporation&lt;/a&gt;.
They&amp;rsquo;ve been a big addition to the project over the past few years.&lt;/p&gt;</description></item><item><title>Photoreceiver Testing</title><link>https://www.maskset.net/blog/2024/05/16/photoreceiver-testing/</link><pubDate>Thu, 16 May 2024 00:00:00 -0400</pubDate><guid>https://www.maskset.net/blog/2024/05/16/photoreceiver-testing/</guid><description>&lt;p&gt;At &lt;a href="https://www.electrooptical.net"&gt;ElectroOptical Innovations (EOI)&lt;/a&gt;, we build a wide range of optical measurement systems tailored to diverse applications. When a subject matter expert approaches us with a measurement challenge, we collaborate closely to define the measurement principle and proceed with system and instrument design.&lt;/p&gt;
&lt;p&gt;Photoreceiver testing is a common and critical part of our work. We’ve tested many photoreceiver devices and helped clients incorporate rigorous testing into their development processes.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s easy to fall victim to confirmation bias—especially near project completion. Optical measurement setups can be complex, and device bring-up often takes more calendar days than anticipated.
Rigorous testing during bring-up helps avoid missing obvious issues, ruling out what could be wrong early reduces the nebulous issues later.
To share our approach, we’ve documented the process we use to test and characterize photoreceivers in the application note: &lt;a href="https://electrooptical.net/static/media/uploads/photoreceiver_testing_system_0_1_2.pdf"&gt;AN-1: Photoreceiver Testing System&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>KiCad Custom DRC Rules</title><link>https://www.maskset.net/blog/2023/10/30/kicad-custom-drc-rules/</link><pubDate>Mon, 30 Oct 2023 16:04:00 -0400</pubDate><guid>https://www.maskset.net/blog/2023/10/30/kicad-custom-drc-rules/</guid><description>&lt;p&gt;I got a board sent back by JLCPCB the other day due to a DRC rule I hadn’t come across before:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“If the copper area is less than 30% of the outer layers, then the trace-trace spacing should be at least 0.15 mm.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is in contrast to their usual minimum spacing of 0.09 mm. The fix? A custom DRC rule.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-lisp" data-lang="lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(version &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(rule top_bottom_clearance
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (constraint clearance (&lt;span style="color:#a6e22e"&gt;min&lt;/span&gt; 0.15mm))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#66d9ef"&gt;condition&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;A.Layer == &amp;#39;F.Cu&amp;#39; || A.Layer == &amp;#39;B.Cu&amp;#39;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Worked great!&lt;/p&gt;</description></item><item><title>Pin 1 Markings and PCB Assembly</title><link>https://www.maskset.net/blog/2023/10/23/pin-1-markings-and-pcb-assembly/</link><pubDate>Mon, 23 Oct 2023 10:00:00 -0400</pubDate><guid>https://www.maskset.net/blog/2023/10/23/pin-1-markings-and-pcb-assembly/</guid><description>&lt;p&gt;Most pick and place files are programmed by hand.
Remember this and repeat it to yourself whenever you&amp;rsquo;re checking your files for PCBA manufacturing.&lt;/p&gt;
&lt;p&gt;Chris Denny&amp;rsquo;s &lt;a href="https://www.youtube.com/watch?v=gmA_P3Tbfvw"&gt;KiCON 2019 talk&lt;/a&gt; is essential viewing on this topic—he breaks down the manual process behind pick-and-place programming and how subtle mistakes can creep in.&lt;/p&gt;
&lt;p&gt;Assembly layers are a great utility to &lt;strong&gt;supplement the silkscreen&lt;/strong&gt; and help the person programming the pick-and-place machine.
We want to make their lives as easy as possible to reduce surprises on the production line.&lt;/p&gt;</description></item><item><title>Spreadsheet Wrangler</title><link>https://www.maskset.net/blog/2023/10/23/spreadsheet-wrangler/</link><pubDate>Mon, 23 Oct 2023 06:00:00 -0400</pubDate><guid>https://www.maskset.net/blog/2023/10/23/spreadsheet-wrangler/</guid><description>&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;Spreadsheet Wrangler is a command line tool to make working with spreadsheets easier.
I use it primarily for handling bill of materials.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/snhobbs/spreadsheet-wrangler"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/spreadsheet-wrangler"&gt;PyPi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="readme"&gt;README&lt;/h2&gt;
&lt;h5 id="spreadsheet-wrangler"&gt;spreadsheet-wrangler&lt;/h5&gt;
&lt;p&gt;Command line tool for interacting with spreadsheet data&lt;/p&gt;
&lt;h4 id="installation"&gt;Installation&lt;/h4&gt;
&lt;h5 id="pypi"&gt;pypi&lt;/h5&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pip install spreadsheet-wrangler
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="source"&gt;Source&lt;/h5&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;git clone https://github.com/snhobbs/spreadsheet-wrangler.git
cd spreadsheet-wrangler
pip install .
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="functions"&gt;Functions&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;merge: Left merge two spreadsheets and save as xlsx&lt;/li&gt;
&lt;li&gt;compare: Compare two spreadsheets on a column name, prints out the discrepancies&lt;/li&gt;
&lt;li&gt;cluster: Combine the same values in a specified column as an array with the same name as the clustered column. The remainder of the first rows data is kept.&lt;/li&gt;
&lt;li&gt;uncluster: Unpack clustered columns into one entry for each. The row is duplicated for each entry.&lt;/li&gt;
&lt;li&gt;filter&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="usage-examples"&gt;Usage Examples&lt;/h4&gt;
&lt;p&gt;These examples follow the use case of working with a bill of materials (BOM). A specialized tool that uses this library for this use case is
available here[https://github.com/snhobbs/BOMTools].&lt;/p&gt;</description></item><item><title>Rectangle Packaging Problem / Efficient 2D Packing</title><link>https://www.maskset.net/blog/2023/10/19/rectangle-packaging-problem-/-efficient-2d-packing/</link><pubDate>Thu, 19 Oct 2023 06:00:00 -0400</pubDate><guid>https://www.maskset.net/blog/2023/10/19/rectangle-packaging-problem-/-efficient-2d-packing/</guid><description>&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;Automatically fit 2D rectangular parts onto standard-sized CNC panels to reduce waste and manual layout work. This post outlines a Python-based approach using the rectpack library and OpenSCAD for visualization and tool path.&lt;/p&gt;
&lt;h2 id="using-rectpack-for-automated-layout"&gt;Using &lt;code&gt;rectpack&lt;/code&gt; for Automated Layout&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s a Python library called &lt;code&gt;rectpack&lt;/code&gt; that implements several efficient algorithms for this task:
&lt;a href="https://github.com/secnot/rectpack"&gt;https://github.com/secnot/rectpack&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;I need to produce a bunch of 2D parts out of the same material. The parts are roughly rectangular and I need to produce an undefined large number (test jig stands for &lt;a href="https://www.thejigsapp.com"&gt;TheJigsApp.com&lt;/a&gt;).
There are a ton of available panel sizes but the CNC I&amp;rsquo;m using can fit panels of 25x36&amp;quot; max.
So our problem is to fit different size rectangles into a given rectangle [&lt;a href="https://en.wikipedia.org/wiki/Rectangle_packing"&gt;Wikipedia: Rectangle Packing&lt;/a&gt;].&lt;/p&gt;</description></item><item><title>Object Oriented OpenSCAD</title><link>https://www.maskset.net/blog/2023/10/13/object-oriented-openscad/</link><pubDate>Fri, 13 Oct 2023 06:00:00 -0400</pubDate><guid>https://www.maskset.net/blog/2023/10/13/object-oriented-openscad/</guid><description>&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;This is a discussion on using vectors in OpenSCAD as objects that can be used polymorphically.
I&amp;rsquo;ve found this to be a powerful approach which encourages more generic algorithms.
It&amp;rsquo;s a bit ugly but it works. Nothing here is revolutionary but I&amp;rsquo;ve found it to be a useful way to think about the problem.&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;OpenSCAD is a special purpose, interpreted, functional language with a limited number of built in functions.
There aren&amp;rsquo;t many types and the user can&amp;rsquo;t define any.&lt;/p&gt;</description></item><item><title>Preparing Laser Cutting Files from SVGs</title><link>https://www.maskset.net/blog/2023/10/05/preparing-laser-cutting-files-from-svgs/</link><pubDate>Thu, 05 Oct 2023 06:00:00 -0400</pubDate><guid>https://www.maskset.net/blog/2023/10/05/preparing-laser-cutting-files-from-svgs/</guid><description>&lt;p&gt;Here&amp;rsquo;s a trick I&amp;rsquo;ve been using to prepare files for laser cutting that have been exported to SVG.&lt;/p&gt;
&lt;p&gt;SVG is just an XML file that contains a bunch of vectors and metadata. Here&amp;rsquo;s an example of one exported from OpenSCAD.
Remember this, I didn&amp;rsquo;t.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-svg" data-lang="svg"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; standalone=&amp;#34;no&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!DOCTYPE svg PUBLIC &amp;#34;-//W3C//DTD SVG 1.1//EN&amp;#34; &amp;#34;http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&amp;#34;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;svg&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;width=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;76mm&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;80mm&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;viewBox=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;-38 -40 76 80&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://www.w3.org/2000/svg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;version=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;1.1&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;OpenSCAD Model&lt;span style="color:#f92672"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;path&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;d=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;M 37.5,-40 L -37.5,-40 L -37.5,40 L 37.5,40 z
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;M 34.3605,-35.4061 L 34.2222,-35.4243 L 34.0859,-35.4545 L 33.9528,-35.4965 L 33.8238,-35.5499 L 33.7,-35.6143
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; L 33.5823,-35.6893 L 33.4715,-35.7743 L 33.3686,-35.8686 L 33.2743,-35.9715 L 33.1893,-36.0823 L 33.1143,-36.2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; L 33.0499,-36.3238 L 32.9965,-36.4528 L 32.9545,-36.5859 L 32.9243,-36.7222 L 32.9061,-36.8605 L 32.9,-37
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; L -33.1893,37.9177 L -33.2743,38.0285 L -33.3686,38.1314 L -33.4715,38.2257 L -33.5823,38.3106 L -33.7,38.3856
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; L -33.8238,38.4501 L -33.9528,38.5035 L -34.0859,38.5455 L -34.2222,38.5757 L -34.3605,38.5939 L -34.5,38.6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; z
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stroke=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;black&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fill=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;lightgray&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stroke-width=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;0.5&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The laser cutter software I&amp;rsquo;m familiar with is Trotec JobControl for the Speedy line (it&amp;rsquo;s what we have at the Fat Cat Fab Lab).
The files need to be prepped for the software with the correct line thickness and color for each process.
When using a design program like adobe illustrator or inkscape that&amp;rsquo;s just part of the design process and isn&amp;rsquo;t an issue but if you&amp;rsquo;re
designing in a CAD program you&amp;rsquo;ll need to edit the exported file to set this up. The export style is at least not readily configurable
in FreeCAD, KiCad, or OpenSCAD.&lt;/p&gt;</description></item><item><title>pyetest: Electronics Testing Tool &amp; Method</title><link>https://www.maskset.net/blog/2023/09/30/pyetest-electronics-testing-tool-method/</link><pubDate>Sat, 30 Sep 2023 03:07:00 -0400</pubDate><guid>https://www.maskset.net/blog/2023/09/30/pyetest-electronics-testing-tool-method/</guid><description>&lt;ul&gt;
&lt;li&gt;Name: pyetest&lt;/li&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/snhobbs/pyetest"&gt;https://github.com/snhobbs/pyetest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;pypi: TBD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;pyetest is a Python library designed to simplify pass/fail test scripting for electronics by leveraging spreadsheets as test descriptions.
The goal is to reduce custom code and make automated test setups more accessible to users who may not be programmers.
By using structured spreadsheets to define measurements and criteria, pyetest generates both intermediate test data and final pass/fail
outcomes making reports easier to generate and debug.&lt;/p&gt;</description></item><item><title>MCU Driver Development that Doesn't Suck</title><link>https://www.maskset.net/blog/2023/05/18/mcu-driver-development-that-doesnt-suck/</link><pubDate>Thu, 18 May 2023 11:44:00 -0400</pubDate><guid>https://www.maskset.net/blog/2023/05/18/mcu-driver-development-that-doesnt-suck/</guid><description>&lt;p&gt;All I&amp;rsquo;m going to say here is to make your bed before you get in and close the barn before the horse puts in his two weeks notice.&lt;/p&gt;
&lt;p&gt;Writing MCU device drivers can suck. It can suck for many reasons. As someone who recently spent
best part of a week tracking down an installation and manufacturing issue that actually turned
out to be a clocking issue in the UART driver I feel qualified to write this to remind my future
self and possibly you too (not that I&amp;rsquo;d accuse you of doing anything quite so brain dead).&lt;/p&gt;</description></item><item><title>Setting Up Multiple FTDI Devices</title><link>https://www.maskset.net/blog/2023/04/20/setting-up-multiple-ftdi-devices/</link><pubDate>Thu, 20 Apr 2023 12:52:00 -0400</pubDate><guid>https://www.maskset.net/blog/2023/04/20/setting-up-multiple-ftdi-devices/</guid><description>&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m building a test jig for a device that needs both RS-232 and RS-485 transceivers. Since this is a test jig, I prefer to build it using off-the-shelf components—ideally ones that can be delivered overnight.&lt;/p&gt;
&lt;p&gt;Inside the jig, I have two USB-to-serial dongles (RS-232 and RS-485) and a LabJack U3, all connected through a USB hub. The hub connects to a USB isolator, which then to a bulkhead-mounted connector for easy disconnection. The jig is controlled using a laptop running Ubuntu with a test suite is written in Python.&lt;/p&gt;</description></item><item><title>Scripting FreeCAD from an AppImage</title><link>https://www.maskset.net/blog/2023/03/22/scripting-freecad-from-an-appimage/</link><pubDate>Wed, 22 Mar 2023 12:36:00 -0400</pubDate><guid>https://www.maskset.net/blog/2023/03/22/scripting-freecad-from-an-appimage/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;AppImages are another packaging methods for distributing code with all dependencies included.
It&amp;rsquo;s one of the simpler approaches, there&amp;rsquo;s no package manager for it, you download the image and go.
The FreeCAD AppImages (&lt;a href="https://wiki.freecad.org/AppImage"&gt;here&lt;/a&gt;) work great and is my typical approach to installation.&lt;/p&gt;
&lt;p&gt;One of FreeCADs strengths is the scripting interface. The GUI maps button clicks to commands meaning you can script everything out of the gate (mostly, it&amp;rsquo;s better than most).
AppImages make this only a bit more complicated than native installations.&lt;/p&gt;</description></item><item><title>KiCad Board Outlines</title><link>https://www.maskset.net/blog/2023/03/21/kicad-board-outlines/</link><pubDate>Tue, 21 Mar 2023 18:36:00 -0400</pubDate><guid>https://www.maskset.net/blog/2023/03/21/kicad-board-outlines/</guid><description>&lt;p&gt;I recently posted a video walk through of how I use board outlines and form factors as footprints in KiCad.
It&amp;rsquo;s a useful approach I encourage you to try &amp;ndash; especially when you are supporting
many different designs. Simplifying and unifying designs can lead to network effects,
allowing faster productivity growth with less complexity.&lt;/p&gt;
&lt;p&gt;There are a few ways to make a board outline in KiCad:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Drawing shapes directly with built-in tools&lt;/li&gt;
&lt;li&gt;Design the outline elsewhere, export to SVG or DXF and import as graphics&lt;/li&gt;
&lt;li&gt;Design the outline using either technique, save as a footprint instead of using it directly on the board.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Unless the board is a basic rectangle, I almost always make the board outline a &lt;strong&gt;footprint&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>KiCad 7 Build Environment</title><link>https://www.maskset.net/blog/2023/02/26/kicad-7-build-environment/</link><pubDate>Sun, 26 Feb 2023 18:36:00 -0500</pubDate><guid>https://www.maskset.net/blog/2023/02/26/kicad-7-build-environment/</guid><description>&lt;p&gt;KiCad 7 has some notable improvements, not least among these is the addition of kicad-cli.
Check out the &lt;a href="https://hackaday.com/2023/02/13/kicad-7-0-0-is-here-brings-trove-of-improvements/"&gt;Hackaday article for more&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="why-a-build-environment"&gt;Why a Build Environment?&lt;/h2&gt;
&lt;p&gt;I am a bit obsessed with pragmatic approaches to building and designing electronics.
I want the complexity to not scale linearly in the number of projects I support.
With shared design practices, reused sections, and update strategies log(n) complexity should be obtainable.&lt;/p&gt;
&lt;p&gt;Setting up every projects in a similar way allows all sorts of automation.
This helps reduce the entropy that naturally creeps into hardware projects.
Keeping a consistent directory structure keeps down the number of variables in a project.
Using a makefile to ensure consistent naming, settings/options, and directory structures are used is a great help in this struggle against the flood of complexity that hardware projects bring.&lt;/p&gt;</description></item><item><title>Semantic Versioning for Hardware</title><link>https://www.maskset.net/blog/2023/02/26/semantic-versioning-for-hardware/</link><pubDate>Sun, 26 Feb 2023 12:36:00 -0500</pubDate><guid>https://www.maskset.net/blog/2023/02/26/semantic-versioning-for-hardware/</guid><description>&lt;script src='https://gist.github.com/snhobbs/35ce2f9cd3e7101f5058b2b081eb0599.js'&gt;&lt;/script&gt;</description></item><item><title>Fixed Point Python Libraries</title><link>https://www.maskset.net/blog/2023/02/02/fixed-point-python-libraries/</link><pubDate>Thu, 02 Feb 2023 10:00:00 -0500</pubDate><guid>https://www.maskset.net/blog/2023/02/02/fixed-point-python-libraries/</guid><description>&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Use spfpm or numfi.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;spfpm behaves exactly like a standard fixed point in a compiled language with exceptions on overflow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;numfi also behaves like a standard fixed point with overflows at the limits, no exceptions are thrown.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been exploring ways to simulate fixed-point arithmetic in Python for algorithm development and testing.
Fixed-point arithmetic is especially relevant for embedded systems, DSPs, and hardware modeling where floating-point may not be available or efficient.
Since there are several libraries, all a bit different I test out as many as I could find.&lt;/p&gt;</description></item><item><title>Reusing PCB Design Elements</title><link>https://www.maskset.net/blog/2022/12/13/reusing-pcb-design-elements/</link><pubDate>Tue, 13 Dec 2022 00:00:00 -0500</pubDate><guid>https://www.maskset.net/blog/2022/12/13/reusing-pcb-design-elements/</guid><description>&lt;figure&gt;&lt;img src="https://www.maskset.net/media/uploads/blog/lab_amp-template-render.jpg"&gt;&lt;figcaption&gt;
 &lt;h4&gt;Board template layout&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Here&amp;rsquo;s the scenario: you&amp;rsquo;ve come up with a great product design, designed the electronics, written the software, set up testing, designed an enclosure, set up manufacturing, and are shipping products.
Version 0.1.0 is out the door in the hands of happy customers. You followed good project management steps but had to keep
to a tight schedule so there are valuable features you want to add. So you start working on version 0.2.0 &lt;a href="https://www.maskset.net/docs/semantic-versioning-for-electronics-design/"&gt;(semantic versioning)&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Building an Automated Test Jig: Hardware</title><link>https://www.maskset.net/blog/2022/11/27/building-an-automated-test-jig-hardware/</link><pubDate>Sun, 27 Nov 2022 15:39:00 -0500</pubDate><guid>https://www.maskset.net/blog/2022/11/27/building-an-automated-test-jig-hardware/</guid><description>&lt;p&gt;&lt;a href="https://store.merifix.com/products/mf300-fixture-kit"&gt;&lt;strong&gt;Merifix MF300 Fixture&lt;/strong&gt; &lt;img src="https://cdn.shopify.com/s/files/1/0165/2828/products/MF300-Iso_large.jpg?v=1342131033" alt="Merifix Fixture"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Part 2. of figuring out how to build a series of automated testing jigs for &lt;a href="https://hobbs-eo.com"&gt;Hobbs ElectroOptics&lt;/a&gt; and &lt;a href="https://electrooptical.net"&gt;ElectroOptical Innovations&lt;/a&gt;.
The first part &amp;ldquo;Requirements and Resources&amp;rdquo; is available &lt;a href="https://www.maskset.net/blog/2022/11/24/building-an-automated-test-jig-requirements-references/"&gt;here&lt;/a&gt;. Like the first part this focuses on development and low scale manufacturing.&lt;/p&gt;
&lt;p&gt;The most straight forward method for sourcing parts is looking at the kits available on the market. Some of the companies that offer kits are listed in
&lt;a href="https://www.maskset.net/blog/2022/11/24/building-an-automated-test-jig-requirements-references/"&gt;&amp;ldquo;Requirements and Resources&amp;rdquo;&lt;/a&gt;.
The parts can obviously purchased in those kits or similar parts can be acquired from suppliers like Digi-key or aliexpress.&lt;/p&gt;</description></item><item><title>Building an Automated Test Jig: Requirements &amp; References</title><link>https://www.maskset.net/blog/2022/11/24/building-an-automated-test-jig-requirements-references/</link><pubDate>Thu, 24 Nov 2022 15:39:00 -0500</pubDate><guid>https://www.maskset.net/blog/2022/11/24/building-an-automated-test-jig-requirements-references/</guid><description>&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s a list of design goals to guide the design of a series of related production test system. A list of interesting resources and and companies is included.&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;figure&gt;&lt;a href="https://bcdevices.com/collections/ict/products/in-circuit-tester-chassis"&gt;&lt;img src="https://cdn.shopify.com/s/files/1/0358/0153/0506/products/ict_800_540x.png"&gt;&lt;/a&gt;&lt;figcaption&gt;
 &lt;h4&gt;Blue Clover Tester Chassis&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;As the number of projects we&amp;rsquo;re supporting increases, the support requirements grow. There is a dire need of a standardized approach to test the electronics. Currently at Hobbs ElectroOptics and ElectroOptical Innovations
we rely on standard flying probe bare board testing and automated optical inspection followed by built-in-self test.
Some projects have a functional test stand which often also flashes the firmware.
The aim then is to have a testing approach that is more fool proof and easier to transfer to a CM.&lt;/p&gt;</description></item><item><title>kicad-parts-placer</title><link>https://www.maskset.net/blog/2022/11/19/kicad-parts-placer/</link><pubDate>Sat, 19 Nov 2022 01:20:00 -0500</pubDate><guid>https://www.maskset.net/blog/2022/11/19/kicad-parts-placer/</guid><description>&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/snhobbs/kicad-parts-placer/master/documents/placed_components_board.png" alt="Generated PCB"&gt;&lt;/p&gt;
&lt;h2 id="new-tool-kicad-parts-placer"&gt;New Tool: &lt;a href="https://github.com/snhobbs/kicad-parts-placer.git"&gt;&lt;em&gt;kicad-parts-placer&lt;/em&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Manually positioning critical components for a design such as pogo pins for test fixtures can be tedious and error-prone.
kicad-parts-placer simplifies this process by automating exact batch placement of parts in KiCad layouts using just a centroid files.&lt;/p&gt;
&lt;p&gt;This Python tool groups components and moves them as a single unit,
ensuring perfect alignment and maintaining fixed spacing.
It’s ideal for creating bed-of-nails testers, aligning mounting holes,
connectors, sensors, and preserving form factors across designs.&lt;/p&gt;</description></item><item><title>Timing Diagrams</title><link>https://www.maskset.net/blog/2022/11/09/timing-diagrams-for-rtl-and-digital-design/</link><pubDate>Wed, 09 Nov 2022 08:36:00 -0500</pubDate><guid>https://www.maskset.net/blog/2022/11/09/timing-diagrams-for-rtl-and-digital-design/</guid><description>&lt;figure&gt;&lt;img src="https://www.maskset.net/media/uploads/blog/adc_timing_model_wavedrom.svg" width="750"&gt;&lt;figcaption&gt;
 &lt;h4&gt;ADC Timing&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I have recently been working as part of a team generating some custom silicon for a high speed time of flight LIDAR.
The digital logic is very simple but its important to get this correct. The team has several different groups all working
remotely which makes clear documentation worth the effort. Timing diagrams for a system that can be understood by
a wide audience is an art form; displaying data in a understandable and information dense way is subtle. The work of
Edward Tufte is wonderful to look into on this topic, one of the historic pieces of data visualization he references
is Charles-Joseph Minard&amp;rsquo;s piece on Napolean&amp;rsquo;s invasion of Russia:&lt;/p&gt;</description></item><item><title>Tool: object-symbols-parser</title><link>https://www.maskset.net/blog/2022/10/26/tool-object-symbols-parser/</link><pubDate>Wed, 26 Oct 2022 11:44:00 -0400</pubDate><guid>https://www.maskset.net/blog/2022/10/26/tool-object-symbols-parser/</guid><description>&lt;figure&gt;&lt;img src="https://raw.githubusercontent.com/snhobbs/object_symbols_parser/master/blinky_objects.png"&gt;
&lt;/figure&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/snhobbs/object_symbols_parser"&gt;Link: https://github.com/snhobbs/object_symbols_parser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When the linker can&amp;rsquo;t complete as the image size is overrunning the section sizes defined in your linker script, it can be a
pain to get the symbol table to find out what is causing the overrun. One solution is to increase the declared resources,
link the ELF file and read the object table. This is annoying (to me at least). object-symbols-parser has a few modes to make
this somewhat more tolerable.&lt;/p&gt;</description></item><item><title>Sigrok + $10 Logic Analyzer</title><link>https://www.maskset.net/blog/2022/10/13/sigrok--10-logic-analyzer/</link><pubDate>Thu, 13 Oct 2022 15:39:00 -0400</pubDate><guid>https://www.maskset.net/blog/2022/10/13/sigrok--10-logic-analyzer/</guid><description>&lt;p&gt;Sometimes, the simplest tools can save hours of frustration.
When I found myself on the road, away from the lab, struggling to debug I2C and SPI issues,
I turned to a surprisingly capable $10 fx2 logic analyzer, powered by Sigrok.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.maskset.net/media/uploads/blog/img_0428.jpg"&gt;&lt;figcaption&gt;
 &lt;h4&gt;Logic analyzer opened up&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="hardware"&gt;Hardware&lt;/h2&gt;
&lt;p&gt;While I have access to more fancier equipment in the lab,
I was looking for a compact, budget-friendly solution to take on the go.
This fx2 logic analyzer fits the bill, offering surprisingly good performance and the price is absurd.&lt;/p&gt;</description></item><item><title>KiCad PCBNew Scripting: Basic scripting beyond the built in terminal</title><link>https://www.maskset.net/blog/2022/06/13/kicad-pcbnew-scripting-basic-scripting-beyond-the-built-in-terminal/</link><pubDate>Mon, 13 Jun 2022 21:47:00 -0400</pubDate><guid>https://www.maskset.net/blog/2022/06/13/kicad-pcbnew-scripting-basic-scripting-beyond-the-built-in-terminal/</guid><description>&lt;p&gt;The internal WX based scripting terminal in KiCad&amp;rsquo;s PCBNew is as bare bones as it gets. You can use a normal interface with the LoadBoard function in the pcbnew scripting interface. There isn&amp;rsquo;t any documentation to speak of for the API but once you&amp;rsquo;re using the improved interface the file structure is intuitive. I don&amp;rsquo;t know who did the naming and structure within the project but it is much better than most large APIs I&amp;rsquo;ve used (looking at you matplotlib). For power users the ability to automate tasks is astonishing so it&amp;rsquo;s worth an explore to see what can be done. For me the first step was to figure out how to get out of the integrated terminal.&lt;/p&gt;</description></item><item><title>KiCad PCBNew Scripting: Removing Ref Des From Silk Screen</title><link>https://www.maskset.net/blog/2022/06/11/kicad-pcbnew-scripting-removing-ref-des-from-silk-screen/</link><pubDate>Sat, 11 Jun 2022 00:00:00 -0400</pubDate><guid>https://www.maskset.net/blog/2022/06/11/kicad-pcbnew-scripting-removing-ref-des-from-silk-screen/</guid><description>&lt;h2 id="purpose"&gt;Purpose&lt;/h2&gt;
&lt;p&gt;Most boards I design include reference designators on the silkscreen. This way, during bring-up, I can rely solely on the schematic, BOM, and board—no need to cross-reference with CAD.
When doing a tight design it may not be possible to fit the labels anywhere that might actually be useful. When that happens you may want to forgo the labels on the silkscreen entirely. The labels are nice to have but are secondary to the operation of the circuit, nicely labeled but nonfunctional is hardly a good trade-off. Here&amp;rsquo;s what I&amp;rsquo;m looking at when deciding to remove the silkscreen ref des:&lt;/p&gt;</description></item><item><title>Text Formatting In the Terminal</title><link>https://www.maskset.net/blog/2022/02/10/text-formatting-in-the-terminal/</link><pubDate>Thu, 10 Feb 2022 03:07:00 -0500</pubDate><guid>https://www.maskset.net/blog/2022/02/10/text-formatting-in-the-terminal/</guid><description>&lt;figure&gt;&lt;img src="https://www.maskset.net/media/uploads/blog/rich_live_table.png" width="750"&gt;&lt;figcaption&gt;
 &lt;h4&gt;Rich Table&lt;/h4&gt;
 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I wanted to share a useful python library that I finally remembered to use after staring it while browsing Github awhile ago. Finding a new useful library can be incredibly invigorating, sometimes it&amp;rsquo;s a waste of time, but the other times! The &amp;lsquo;Rich&amp;rsquo; library falls into the invigorating category.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name: Rich&lt;/li&gt;
&lt;li&gt;Purpose: Terminal display tools.&lt;/li&gt;
&lt;li&gt;Why I Like It: Fast, pretty, and extensible output formatting for scripts.&lt;/li&gt;
&lt;li&gt;Pypi: &lt;a href="https://pypi.org/project/rich/"&gt;https://pypi.org/project/rich/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/Textualize/rich"&gt;https://github.com/Textualize/rich&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tutorial I Used: &lt;a href="https://rich.readthedocs.io/en/latest/live.html"&gt;https://rich.readthedocs.io/en/latest/live.html&lt;/a&gt; and &lt;a href="https://www.codeunderscored.com/format-terminal-using-pythons-rich-library"&gt;https://www.codeunderscored.com/format-terminal-using-pythons-rich-library&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I love the way this library can make things look with a few lines but that&amp;rsquo;s not the main draw to me.
My goal is an understandable and usable interface, no clutter, and nothing that behaves any differently than what the user expects.&lt;/p&gt;</description></item><item><title>Jupyter Notebooks &amp; Photon Budgets</title><link>https://www.maskset.net/blog/2021/11/29/jupyter-notebooks-photon-budgets/</link><pubDate>Mon, 29 Nov 2021 06:00:00 -0500</pubDate><guid>https://www.maskset.net/blog/2021/11/29/jupyter-notebooks-photon-budgets/</guid><description>&lt;h4 id="feasibility-analysis--photon-budgets"&gt;Feasibility Analysis / Photon Budgets&lt;/h4&gt;
&lt;p&gt;When making a measurement the first questions you need to ask are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What are we measuring&lt;/li&gt;
&lt;li&gt;How can it be measured&lt;/li&gt;
&lt;li&gt;Is the measurement possible&lt;/li&gt;
&lt;li&gt;How good can we get&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The order is only for the first iteration of thinking. As with all complex systems, feedback and iteration must exist. A good starting point is doing a basic pass through on a white board or the back of a napkin at lunch. There are always a few &lt;a href="https://en.wikipedia.org/wiki/Spherical_cow"&gt;spherical cows&lt;/a&gt; and references to &lt;a href="https://en.wikipedia.org/wiki/Perturbation_theory_%28quantum_mechanics%29"&gt;first order perturbations&lt;/a&gt;. The first pass can raise concerns and quantities that can need to be measured or estimated (hopefully both). After a first pass when you&amp;rsquo;ve figured out what paths you are pursuing it is useful to do a formal analysis which is known generically as a feasibility study/analysis and as a photon budget in some circles for optical measurements.&lt;/p&gt;</description></item><item><title>Jupyter Notebook Tools &amp; Setup</title><link>https://www.maskset.net/blog/2021/11/20/jupyter-notebook-tools-setup/</link><pubDate>Sat, 20 Nov 2021 06:00:00 -0500</pubDate><guid>https://www.maskset.net/blog/2021/11/20/jupyter-notebook-tools-setup/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;The following are a collection of tools I use to improve my Jupyter reports.&lt;/p&gt;
&lt;h2 id="improving-pdf-output"&gt;Improving PDF Output&lt;/h2&gt;
&lt;p&gt;Jupyter notebook plots created with Matplotlib are by default PNG.
When possible I prefer vector graphics as it allows you to upscale as much as
necessary with no quality penalty. The following sets the exporting image format to PDF.
The inline images remain PNGs but the export to PDF or LaTeX will use the PDFs.&lt;/p&gt;</description></item><item><title>Blogs &amp; News Sites</title><link>https://www.maskset.net/blog/2021/11/13/blogs-news-sites/</link><pubDate>Sat, 13 Nov 2021 03:08:00 -0500</pubDate><guid>https://www.maskset.net/blog/2021/11/13/blogs-news-sites/</guid><description>&lt;h3 id="technical-blogs--news"&gt;Technical Blogs &amp;amp; News&lt;/h3&gt;
&lt;h3 id="opml-list"&gt;&lt;a href="https://www.maskset.net/media/uploads/blog/feedly-2021-11-12.opml"&gt;OPML List&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.edaboard.com/external.php?type=RSS2&amp;amp;amp"&gt;Analog Circuit Design:forumids=38; https://www.edaboard.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mcuoneclipse.com/feed/"&gt;MCU on Eclipse: https://mcuoneclipse.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://metadata.osa.org/rss/infobase/josaa_feed.xml"&gt;Journal of the Optical Society of America A: http://www.osapublishing.org/josaa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://macrofab.com/feed/"&gt;MacroFab: https://macrofab.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://metadata.osa.org/rss/infobase/ol_feed.xml"&gt;Optics Letters: http://www.osapublishing.org/ol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jaycarlson.net/feed/"&gt;Jay Carlson: https://jaycarlson.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.eetimes.com/rss"&gt;EETimes: https://www.eetimes.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thesignalpath.com/blogs/feed/"&gt;The Signal Path: https://thesignalpath.com/blogs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://betterembsw.blogspot.com/feeds/posts/default"&gt;Better Embedded System SW: http://betterembsw.blogspot.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://e2e.ti.com/blogs_/b/msp430blog/rss.aspx"&gt;Embedded processing: https://e2e.ti.com/blogs_/b/process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://phys.org/rss-feed/physics-news/optics-photonics/"&gt;Photonics News - Optics, Photonics, Physics News: http://phys.org/rss-feed/physics-news/optics-photonics/; https://phys.org/physics-news/optics-photonics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/feed/better-programming"&gt;Better Programming - Medium: https://betterprogramming.pub?source=rss&amp;mdash;-d0b105d10f0a&amp;mdash;4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://metadata.osa.org/rss/infobase/ao_feed.xml"&gt;Applied Optics: http://www.osapublishing.org/ao&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://embeddedgurus.com/stack-overflow/feed/"&gt;Stack Overflow: https://embeddedgurus.com/stack-overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://feeds.feedburner.com/EmbeddedStar"&gt;Embedded Star: http://www.embeddedstar.com/weblog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.eventhelix.com/feed/"&gt;telecom • networking • design: http://blog.eventhelix.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.mentor.com/colinwalls/feed/"&gt;Embedded Software: https://blogs.sw.siemens.com/embedded-software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://embedded.fm/episodes?format=rss"&gt;Embedded: https://embedded.fm/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.embeddedrelated.com/blogs_rss.php"&gt;EmbeddedRelated.com Blogs: https://www.embeddedrelated.com/blogs.php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://interrupt.memfault.com/blog/feed.xml"&gt;Interrupt: https://interrupt.memfault.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://Dave-ford.blogspot.com/feeds/posts/default"&gt;Dave Ford&amp;rsquo;s Programming Blog: http://dave-ford.blogspot.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://electrooptical.net/News/feeds/rss/"&gt;ElectroOptical Innovations: https://electrooptical.net/News/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.edn.com/rss/"&gt;EDN: https://www.edn.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://embedded.fm/blog?format=RSS"&gt;Latest Posts - Embedded: https://embedded.fm/blog/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://circuitcellar.com/feed/"&gt;Circuit Cellar: https://circuitcellar.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.embedds.com/feed/"&gt;Embedds: https://embedds.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.adafruit.com/blog/feed/adacast"&gt;Adafruit Industries – Makers, hackers, artists, designers and engineers!: https://blog.adafruit.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.industrial-embedded.com/news/rss.xml"&gt;Industrial Embedded Systems: http://industrial.embedded-computing.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://feeds.feedburner.com/DesignWorldOnline"&gt;Design World Online: https://www.designworldonline.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sparkfun.com/commerce/rss.php"&gt;SparkFun: Commerce Blog: https://www.sparkfun.com/news&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://electronicdesign.com/rss.xml"&gt;Electronic Design - Engineering Essentials Curated By Experts: https://www.electronicdesign.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fpgarelated.com/blogs_rss.php"&gt;FPGARelated.com Blogs: https://www.fpgarelated.com/blogs.php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://embeddedgurus.com/wp-content/recent-global-posts-feed.php"&gt;Embedded Gurus - Experts on Embedded Software Posts: https://embeddedgurus.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://embeddedblog.blogspot.com/feeds/posts/default"&gt;The Embedded Blog: http://embeddedblog.blogspot.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://metadata.osa.org/rss/infobase/as_feed.xml"&gt;Applied Spectroscopy: http://www.osapublishing.org/as&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.digilentinc.com/index.php/feed/"&gt;Digilent Blog: https://digilent.com/blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mbed.org/blog/feeds/entries/"&gt;mbed: https://os.mbed.com/blog/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ieeexplore.ieee.org/rss/TOC68.XML"&gt;IEEE Photonics Technology Letters - new TOC: http://ieeexplore.ieee.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.edn.com/rss/all"&gt;All Articles: https://www.edn.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://optics.org/rss/news.xml"&gt;Optics.org News: https://optics.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.osa-opn.org/home/rss.aspx?rss=News"&gt;Optics and Photonics News RSS: https://www.optica-opn.org/gallery/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://feeds.feedburner.com/acs/apchd5"&gt;ACS Photonics: Latest Articles (ACS Publications): https://pubs.acs.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.designnews.com/rss_simple.asp"&gt;designnews.com - Serving the 21st Century Design Engineer: https://www.designnews.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://feeds.feedburner.com/TheAmpHour"&gt;The Amp Hour Electronics Podcast: https://theamphour.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arxiv.org/rss/physics.optics"&gt;physics.optics updates on arXiv.org: http://arxiv.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cyberciti.biz/faq/feed/"&gt;nixCraft: Linux Tips, Hacks, Tutorials, And Ideas In Blog Format (RSS/FEED): https://www.cyberciti.biz/atom/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://physicstoday.org/feed.xml"&gt;Physics Today Magazine: https://physicstoday.scitation.org/loi/pto?af=R&amp;amp;feed=most-recent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.designnews.com/rss_simple.asp"&gt;designnews.com - Serving the 21st Century Design Engineer: https://www.designnews.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://feeds.feedburner.com/DesignWorldOnline"&gt;Design World Online: https://www.designworldonline.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sparkfun.com/commerce/rss.php"&gt;SparkFun: Commerce Blog: https://www.sparkfun.com/news&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://karibe.co.ke"&gt;Karibe - Programming &amp;amp; Embedded: https://karibe.co.ke&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wordvice.com/"&gt;Wordvice - Proofreading &amp;amp; Editing Professionals: https://wordvice.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Article: Device Control</title><link>https://www.maskset.net/blog/2021/11/12/article-device-control/</link><pubDate>Fri, 12 Nov 2021 18:39:00 -0500</pubDate><guid>https://www.maskset.net/blog/2021/11/12/article-device-control/</guid><description>&lt;script src='https://gist.github.com/snhobbs/e29c4e306fa253ab760384fcbd5a5d4f.js'&gt;&lt;/script&gt;</description></item><item><title>Article: Device Control Dashboard</title><link>https://www.maskset.net/blog/2021/11/12/article-device-control-dashboard/</link><pubDate>Fri, 12 Nov 2021 18:37:00 -0500</pubDate><guid>https://www.maskset.net/blog/2021/11/12/article-device-control-dashboard/</guid><description>&lt;script src='https://gist.github.com/snhobbs/5f9a1e2340ab90e62c9e6bd5cf2a317a.js'&gt;&lt;/script&gt;</description></item><item><title>Article: Building a Functional Teststand</title><link>https://www.maskset.net/blog/2021/11/12/article-building-a-functional-teststand/</link><pubDate>Fri, 12 Nov 2021 18:36:00 -0500</pubDate><guid>https://www.maskset.net/blog/2021/11/12/article-building-a-functional-teststand/</guid><description>&lt;script src='https://gist.github.com/snhobbs/5f9a1e2340ab90e62c9e6bd5cf2a317a.js'&gt;&lt;/script&gt;</description></item><item><title>Article: Embedded Directory Setup</title><link>https://www.maskset.net/blog/2021/09/12/article-embedded-directory-setup/</link><pubDate>Sun, 12 Sep 2021 18:36:00 -0400</pubDate><guid>https://www.maskset.net/blog/2021/09/12/article-embedded-directory-setup/</guid><description>&lt;h3 id="github-gist"&gt;GitHub gist&lt;/h3&gt;
&lt;script src='https://gist.github.com/snhobbs/e763280e3f9253df3cf50f1481c26ead.js'&gt;&lt;/script&gt;</description></item><item><title>ISP Programming</title><link>https://www.maskset.net/blog/2019/12/02/isp-programming/</link><pubDate>Mon, 02 Dec 2019 20:44:00 -0500</pubDate><guid>https://www.maskset.net/blog/2019/12/02/isp-programming/</guid><description>&lt;div class="td-card card border me-4"&gt;
&lt;div class="card-body"&gt;
 &lt;p class="card-text"&gt;
&lt;figure&gt;&lt;img src="https://www.maskset.net/media/uploads/blog/square-wave-on-oscilloscope.jpg"
 alt="Analog scope pulse"&gt;
&lt;/figure&gt;
&lt;/p&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;h3 id="intro"&gt;Intro&lt;/h3&gt;
&lt;p&gt;Most microcontrollers these days come with integrated, ROM based, bootloader known as In-System Programming (ISP). You hookup to some default port, follow the protocol described in the docs and you can write/read the flash, query chip information, etc. The port is typically a UART but USB, I2C, and SPI are not unknown. NXP chips will enter the ISP handler if the user code is &amp;ldquo;not valid&amp;rdquo; (more on that later) or if the ISP pin is pulled down on reset.&lt;/p&gt;</description></item><item><title>Why You Should Use Latex</title><link>https://www.maskset.net/blog/2017/04/16/why-you-should-use-latex/</link><pubDate>Sun, 16 Apr 2017 22:45:39 -0400</pubDate><guid>https://www.maskset.net/blog/2017/04/16/why-you-should-use-latex/</guid><description>&lt;h2 id="latex"&gt;LaTeX&lt;/h2&gt;
&lt;p&gt;Some pronounce it &amp;lsquo;LAA-Tech&amp;rsquo;, I prefer &amp;lsquo;Lay-Tech&amp;rsquo;, never &amp;rsquo;lay-techs&amp;rsquo; that&amp;rsquo;s the rubber.
Latex is amazing, it has sort of a cult following among physicists.
Actually a cult, in my undergrad we couldn&amp;rsquo;t hand in papers unless they
were done using LaTeX (the TAs would check the properties section
of a PDF to make sure).&lt;/p&gt;
&lt;h3 id="what-and-why"&gt;What and Why&lt;/h3&gt;
&lt;h4 id="skip-unless-you-need-convincing-latex-is-a-good-idea"&gt;Skip unless you need convincing LaTeX is a good idea&lt;/h4&gt;
&lt;p&gt;LaTeX is a typesetting language that lets you specify how a generated document is supposed to look.
What you are reading right now is an example of a typesetting language
called HTML, you can see how the web page is actually written by right
clicking and selecting &amp;lsquo;view-source&amp;rsquo;.
Microsoft Office and Adobe are the main alternatives but are examples of GUI
(graphical user interface) programs, referred to as WYSIWYG (what you see is what you get) programs.
None of that matters, what matters is that LaTeX gives you complete control
over how your document is supposed to look.
With a GUI, for instance, you specify where an image, table, etc. is supposed to go
by &amp;lsquo;dragging-and-dropping&amp;rsquo; it where you want it. You would then drag then
use a drop-down menu to resize it or whatever. When you want to change
a figure caption number you need to find every instance and change it.
To move an image or resize it you INEVITABLY ruin the nicely done formatting
below it. To reformat the document you need to do it all by hand again.
This is, of course, utter nonsense. With LaTeX you could instead be suffering from a whole slew of different problems instead.&lt;/p&gt;</description></item></channel></rss>