cdwilson.dev
https://cdwilson.dev/
Recent content on cdwilson.devHugoenI bet you can't RE this receipt
https://cdwilson.dev/articles/i-bet-you-cant-re-this-receipt/
Wed, 21 Jan 2026 00:00:00 +0000https://cdwilson.dev/articles/i-bet-you-cant-re-this-receipt/<p>I will send $100 to the first person who can reverse engineer how <a href="https://www.target.com/" class="external-link" target="_blank" rel="noopener">Target</a> calculated the $162.10 total amount on this receipt.</p>
<p>This is not a joke. I’m totally serious.</p>
<h2 id="rules">
Rules
<a class="heading-link" href="#rules">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h2>
<p>The first person to build me a spreadsheet showing exactly how the $162.10 total amount is calculated (step-by-step with explanation, including how to calculate the $64.67 taxable amount in the red box), will be sent $100 via Venmo, PayPal, etc.</p>Hackaday Supercon 2024
https://cdwilson.dev/articles/hackaday-supercon-2024/
Thu, 07 Nov 2024 00:00:00 +0000https://cdwilson.dev/articles/hackaday-supercon-2024/<p>
<a href="images/image-20241107200028411.png">
<img src="images/image-20241107200028411.png" alt="" class="center" />
</a>
</p>
<p>I finally got a chance to sit down and reflect on this past weekend at <a href="https://hackaday.io/superconference/" class="external-link" target="_blank" rel="noopener">Hackaday Supercon 2024</a>.</p>
<p>You might expect that a post about Supercon would be all about <a href="https://www.youtube.com/watch?v=Iz-HrZkzUlk&t=5124s" class="external-link" target="_blank" rel="noopener">epic badge hacks</a>, or a recap of interesting <a href="https://hackaday.io/superconference/schedule.html" class="external-link" target="_blank" rel="noopener">talks</a>, or photos of the (surprisingly good for a conference) food that I ate 🌮</p>
<p>But what I really want to do is tell you a story of how the <strong>kindness</strong> and <strong>generosity</strong> of a bunch of random people made my first Supercon… well… SuperFUN!</p>2024 mid-year update
https://cdwilson.dev/articles/2024-mid-year-update/
Wed, 26 Jun 2024 00:00:00 +0000https://cdwilson.dev/articles/2024-mid-year-update/<p>It’s been a little while since I’ve posted anything new here, but that doesn’t mean I’ve been resting on my laurels!</p>
<p>Here’s what (and where) I’ve been writing recently 👨🏻💻</p>
<h1 id="content-for-clients">
Content for clients
<a class="heading-link" href="#content-for-clients">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>Over the last year, I’ve been doing some Zephyr-related technical writing for the <a href="https://blog.golioth.io/" class="external-link" target="_blank" rel="noopener">Golioth blog</a>.</p>
<p>You can see the full list of articles I’ve contributed at <a href="https://blog.golioth.io/author/cdwilson/" class="external-link" target="_blank" rel="noopener">https://blog.golioth.io/author/cdwilson/</a></p>
<h1 id="common-ground-electronics">
Common Ground Electronics
<a class="heading-link" href="#common-ground-electronics">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>In addition to authoring technical content for clients, I’m also starting to write about embedded systems and IoT-related topics on the <a href="https://cgnd.dev/posts/" class="external-link" target="_blank" rel="noopener">Common Ground Electronics blog</a>. So far, I’ve written about how to <a href="https://cgnd.dev/posts/enforce-zephyr-code-quality-pre-commit/" class="external-link" target="_blank" rel="noopener">enforce Zephyr code quality with pre-commit</a> and my experience <a href="https://cgnd.dev/posts/golioth-wifi-serial-logger-prototype/" class="external-link" target="_blank" rel="noopener">prototyping a WiFi serial logger with Golioth</a>. I also just posted a <a href="https://cgnd.dev/posts/2024-mid-year-retrospective/" class="external-link" target="_blank" rel="noopener">mid-year retrospective</a> where I talk about how the business was started and what I’ve been working on over the last year.</p>A better difftool for KiCad
https://cdwilson.dev/articles/a-better-difftool-for-kicad/
Mon, 06 Feb 2023 00:00:00 +0000https://cdwilson.dev/articles/a-better-difftool-for-kicad/<p>It can be difficult to tell what has actually changed when running <code>git difftool</code> on a <code>.kicad_pcb</code> file because KiCad embeds timestamps into the file that change when the file is modified:</p>
<p>
<a href="images/difftool_timestamp_changes.png">
<img src="images/difftool_timestamp_changes.png" alt="difftool_timestamp_changes" class="center" />
</a>
</p>
<p>Luckly, we can tell <code>git</code> to use a <a href="https://git-scm.com/docs/git-difftool#Documentation/git-difftool.txt--tlttoolgt" class="external-link" target="_blank" rel="noopener">custom difftool</a> using the <code>--tool=<tool></code> argument.</p>
<p>First, we need to create a custom shell script to pass to <code>git difftool --tool=<tool></code>. I use <a href="https://kaleidoscope.app/" class="external-link" target="_blank" rel="noopener">Kaleidoscope.app</a> as my git difftool on macOS, so I named this script <code>kicad-ksdiff</code> and put it a directory on my <code>$PATH</code>:</p>KiCad database libraries on macOS
https://cdwilson.dev/articles/kicad-database-libraries-on-macos/
Wed, 14 Dec 2022 00:00:00 +0000https://cdwilson.dev/articles/kicad-database-libraries-on-macos/<div class="notice info">
<div class="notice-title">
<i class="fa-solid fa-exclamation-circle" aria-hidden="true"></i>Info
</div>
<div class="notice-content"><p>On December 11, 2022 the KiCad team <a href="https://social.adamwolf.org/@adamwolf/109496840211680309" class="external-link" target="_blank" rel="noopener">announced</a> support for macOS universal builds in the 6.99 <a href="https://www.kicad.org/download/macos/" class="external-link" target="_blank" rel="noopener">nightly releases</a>. Using a universal build greatly simplifies the process of setting up database libraries and is <em>strongly recommended</em>. If you are using an older <code>x86_64</code> nightly build released before December 12, 2022 on a Mac with Apple Silicon (i.e. the file does <em>NOT</em> start with <code>kicad-unified-universal</code>), make sure to follow the old instructions found here:</p>Set KICAD_DOCUMENTS_HOME on macOS
https://cdwilson.dev/articles/set-kicad-documents-home-on-macos/
Tue, 06 Dec 2022 00:00:00 +0000https://cdwilson.dev/articles/set-kicad-documents-home-on-macos/<h1 id="kicad-documents-home">
KiCad Documents Home
<a class="heading-link" href="#kicad-documents-home">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>KiCad 6.x introduced the concept of the “KiCad Documents Home” base directory, described as the:</p>
<blockquote>
<p>Base path of KiCad user-modifiable documents, such as projects, templates, Python scripts, libraries, etc. Subdirectories will be created within this directory for each KiCad minor version. This directory is provided as a suggested user data location, but does not need to be used.</p></blockquote>
<p>By default, KiCad creates this folder in <code>~/Documents/KiCad/</code>:</p>KiCad database libraries on Apple Silicon
https://cdwilson.dev/articles/kicad-database-libraries-on-apple-silicon/
Fri, 04 Nov 2022 00:00:00 +0000https://cdwilson.dev/articles/kicad-database-libraries-on-apple-silicon/<div class="notice warning">
<div class="notice-title">
<i class="fa-solid fa-exclamation-triangle" aria-hidden="true"></i>Warning
</div>
<div class="notice-content"><p>On December 11, 2022 the KiCad team <a href="https://social.adamwolf.org/@adamwolf/109496840211680309" class="external-link" target="_blank" rel="noopener">announced</a> support for macOS universal builds in the 6.99 <a href="https://www.kicad.org/download/macos/" class="external-link" target="_blank" rel="noopener">nightly releases</a>. Using a universal build greatly simplifies the process of setting up database libraries and is <em>strongly recommended</em>. If you are using a universal nightly build released after December 12, 2022 (the file starts with <code>kicad-unified-universal</code>), make sure to follow the updated instructions found here:</p>
<p><a href="https://cdwilson.dev/articles/kicad-database-libraries-on-macos/" class="external-link" target="_blank" rel="noopener">https://cdwilson.dev/articles/kicad-database-libraries-on-macos/</a></p></div>
</div>
<h1 id="overview">
Overview
<a class="heading-link" href="#overview">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>A new “Database Libraries” feature was <a href="https://gitlab.com/kicad/code/kicad/-/issues/7436" class="external-link" target="_blank" rel="noopener">recently added</a> to the KiCad <a href="https://downloads.kicad.org/kicad/macos/explore/nightlies" class="external-link" target="_blank" rel="noopener">macOS Nightlies</a> (6.99) and is scheduled to be officially released in KiCad 7. Here’s an overview from the <a href="https://docs.kicad.org/master/en/eeschema/eeschema.html#database_libraries" class="external-link" target="_blank" rel="noopener">documentation</a>:</p>40% keymap for Keyboardio Model 100
https://cdwilson.dev/articles/40-percent-keymap-for-keyboardio-model-100/
Sun, 30 Oct 2022 00:00:00 +0000https://cdwilson.dev/articles/40-percent-keymap-for-keyboardio-model-100/<p>After backing the wildly successful <a href="https://shop.keyboard.io/pages/model100" class="external-link" target="_blank" rel="noopener">Keyboardio Model 100</a> <a href="https://www.kickstarter.com/projects/keyboardio/model-100" class="external-link" target="_blank" rel="noopener">Kickstarter campaign</a> last year, I finally received my keyboard in the mail 🥳</p>
<p>
<a href="images/model100_desk.png">
<img src="images/model100_desk.png" alt="Model 100 Desk" class="center" />
</a>
</p>
<p>The keyboard is ✨beautiful✨ and the custom-sculpted keycaps feel really great to type on. After using the Model 100 for a couple weeks now, I’ve finally settled on a 40%-ish (3 rows of keys) keymap that feels really natural for me.</p>
<p>Although this keymap works really well for me personally, it’s probably not the right keymap for everyone. The Model 100 is a roughly 60%-ish (4 rows of keys) keyboard, so <strong>it may seem odd that I’m only using 44 of the 64 available keys on the keyboard</strong>. I thought it might be interesting to walk through my thought process step-by-step and discuss some of the requirements that drove the decisions about where to map each key.</p>USB over IP with VirtualHere
https://cdwilson.dev/articles/usb-over-ip-with-virtualhere/
Tue, 05 Jul 2022 00:00:00 +0000https://cdwilson.dev/articles/usb-over-ip-with-virtualhere/<p>Raise your hand if you’re tired of having a spaghetti mess of USB hubs and dongles hanging off your laptop? 🙋🏻♂️</p>
<p>I’m going to show you how to leave all those USB devices behind and remotely connect to them over the network instead. Yup, you heard right–you’ll <em>finally</em> be able to work from a <a href="https://mgsloan.com/posts/tree-based-computing/" class="external-link" target="_blank" rel="noopener">laptop tied to a tree</a>! (or at least from the comfort of your own couch…)</p>
<h1 id="virtualhere">
VirtualHere
<a class="heading-link" href="#virtualhere">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>A while back, I was looking for a way to fire up the debugger on a <a href="https://www.st.com/en/evaluation-tools/stm32-nucleo-boards.html" class="external-link" target="_blank" rel="noopener">STM32 NUCLEO development board</a> without having the board directly connected to one of my laptop’s USB ports.</p>DIY home office electronics workspace
https://cdwilson.dev/articles/diy-home-office-electronics-workspace/
Tue, 28 Jun 2022 00:00:00 +0000https://cdwilson.dev/articles/diy-home-office-electronics-workspace/<h1 id="the-idea">
The idea
<a class="heading-link" href="#the-idea">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>I’ve been wanting to set up a small electronics workspace in my home office for a while now. The main goal was to have an ESD-safe area in the office where I could do bring-up and testing for projects that require a connection to a computer and test equipment. I already have a separate full size electronics workbench in the garage (SMT reflow oven, hot air rework, microscope, etc), so this was intended as a more focused compliment to that space, rather than a replacement for it.</p>Using giscus for comments in Hugo
https://cdwilson.dev/articles/using-giscus-for-comments-in-hugo/
Sun, 26 Jun 2022 00:00:00 +0000https://cdwilson.dev/articles/using-giscus-for-comments-in-hugo/<p>After looking into a <a href="https://getreplybox.com/" class="external-link" target="_blank" rel="noopener">couple</a> <a href="https://talk.hyvor.com/" class="external-link" target="_blank" rel="noopener">different</a> <a href="https://fastcomments.com/" class="external-link" target="_blank" rel="noopener">hosted</a> <a href="https://commento.io/" class="external-link" target="_blank" rel="noopener">options</a> for enabling comments on this site, I decided to give <a href="https://giscus.app/" class="external-link" target="_blank" rel="noopener">giscus</a> a try.</p>
<p>This article describes why I chose giscus and how to set it up in a Hugo site.</p>
<h1 id="first-why-giscus">
First: why giscus?
<a class="heading-link" href="#first-why-giscus">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p>It’s worth talking through the thought process for how I landed on giscus, as it’s probably not the right option for everybody.</p>
<p>Derek Kay has an <a href="https://darekkay.com/blog/static-site-comments/" class="external-link" target="_blank" rel="noopener">excellent article</a> which explores various ways to include comments on a static site. After reviewing many of the options he mentioned in the article, I found that I mostly agree with his conclusion:</p>Bash shell startup files
https://cdwilson.dev/articles/bash-shell-startup-files/
Fri, 24 Oct 2014 00:00:00 +0000https://cdwilson.dev/articles/bash-shell-startup-files/<p>
<a href="images/tanooki_mario_shell.gif">
<img src="images/tanooki_mario_shell.gif" alt="" class="center" />
</a>
</p>
<p>This article is an attempt to answer the following questions<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>:</p>
<ul>
<li>What is the difference between <code>/etc/profile</code>, <code>~/.profile</code>, <code>~/.bash_profile</code>, <code>~/.bash_login</code>, and <code>~/.bashrc</code>?</li>
<li>Why doesn’t Terminal.app read my <code>~/.bashrc</code> on Mac OS X?</li>
</ul>
<h2 id="bash-startup">
Bash startup
<a class="heading-link" href="#bash-startup">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h2>
<p>When Bash is invoked, it reads and executes commands from its startup files to set up the shell environment.</p>
<p>There are a couple conditions Bash checks to determine which startup files are read (and which ones are not) when the shell is invoked:</p>Understanding the INA219 I2C Current/Power Monitor
https://cdwilson.dev/articles/understanding-the-ina219/
Sun, 06 Jul 2014 00:00:00 +0000https://cdwilson.dev/articles/understanding-the-ina219/<h2 id="motivation">
Motivation
<a class="heading-link" href="#motivation">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h2>
<p>The <a href="http://www.ti.com/lit/gpn/ina219" title="INA219 datasheet" class="external-link" target="_blank" rel="noopener">INA219 datasheet</a> provides an example calibration workflow, but doesn’t really explain how some of the equations and constant values are derived. This article tries to fill in some of the gaps that weren’t obvious to me when I first read the datasheet.</p>
<h2 id="overview">
Overview
<a class="heading-link" href="#overview">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h2>
<blockquote>
<p>“The INA219 is a high-side current shunt and power monitor with an I2C interface. The INA219 monitors both shunt drop and supply voltage, with programmable conversion times and filtering. A programmable calibration value, combined with an internal multiplier, enables direct readouts in amperes. An additional multiplying register calculates power in watts. The I2C interface features 16 programmable addresses.”</p>Current Projects
https://cdwilson.dev/projects/
Mon, 01 Jan 0001 00:00:00 +0000https://cdwilson.dev/projects/<p><a href="https://cgnd.dev/" class="external-link" target="_blank" rel="noopener">Common Ground Electronics</a> :: A boutique embedded systems engineering services firm</p>
<h1 id="past-projects">
Past Projects
<a class="heading-link" href="#past-projects">
<i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
<span class="sr-only">Link to heading</span>
</a>
</h1>
<p><a href="https://flyingcamp.design/" class="external-link" target="_blank" rel="noopener">Flying Camp Design</a> :: Open-source hardware development tools for the early Internet of Things</p>
<p><a href="https://web.archive.org/web/20140106080903/http://moteware.com/" class="external-link" target="_blank" rel="noopener">Moteware</a> :: Open-source electronics disseminator for research groups and education</p>Get in touch
https://cdwilson.dev/contact/
Mon, 01 Jan 0001 00:00:00 +0000https://cdwilson.dev/contact/<p>I love hearing from new people — please feel free to <a href="mailto:[email protected]" >email me</a>!</p>
<p>I’m always up for chatting about electronics, collaborating on product ideas, or anything else you’ve got in mind.</p>Hi 👋, I'm Chris
https://cdwilson.dev/about/
Mon, 01 Jan 0001 00:00:00 +0000https://cdwilson.dev/about/<p>
<a href="images/chris_200_circular.png">
<img src="images/chris_200_circular.png" alt="Chris Wilson" class="center" />
</a>
</p>
<p>I’m passionate about technology that makes electronics more open, approachable, and accessible to everyone.</p>
<p>I spent most of my career working as a hardware design engineer specializing in embedded systems designed for the Internet of Things. More recently, I took a hiatus from design work and pivoted into a product management role at a PCB assembly manufacturing startup.</p>
<p>Currently, I’m bootstrapping <a href="https://cgnd.dev/" class="external-link" target="_blank" rel="noopener">Common Ground Electronics</a>, a boutique embedded systems engineering services firm.</p>