<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Raspberry Pi &#8211; About Things | A Hans Scharler Blog</title>
	<atom:link href="https://nothans.com/tag/raspberry-pi/feed" rel="self" type="application/rss+xml" />
	<link>https://nothans.com</link>
	<description>Life, Comedy, Games, Tech, Marketing, and Community</description>
	<lastBuildDate>Sat, 29 Aug 2026 15:56:59 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://i0.wp.com/nothans.com/wp-content/uploads/2023/02/cropped-settings.png?fit=32%2C32&#038;ssl=1</url>
	<title>Raspberry Pi &#8211; About Things | A Hans Scharler Blog</title>
	<link>https://nothans.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">114568856</site>	<item>
		<title>CABLE 82 TV Channel Build Tutorial (Rasbperry Pi 3 B+ and Old CRT TV)</title>
		<link>https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv</link>
					<comments>https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Mon, 24 Aug 2026 19:40:30 +0000</pubDate>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[CABLE 82]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5604</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>Last month I published&nbsp;<a href="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel">CABLE 82</a>, a recreation of the 1982 cable community bulletin board channel that runs on a Raspberry Pi and an old CRT. That post covered the software and the shape of the hardware. Then a reader with a Pi 3 B+ hit &#8220;localhost refused to connect,&#8221; we went back and forth in the comments, and I realized I had never written down the whole build. I will take you from a blank SD card to a glowing tube.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" fetchpriority="high" decoding="async" width="750" height="600" data-attachment-id="5682" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/image-148" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?fit=2000%2C1600&amp;ssl=1" data-orig-size="2000,1600" data-comments-opened="0" data-image-title="CABLE 82 Dialed In on a Magnavox TV from 1987" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?fit=750%2C600&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=750%2C600&#038;ssl=1" alt="" class="wp-image-5682" style="width:540px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=1024%2C819&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=300%2C240&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=768%2C614&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=1536%2C1229&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=750%2C600&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=1320%2C1056&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?resize=80%2C64&amp;ssl=1 80w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/image-2.png?w=2000&amp;ssl=1 2000w" sizes="(max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">CABLE 82 Dialed In on a Magnavox TV from 1987</figcaption></figure>
</div>


<p>The TV is a Magnavox portable from Facebook Marketplace, a Perfect View from August 1987, the kind with a handle on top, a rod antenna, and a 12V jack so you could watch it in the car.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" decoding="async" width="395" height="431" data-attachment-id="5658" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/magnavox-marketplace-listing-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?fit=395%2C431&amp;ssl=1" data-orig-size="395,431" data-comments-opened="0" data-image-title="Magnavox marketplace listing" data-image-description="" data-image-caption="&lt;p&gt;The Marketplace listing: a black Magnavox portable CRT showing static&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?fit=395%2C431&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?resize=395%2C431&#038;ssl=1" alt="The Marketplace listing: a black Magnavox portable CRT showing static" class="wp-image-5658" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?w=395&amp;ssl=1 395w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/00-magnavox-marketplace-listing-1.jpg?resize=275%2C300&amp;ssl=1 275w" sizes="(max-width: 395px) 100vw, 395px" /></figure>
</div>


<p>The Pi is a 3 Model B+, the same board the reader had.</p>


<h2 class="wp-block-heading" id="the-false-start-the-original-2012-pi">The false start: the original 2012 Pi</h2>

<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" decoding="async" width="697" height="544" data-attachment-id="5672" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/pi-model-b-and-debian6-sd-card-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?fit=697%2C544&amp;ssl=1" data-orig-size="697,544" data-comments-opened="0" data-image-title="Pi model b and debian6 sd card" data-image-description="" data-image-caption="&lt;p&gt;The original Raspberry Pi Model B from 2012 with the element14 &amp;#8220;Debian 6 for Linux&amp;#8221; SD card it shipped with&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?fit=697%2C544&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?resize=697%2C544&#038;ssl=1" alt="The original Raspberry Pi Model B from 2012 with the element14 &quot;Debian 6 for Linux&quot; SD card it shipped with" class="wp-image-5672" style="width:523px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?w=697&amp;ssl=1 697w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/01-pi-model-b-and-debian6-sd-card-1.jpg?resize=300%2C234&amp;ssl=1 300w" sizes="(max-width: 697px) 100vw, 697px" /></figure>
</div>


<p>My first instinct was to do this on the least capable Pi in the house: the original Model B, board marked &#8220;(c)2011.12&#8221;, with the 4GB &#8220;Debian 6 for Linux&#8221; card it came with. Raspberry Pi OS still supports it, which is remarkable for a 2012 computer, and Node.js 20 installs from&nbsp;<code>apt</code>. The server half of CABLE 82 would run fine.</p>



<p>The TV half would not. The original Pi&#8217;s chip is ARMv6, and no current browser runs on it. Raspberry Pi dropped Chromium for ARMv6 in 2023; on the current OS it prints &#8220;This hardware doesn&#8217;t support NEON SIMD extensions&#8221; and quits. Firefox is built for ARMv7 and dies the same way. The one engine left is WebKit, with no JavaScript JIT, on a 700MHz core. I looked at that path for a while&#8230; and decided the tutorial should be about the channel, not about heroics.</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="728" height="509" data-attachment-id="5657" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/pi-3b-plus-and-16gb-microsd-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?fit=728%2C509&amp;ssl=1" data-orig-size="728,509" data-comments-opened="0" data-image-title="Pi 3b plus and 16gb microsd" data-image-description="" data-image-caption="&lt;p&gt;The Raspberry Pi 3 Model B+ in its clear case, heatsinks on, with the 16GB microSD card that is about to become a TV channel&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?fit=728%2C509&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?resize=728%2C509&#038;ssl=1" alt="The Raspberry Pi 3 Model B+ in its clear case, heatsinks on, with the 16GB microSD card that is about to become a TV channel" class="wp-image-5657" style="width:484px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?w=728&amp;ssl=1 728w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/02-pi-3b-plus-and-16gb-microsd-1.jpg?resize=300%2C210&amp;ssl=1 300w" sizes="auto, (max-width: 728px) 100vw, 728px" /></figure>
</div>

<h2 class="wp-block-heading" id="what-you-need">What you need</h2>


<ul class="wp-block-list">
<li>Raspberry Pi 3 Model B+&nbsp;(or any Pi 2 or newer; a Pi 4 is a fine choice too).</li>



<li>16GB or larger microSD card.&nbsp;Mine is a SanDisk Ultra PLUS 16GB.</li>



<li>Micro-USB power supply, 5V at 2.5A. The 3 B+ is the last micro-USB Pi.</li>



<li>A network connection<strong>.</strong>&nbsp;Ethernet is simplest for the first boot; the 3 B+ also has Wi-Fi.</li>



<li>4:3 CRT with a coax antenna input.&nbsp;Almost every tube TV has one, which is why this is the path that works for everybody. Mine has nothing else: one F connector marked EXT ANT and a switch to pick it over the built-in rod antenna.</li>



<li><a href="https://www.amazon.com/dp/B0DRCZKLBQ?tag=nothans">HDMI-to-RF modulator</a>, the little box that turns HDMI into channel 3 or 4 on the antenna input, plus a short coax cable. Mine is an &#8220;HDM61&#8221; unit; the same design is sold under a dozen brand names.</li>



<li>Another computer to flash the card and to SSH into the Pi (needs to be on the same network as the Raspberry Pi).</li>
</ul>


<h2 class="wp-block-heading" id="step-1-put-the-os-on-the-card">Step 1: Put the OS on the card</h2>

<h3 class="wp-block-heading" id="which-image-and-why">Which image, and why</h3>


<p><strong>Raspberry Pi OS (64-bit), the desktop edition.</strong>&nbsp;It is the image Raspberry Pi&#8217;s own kiosk tutorial tells you to use, and there are two practical reasons to follow that advice on a 3 B+:</p>



<ol class="wp-block-list">
<li>Chromium is the browser that will show the channel, and the 64-bit build is the one that has been solid on Pi 3 boards (the 32-bit build had a will-not-start bug on the Pi 3 as recently as this summer).</li>



<li>Node.js 22 from NodeSource is 64-bit only now; their installer refuses 32-bit outright.</li>
</ol>



<p>The image is a 1.3GB download and takes about 6GB on the card, so 16GB leaves plenty of room.</p>


<h3 class="wp-block-heading" id="flash-it-with-raspberry-pi-imager">Flash it with Raspberry Pi Imager</h3>


<p>Raspberry Pi Imager is the right tool here, and not balenaEtcher or&nbsp;<code>dd</code>, because it can bake the hostname, your user, and SSH into the card before the Pi ever boots. That is what makes the headless setup work. Install it from&nbsp;<a href="https://www.raspberrypi.com/software/">raspberrypi.com/software</a>, put the card in your computer, and walk the steps down the left side.</p>



<p><strong>Device: Raspberry Pi 3.</strong>&nbsp;This filters the OS list to images that run on the 3 family (A+, B, B+, and Compute Module 3).</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5656" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-device-raspberry-pi-3-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager device raspberry pi 3" data-image-description="" data-image-caption="&lt;p&gt;Raspberry Pi Imager 2.0, Device step, with Raspberry Pi 3 selected&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?resize=682%2C482&#038;ssl=1" alt="Raspberry Pi Imager 2.0, Device step, with Raspberry Pi 3 selected" class="wp-image-5656" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/03-imager-device-raspberry-pi-3-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<p><strong>OS: Raspberry Pi OS (64-bit).</strong>&nbsp;The top entry, marked Recommended. Not the 32-bit one and not the &#8220;Legacy&#8221; one; Legacy is the older Bookworm release.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5659" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-os-raspberry-pi-os-64-bit-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager os raspberry pi os 64 bit" data-image-description="" data-image-caption="&lt;p&gt;Imager OS step: Raspberry Pi OS (64-bit), a port of Debian Trixie with the Raspberry Pi Desktop, released 2026-06-18&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager OS step: Raspberry Pi OS (64-bit), a port of Debian Trixie with the Raspberry Pi Desktop, released 2026-06-18" class="wp-image-5659" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/04-imager-os-raspberry-pi-os-64-bit-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<p><strong>Storage: the SD card.</strong>&nbsp;Imager hides your system drives by default, so the only thing in the list should be the card. Mine shows up as a 14.8GB &#8220;Generic MassStorageClass USB Device&#8221; because it is in a USB reader; a 16GB card really is about 14.8GB once you count the way computers count.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5662" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-storage-16gb-card-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager storage 16gb card" data-image-description="" data-image-caption="&lt;p&gt;Imager Storage step showing the 14.8GB USB card reader mounted as I:\&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager Storage step showing the 14.8GB USB card reader mounted as I:\" class="wp-image-5662" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/05-imager-storage-16gb-card-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<p><strong>Customisation.</strong>&nbsp;This is the part Etcher cannot do, and the reason the Pi will come up on the network with no screen attached.</p>



<ul class="wp-block-list">
<li><strong>Hostname:</strong>&nbsp;<code>cable82</code>. That gives you&nbsp;<code>cable82.local</code>&nbsp;later, so you never have to go looking for an IP address.</li>



<li><strong>Localisation:</strong>&nbsp;your time zone and keyboard layout. The clock on the channel runs off the Pi&#8217;s time zone, so get this right.</li>



<li><strong>User:</strong>&nbsp;a username and password you will remember. You will type them into SSH in a few minutes.</li>



<li><strong>Wi-Fi:</strong>&nbsp;your network name and password. I set it even though the Pi would be on Ethernet for the build; it means the finished TV can live anywhere in the house.</li>



<li><strong>Remote access:</strong>&nbsp;<strong>enable SSH</strong>, password authentication. I also left Raspberry Pi Connect on, which gives you a browser-based remote shell to the Pi from anywhere, handy for a TV that lives in a corner.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5660" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-hostname-cable82-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager hostname cable82" data-image-description="" data-image-caption="&lt;p&gt;Imager Customisation: hostname set to cable82&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager Customisation: hostname set to cable82" class="wp-image-5660" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/06-imager-hostname-cable82-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5663" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-ssh-enabled-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager ssh enabled" data-image-description="" data-image-caption="&lt;p&gt;Imager Customisation, Remote access: Enable SSH on, password authentication&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager Customisation, Remote access: Enable SSH on, password authentication" class="wp-image-5663" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/07-imager-ssh-enabled-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>


<p>Then&nbsp;<strong>Write</strong>. Imager asks once more whether it can erase the card, downloads the image, writes it, and verifies it. The write was the slow part: this card takes data at about 10MB/s, so the 6GB image plus verification took about fifteen minutes.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5661" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-writing-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager writing" data-image-description="" data-image-caption="&lt;p&gt;Imager, write in progress at 9MB/s&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager, write in progress at 9MB/s" class="wp-image-5661" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/08-imager-writing-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="682" height="482" data-attachment-id="5664" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/imager-write-complete-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?fit=682%2C482&amp;ssl=1" data-orig-size="682,482" data-comments-opened="0" data-image-title="Imager write complete" data-image-description="" data-image-caption="&lt;p&gt;Imager, write complete, with the list of customisations applied&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?fit=682%2C482&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?resize=682%2C482&#038;ssl=1" alt="Imager, write complete, with the list of customisations applied" class="wp-image-5664" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?w=682&amp;ssl=1 682w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/11-imager-write-complete-1.jpg?resize=300%2C212&amp;ssl=1 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div>

<h3 class="wp-block-heading" id="first-boot">First boot</h3>


<p>Imager ejects the card when it is done. Card into the Pi, Ethernet in, power in. The green light flickers for a while: the first boot resizes the filesystem to fill the card, generates SSH keys, and runs a one-time setup pass. Mine answered on the network in well under two minutes. Then from your computer:</p>



<pre class="wp-block-code"><code>ssh yourname@cable82.local</code></pre>



<p>(If&nbsp;<code>.local</code>&nbsp;does not resolve on your machine, your router&#8217;s device list will show a&nbsp;<code>cable82</code>&nbsp;with an IP address; SSH to that instead.)</p>



<p>Three things to check while you are in:</p>



<pre class="wp-block-code"><code>head -2 /etc/os-release
free -m
df -h /</code></pre>



<p>Mine came back Debian 13 (trixie), 905MB of memory with about 570MB available, and a 15GB root partition with 8.4GB free after the 6GB image. The Pi had been up eight minutes by the time I got around to asking. Then bring the image current:</p>



<pre class="wp-block-code"><code>sudo apt update &amp;&amp; sudo apt full-upgrade -y</code></pre>



<p>(<code>sudo</code>&nbsp;asks for your password; recent Raspberry Pi OS releases turned off passwordless sudo by default.)</p>



<p>The Pi is on the network, current, and answering SSH.</p>


<h2 class="wp-block-heading" id="step-2-nodejs">Step 2: Node.js</h2>


<p>CABLE 82 is a Node.js app with no dependencies, so Node is the only thing to install. It needs Node 18 or newer, and a fresh Raspberry Pi OS has none at all:</p>



<pre class="wp-block-code"><code>$ node -v
bash: node: command not found</code></pre>



<p>That line, by the way, is almost certainly what was behind the reader&#8217;s &#8220;localhost refused to connect.&#8221; No Node, no server, nothing listening, and the browser reports it as a refused connection.</p>



<p>Two ways to get Node on a 64-bit Pi. The quick one is the distro&#8217;s own package,&nbsp;<code>sudo apt install nodejs</code>, which gives you Node 20. I went with NodeSource for Node 22, the current long-term-support line, and it is two commands:</p>



<pre class="wp-block-code"><code>curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
node -v</code></pre>



<p>Mine printed&nbsp;<code>v22.23.2</code>. (NodeSource only builds for 64-bit now; if you flashed the 32-bit image, use the&nbsp;<code>apt</code>&nbsp;route.)</p>


<h2 class="wp-block-heading" id="step-3-cable-82-on-the-air">Step 3: CABLE 82 on the air</h2>


<p>With Node in place, the channel itself is next. Clone it and start it:</p>



<pre class="wp-block-code"><code>cd ~
git clone https://github.com/nothans/cable-82
cd cable-82
node server.js</code></pre>



<p>It prints every address it answers on:</p>



<pre class="wp-block-code"><code>CABLE 82 broadcasting
  http://localhost:1982   (a browser on this machine)
  http://192.168.68.93:1982   (a browser on another device on your network)
Control room: http://localhost:1982/config</code></pre>



<p>Read that second line carefully, because it is the other half of the reader&#8217;s problem.&nbsp;<code>localhost</code>&nbsp;means &#8220;this machine.&#8221; Typed into a browser on your laptop, it asks the laptop for a channel it does not have. The&nbsp;<code>192.168.x.x</code>&nbsp;address is the Pi as seen from everywhere else on your network, and that is the one to open from the laptop. I did, and the channel was there: blue screen, the clock, the crawl.</p>



<figure class="wp-block-image"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="563" data-attachment-id="5673" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/channel-from-laptop-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?fit=1024%2C768&amp;ssl=1" data-orig-size="1024,768" data-comments-opened="0" data-image-title="Channel from laptop" data-image-description="" data-image-caption="&lt;p&gt;The channel from a browser on the laptop: blue clock page, LATEST crawl&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?fit=750%2C563&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=750%2C563&#038;ssl=1" alt="The channel from a browser on the laptop: blue clock page, LATEST crawl" class="wp-image-5673" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=750%2C563&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/12-channel-from-laptop-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<p>The first run also writes a&nbsp;<code>config.json</code>&nbsp;next to the server, which is where everything you change in the control room ends up. Open&nbsp;<code>http://192.168.68.93:1982/config</code>&nbsp;from the laptop and make it yours: channel name, your messages, your feeds, your town for the weather. Save, and the channel picks it up within about twenty seconds.</p>



<figure class="wp-block-image"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="563" data-attachment-id="5674" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/control-room-from-laptop-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?fit=1024%2C768&amp;ssl=1" data-orig-size="1024,768" data-comments-opened="0" data-image-title="Control room from laptop" data-image-description="" data-image-caption="&lt;p&gt;The control room from the laptop: the whole channel in one screen&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?fit=750%2C563&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=750%2C563&#038;ssl=1" alt="The control room from the laptop: the whole channel in one screen" class="wp-image-5674" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=750%2C563&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/13-control-room-from-laptop-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>


<h3 class="wp-block-heading" id="make-it-a-service">Make it a service</h3>


<p>Ctrl-C the server and hand it to systemd so it runs at boot and restarts if it ever dies. Create&nbsp;<code>/etc/systemd/system/cable82.service</code>:</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=CABLE 82
After=network-online.target

&#91;Service]
ExecStart=/usr/bin/node /home/cable82/cable-82/server.js
Restart=always
User=cable82

&#91;Install]
WantedBy=multi-user.target</code></pre>



<p>Both&nbsp;<code>cable82</code>s are my username; use yours (<code>whoami</code>&nbsp;tells you, and&nbsp;<code>which node</code>&nbsp;confirms the path on the&nbsp;<code>ExecStart</code>&nbsp;line). Then:</p>



<pre class="wp-block-code"><code>sudo systemctl enable --now cable82
systemctl status cable82</code></pre>



<p><code>active (running)</code>&nbsp;with the broadcasting lines in its log, and&nbsp;<code>sudo journalctl -u cable82 -f</code>&nbsp;is where to look if anything is ever wrong. The server sits at about 46MB of memory.</p>


<h2 class="wp-block-heading" id="step-4-chromium-in-kiosk-mode">Step 4: Chromium in kiosk mode</h2>


<p>The desktop image already logs in automatically and starts a Wayland session (the compositor is called labwc; the old LXDE desktop from earlier Pi OS releases is gone). Chromium 151 is preinstalled. All we have to do is tell the session to open Chromium full screen on the channel at login.</p>



<p>The file for that is&nbsp;<code>~/.config/labwc/autostart</code>. Create it with these lines:</p>



<pre class="wp-block-code"><code># CABLE 82 kiosk: wait for the channel server, then put Chromium on it full screen.
until curl -s -o /dev/null http://localhost:1982; do sleep 1; done
/usr/bin/lwrespawn /usr/bin/chromium http://localhost:1982   --kiosk --noerrdialogs --disable-infobars --no-first-run --no-memcheck   --disable-lcd-text --autoplay-policy=no-user-gesture-required   --enable-features=OverlayScrollbar --password-store=basic --start-maximized &amp;</code></pre>



<p>A few of those deserve a word:</p>



<ul class="wp-block-list">
<li>The&nbsp;<code>until curl</code>&nbsp;loop waits for the server to answer before launching the browser. Without it, Chromium can win the race at boot and show &#8220;localhost refused to connect&#8221; on the TV, and nothing ever tells it to try again.</li>



<li><code>lwrespawn</code>&nbsp;is a Raspberry Pi helper that restarts a program if it dies, so a crash brings the channel back instead of leaving a blank desktop.</li>



<li><code>--no-memcheck</code>&nbsp;stops Chromium from popping a low-memory warning over the channel on a 1GB board.</li>



<li><code>--autoplay-policy=no-user-gesture-required</code>&nbsp;lets the background music start without anyone clicking.</li>



<li><code>--disable-lcd-text</code>&nbsp;turns off subpixel font smoothing so the chunky text stays crisp white instead of going pink at the edges.</li>



<li><code>--password-store=basic</code>&nbsp;keeps the desktop keyring from asking for a password at login.</li>
</ul>



<p>Then turn off screen blanking, or the TV goes dark after ten minutes:</p>



<pre class="wp-block-code"><code>sudo raspi-config nonint do_blanking 1</code></pre>



<p>(Or interactively:&nbsp;<code>sudo raspi-config</code>&nbsp;&gt; Display Options &gt; Screen Blanking &gt; No.)</p>



<p>If you are here from the original post: the&nbsp;<code>chromium-browser --kiosk</code>&nbsp;line and the&nbsp;<code>/etc/xdg/lxsession/LXDE-pi/autostart</code>&nbsp;file in that post were for the previous Pi OS release. On Trixie the binary is&nbsp;<code>chromium</code>&nbsp;and the file is the labwc one above.</p>



<p>Reboot. About a minute later Chromium was running full screen on the channel. I could tell from the laptop before the TV was even connected:</p>



<pre class="wp-block-code"><code>$ pgrep -a chromium | head -1
1407 /usr/lib/chromium/chromium ... --kiosk ... http://localhost:1982</code></pre>


<h3 class="wp-block-heading" id="check-the-power-supply-while-you-are-here">Check the power supply while you are here</h3>


<p>This section wasn&#8217;t what I expected. My first run was off a phone charger&#8230;</p>



<pre class="wp-block-code"><code>$ vcgencmd get_throttled
throttled=0xd0005
$ vcgencmd measure_clock arm
frequency(48)=600064000</code></pre>



<p>Any bit set in&nbsp;<code>get_throttled</code>&nbsp;is a complaint;&nbsp;<code>0x5</code>&nbsp;means under-voltage and throttling right now, and the clock line shows a 1.4GHz Pi running at 600MHz. It worked, in the sense that the channel was on, but at less than half speed. With a proper 5V 2.5A supply the under-voltage bits cleared and the clock came back up. If you only run one check from this whole post on an existing Pi, run that one.</p>



<p>(On a 3 B+ you may still see&nbsp;<code>0x80008</code>&nbsp;with a 1.2GHz clock: that is the board&#8217;s own soft temperature limit at 60C, normal with Chromium running, and nothing to do with power.)</p>


<h2 class="wp-block-heading" id="step-5-the-crt">Step 5: The CRT</h2>


<p><em>Note on photos of the TV&#8230; it turns out to be surprisingly hard to get a good photo of the screen. My phone didn&#8217;t capture it well. Also, the screen had a giant smudge backed into the acrylic covering the TV. I had to use Novus 2 polish to clean up the smudge and scratches. I assure you that it looks better in person&#8230;</em></p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="5671" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/first-picture-on-the-magnavox-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?fit=1928%2C2560&amp;ssl=1" data-orig-size="1928,2560" data-comments-opened="0" data-image-title="First picture on the magnavox" data-image-description="" data-image-caption="&lt;p&gt;The first picture: CABLE 82 on the Magnavox over channel 3, fuzzy, red page, no sound yet&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=750%2C996&#038;ssl=1" alt="The first picture: CABLE 82 on the Magnavox over channel 3, fuzzy, red page, no sound yet" class="wp-image-5671" style="width:316px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?w=1928&amp;ssl=1 1928w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=1157%2C1536&amp;ssl=1 1157w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=1542%2C2048&amp;ssl=1 1542w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=750%2C996&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/14-first-picture-on-the-magnavox-1-scaled.jpg?resize=1320%2C1753&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p>The Magnavox has exactly one way in: an F connector marked EXT ANT.</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="403" height="547" data-attachment-id="5665" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/magnavox-back-panel-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?fit=403%2C547&amp;ssl=1" data-orig-size="403,547" data-comments-opened="0" data-image-title="Magnavox back panel" data-image-description="" data-image-caption="&lt;p&gt;The back of the Magnavox: one EXT ANT jack and a switch to choose it over the rod antenna&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?fit=403%2C547&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?resize=403%2C547&#038;ssl=1" alt="The back of the Magnavox: one EXT ANT jack and a switch to choose it over the rod antenna" class="wp-image-5665" style="width:293px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?w=403&amp;ssl=1 403w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/09-magnavox-back-panel-1.jpg?resize=221%2C300&amp;ssl=1 221w" sizes="auto, (max-width: 403px) 100vw, 403px" /></figure>
</div>


<p>So the path is HDMI out of the Pi into a small&nbsp;<a href="https://www.amazon.com/dp/B0DRCZKLBQ?tag=nothans">HDMI-to-RF modulator</a>, coax from the modulator into the TV, and the TV tuned to channel 3. The box is the size of a cassette tape, takes USB power, has a CH3/CH4 switch, and its spec sheet says everything you need to know: NTSC out, 480p to 1080p in, sound on the 4.5MHz carrier (that means mono, the way 1982 did it).</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="730" data-attachment-id="5666" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/hdm61-modulator-specs-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?fit=1500%2C1459&amp;ssl=1" data-orig-size="1500,1459" data-comments-opened="0" data-image-title="Hdm61 modulator specs" data-image-description="" data-image-caption="&lt;p&gt;The modulator&amp;#8217;s spec table: NTSC, CH3/CH4, 480p-1080p in, sound system M = 4.5MHz&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?fit=750%2C729&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=750%2C730&#038;ssl=1" alt="The modulator's spec table: NTSC, CH3/CH4, 480p-1080p in, sound system M = 4.5MHz" class="wp-image-5666" style="aspect-ratio:1.0281124497991967;width:447px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?w=1500&amp;ssl=1 1500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=300%2C292&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=1024%2C996&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=768%2C747&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=750%2C730&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/10-hdm61-modulator-specs-1.jpg?resize=1320%2C1284&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="5670" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/modulator-and-tv-clock-page-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?fit=1928%2C2560&amp;ssl=1" data-orig-size="1928,2560" data-comments-opened="0" data-image-title="Modulator and tv clock page" data-image-description="" data-image-caption="&lt;p&gt;The HDMI-to-RF modulator and the TV, clock page on screen&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=750%2C996&#038;ssl=1" alt="The HDMI-to-RF modulator and the TV, clock page on screen" class="wp-image-5670" style="width:408px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?w=1928&amp;ssl=1 1928w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=1157%2C1536&amp;ssl=1 1157w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=1542%2C2048&amp;ssl=1 1542w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=750%2C996&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/15-modulator-and-tv-clock-page-1-scaled.jpg?resize=1320%2C1753&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p>Plug it all in and the channel was on the tube.</p>


<h3 class="wp-block-heading" id="send-it-a-43-picture">Send it a 4:3 picture</h3>


<p>The box scales whatever it gets to fill the 4:3 tube. CABLE 82 draws a 4:3 stage, so if the Pi sends a widescreen mode, the stage gets squashed. The Pi has to output 640&#215;480. On current Raspberry Pi OS the old&nbsp;<code>hdmi_group</code>&nbsp;and&nbsp;<code>hdmi_mode</code>&nbsp;lines in&nbsp;<code>config.txt</code>&nbsp;are dead; the kernel takes its orders from&nbsp;<code>cmdline.txt</code>, and the desktop then picks its own mode on top of that. So it takes two small files.</p>



<p>Append to the end of the single long line in&nbsp;<code>/boot/firmware/cmdline.txt</code>:</p>



<pre class="wp-block-code"><code>video=HDMI-A-1:640x480@60D vc4.force_hotplug=1</code></pre>



<p>The&nbsp;<code>D</code>&nbsp;forces the output on even when nothing answers, and&nbsp;<code>force_hotplug</code>&nbsp;keeps it on if the modulator never raises the hotplug pin (mine does not). Then pin the desktop to the same mode in&nbsp;<code>~/.config/kanshi/config</code>:</p>



<pre class="wp-block-code"><code>profile crt {
  output HDMI-A-1 mode 640x480 position 0,0
}</code></pre>



<p>Without that second file, the desktop on my Pi happily chose 1024&#215;768 on top of the kernel&#8217;s 640&#215;480.</p>


<h3 class="wp-block-heading" id="give-it-an-edid-so-there-is-sound">Give it an EDID, so there is sound</h3>


<p>The first picture had no audio, and the reason is a good one: cheap modulators send no EDID, the little data block a screen uses to introduce itself. No EDID means the Pi does not know the &#8220;screen&#8221; can hear, and it refuses to send HDMI audio at all. So I made it one. The CABLE 82 <a href="https://github.com/nothans/cable-82">repo</a> now ships a 256-byte EDID that describes a 640&#215;480 4:3 screen with stereo audio (<code>edid/cable82-640x480-audio.bin</code>, with the script that generates it). Hand it to the kernel:</p>



<pre class="wp-block-code"><code>sudo mkdir -p /lib/firmware/edid
sudo cp ~/cable-82/edid/cable82-640x480-audio.bin /lib/firmware/edid/cable82.bin</code></pre>



<p>and add one more parameter to that same&nbsp;<code>cmdline.txt</code>&nbsp;line:</p>



<pre class="wp-block-code"><code>drm.edid_firmware=HDMI-A-1:edid/cable82.bin</code></pre>



<p>Reboot.&nbsp;<code>wpctl status</code>&nbsp;now lists an HDMI sink next to the headphone jack; make it the default and give it some level (WirePlumber remembers):</p>



<pre class="wp-block-code"><code>wpctl status                       # find the "(HDMI)" sink's number
wpctl set-default &lt;number&gt;
wpctl set-volume &lt;number&gt; 0.8</code></pre>



<p>The channel&#8217;s music came out of the Magnavox&#8217;s speaker on the next page turn.</p>


<h3 class="wp-block-heading" id="hide-the-cursor">Hide the cursor</h3>


<p>A mouse pointer sat in the middle of the picture with no mouse attached. The HDMI CEC input counts as a pointer device, so the desktop draws one. The fix is a labwc keybinding that hides it, pressed automatically after boot. Copy&nbsp;<code>/etc/xdg/labwc/rc.xml</code>&nbsp;to&nbsp;<code>~/.config/labwc/rc.xml</code>, add inside&nbsp;<code>&lt;keyboard&gt;</code>:</p>



<pre class="wp-block-code"><code>&lt;keybind key="A-W-h"&gt;&lt;action name="HideCursor"/&gt;&lt;/keybind&gt;</code></pre>



<p>then&nbsp;<code>sudo apt install wtype</code>&nbsp;and add to the end of&nbsp;<code>~/.config/labwc/autostart</code>:</p>



<pre class="wp-block-code"><code>(sleep 10; wtype -M alt -M logo -P h -p h -m logo -m alt) &amp;</code></pre>


<h3 class="wp-block-heading" id="the-detour-composite">The detour: composite</h3>


<p>Before the HDMI modulator arrived I tried the other way in: the Pi&#8217;s 3.5mm AV jack, a 4-pole cable to yellow/red/white, and an old composite-to-RF adapter. On a Pi 3 that means&nbsp;<code>sudo raspi-config nonint do_composite 0</code>, which turns HDMI off; on every Pi before the 5 it is one or the other. The Wayland desktop also does not trust the composite connector until it is told the mode, so&nbsp;<code>video=Composite-1:720x480@60ie,tv_mode=NTSC</code>&nbsp;goes on the&nbsp;<code>cmdline.txt</code>&nbsp;line too.</p>


<h2 class="wp-block-heading" id="step-6-make-it-readable">Step 6: Make it readable</h2>

<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="5676" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/did-you-know-page-best-legibility-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?fit=1928%2C2560&amp;ssl=1" data-orig-size="1928,2560" data-comments-opened="0" data-image-title="Did you know page best legibility" data-image-description="" data-image-caption="&lt;p&gt;The DID YOU KNOW page, the most legible of the bunch before CRT mode&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=750%2C996&#038;ssl=1" alt="The DID YOU KNOW page, the most legible of the bunch before CRT mode" class="wp-image-5676" style="width:453px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?w=1928&amp;ssl=1 1928w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=1157%2C1536&amp;ssl=1 1157w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=1542%2C2048&amp;ssl=1 1542w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=750%2C996&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/16-did-you-know-page-best-legibility-1-scaled.jpg?resize=1320%2C1753&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p>With everything working, the verdict on a 9-inch 1987 tube over RF: the big clock and the crawl read fine, the small text was marginal, and the red and blue pages were worse than the cyan one. That is NTSC. It smears saturated color, it clips pure white (broadcast engineers kept white at 90% for a reason), and the hard drop shadow under every character turned into ringing.</p>



<p>So I added a CRT set of settings in the control room for much older TVs&#8230;</p>



<figure class="wp-block-image"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="320" data-attachment-id="5669" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/control-room-crt-panel-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?fit=813%2C347&amp;ssl=1" data-orig-size="813,347" data-comments-opened="0" data-image-title="Control room crt panel" data-image-description="" data-image-caption="&lt;p&gt;The CRT panel: CRT mode, text size, and the overscan margin&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?fit=750%2C320&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?resize=750%2C320&#038;ssl=1" alt="The CRT panel: CRT mode, text size, and the overscan margin" class="wp-image-5669" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?w=813&amp;ssl=1 813w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?resize=300%2C128&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?resize=768%2C328&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/20-control-room-crt-panel-1.jpg?resize=750%2C320&amp;ssl=1 750w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<ul class="wp-block-list">
<li><strong>CRT mode</strong>&nbsp;swaps in a softer palette (less saturated backgrounds, 90% white) and drops the drop shadow.</li>



<li><strong>Text size</strong>&nbsp;enlarges the body text, kicker, crawl, and the small header lines, from 1 to 1.5x. I run 1.25 on this set; the big clock stays as it is.</li>



<li><strong>Overscan safe margin</strong>&nbsp;was already there; raise it if the TV crops the edges.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="640" height="480" data-attachment-id="5668" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/crt-mode-640x480-from-laptop-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?fit=640%2C480&amp;ssl=1" data-orig-size="640,480" data-comments-opened="0" data-image-title="Crt mode 640&amp;#215;480 from laptop" data-image-description="" data-image-caption="&lt;p&gt;CRT mode as the Pi renders it: softer blue, no shadow, text at 1.25x&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?fit=640%2C480&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?resize=640%2C480&#038;ssl=1" alt="CRT mode as the Pi renders it: softer blue, no shadow, text at 1.25x" class="wp-image-5668" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?w=640&amp;ssl=1 640w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/17-crt-mode-640x480-from-laptop-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
</div>


<p>Turning text size up found one more thing: at 640&#215;480 the weather card no longer fit and its HI/LO line slid under the crawl.</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="996" data-attachment-id="5675" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/weather-page-crt-mode-cut-off-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?fit=1928%2C2560&amp;ssl=1" data-orig-size="1928,2560" data-comments-opened="0" data-image-title="Weather page crt mode cut off" data-image-description="" data-image-caption="&lt;p&gt;The weather page with the bottom line cut off&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?fit=750%2C996&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=750%2C996&#038;ssl=1" alt="The weather page with the bottom line cut off" class="wp-image-5675" style="width:586px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?w=1928&amp;ssl=1 1928w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=226%2C300&amp;ssl=1 226w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=771%2C1024&amp;ssl=1 771w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=768%2C1020&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=1157%2C1536&amp;ssl=1 1157w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=1542%2C2048&amp;ssl=1 1542w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=750%2C996&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/18-weather-page-crt-mode-cut-off-1-scaled.jpg?resize=1320%2C1753&amp;ssl=1 1320w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p>So pages now fit themselves: if the content would overflow, the weather card gives up its sunrise/sunset line first, then shrinks just enough, and a long fact does the same.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="640" height="480" data-attachment-id="5650" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/weather-page-fit-640x480" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?fit=640%2C480&amp;ssl=1" data-orig-size="640,480" data-comments-opened="0" data-image-title="Weather page fit 640&amp;#215;480" data-image-description="" data-image-caption="&lt;p&gt;The weather page fitting the 640&amp;#215;480 frame after the fix&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?fit=640%2C480&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?resize=640%2C480&#038;ssl=1" alt="" class="wp-image-5650" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?w=640&amp;ssl=1 640w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/19-weather-page-fit-640x480-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 640px) 100vw, 640px" /><figcaption class="wp-element-caption">The weather page fitting the 640&#215;480 frame after the fix</figcaption></figure>
</div>


<p>All of that is in the repo as of this post.</p>


<h2 class="wp-block-heading" id="what-changed-because-of-this-build">What changed because of this build</h2>


<p>Three things fed straight back into the project:</p>



<ul class="wp-block-list">
<li>The&nbsp;<a href="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel">original post</a>&nbsp;now carries a dated update: the kiosk command is&nbsp;<code>chromium</code>&nbsp;in&nbsp;<code>~/.config/labwc/autostart</code>&nbsp;on current Raspberry Pi OS, and the power supply got the mention it earned.</li>



<li>The&nbsp;<a href="https://github.com/nothans/cable-82#running-it-on-a-real-crt-raspberry-pi">repo README</a>&nbsp;was rewritten from this build, step by step as tested, with a Troubleshooting section keyed to the exact errors from the comment thread.</li>



<li>CABLE 82 itself gained CRT mode, the text size setting, the fit-to-page behavior, and the shipped EDID, because a real 1987 tube demanded all four.</li>
</ul>



<p>That is the part I did not expect when a reader said &#8220;localhost refused to connect&#8221;: the failure report turned into the best test pass the project ever had!</p>


<h2 class="wp-block-heading" id="a-channel-of-your-own">A channel of your own</h2>

<div class="wp-block-image">
<figure class="aligncenter is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="565" data-attachment-id="5667" data-permalink="https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/the-whole-chain-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?fit=1255%2C945&amp;ssl=1" data-orig-size="1255,945" data-comments-opened="0" data-image-title="The whole chain" data-image-description="" data-image-caption="&lt;p&gt;The whole chain: Raspberry Pi 3 B+, RF modulator, coax, and the 1987 Magnavox on channel 3, on the air&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?fit=750%2C565&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=750%2C565&#038;ssl=1" alt="The whole chain: Raspberry Pi 3 B+, RF modulator, coax, and the 1987 Magnavox on channel 3, on the air" class="wp-image-5667" style="aspect-ratio:1.3280763643909526;width:484px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?w=1255&amp;ssl=1 1255w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=300%2C226&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=1024%2C771&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=768%2C578&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=750%2C565&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/08/23-the-whole-chain-1.jpg?resize=100%2C75&amp;ssl=1 100w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
</div>


<p>The Magnavox sits there now, tuned to channel 3, being a channel. The clock, the bake-sale energy, the crawl, the beautiful-music bed coming out of a mono speaker that was built when the music was new. It is a thirty-nine-year-old TV showing a channel that stopped existing before the TV was built, fed by a computer the size of a deck of cards, and the whole thing works because somebody left a comment saying it did not.</p>



<p>So: if you build one and it refuses to connect, say so. That is how this channel gets better, and it is very 1982 of you. Thanks.</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/cable-82-tv-channel-build-tutorial-rasbperry-pi-3-b-and-old-crt-tv/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5604</post-id>	</item>
		<item>
		<title>CABLE 82: Turn a Raspberry Pi and an Old CRT Into a 1982 Cable Bulletin Board Channel</title>
		<link>https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel</link>
					<comments>https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel#comments</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Thu, 23 Jul 2026 01:42:05 +0000</pubDate>
				<category><![CDATA[CheerLights]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[internet of things]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[retro]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5489</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>Before feeds, your town had a channel.</p>



<p>You might know the one if you watched MTV when it first came on cable. A flat blue screen, chunky white text, the time and the temperature in the corner. The Lions Club pancake breakfast. A birthday wish for someone named STEVE. Little League signups at the rec center. Headlines crawling along the bottom while a Muzak version of a song you almost recognized played underneath. I remember watching it for long stretches, waiting for the flea market notice to come back around. Our Sears CRT had the blue bars burnt in.</p>



<p>At some point, the Cable Bulletin Board Channel disappeared from all of our lives. NOBODY IS TALKING ABOUT IT.</p>



<p>Recently, I have been spending evenings learning about retro gaming and reading posts on Reddit saying that you have to game on a CRT for the proper gaming experience. This led me to Facebook Marketplace. After a few weeks of looking at photos of TVs this got me remembering the big honker in our living room&#8230; then, I uncovered a repressed memory. I had to have it back in my life.</p>


<h2 class="wp-block-heading" id="meet-cable-82">Meet CABLE 82</h2>


<p>CABLE 82 is a tiny web app that turns any screen into your own 1982 community bulletin board channel. Ideally that screen is an old 4:3 CRT fed by a Raspberry Pi, sitting in the corner of a room, being ambient.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://github.com/nothans/cable-82"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="600" data-attachment-id="5490" data-permalink="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel/hero" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?fit=2000%2C1600&amp;ssl=1" data-orig-size="2000,1600" data-comments-opened="0" data-image-title="CABLE 82: Turn a Raspberry Pi and an Old CRT Into a 1982 Cable Bulletin Board Channel" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?fit=750%2C600&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=750%2C600&#038;ssl=1" alt="CABLE 82: Turn a Raspberry Pi and an Old CRT Into a 1982 Cable Bulletin Board Channel" class="wp-image-5490" style="aspect-ratio:1.2504481250448125;width:545px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=1024%2C819&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=300%2C240&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=768%2C614&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=1536%2C1229&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=750%2C600&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=1320%2C1056&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?resize=80%2C64&amp;ssl=1 80w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/hero.jpg?w=2000&amp;ssl=1 2000w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a></figure>
</div>


<p>It scrolls the date and time, your community messages, fun facts, dad jokes, live weather, and headlines from whatever RSS feeds you point it at. There is a crawl along the bottom, a red LATEST flag, and a little station bug in the corner, because of course there is.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="750" height="422" src="https://www.youtube.com/embed/d5Jcfx5oN0A?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p>You make it yours in a control room in the browser, or by editing one plain config file. It is free and open source and it runs on a Raspberry Pi.</p>



<p>The rest of this post is how to get it going on a Raspberry Pi and a CRT.</p>


<h2 class="wp-block-heading" id="step-1-get-it-on-the-air">Step 1: Get it on the air</h2>


<p>SSH into the Pi, or just open a terminal on it, and run:</p>



<pre class="wp-block-code"><code>git clone https://github.com/nothans/cable-82
cd cable-82
node server.js</code></pre>



<p>Open&nbsp;<code>http://localhost:1982</code>&nbsp;in a browser on the Pi. You&#8217;re on the air.</p>



<p>Out of the box it already looks right: the blue screens, the clock, a couple of example bake-sale messages, and real headlines pulled from a few default feeds.</p>


<h2 class="wp-block-heading" id="step-2-make-it-your-channel">Step 2: Make it your channel</h2>


<p>Everything about the channel lives in one place. Open the control room at&nbsp;<code>http://localhost:1982/config</code>&nbsp;and you get the whole thing on one screen: the name, your community messages, which RSS feeds to pull, your town&#8217;s weather, the colors, the page lineup. Change something, hit Save, and the channel updates itself within about twenty seconds. Nobody has to touch the TV.</p>



<p>If you would rather edit a file, it all lives in&nbsp;<code>config.json</code>, and you can hand-edit that just as happily. Put your own town in the weather. Drop in the feeds you actually read. Write the messages your household needs to see, which in my house is mostly reminders that trash day is tomorrow.</p>


<h2 class="wp-block-heading" id="step-3-run-it-on-boot">Step 3: Run it on boot</h2>


<p>You do not want to SSH in and start a server every time the power blips. Make it a service so the Pi just comes up broadcasting.</p>



<p>Create&nbsp;<code>/etc/systemd/system/cable82.service</code>:</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=CABLE 82
After=network-online.target

&#91;Service]
ExecStart=/usr/bin/node /home/pi/cable-82/server.js
Restart=always
User=pi

&#91;Install]
WantedBy=multi-user.target</code></pre>



<p>Then turn it on:</p>



<pre class="wp-block-code"><code>sudo systemctl enable --now cable82</code></pre>



<p>Now the channel is always running in the background, whether anything is looking at it or not.</p>


<h2 class="wp-block-heading" id="step-4-point-a-browser-at-it-full-screen">Step 4: Point a browser at it, full screen</h2>


<p>Have the Pi launch Chromium in kiosk mode, pointed at the channel:</p>



<pre class="wp-block-code"><code>chromium-browser --kiosk --noerrdialogs --disable-infobars \
  --disable-lcd-text \
  --autoplay-policy=no-user-gesture-required \
  http:&#47;&#47;localhost:1982</code></pre>



<p>Two of those flags earn their keep.&nbsp;<code>--disable-lcd-text</code>&nbsp;turns off subpixel font smoothing, which otherwise tints the chunky white text a faint pink on some screens.&nbsp;<code>--autoplay-policy=no-user-gesture-required</code>&nbsp;lets the background music start on its own at boot, so nobody has to click anything to get the beautiful-music bed going.</p>



<p>While you are in there, turn off screen blanking so the picture never sleeps:&nbsp;<code>sudo raspi-config</code>&nbsp;&gt; Display Options &gt; Screen Blanking &gt; No.</p>


<h2 class="wp-block-heading" id="step-5-get-it-onto-a-real-crt">Step 5: Get it onto a real CRT</h2>


<p>The easiest and most reliable hookup works on any Pi and any TV with a coax (antenna) input. Run&nbsp;HDMI from the Pi into an&nbsp;<a href="https://amzn.to/4ftrKsq">HDMI-to-coax RF modulator</a>, then run coax from the modulator into the TV, and tune the TV to&nbsp;channel 3 or 4. Your Pi is now a broadcast channel and the TV is receiving it over the air the way God and 1982 intended.</p>



<p>If the TV crops the edges of the picture, bump up the overscan margin in the control room until nothing important gets cut off. There are no fake scanline filters in CABLE 82, on purpose. The CRT is the filter.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="691" height="553" data-attachment-id="5601" data-permalink="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel/image-147" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-35.png?fit=691%2C553&amp;ssl=1" data-orig-size="691,553" data-comments-opened="0" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-35.png?fit=691%2C553&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-35.png?resize=691%2C553&#038;ssl=1" alt="" class="wp-image-5601" style="width:269px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-35.png?w=691&amp;ssl=1 691w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-35.png?resize=300%2C240&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-35.png?resize=80%2C64&amp;ssl=1 80w" sizes="auto, (max-width: 691px) 100vw, 691px" /></figure>
</div>

<h2 class="wp-block-heading" id="step-6-give-it-a-soundtrack">Step 6: Give it a soundtrack</h2>


<p>Drop a few audio files into the&nbsp;<code>music/</code>&nbsp;folder and CABLE 82 plays them as a continuous background bed behind the pages, looping the set, shuffling if you like. Two tracks ship with it to get you started. Aim for the sound the old channels actually used: beautiful music, easy listening, and eventually the famous smooth jazz.</p>


<h2 class="wp-block-heading" id="a-channel-of-your-own">A channel of your own</h2>


<p>A Pi, an old TV, a coax cable, and a folder of files, and now there is a corner of your house that runs its own quiet little channel: your messages, your weather, your headlines, your dad jokes, scrolling by all day.</p>



<p>It&#8217;s not useful, exactly. It&#8217;s better than useful.</p>



<p>CABLE 82 is open source and lives at&nbsp;<a href="https://github.com/nothans/cable-82">github.com/nothans/cable-82</a>.</p>


<h2 class="wp-block-heading" id="project-demo-video">Project Demo Video</h2>


<p>Watch 6 minutes of glorious community news like it is 1982. Enjoy.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="750" height="422" src="https://www.youtube.com/embed/0YEvI_oFfqY?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>


<h2 class="wp-block-heading" id="update-july-27-2026-cheerlights-support">Update July 27, 2026: CheerLights Support</h2>


<p>I can&#8217;t believe that it took me a few days to do this&#8230; <a href="https://cheerlights.com/">CheerLights</a>. A perfect feed (for me) is to see the latest CheerLights color scroll by every once in a while. Okay, so now you can add CheerLights feed support with a custom message if needed.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><a href="https://github.com/nothans/cable-82"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="422" data-attachment-id="5531" data-permalink="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel/image-133" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?fit=1920%2C1080&amp;ssl=1" data-orig-size="1920,1080" data-comments-opened="0" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?fit=750%2C422&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=750%2C422&#038;ssl=1" alt="" class="wp-image-5531" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=1024%2C576&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=300%2C169&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=768%2C432&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=1536%2C864&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=750%2C422&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=480%2C270&amp;ssl=1 480w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?resize=1320%2C743&amp;ssl=1 1320w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-23.png?w=1920&amp;ssl=1 1920w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a><figcaption class="wp-element-caption">CheerLights is now on the CABLE 82 project</figcaption></figure>
</div>

<h2 class="wp-block-heading" id="update-august-22-2026-updated-github-readme-and-better-crt-support">Update August 22, 2026: Updated GitHub README and better CRT support</h2>


<p>Based on some user feedback, I built a version of the project on an older Raspberry Pi and used a much older CRT TV. This helped me find some areas for improvement.</p>



<p>I updated the kiosk command to use chromium (not chromium-browser), and it goes in ~/.config/labwc/autostart.</p>



<p>Old TVs do not have as much contrast as newer ones, so I added a CRT mode to help. This is in the &#8220;control room&#8221; or in the config.</p>



<p>And, a user reported &#8220;throttling&#8221; of the CPU. This happens when the Raspberry Pi is underpowered. This usually happens when you use a phone USB charger instead of a Raspberry Pi power supply.</p>



<p>From what I learned during the first month of the project, I added a <a href="https://github.com/nothans/cable-82#troubleshooting">troubleshooting</a> section to the GitHub README for the CABLE 82 project.</p>



<p>I will publish an end-to-end tutorial for a Raspberry Pi 3 B+ soon to help smooth out the installation steps.</p>



<p>Thanks for sharing your feedback and trying the project. It helps all of us.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="712" height="945" data-attachment-id="5596" data-permalink="https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel/image-146" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-34.png?fit=712%2C945&amp;ssl=1" data-orig-size="712,945" data-comments-opened="0" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-34.png?fit=712%2C945&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-34.png?resize=712%2C945&#038;ssl=1" alt="Cable-82 running a Raspberry Pi and a CRT TV from 1987" class="wp-image-5596" style="aspect-ratio:0.7534664689979943;width:270px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-34.png?w=712&amp;ssl=1 712w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/07/image-34.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 712px) 100vw, 712px" /><figcaption class="wp-element-caption">CABLE 82 server running on a Raspberry Pi and a CRT TV from 1987</figcaption></figure>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/cable-82-turn-a-raspberry-pi-and-an-old-crt-into-a-1982-cable-bulletin-board-channel/feed</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5489</post-id>	</item>
		<item>
		<title>AI Agents for Hardware Engineering</title>
		<link>https://nothans.com/ai-agents-for-hardware-engineering</link>
					<comments>https://nothans.com/ai-agents-for-hardware-engineering#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Fri, 22 May 2026 21:59:00 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Simulink]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=5431</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>There&#8217;s a belief going around that you can prompt your way to anything. Hand the AI a problem, walk away, come back to working code.</p>



<p>Fine for a side-project web app. Does not work for an inverted pendulum spinning on your desk.</p>


<h2 class="wp-block-heading" id="the-pit-and-the-pendulum">The Pit and the Pendulum</h2>


<p>MathWorks just published a <a href="https://www.youtube.com/watch?v=-G4H2DmhR28">Tech Talk by Brian Douglas</a>. It is worth watching if you build hardware.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="750" height="422" src="https://www.youtube.com/embed/-G4H2DmhR28?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p>The setup is a Quanser cube servo with an inverted pendulum, a Raspberry Pi running the controller, and a coding agent wired into Simulink through the <a href="https://github.com/matlab/simulink-agentic-toolkit">Simulink Agentic Toolkit</a>. The agent&#8217;s job is to swing the pendulum up and balance it.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="750" data-attachment-id="5433" data-permalink="https://nothans.com/ai-agents-for-hardware-engineering/image-107" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?fit=1024%2C1024&amp;ssl=1" data-orig-size="1024,1024" data-comments-opened="0" data-image-title="AI Agents for Hardware Engineering, Simulink Agentic Toolkit" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?fit=750%2C750&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=750%2C750&#038;ssl=1" alt="" class="wp-image-5433" style="width:559px;height:auto" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=768%2C768&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=530%2C530&amp;ssl=1 530w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=750%2C750&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2026/05/image-1.png?resize=500%2C500&amp;ssl=1 500w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption"><a href="https://github.com/matlab/simulink-agentic-toolkit">Simulink Agentic Toolkit</a></figcaption></figure>
</div>


<p>Balancing an inverted pendulum is a classic control problem because it&#8217;s unstable by nature. Get the math wrong and the pendulum falls. Get the code wrong and a 12V motor jerks the cube into something it shouldn&#8217;t.</p>


<h2 class="wp-block-heading" id="what-happens-if-you-just-prompt-it">What Happens If You Just Prompt It</h2>


<p>The tempting move is the one most of us have done with web apps. Open a chat, describe the system, ask for the code. One prompt, big blob, ship it.</p>



<p>The MathWorks engineers walk through why that falls apart for hardware:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8220;If you rely on AI to generate code directly, that process is much less structured&#8230; it&#8217;s often unclear exactly how or why a particular implementation was created, making it harder to trust and verify.&#8221;</p>



<p>Brian Douglas</p>
</blockquote>



<p>Hardware is unforgiving. You can&#8217;t roll back a destroyed motor with a git revert. When a physical system fails, you need to know which assumption broke, which equation got the wrong constant, which sample rate the controller is actually running at. A black box of generated C code doesn&#8217;t tell you any of that.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8220;You don&#8217;t want to let your AI agent skip parts of your engineering workflow. That&#8217;s how you can get yourself into trouble with a final product that doesn&#8217;t meet your objective or worse, is just purely unsafe.&#8221;</p>



<p>Brian Douglas</p>
</blockquote>


<h2 class="wp-block-heading" id="the-workflow-is-the-script">The Workflow Is the Script</h2>


<p>The answer is to keep the AI inside the workflow engineers already trust: Model-Based Design. The agent doesn&#8217;t replace the workflow. It runs each step inside it, faster.</p>



<p><strong>Define quantifiable requirements.</strong>&nbsp;Before any code, the human and the AI agree on what success looks like. Spin-up speed. Wobble limits. The 12V motor constraint. These targets become the benchmarks for verification later.</p>



<p><strong>Use a trusted model.</strong>&nbsp;Instead of letting the AI invent a custom physics engine, the workflow points it at an existing Simulink model. The agent runs linearization through the Simulink Agentic Toolkit and reports the system&#8217;s poles back to the human. The math comes from validated tools, not from a language model freestyling differential equations.</p>



<p><strong>Use a trusted controller.</strong>&nbsp;Same logic. The agent is told to use the MPC Toolbox. Model Predictive Control has decades of theory behind it and a deterministic implementation. If something looks wrong, you can tune it manually. You&#8217;re not debugging an optimizer the AI invented on the fly.</p>



<p><strong>Verify in layers.</strong>&nbsp;Three stages before the code touches hardware:</p>



<ul class="wp-block-list">
<li><strong>MIL</strong> (Model-in-the-Loop): the controller runs against the theoretical model</li>



<li><strong>SIL</strong> (Software-in-the-Loop): the generated embedded C code runs on a computer, behaving exactly like the simulation</li>



<li><strong>PIL</strong> (Processor-in-the-Loop): the C code runs on the actual target Raspberry Pi</li>
</ul>



<p>Each layer catches different bugs. Skip one and you&#8217;ll catch that bug on hardware instead.</p>



<p><strong>Deploy and iterate.</strong>&nbsp;Only after layered verification does the code go on the real pendulum.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8220;Instead of asking an agent to solve your problem however it wants, you tell it to follow an engineering workflow that you understand.&#8221;</p>



<p>Brian Douglas</p>
</blockquote>



<p>The AI executes. The human directs.</p>


<h2 class="wp-block-heading" id="the-hardware-truth">The Hardware Truth</h2>


<p>Here&#8217;s the part of the video I liked best. They ran the verified controller on the real pendulum and it didn&#8217;t quite work. The physical hardware behaved differently from the model.</p>



<p>This is what the vibe-coding fantasy ignores. Reality disagrees with simulation, especially the first time. You will need to iterate. The thing that matters is whether you can.</p>



<p>Because the team followed the workflow, they could. The model was traceable. The requirements were quantifiable. The controller was inspectable. They used the AI to update the physics model, ran it back through MIL, SIL, and PIL, and tried again. No starting over.</p>



<p>The workflow doesn&#8217;t promise perfect code on the first pass. It promises code you can fix.</p>


<h2 class="wp-block-heading" id="the-director-pattern">The Director Pattern</h2>


<p>A few months <a href="https://nothans.com/the-matlab-engineering-super-stack" data-type="link" data-id="https://nothans.com/the-matlab-engineering-super-stack">ago</a>, I wrote about Seth DeLand&#8217;s framing of agentic AI for engineers. The headline idea: you&#8217;re not being replaced, you&#8217;re being promoted. The engineer becomes the one who defines the problem, sets the constraints, and shapes the space where the AI works.</p>



<p>The MathWorks Tech Talk is what that looks like in hardware. The AI isn&#8217;t the engineer. It&#8217;s the agent. You&#8217;re the director.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8220;Agentic AI is powerful, but for engineering, the value comes from how you use it. You get the speed and productivity benefits of AI without sacrificing trust, safety, or understanding.&#8221;</p>



<p>Brian Douglas</p>
</blockquote>



<p>You don&#8217;t get speed and safety together by handing the AI a prompt and crossing your fingers. You get there by keeping the workflow you trust and letting the agent move faster inside it.</p>



<p>Speed without losing safety. Productivity without losing traceability.</p>



<p>For software, vibe coding is mostly fine. The blast radius is a wasted afternoon.</p>



<p>For hardware, the blast radius is a sparking motor and a pendulum on the floor.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/ai-agents-for-hardware-engineering/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5431</post-id>	</item>
		<item>
		<title>Give the Gift of CheerLights this Holiday Season</title>
		<link>https://nothans.com/give-the-gift-of-cheerlights-this-holiday-season</link>
					<comments>https://nothans.com/give-the-gift-of-cheerlights-this-holiday-season#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Tue, 29 Nov 2022 23:18:34 +0000</pubDate>
				<category><![CDATA[CheerLights]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[ThingSpeak]]></category>
		<category><![CDATA[cheerlights]]></category>
		<category><![CDATA[Christmas]]></category>
		<category><![CDATA[internet of things]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[MicroPython]]></category>
		<category><![CDATA[Pico W]]></category>
		<category><![CDATA[Pimoroni]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=3455</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>Tis&#8217; the season. <a rel="noreferrer noopener" href="https://cheerlights.com/" target="_blank">CheerLights</a> season! This might be my favorite time of year. I love seeing people build IoT projects, share their experiences, and control the lights around the world. I love checking the daily action in our community over at <a rel="noreferrer noopener" href="https://cheerlights.com/discord" target="_blank">Discord</a>.</p>



<p>Borrowing ideas from my <a href="https://nothans.com/lofi-girl-shadowbox" data-type="post" data-id="3436">Lofi Girl CheerLights Shadowbox</a> project, George and I made a CheerLights Gift for under our Christmas tree. This gift changes color based on the latest CheerLights color and anyone on Twitter or Discord can change its color and the color of all of the other CheerLights projects.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="702" height="933" data-attachment-id="3456" data-permalink="https://nothans.com/give-the-gift-of-cheerlights-this-holiday-season/image-6-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-6.png?fit=702%2C933&amp;ssl=1" data-orig-size="702,933" data-comments-opened="0" data-image-title="CheerLights Gift" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-6.png?fit=702%2C933&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-6.png?resize=702%2C933&#038;ssl=1" alt="" class="wp-image-3456" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-6.png?w=702&amp;ssl=1 702w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-6.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 702px) 100vw, 702px" /><figcaption class="wp-element-caption">CheerLights Gift Under the Tree</figcaption></figure>
</div>


<p>The CheerLights Gift project is based on the <a rel="noreferrer noopener" href="https://shop.pimoroni.com/products/plasma-stick-2040-w" target="_blank">Pimoroni Plasma Stick 2040 W</a> and NeoPixel string lights for illumination. The Plasma Stick ships with CheerLights code main MicroPython file, so all you have to do is change the Wi-Fi network name and password. The microcontroller makes a request to the <a rel="noreferrer noopener" href="https://cheerlights.com/learn/" target="_blank">ThingSpeak API</a> to get the latest CheerLights color, sets the color of the NeoPixel LED lights, waits 10 seconds, and repeats. This is about the fastest way to build your own CheerLights display.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="733" height="974" data-attachment-id="3462" data-permalink="https://nothans.com/give-the-gift-of-cheerlights-this-holiday-season/image-9" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-9.png?fit=733%2C974&amp;ssl=1" data-orig-size="733,974" data-comments-opened="0" data-image-title="image-9" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-9.png?fit=733%2C974&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-9.png?resize=733%2C974&#038;ssl=1" alt="" class="wp-image-3462" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-9.png?w=733&amp;ssl=1 733w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-9.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 733px) 100vw, 733px" /><figcaption class="wp-element-caption">Metal Giftbox with Pimoroni Plasma Stick 2040 W</figcaption></figure>
</div>


<p>I used a metal gift box that I found in a craft store to house the lights and controller. All we needed to do was stuff the LEDs inside and glue them in place. I only burned my fingers twice.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="702" height="933" data-attachment-id="3459" data-permalink="https://nothans.com/give-the-gift-of-cheerlights-this-holiday-season/image-8-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-8.png?fit=702%2C933&amp;ssl=1" data-orig-size="702,933" data-comments-opened="0" data-image-title="image-8" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-8.png?fit=702%2C933&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-8.png?resize=702%2C933&#038;ssl=1" alt="" class="wp-image-3459" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-8.png?w=702&amp;ssl=1 702w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-8.png?resize=226%2C300&amp;ssl=1 226w" sizes="auto, (max-width: 702px) 100vw, 702px" /><figcaption class="wp-element-caption">Hot gluing NeoPixel LEDs</figcaption></figure>
</div>


<p>The project turned out well and kept my five-year-old&#8217;s interest for the duration of the build. I was happy that the Plasma Stick 2040 W made it really easy to get the project going.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="705" data-attachment-id="3458" data-permalink="https://nothans.com/give-the-gift-of-cheerlights-this-holiday-season/image-7-2" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-7.png?fit=993%2C933&amp;ssl=1" data-orig-size="993,933" data-comments-opened="0" data-image-title="image-7" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-7.png?fit=750%2C705&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-7.png?resize=750%2C705&#038;ssl=1" alt="" class="wp-image-3458" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-7.png?w=993&amp;ssl=1 993w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-7.png?resize=300%2C282&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-7.png?resize=768%2C722&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-7.png?resize=750%2C705&amp;ssl=1 750w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">George Loves Cyan</figcaption></figure>
</div>


<p>Join the CheerLights IoT community at <a href="https://cheerlights.com/" target="_blank" rel="noreferrer noopener">CheerLights.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/give-the-gift-of-cheerlights-this-holiday-season/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3455</post-id>	</item>
		<item>
		<title>Internet-connected Lofi Girl Shadowbox</title>
		<link>https://nothans.com/lofi-girl-shadowbox</link>
					<comments>https://nothans.com/lofi-girl-shadowbox#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Wed, 16 Nov 2022 02:21:37 +0000</pubDate>
				<category><![CDATA[CheerLights]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[ThingSpeak]]></category>
		<category><![CDATA[cheerlights]]></category>
		<category><![CDATA[internet of things]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[Lo-Fi]]></category>
		<category><![CDATA[Lofi Girl]]></category>
		<category><![CDATA[MicroPython]]></category>
		<category><![CDATA[neopixel]]></category>
		<category><![CDATA[Pico W]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=3436</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p><a rel="noreferrer noopener" href="https://www.youtube.com/watch?v=jfKfPfyJRdk" target="_blank">Lofi Girl</a> got me through countless hours of programming and PowerPoint creating. Lofi Girl is a mix of low-fidelity music and 2D animation that streams on YouTube. It&#8217;s really popular. The chill aesthetic has made its way to merch like hoodies, plush toys, and posters. Since I have spent a lot of time vibing to the music and the video over the years, I wanted to build something to honor the special place Lo-Fi has in my heart and of course connect it to the internet. Behold&#8230; The LofiGirl Shadowbox with <a href="https://cheerlights.com" target="_blank" rel="noreferrer noopener">CheerLights</a>&#8230;</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="565" data-attachment-id="3439" data-permalink="https://nothans.com/lofi-girl-shadowbox/image-4-3" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-4.png?fit=1216%2C916&amp;ssl=1" data-orig-size="1216,916" data-comments-opened="0" data-image-title="Lofi Girl Shadowbox" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-4.png?fit=750%2C565&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-4.png?resize=750%2C565&#038;ssl=1" alt="" class="wp-image-3439" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-4.png?resize=1024%2C771&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-4.png?resize=300%2C226&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-4.png?resize=768%2C579&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-4.png?resize=750%2C565&amp;ssl=1 750w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-4.png?resize=500%2C375&amp;ssl=1 500w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-4.png?resize=100%2C75&amp;ssl=1 100w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-4.png?w=1216&amp;ssl=1 1216w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption class="wp-element-caption">Lofi Girl Shadowbox</figcaption></figure>



<p>The Lofi Girl Shadowbox is backlit with the latest color of <a href="https://cheerlights.com">CheerLights</a>. It&#8217;s always changing based on what people set the color to on <a rel="noreferrer noopener" href="https://twitter.com/cheerlights/status/1575133134340997122" target="_blank">Twitter</a> and <a rel="noreferrer noopener" href="https://cheerlights.com/discord" target="_blank">Discord</a>.</p>


<h2 class="wp-block-heading" id="parts">Parts</h2>


<ul class="wp-block-list">
<li><a href="https://lofigirlshop.com/collections/arts">Lofi Girl poster</a> &#8211; I am a 1 A.M person</li>



<li>Shadowbox</li>



<li><a href="https://amzn.to/3Alxtgl" target="_blank" rel="noreferrer noopener">Black foam board</a></li>



<li>Foam block</li>



<li><a rel="noreferrer noopener" href="https://shop.pimoroni.com/products/plasma-stick-2040-w" target="_blank">Pimoroni Plasma Stick 2040 W</a> (based on the Raspberry Pi Pico W)</li>



<li><a href="https://shop.pimoroni.com/products/wireless-plasma-kit" target="_blank" rel="noreferrer noopener">LED string lights</a></li>



<li>Micro USB cord and power supply</li>



<li>Other things: utility knife, straightedge, hot glue gun, and repositionable glue squares</li>
</ul>


<h2 class="wp-block-heading" id="assembly">Assembly</h2>


<p>The poster that I got from the Lofi Girl shop was 30cm x 45cm and on really thin paper. I used the repositionable glue squares to stick the poster on the black foam board. This gives the poster some structure. I cut a hole in the back of the shadowbox and feed the USB cable through. I cut out a rough shape of the <a rel="noreferrer noopener" href="https://shop.pimoroni.com/products/plasma-stick-2040-w" target="_blank">Pimoroni Plasma Stick 2040 W</a> and wrapped the string lights around the foam block.</p>



<div data-carousel-extra='{&quot;blog_id&quot;:1,&quot;permalink&quot;:&quot;https://nothans.com/lofi-girl-shadowbox&quot;}'  class="wp-block-jetpack-tiled-gallery aligncenter is-style-rectangular"><div class="tiled-gallery__gallery"><div class="tiled-gallery__row"><div class="tiled-gallery__col" style="flex-basis:25.55717%"><figure class="tiled-gallery__item"><img decoding="async" data-attachment-id="3440" data-permalink="https://nothans.com/lofi-girl-shadowbox/cutting-foam-board" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/cutting-foam-board.jpg?fit=719%2C739&amp;ssl=1" data-orig-size="719,739" data-comments-opened="0" data-image-title="cutting foam board" data-image-description="" data-image-caption="&lt;p&gt;Cutting black foam board&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/cutting-foam-board.jpg?fit=719%2C739&amp;ssl=1" role="button" tabindex="0" aria-label="Open image 1 of 4 in full-screen" srcset="https://i2.wp.com/nothans.com/wp-content/uploads/2022/11/cutting-foam-board.jpg?strip=info&#038;w=600&#038;ssl=1 600w,https://i2.wp.com/nothans.com/wp-content/uploads/2022/11/cutting-foam-board.jpg?strip=info&#038;w=719&#038;ssl=1 719w" alt="" data-height="739" data-id="3440" data-link="https://nothans.com/?attachment_id=3440" data-url="https://nothans.com/wp-content/uploads/2022/11/cutting-foam-board.jpg" data-width="719" src="https://i2.wp.com/nothans.com/wp-content/uploads/2022/11/cutting-foam-board.jpg?ssl=1" data-amp-layout="responsive"/></figure></div><div class="tiled-gallery__col" style="flex-basis:19.80807%"><figure class="tiled-gallery__item"><img decoding="async" data-attachment-id="3441" data-permalink="https://nothans.com/lofi-girl-shadowbox/foam-block" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/foam-block.jpg?fit=747%2C992&amp;ssl=1" data-orig-size="747,992" data-comments-opened="0" data-image-title="foam block" data-image-description="" data-image-caption="&lt;p&gt;Foam board sizing&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/foam-block.jpg?fit=747%2C992&amp;ssl=1" role="button" tabindex="0" aria-label="Open image 2 of 4 in full-screen" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/foam-block.jpg?strip=info&#038;w=600&#038;ssl=1 600w,https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/foam-block.jpg?strip=info&#038;w=747&#038;ssl=1 747w" alt="" data-height="992" data-id="3441" data-link="https://nothans.com/?attachment_id=3441" data-url="https://nothans.com/wp-content/uploads/2022/11/foam-block.jpg" data-width="747" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/foam-block.jpg?ssl=1" data-amp-layout="responsive"/></figure></div><div class="tiled-gallery__col" style="flex-basis:19.80807%"><figure class="tiled-gallery__item"><img decoding="async" data-attachment-id="3442" data-permalink="https://nothans.com/lofi-girl-shadowbox/foam-block-cutout" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/Foam-block-cutout.jpg?fit=747%2C992&amp;ssl=1" data-orig-size="747,992" data-comments-opened="0" data-image-title="Foam block cutout" data-image-description="" data-image-caption="&lt;p&gt;Cutting out spot for the Raspberry Pi Pico W&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/Foam-block-cutout.jpg?fit=747%2C992&amp;ssl=1" role="button" tabindex="0" aria-label="Open image 3 of 4 in full-screen" srcset="https://i2.wp.com/nothans.com/wp-content/uploads/2022/11/Foam-block-cutout.jpg?strip=info&#038;w=600&#038;ssl=1 600w,https://i2.wp.com/nothans.com/wp-content/uploads/2022/11/Foam-block-cutout.jpg?strip=info&#038;w=747&#038;ssl=1 747w" alt="" data-height="992" data-id="3442" data-link="https://nothans.com/?attachment_id=3442" data-url="https://nothans.com/wp-content/uploads/2022/11/Foam-block-cutout.jpg" data-width="747" src="https://i2.wp.com/nothans.com/wp-content/uploads/2022/11/Foam-block-cutout.jpg?ssl=1" data-amp-layout="responsive"/></figure></div><div class="tiled-gallery__col" style="flex-basis:34.82669%"><figure class="tiled-gallery__item"><img decoding="async" data-attachment-id="3443" data-permalink="https://nothans.com/lofi-girl-shadowbox/wrapped-led-lights" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/Wrapped-LED-lights.jpg?fit=1216%2C916&amp;ssl=1" data-orig-size="1216,916" data-comments-opened="0" data-image-title="Wrapped LED lights" data-image-description="" data-image-caption="&lt;p&gt;Wrapping LED lights around foam block&lt;/p&gt;
" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/Wrapped-LED-lights.jpg?fit=750%2C565&amp;ssl=1" role="button" tabindex="0" aria-label="Open image 4 of 4 in full-screen" srcset="https://i1.wp.com/nothans.com/wp-content/uploads/2022/11/Wrapped-LED-lights-1024x771.jpg?strip=info&#038;w=600&#038;ssl=1 600w,https://i1.wp.com/nothans.com/wp-content/uploads/2022/11/Wrapped-LED-lights-1024x771.jpg?strip=info&#038;w=900&#038;ssl=1 900w,https://i1.wp.com/nothans.com/wp-content/uploads/2022/11/Wrapped-LED-lights-1024x771.jpg?strip=info&#038;w=1024&#038;ssl=1 1024w" alt="" data-height="916" data-id="3443" data-link="https://nothans.com/?attachment_id=3443" data-url="https://nothans.com/wp-content/uploads/2022/11/Wrapped-LED-lights-1024x771.jpg" data-width="1216" src="https://i1.wp.com/nothans.com/wp-content/uploads/2022/11/Wrapped-LED-lights-1024x771.jpg?ssl=1" data-amp-layout="responsive"/></figure></div></div></div></div>


<h2 class="wp-block-heading" id="programming">Programming</h2>


<p>The best part of the whole project is that CheerLights is baked into the <a rel="noreferrer noopener" href="https://shop.pimoroni.com/products/plasma-stick-2040-w" target="_blank">Pimoroni Plasma Stick 2040 W</a>. All you need to do is program the device with your Wi-Fi settings. Open Thonny and open the WIFI_CONFIG.py file. Change SSID to your wireless network name, PSK to your password, and COUNTRY to your country code like US or GB. Click <em>Save</em>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="676" height="609" data-attachment-id="3437" data-permalink="https://nothans.com/lofi-girl-shadowbox/image-3-3" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-3.png?fit=676%2C609&amp;ssl=1" data-orig-size="676,609" data-comments-opened="0" data-image-title="image-3" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-3.png?fit=676%2C609&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-3.png?resize=676%2C609&#038;ssl=1" alt="" class="wp-image-3437" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-3.png?w=676&amp;ssl=1 676w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image-3.png?resize=300%2C270&amp;ssl=1 300w" sizes="auto, (max-width: 676px) 100vw, 676px" /><figcaption class="wp-element-caption">WIFI_CONFIG.py in Thonny</figcaption></figure>
</div>


<p>Pimoroni has an excellent <a rel="noreferrer noopener" href="https://learn.pimoroni.com/article/assembling-wireless-plasma-kit" target="_blank">tutorial </a>on getting Thonny installed and an explanation of the <a rel="noreferrer noopener" href="https://shop.pimoroni.com/products/plasma-stick-2040-w" target="_blank">Pimoroni Plasma Stick 2040 W</a> kit. I have also written a <a href="https://cheerlights.com/cheerlights-raspberry-pi-pico-w-micropython/" target="_blank" rel="noreferrer noopener">tutorial</a> on the CheerLights blog.</p>


<h2 class="wp-block-heading" id="chill">Chill</h2>


<p>Now that you&#8217;ve done all of the hard work, it&#8217;s time to <a href="https://cheerlights.com">chill</a> and enjoy the Lo-Fi vibes tuned to CheerLights. While I was making this project today, I had Lofi Girl on YouTube, and the lights were just bright enough to see what I was doing without cutting myself. I am looking for a wall to permanently install my Lofi Girl Shadowbox. I am seriously thinking of drilling a hole in the wall to hide the USB power adapter.</p>



<!-- iframe plugin v.6.0 wordpress.org/plugins/iframe/ -->
<iframe loading="lazy" src="https://player.twitch.tv/?channel=cheerlights&#038;parent=nothans.com" width="100%" height="500" frameborder="0" scrolling="no" allowfullscreen="allowfullscreen" class="iframe-class"></iframe>

]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/lofi-girl-shadowbox/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3436</post-id>	</item>
		<item>
		<title>Big News from Arduino: Arduino Lab for MicroPython</title>
		<link>https://nothans.com/big-news-from-arduino-arduino-lab-for-micropython</link>
					<comments>https://nothans.com/big-news-from-arduino-arduino-lab-for-micropython#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Thu, 10 Nov 2022 16:46:49 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[cheerlights]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[makers]]></category>
		<category><![CDATA[making]]></category>
		<category><![CDATA[MicroPython]]></category>
		<category><![CDATA[Pimoroni]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=3424</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p><a rel="noreferrer noopener" href="https://github.com/arduino/lab-micropython-editor" target="_blank">Arduino Lab for MicroPython</a> is a lightweight editor for MicroPython programs, supporting connection with a board, code upload, file transfer, and an interactive REPL shell.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="640" height="593" data-attachment-id="3425" data-permalink="https://nothans.com/big-news-from-arduino-arduino-lab-for-micropython/image-8" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image.png?fit=640%2C593&amp;ssl=1" data-orig-size="640,593" data-comments-opened="0" data-image-title="Arduino Lab for MicroPython" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image.png?fit=640%2C593&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image.png?resize=640%2C593&#038;ssl=1" alt="" class="wp-image-3425" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image.png?w=640&amp;ssl=1 640w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/11/image.png?resize=300%2C278&amp;ssl=1 300w" sizes="auto, (max-width: 640px) 100vw, 640px" /><figcaption class="wp-element-caption">Arduino Lab for MicroPython</figcaption></figure>
</div>


<p>I have been exploring MicroPython ever since I got a <a rel="noreferrer noopener" href="https://cheerlights.com/cheerlights-raspberry-pi-pico-w-micropython/" target="_blank">Raspberry Pi Pico W</a>. The community is moving fast and making more and more examples and libraries for MicroPython. Having the Arduino team lean into making the Arduino Lab IDE for MicroPython is a good indicator where things are headed. I was able to build an awesome CheerLights display using MicroPython running on a Raspberry Pi Pico W connected to a Pimoroni Galactic Unicorn PED panel.</p>



<figure class="wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Creating a CheerLights display with Pimoroni Galactic Unicorn" width="750" height="422" src="https://www.youtube.com/embed/ozkjXhZcbd8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div><figcaption class="wp-element-caption"><a rel="noreferrer noopener" href="https://cheerlights.com/cheerlights-raspberry-pi-pico-w-micropython/" target="_blank">CheerLights + Raspberry Pi Pico W + MicroPython</a></figcaption></figure>



<p>Consider Arduino Labs for MicroPython as pre-release, experimental software. Things are moving fast and the project will stabilize. Follow the project on <a href="https://github.com/arduino/lab-micropython-editor/" target="_blank" rel="noreferrer noopener">GitHub</a> and file any problems that you come across on <a href="https://github.com/arduino/lab-micropython-editor/issues" target="_blank" rel="noreferrer noopener">GitHub Issues</a>.</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/big-news-from-arduino-arduino-lab-for-micropython/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3424</post-id>	</item>
		<item>
		<title>You Can See the Earth Move Thanks to a Seismograph Board for the Raspberry Pi</title>
		<link>https://nothans.com/you-can-see-the-earth-move-thanks-to-a-seismograph-board-for-the-raspberry-pi</link>
					<comments>https://nothans.com/you-can-see-the-earth-move-thanks-to-a-seismograph-board-for-the-raspberry-pi#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Sat, 12 Mar 2022 14:57:39 +0000</pubDate>
				<category><![CDATA[ThingSpeak]]></category>
		<category><![CDATA[internet of things]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[thingspeak]]></category>
		<category><![CDATA[web of things]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=2745</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>I have been blogging about IoT and M2M for just about 15 years. In that timeframe, a lot of <em>things</em> happened. Nothing more significant than the rise of single-board computers ushered in by the Raspberry Pi 10 years ago. Since the Raspberry Pi&#8217;s release, people have been making addon boards for almost any application you can think of. I use a bunch of the tiny computers around my house for various projects: I run a whole arcade machine, a home automation server, and a monitor for network activity to name a few.</p>



<p>Recently, my college at MathWorks, Christopher Stapels, introduced me to the <a href="https://raspberryshake.org/" target="_blank" rel="noreferrer noopener">Raspberry Shake</a>. The&#8221;shake&#8221; is a  personal seismograph that laterally allows you to watch the Earth move and the things that cause the earth to move.</p>



<figure class="wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="750" height="422" src="https://www.youtube.com/embed/xiDaKjxvqEA?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div><figcaption>Raspberry Shake: Your Personal Seismograph</figcaption></figure>



<p>Christopher went on to collaborate with <a href="http://twitter.com/Weston_Quakes">Alan Kafka</a> at Weston Observatory, Boston College, and Jay Pulli at Raytheon to explore traffic data analysis using seismic data collected by the Raspberry Shake and sent to <a href="https://thingspeak.com/channels/1470727" target="_blank" rel="noreferrer noopener">ThingSpeak</a>.</p>



<figure class="wp-block-image size-large"><a href="https://blogs.mathworks.com/iot/2022/03/02/seismic-traffic-monitoring/"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="533" data-attachment-id="2746" data-permalink="https://nothans.com/you-can-see-the-earth-move-thanks-to-a-seismograph-board-for-the-raspberry-pi/raspberry-shake" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/03/raspberry-shake.jpg?fit=1249%2C888&amp;ssl=1" data-orig-size="1249,888" data-comments-opened="0" data-image-title="raspberry-shake" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2022/03/raspberry-shake.jpg?fit=750%2C533&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2022/03/raspberry-shake.jpg?resize=750%2C533&#038;ssl=1" alt="" class="wp-image-2746" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2022/03/raspberry-shake.jpg?resize=1024%2C728&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/03/raspberry-shake.jpg?resize=300%2C213&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/03/raspberry-shake.jpg?resize=768%2C546&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2022/03/raspberry-shake.jpg?w=1249&amp;ssl=1 1249w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a><figcaption><a href="https://blogs.mathworks.com/iot/2022/03/02/seismic-traffic-monitoring/">Live Seismic Traffic Monitoring with ThingSpeak, MATLAB, and Raspberry Shake</a></figcaption></figure>



<p>The team explored the data using MATLAB and tried to establish some correlation between vibration and traffic density. Check out the <a rel="noreferrer noopener" href="https://blogs.mathworks.com/iot/2022/03/02/seismic-traffic-monitoring/" target="_blank">project</a> on the MathWorks IoT Blog. <a rel="noreferrer noopener" href="https://www.youtube.com/watch?v=GN8VV8CHnrk" target="_blank">Whole Lotta Shakin&#8217; Goin&#8217; On</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/you-can-see-the-earth-move-thanks-to-a-seismograph-board-for-the-raspberry-pi/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2745</post-id>	</item>
		<item>
		<title>CheerLights for Raspberry Pi Zero W and Blinkt!</title>
		<link>https://nothans.com/cheerlights-for-raspberry-pi-zero-w-and-blinkt</link>
					<comments>https://nothans.com/cheerlights-for-raspberry-pi-zero-w-and-blinkt#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Tue, 15 Dec 2020 16:27:27 +0000</pubDate>
				<category><![CDATA[CheerLights]]></category>
		<category><![CDATA[ThingSpeak]]></category>
		<category><![CDATA[Blinkt!]]></category>
		<category><![CDATA[cheerlights]]></category>
		<category><![CDATA[internet of things]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[Pimoroni]]></category>
		<category><![CDATA[Qwirkshop]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=1648</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>Well, it&#8217;s that time of year&#8230; <a rel="noreferrer noopener" href="https://cheerlights.com" target="_blank">CheerLights</a> time of year! I started CheerLights back in 2011 with one set of lights. Now there are lights synchronized all over the world and the project gets popular around the holidays. The idea behind CheerLights is to show how we are all connected. We are in this together. When someone changes the CheerLights color (via <a rel="noreferrer noopener" href="https://twitter.com/search?q=cheerlights&amp;f=live" target="_blank">Twitter</a>), all of the connected lights also change to that color.</p>



<p>For this season, I wanted to try out the <a rel="noreferrer noopener" href="https://shop.pimoroni.com/products/blinkt" target="_blank">Blinkt!</a> kit from Pimoroni. I really what I am seeing from Pimoroni. Their starter kits and accessories for the Raspberry Pi are really well designed, <em>colorful</em>, and useful. If you are in the US, some of the Pimoroni kits are on <a rel="noreferrer noopener" href="https://amzn.to/2KpNjzp" target="_blank">Amazon</a>.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="750" data-attachment-id="1649" data-permalink="https://nothans.com/cheerlights-for-raspberry-pi-zero-w-and-blinkt/sony-dsc" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/pimoroni_kit.jpg?fit=1024%2C1024&amp;ssl=1" data-orig-size="1024,1024" data-comments-opened="0" data-image-title="pimoroni raspberry pi kit" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/pimoroni_kit.jpg?fit=750%2C750&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/pimoroni_kit.jpg?resize=750%2C750&#038;ssl=1" alt="" class="wp-image-1649" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/pimoroni_kit.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/pimoroni_kit.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/pimoroni_kit.jpg?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/pimoroni_kit.jpg?resize=768%2C768&amp;ssl=1 768w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption>Pimoroni Raspberry Pi Zero W Starter Kit</figcaption></figure>



<p>I do recommend the <a rel="noreferrer noopener" href="https://amzn.to/2KpNjzp" target="_blank">Pimoroni Raspberry Pi Zero W Starter Kit</a> if you are using the Raspberry Pi Zero W for the first time. The main reason for using a starter kit is that the ports on the Raspberry Pi Zero W need some adapters. You need to get a mini to full-size HDMI adaptor and a Micro-USB adapter to be able to connect a monitor, keyboard, and mouse to the Raspberry Pi Zero W. The kit also includes a 16GB micro-SD card with an operating system pre-loaded.</p>



<p>Connect a monitor, keyboard, and mouse to the Raspberry Pi Zero W and connect the USB cable to a reliable 5V USB power supply and you are ready to start programming.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="563" data-attachment-id="1650" data-permalink="https://nothans.com/cheerlights-for-raspberry-pi-zero-w-and-blinkt/raspberry_pi_zero_w_blinkt_cheerlights" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/Raspberry_Pi_Zero_W_Blinkt_CheerLights-scaled.jpg?fit=2560%2C1920&amp;ssl=1" data-orig-size="2560,1920" data-comments-opened="0" data-image-title="Raspberry_Pi_Zero_W_Blinkt_CheerLights" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/Raspberry_Pi_Zero_W_Blinkt_CheerLights-scaled.jpg?fit=750%2C563&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/Raspberry_Pi_Zero_W_Blinkt_CheerLights.jpg?resize=750%2C563&#038;ssl=1" alt="" class="wp-image-1650" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/Raspberry_Pi_Zero_W_Blinkt_CheerLights-scaled.jpg?resize=1024%2C768&amp;ssl=1 1024w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/Raspberry_Pi_Zero_W_Blinkt_CheerLights-scaled.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/Raspberry_Pi_Zero_W_Blinkt_CheerLights-scaled.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/Raspberry_Pi_Zero_W_Blinkt_CheerLights-scaled.jpg?resize=1536%2C1152&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/Raspberry_Pi_Zero_W_Blinkt_CheerLights-scaled.jpg?resize=2048%2C1536&amp;ssl=1 2048w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/Raspberry_Pi_Zero_W_Blinkt_CheerLights-scaled.jpg?resize=100%2C75&amp;ssl=1 100w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/Raspberry_Pi_Zero_W_Blinkt_CheerLights-scaled.jpg?w=2250&amp;ssl=1 2250w" sizes="auto, (max-width: 750px) 100vw, 750px" /><figcaption>Raspberry Pi Zero W with Blinkt! LED Strip</figcaption></figure>



<p>I followed Pimoroni&#8217;s <a rel="noreferrer noopener" href="https://learn.pimoroni.com/tutorial/sandyj/getting-started-with-blinkt" target="_blank">getting started tutorial</a> to install the Blinkt! python library. The Blinkt! board is a strip of LEDs that sit on top of the Raspberry Pi&#8217;s GPIO pins. Blinkt! is a cool way to get started with controlling things with the Raspberry Pi. Consider turning on the LEDs for the first time using code as your &#8220;Hello World&#8221; program for physical computing.</p>



<p>After connecting your Raspberry Pi Zero W to your Wi-Fi network, open a terminal window and enter the following comment to install the Blinkt!~ libraries (type &#8216;y&#8217; or &#8216;n&#8217; when prompted).</p>



<pre class="wp-block-preformatted">curl https://get.pimoroni.com/blinkt | bash</pre>



<p>Create a new file in your home directory called &#8220;cheerlights.py&#8221;. This file will contain the code that gets the latest CheerLights color on ThingSpeak and sets the color of the Blinkt! LEDs. Copy this <a rel="noreferrer noopener" href="https://raspberry-valley.azurewebsites.net/Cheeerlights-on-Blinkt/" target="_blank">code</a> into the &#8220;cheerlights.py&#8221; file and save it.</p>



<pre class="wp-block-preformatted">python cheerlights.py</pre>



<p>After a few seconds, you should see the <a rel="noreferrer noopener" href="https://cheerlights.com/live" target="_blank">latest</a> CheerLights color on the Blinkt!</p>



<p>To keep the &#8220;cheerlights.py&#8221; running all of the time, you need to add the script to crontab. This will make the script stays running in case of an error or reboot of the device.</p>



<pre class="wp-block-preformatted">sudo crontab -e</pre>



<p>Then, add this line to the end of the crontab file and save the file.</p>



<pre class="wp-block-preformatted">@reboot sleep 60 &amp;&amp; sudo python /home/pi/cheerlights.py</pre>



<p>A couple of years ago, I noticed that a maker space along with <a rel="noreferrer noopener" href="https://www.qwirkshop.co.uk/" target="_blank">Qwirkshop</a> created a desktop light kit for the Raspberry Pi Zero W and Blinkt! board. The kit was sold for a brief time on <a rel="noreferrer noopener" href="https://twitter.com/Qwirkshop/status/1074710652256743424" target="_blank">Etsy</a> and I picked up a few kits. Well, I just found them in my storage closet! The kit is a bunch of laser cut pieces that you assemble together. It is an ingenious kit in that it was designed in layers and holds together with no glue. The results were beautiful.</p>



<figure class="wp-block-image size-large"><a href="https://twitter.com/Qwirkshop/status/1074710652256743424"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="1000" data-attachment-id="1651" data-permalink="https://nothans.com/cheerlights-for-raspberry-pi-zero-w-and-blinkt/cheerlights_kit" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/CheerLights_Kit-scaled.jpg?fit=1920%2C2560&amp;ssl=1" data-orig-size="1920,2560" data-comments-opened="0" data-image-title="CheerLights_Kit" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/CheerLights_Kit-scaled.jpg?fit=750%2C1000&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/CheerLights_Kit.jpg?resize=750%2C1000&#038;ssl=1" alt="" class="wp-image-1651" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/CheerLights_Kit-scaled.jpg?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/CheerLights_Kit-scaled.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/CheerLights_Kit-scaled.jpg?resize=1152%2C1536&amp;ssl=1 1152w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/CheerLights_Kit-scaled.jpg?resize=1536%2C2048&amp;ssl=1 1536w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/12/CheerLights_Kit-scaled.jpg?w=1920&amp;ssl=1 1920w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a></figure>



<p><a rel="noreferrer noopener" href="https://nothans.com/contact" target="_blank">Let me know</a> if you build something to display the latest CheerLights color. I am always looking for new ideas for the CheerLights <a rel="noreferrer noopener" href="https://cheerlights.com" target="_blank">blog</a>.</p>



<p>Let&#8217;s stay connected!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/cheerlights-for-raspberry-pi-zero-w-and-blinkt/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1648</post-id>	</item>
		<item>
		<title>Arcade Cabinet Upgrade: Custom Acrylic Sign with RGB Backlight</title>
		<link>https://nothans.com/arcade-cabinet-upgrade-custom-acrylic-sign-with-rgb-backlight</link>
					<comments>https://nothans.com/arcade-cabinet-upgrade-custom-acrylic-sign-with-rgb-backlight#comments</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Tue, 09 Jun 2020 21:21:28 +0000</pubDate>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[arcade]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[RetroPie]]></category>
		<category><![CDATA[RGB Lights]]></category>
		<guid isPermaLink="false">https://nothans.com/?p=1557</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p>As someone said, &#8220;always leave things better than you found them&#8230; especially people.&#8221; I have co-opted this motto in my life. I try to help others and upgrade things that I love on a daily basis. I can&#8217;t get a lot done each day, but I can do something. Every. Day. Over time, the changes really add up!</p>



<p>I recently was looking around my game room for some inspiration for a quick project. I have a custom arcade cabinet based on <a rel="noreferrer noopener" href="https://retropie.org.uk/" target="_blank">RetroPie</a> running on a Raspberry Pi attached to a smart TV. It has been a lot of fun playing my video games from 30+ years ago. My project this time was to add a custom acrylic sign with an RGB backlight. I wanted the cabinet to look more like an actual arcade cabinet.</p>



<p>My go-to site for graphic printing is <a rel="noreferrer noopener" href="https://www.signs.com/acrylic/" target="_blank">Signs.com</a>. I have used it many times for upgrading <a href="https://nothans.com/arkham-horror-the-card-game-acrylic-player-mats">Arkham Horror: The Card Game</a> and for other projects around the house. I designed a sign using Adobe Illustrator and got it made out of acrylic. I cobbled together vector logos of many of my favorite systems plus the RetroPie logo and named the arcade cabinet, &#8220;The Scharcade&#8221;. See what I did there? Do you see it?</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2232" height="2560" data-attachment-id="1559" data-permalink="https://nothans.com/arcade-cabinet-upgrade-custom-acrylic-sign-with-rgb-backlight/arcade_frosted_glass" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Frosted_Glass-scaled.jpg?fit=2232%2C2560&amp;ssl=1" data-orig-size="2232,2560" data-comments-opened="0" data-image-title="Arcade Frosted Glass" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Frosted_Glass-scaled.jpg?fit=750%2C860&amp;ssl=1" src="https://i2.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Frosted_Glass-scaled.jpg?fit=750%2C860&amp;ssl=1" alt="" class="wp-image-1559" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Frosted_Glass-scaled.jpg?w=2232&amp;ssl=1 2232w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Frosted_Glass-scaled.jpg?resize=262%2C300&amp;ssl=1 262w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Frosted_Glass-scaled.jpg?resize=893%2C1024&amp;ssl=1 893w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Frosted_Glass-scaled.jpg?resize=768%2C881&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Frosted_Glass-scaled.jpg?resize=1339%2C1536&amp;ssl=1 1339w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Frosted_Glass-scaled.jpg?resize=1786%2C2048&amp;ssl=1 1786w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Frosted_Glass-scaled.jpg?w=1500&amp;ssl=1 1500w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>



<p>I used an <a rel="noreferrer noopener" href="https://amzn.to/2Aj8oqz" target="_blank">RGB Led Strip with IR Remote Control</a> as a backlight for the sign and to edge light the TV screen. The IR remote is handy to change the color of the lights. Just make sure that you expose the IR receiver on the power supply so you can change the color from the front of the cabinet.</p>



<p>My upgrade to the upgrade was to frost the arcade cabinet sign to make it look better. The original sign was completely transparent and you could see the lights shining through from each one of the LEDs. <em>LEDs love diffusers</em>. To fix this issue, I used <a rel="noreferrer noopener" href="https://amzn.to/2Us64Vf" target="_blank">Rust-Oleum Frosted Glass Spray Paint</a> on the backside of the sign. I tested out the spray paint on a scrap piece of acrylic. I was really worried about ruining the custom sign. Once I was confident with the results, I went ahead and sprayed one even coat of the paint on the backside of the sign. It takes about 20-30 minutes in order for the paint to activate. I wanted in anticipation for 20 minutes and I gradually saw the clear acrylic turn frosted. I was really happy with the results. The 20 minutes felt light an eternity.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="750" height="1000" data-attachment-id="1560" data-permalink="https://nothans.com/arcade-cabinet-upgrade-custom-acrylic-sign-with-rgb-backlight/arcade_sign_before_and_after" data-orig-file="https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Sign_Before_and_After.jpg?fit=1228%2C1637&amp;ssl=1" data-orig-size="1228,1637" data-comments-opened="0" data-image-title="Arcade Sign Before and After" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Sign_Before_and_After.jpg?fit=750%2C1000&amp;ssl=1" src="https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Sign_Before_and_After.jpg?resize=750%2C1000&#038;ssl=1" alt="" class="wp-image-1560" srcset="https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Sign_Before_and_After.jpg?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Sign_Before_and_After.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Sign_Before_and_After.jpg?resize=1152%2C1536&amp;ssl=1 1152w, https://i0.wp.com/nothans.com/wp-content/uploads/2020/06/Arcade_Sign_Before_and_After.jpg?w=1228&amp;ssl=1 1228w" sizes="auto, (max-width: 750px) 100vw, 750px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/arcade-cabinet-upgrade-custom-acrylic-sign-with-rgb-backlight/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1557</post-id>	</item>
		<item>
		<title>Update a ThingSpeak Channel using MQTT on a Raspberry Pi</title>
		<link>https://nothans.com/thingspeak-tutorials/update-a-thingspeak-channel-using-mqtt-on-a-raspberry-pi</link>
					<comments>https://nothans.com/thingspeak-tutorials/update-a-thingspeak-channel-using-mqtt-on-a-raspberry-pi#respond</comments>
		
		<dc:creator><![CDATA[Hans Scharler]]></dc:creator>
		<pubDate>Tue, 13 Dec 2016 18:47:08 +0000</pubDate>
				<category><![CDATA[ThingSpeak]]></category>
		<category><![CDATA[internet of things]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[MQTT]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">http://community.thingspeak.com/?page_id=1972</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<p><a href="https://thingspeak.com">ThingSpeak</a> has added <a href="https://www.mathworks.com/help/thingspeak/mqtt-api.html">MQTT</a> as a method to accept channel updates.&nbsp; MQTT is different from HTTP/REST. It is specifically designed to be lightweight and intended for embedded devices with low RAM and CPU performance.&nbsp; Also, in most cases, MQTT uses less bandwidth.</p>



<p>MQTT operates under a publish/subscribe model in which clients connect to the MQTT broker and either publish data or subscribe to topics to receive data from other clients.&nbsp; MQTT messages can be sent using unsecured TCP, which is the easiest and has the lower RAM, CPU, and bandwidth requirements.&nbsp; MQTT messages can also be sent using WebSockets.&nbsp; This may be needed for situations when the standard port for MQTT, 1883, is blocked on the network.&nbsp; When using MQTT over WebSockets, it is possible to encrypt the communication with SSL.&nbsp; If your hardware is capable of using SSL over a WebSocket, that is the recommended method.</p>



<p>On the Raspberry Pi, an MQTT client library is required to send data to ThingSpeak.&nbsp; <a href="https://eclipse.org/paho/clients/python/">Paho</a> is an open-source MQTT client library that will be used for this example.&nbsp; It has been adapted to many languages, including Python.</p>



<p>This example will demonstrate how to publish data to a ThingSpeak channel using the Paho library.&nbsp; The CPU and RAM usage of the Raspberry Pi will be measured and published to ThingSpeak every 20 seconds.</p>


<h3 class="wp-block-heading" id="PublishUsingWebsocketsInPythonOnARaspberryPiExample-1">Setup</h3>


<p>1) Create a new channel as shown in&nbsp;<a href="https://www.mathworks.com/help/thingspeak/collect-data-in-a-new-channel.html" target="_blank" rel="noopener">Collect Data in a New Channel</a> with two fields named “CPU (%)” and “RAM (%)”.</p>



<p>2) Create an MQTT device by clicking&nbsp;<strong class="emphasis bold">Devices</strong>&nbsp;&gt;&nbsp;<strong class="emphasis bold">MQTT</strong>&nbsp;at the top of the ThingSpeak page, then&nbsp;<strong class="emphasis bold">Add Device</strong>. When setting up the device and adding the new channel to its authorized list, click&nbsp;<strong class="emphasis bold">Download Credentials</strong>&nbsp;&gt;&nbsp;<strong class="emphasis bold">Plain Text</strong>. For details, see&nbsp;<a class="a" href="https://www.mathworks.com/help/thingspeak/mqtt-basics.html#mw_0bf68abc-6c4e-4e2e-8312-e8223a203b71" data-docid="thingspeak#mw_0bf68abc-6c4e-4e2e-8312-e8223a203b71">Create a ThingSpeak MQTT Device</a>. Use the saved credentials in the Code section below.</p>



<p>3) Download the&nbsp;<a href="https://eclipse.org/paho/clients/python" target="_blank" rel="noopener">Paho MQTT</a>&nbsp;client library for Python. You can use the command line to install the libraries. If you are using Python 2, use this code:</p>



<div class="code_responsive">
<pre class="programlisting">sudo pip install paho-mqtt
sudo pip install psutil
</pre>
</div>



<p>If you use Python 3, use this code:</p>



<div class="code_responsive">
<pre class="programlisting">sudo pip3 install paho-mqtt
sudo pip3 install psutil</pre>
</div>


<h3 class="wp-block-heading" id="publishing-to-thingspeak-example">Publishing to ThingSpeak Example</h3>


<p>This example shows how simple it can be to send data to ThingSpeak using MQTT.</p>



<p>Three MQTT connection methods are demonstrated in this example: TCP, WebSockets, and SSL. To use a conventional TCP socket on port 1883, set useUnsecuredTCP=True.&nbsp; This connection method is the simplest and requires the least system resources.&nbsp; To use WebSockets on port 80, set <strong>useUnsecuredWebsockets=True</strong>.&nbsp; Websockets are helpful when the default MQTT port is blocked on the local network.&nbsp; Finally, if encryption is required, set <strong>useSSLWebsockets=True</strong>.&nbsp;&nbsp; Be sure only to set one of the connection method variables to True and leave the other two False.</p>



<p>Also, be sure to change the channel ID and API key to your channel’s settings.</p>



<pre class="wp-block-preformatted"># Publich to a ThingSpeak Channel Using MQTT
# 
# This is an example of publishing to multiple fields simultaneously.
# Connections over standard TCP, websocket or SSL are possible by setting
# the parameters below.
#
# CPU and RAM usage is collected every 20 seconds and published to a
# ThingSpeak channel using an MQTT Publish
#
# This example requires the Paho MQTT client package which
# is available at: http://eclipse.org/paho/clients/python
import paho.mqtt.publish as publish
import psutil
import string

# The ThingSpeak Channel ID.
# Replace &lt;YOUR-CHANNEL-ID&gt; with your channel ID.
channel_ID = "&lt;YOUR-CHANNEL-ID&gt;"

# The hostname of the ThingSpeak MQTT broker.
mqtt_host = "mqtt3.thingspeak.com"

# Your MQTT credentials for the device
mqtt_client_ID = "&lt;YOUR-CLIENT-ID&gt;"
mqtt_username  = "&lt;YOUR-USERNAME&gt;"
mqtt_password  = "&lt;YOUR-MQTT-PASSWORD&gt;"

t_transport = "websockets"
t_port = 80

# Create the topic string.
topic = "channels/" + channel_ID + "/publish"

while (True):

    # get the system performance data over 20 seconds.
    cpu_percent = psutil.cpu_percent(interval=20)
    ram_percent = psutil.virtual_memory().percent

    # build the payload string.
    payload = "field1=" + str(cpu_percent) + "&amp;field2=" + str(ram_percent)

    # attempt to publish this data to the topic.
    try:
        print ("Writing Payload = ", payload," to host: ", mqtt_host, " clientID= ", mqtt_client_ID, " User ", mqtt_username, " PWD ", mqtt_password)
        publish.single(topic, payload, hostname=mqtt_host, transport=t_transport, port=t_port, client_id=mqtt_client_ID, auth={'username':mqtt_username,'password':mqtt_password})
    except (keyboardInterrupt)
        break
    except Exception as e:
        print (e) </pre>



		<div id="respond" class="comment-respond wp-block-post-comments-form">
			<h3 id="reply-title" class="comment-reply-title">Leave a Reply<small><a rel="nofollow" id="cancel-comment-reply-link" href="/tag/raspberry-pi/feed#respond" style="display:none;">Cancel reply</a></small></h3>			<form id="commentform" class="comment-form">
				<iframe
					title="Comment Form"
					src="https://jetpack.wordpress.com/jetpack-comment/?blogid=114568856&#038;postid=1972&#038;comment_registration=0&#038;require_name_email=1&#038;stc_enabled=1&#038;stb_enabled=1&#038;show_avatars=1&#038;avatar_default=mystery&#038;greeting=Leave+a+Reply&#038;jetpack_comments_nonce=e5d81c9f81&#038;greeting_reply=Leave+a+Reply+to+%25s&#038;color_scheme=light&#038;lang=en_US&#038;jetpack_version=16.1.2&#038;iframe_unique_id=1&#038;show_cookie_consent=10&#038;has_cookie_consent=0&#038;is_current_user_subscribed=0&#038;token_key=%3Bnormal%3B&#038;sig=e05c47331d03f9b9e4675e9ef077314a50c8198f#parent=https%3A%2F%2Fnothans.com%2Ftag%2Fraspberry-pi%2Ffeed"
											name="jetpack_remote_comment"
						style="width:100%; height: 430px; border:0;"
										class="jetpack_remote_comment"
					id="jetpack_remote_comment"
					sandbox="allow-same-origin allow-top-navigation allow-scripts allow-forms allow-popups"
				>
									</iframe>
									<!--[if !IE]><!-->
					<script>
						document.addEventListener('DOMContentLoaded', function () {
							var commentForms = document.getElementsByClassName('jetpack_remote_comment');
							for (var i = 0; i < commentForms.length; i++) {
								commentForms[i].allowTransparency = false;
								commentForms[i].scrolling = 'no';
							}
						});
					</script>
					<!--<![endif]-->
							</form>
		</div>

		
		<input type="hidden" name="comment_parent" id="comment_parent" value="" />

		<p class="akismet_comment_form_privacy_notice">This site uses Akismet to reduce spam. <a href="https://akismet.com/privacy/" target="_blank" rel="nofollow noopener">Learn how your comment data is processed.</a></p>]]></content:encoded>
					
					<wfw:commentRss>https://nothans.com/thingspeak-tutorials/update-a-thingspeak-channel-using-mqtt-on-a-raspberry-pi/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1972</post-id>	</item>
	</channel>
</rss>
