<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>arduino — toothywalrus</title><link>https://blog.toothywalrus.dev/projects/arduino/</link><description>Long-form write-ups about SDR, homelab, electronics and tooling — plus a weekly log of what actually got built.</description><language>en-us</language><lastBuildDate>Thu, 06 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.toothywalrus.dev/projects/arduino/index.xml" rel="self" type="application/rss+xml"/><item><title>arduino, week 32: the traffic light is real</title><link>https://blog.toothywalrus.dev/logbook/2026-w32-arduino/</link><pubDate>Thu, 06 Aug 2026 00:00:00 +0000</pubDate><guid>https://blog.toothywalrus.dev/logbook/2026-w32-arduino/</guid><category>weeknotes</category><category>electronics</category><category>teaching</category><description>&lt;p&gt;The kids&amp;rsquo; track had a plan and no built hardware. Now it has built hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The traffic light works.&lt;/strong&gt; Three LEDs, breadboarded and flashed on the real
board. It&amp;rsquo;s the opening project because it is the shortest path from &amp;ldquo;wires in
a bag&amp;rdquo; to &amp;ldquo;a thing that visibly does something,&amp;rdquo; and that distance is the
whole game when the audience is eight.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Five programs, one circuit.&lt;/strong&gt; Rather than a project per lesson, tutorial 02
ships five interchangeable programs that all run on the same wiring — so the
build happens once and the payoff repeats. One is a seven-pattern light show.
One is &lt;code&gt;calm_light&lt;/code&gt;: a single slow drift, no events, nothing to react to. I
added it as an afterthought and it&amp;rsquo;s the one I keep running.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The toolchain question is closed:&lt;/strong&gt; &lt;code&gt;arduino-cli&lt;/code&gt;, not PlatformIO. Written
down so it stops getting relitigated every time I open the repo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Small thing I&amp;rsquo;m pleased about:&lt;/strong&gt; I dumped the board&amp;rsquo;s flash before
reflashing it. That is a habit I acquired the expensive way and it costs
thirty seconds.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Also this week:&lt;/strong&gt; the tutorials are now generated from shared sources in
both Russian and English with a kids mode, rather than maintained as parallel
documents. The vendored kit docs were swapped to the starter kit actually
sitting on the desk instead of the one I&amp;rsquo;d guessed at, which is the sort of
error that only shows up when a child asks where a part is. Two ESP32S boards
and a second components kit joined the inventory, with their pin gotchas
written down before they bite. And the thermometer project moved off a manual
&lt;code&gt;nohup&lt;/code&gt; onto a proper user service, and now keeps its readings in SQLite with
a history view.&lt;/p&gt;
&lt;div class="provenance"&gt;
 &lt;h2&gt;Where this came from&lt;/h2&gt;
 &lt;p&gt;Work between 3 and 6 August 2026 in the &lt;code&gt;arduino&lt;/code&gt; repository — about 21
commits, plus issues #51 and #56. The repository is private.&lt;/p&gt;
&lt;p&gt;The traffic light and the five programs were built and flashed on hardware,
not simulated. The ESP32S pin notes are transcribed from datasheets and have
not yet been verified on the boards themselves.&lt;/p&gt;

&lt;/div&gt;
</description></item><item><title>Week 32: a subway that ate its passengers, and a project I talked myself out of</title><link>https://blog.toothywalrus.dev/logbook/2026-w32/</link><pubDate>Thu, 06 Aug 2026 00:00:00 +0000</pubDate><guid>https://blog.toothywalrus.dev/logbook/2026-w32/</guid><category>weeknotes</category><description>&lt;p&gt;Short week — Monday to Thursday, because this is the first one of these and I
wanted to see what it looked like before the week was over. Eleven repos
touched. The two things worth reading about are both failures.&lt;/p&gt;
&lt;p&gt;This is the index: a paragraph per project, and a link where there&amp;rsquo;s more.&lt;/p&gt;
&lt;h2 id="the-metro-opened-trapped-everyone-reopened"&gt;The metro opened, trapped everyone, reopened&lt;/h2&gt;
&lt;p&gt;The Minecraft server got a subway — server-side on Paper minecarts, so nobody
has to install anything to ride it. I picked a plugin, built Line 1 as a test,
got it rendering on the web map, then walked into a station and could not get
out. The walls a station generates are perfectly sensible for something
arriving on rails and a sealed box for something arriving on foot.&lt;/p&gt;
&lt;p&gt;Fixed, and written down as a lesson with teeth: if I generate geometry from
config again, a human may approach it from an angle the config never
considered.&lt;/p&gt;
&lt;p&gt;→ &lt;a href="https://blog.toothywalrus.dev/logbook/2026-w32-mc-server/"&gt;mc-server, week 32&lt;/a&gt; — the
plugin choice, the web-map caveat, and a bake-off with no verdict yet.&lt;/p&gt;
&lt;h2 id="stockflow-scoped-down-to-almost-nothing"&gt;StockFlow, scoped down to almost nothing&lt;/h2&gt;
&lt;p&gt;New repo on Monday. By Thursday I&amp;rsquo;d written the case against most of it.&lt;/p&gt;
&lt;p&gt;There is no contributor earnings API — not rate-limited, not partner-gated,
absent. The numbers I wanted to analyse are visible to a human in a dashboard
and nowhere else, and everything I&amp;rsquo;d sketched on top of that assumption goes
with it. Four days spent to avoid four weeks, which is the right trade and
still doesn&amp;rsquo;t feel like a win.&lt;/p&gt;
&lt;p&gt;→ &lt;a href="https://blog.toothywalrus.dev/logbook/2026-w32-stockflow/"&gt;stockflow, week 32&lt;/a&gt; — what
survives, and what I actually checked before concluding that.&lt;/p&gt;
&lt;h2 id="the-traffic-light-is-real"&gt;The traffic light is real&lt;/h2&gt;
&lt;p&gt;The kids&amp;rsquo; electronics track has its first finished project on actual hardware.
Three LEDs, then five interchangeable programs on the same circuit so the
wiring gets built once and the payoff repeats. One is a seven-pattern light
show. One is deliberately calm — a single slow drift, nothing to react to —
and it&amp;rsquo;s the one I keep running.&lt;/p&gt;
&lt;p&gt;→ &lt;a href="https://blog.toothywalrus.dev/logbook/2026-w32-arduino/"&gt;arduino, week 32&lt;/a&gt; — the
toolchain decision, and why the tutorials are generated rather than written
twice.&lt;/p&gt;
&lt;h2 id="four-lines-that-changed-how-a-game-feels"&gt;Four lines that changed how a game feels&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;metamorph-ball&lt;/code&gt; gained a jelly form that squeezes through a grate,
squash-and-stretch and spark bursts fired on the same cues as its audio, and
synthesised sound instead of samples. None of that is the change that
mattered. The camera now follows the ball instead of waiting to be dragged,
and before that, playing it felt like operating a diagram.&lt;/p&gt;
&lt;p&gt;→ &lt;a href="https://blog.toothywalrus.dev/logbook/2026-w32-game-lab/"&gt;game-lab, week 32&lt;/a&gt; — the
route, the forms, and a deploy key that can only write to one directory.&lt;/p&gt;
&lt;h2 id="the-homelab-grew-a-control-plane"&gt;The homelab grew a control plane&lt;/h2&gt;
&lt;p&gt;Host provisioning is Ansible now and has actually been applied, not just
written — a distinction that matters, because half-finished
infrastructure-as-code is worse than none. It tells you the machine is in a
state it isn&amp;rsquo;t. Monitoring went up, bound to the private network only, and the
fleet configuration moved out into its own repo.&lt;/p&gt;
&lt;p&gt;→ &lt;a href="https://blog.toothywalrus.dev/logbook/2026-w32-homelab/"&gt;homelab, week 32&lt;/a&gt; — including
two things learned about drives that I&amp;rsquo;d have preferred to learn earlier.&lt;/p&gt;
&lt;h2 id="a-baseline-taken-before-the-antenna"&gt;A baseline taken before the antenna&lt;/h2&gt;
&lt;p&gt;The SDR receiver got characterised with nothing connected to it. That sounds
like a non-experiment and it&amp;rsquo;s the opposite — once an antenna is attached,
every number is the radio &lt;em&gt;and&lt;/em&gt; the antenna &lt;em&gt;and&lt;/em&gt; the room, with no way to
separate them afterwards.&lt;/p&gt;
&lt;p&gt;→ &lt;a href="https://blog.toothywalrus.dev/logbook/2026-w32-sdr/"&gt;sdr, week 32&lt;/a&gt; — and the full
write-up is going to be this blog&amp;rsquo;s first proper article.&lt;/p&gt;
&lt;h2 id="everything-else-briefly"&gt;Everything else, briefly&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ToothyGram&lt;/strong&gt; stopped presenting itself as an official Telegram product,
which it never should have. Otherwise: adopted a new upstream base, mapped
where a fork can attach to it, and proved the cheapest attachment point costs
exactly one modified upstream file. There&amp;rsquo;s a divergence log now, and a sync
runbook, because the alternative is rediscovering all of it in six months.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The money project&lt;/strong&gt; landed three long-lived branches — candle storage, chart
event overlays, an ops detail popup. → &lt;a href="https://blog.toothywalrus.dev/logbook/2026-w32-moneybtn2/"&gt;moneybtn2, week
32&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two repos were born&lt;/strong&gt;: this blog, and the content-studio one that is
deliberately not this blog. Both are still a README and an argument. The
conventions repo gained one rule, which is that a repo must have a description
at creation time — because nothing populates that field automatically and you
notice eleven blank ones at once, months later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nothing happened on the academy project.&lt;/strong&gt; One commit, recording a test
result on the Mac and listing the iPad checks still to run. It&amp;rsquo;s on the list
and it didn&amp;rsquo;t get attention, because the metro and the traffic light did.&lt;/p&gt;
&lt;h2 id="the-bit-that-made-me-laugh"&gt;The bit that made me laugh&lt;/h2&gt;
&lt;p&gt;Two branches on the money project both created decision record &lt;code&gt;0089&lt;/code&gt;.
Renumbering to &lt;code&gt;0107&lt;/code&gt; and &lt;code&gt;0108&lt;/code&gt; fixed it — except &lt;code&gt;0089&lt;/code&gt; had &lt;em&gt;also&lt;/em&gt; been
claimed on &lt;code&gt;main&lt;/code&gt; in the meantime, so the survivor became &lt;code&gt;0109&lt;/code&gt;, followed by
a commit to index it and fix a stale reference that had survived the first two
renames.&lt;/p&gt;
&lt;p&gt;Three commits of bookkeeping to land one document about something else
entirely. Sequentially-numbered append-only records are a good convention right
up to the point where you have parallel branches, and I don&amp;rsquo;t have a fix beyond
noticing early.&lt;/p&gt;
&lt;div class="provenance"&gt;
 &lt;h2&gt;Where this came from&lt;/h2&gt;
 &lt;p&gt;Assembled from work between Monday 3 and Thursday 6 August 2026: roughly 90
commits across eleven repositories, plus the decision records written in that
window. The repositories are private, so there is nothing to link to here —
what&amp;rsquo;s above summarises things that are recorded, not recollected.&lt;/p&gt;
&lt;p&gt;Load-bearing sources: &lt;code&gt;mc-server&lt;/code&gt; 0015–0017 and its walkable-tunnel and
web-map notes; &lt;code&gt;stockflow&lt;/code&gt;&amp;rsquo;s build-vs-buy case and platform data-access
research; &lt;code&gt;arduino&lt;/code&gt;&amp;rsquo;s toolchain decision and tutorial 02; &lt;code&gt;game-lab&lt;/code&gt;&amp;rsquo;s
&lt;code&gt;metamorph-ball&lt;/code&gt; iteration C; &lt;code&gt;homelab-infra&lt;/code&gt; 0015–0018; &lt;code&gt;moneybtn2&lt;/code&gt; 0107–0109.&lt;/p&gt;
&lt;p&gt;Nothing above describes something that wasn&amp;rsquo;t actually run or committed. The
TrainCarts bake-off has no result yet and is reported as unfinished; the
satellite and drone SDR work is a plan, not a result.&lt;/p&gt;

&lt;/div&gt;
</description></item></channel></rss>