<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DIY | Tomokatsu Yukishita | yre.jp</title><link>https://yre.jp/en/tag/diy/</link><atom:link href="https://yre.jp/en/tag/diy/index.xml" rel="self" type="application/rss+xml"/><description>DIY</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-US</language><lastBuildDate>Tue, 19 Jul 2022 00:00:00 +0000</lastBuildDate><image><url>https://yre.jp/media/icon_hufbc159bd6ce6a866189b19a79c0d0f51_12846_512x512_fill_lanczos_center_3.png</url><title>DIY</title><link>https://yre.jp/en/tag/diy/</link></image><item><title>Build a Cloud-Connected Photo Frame with Raspberry Pi, Google Drive, rclone, fbi, and Python</title><link>https://yre.jp/en/post/raspi-photoframe/</link><pubDate>Tue, 19 Jul 2022 00:00:00 +0000</pubDate><guid>https://yre.jp/en/post/raspi-photoframe/</guid><description>&lt;p>I have been shooting with a digital SLR since 2003, and my total shot count is now at 388,524. I wanted a way to display those photos as a slideshow at home — without the hassle of manually copying files to an SD card every week.&lt;/p>
&lt;h2 id="the-problem-with-commercial-photo-frames">The Problem with Commercial Photo Frames&lt;/h2>
&lt;p>Most digital photo frames read images from an SD card or USB drive, in the 7–10 inch range. They work fine, but constantly re-copying photos is tedious enough to make you stop using it.&lt;/p>
&lt;p>What I wanted was a photo frame that pulls photos automatically from cloud storage like Google Drive. No such product seemed to exist, so I built one.&lt;/p>
&lt;p>
&lt;figure id="figure-the-concept-automatic-photo-sync-from-cloud-storage-to-the-photo-frame">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="System diagram of a cloud-connected photo frame using Google Drive and Raspberry Pi. Shows cloud storage automatically syncing photos for slideshow display" srcset="
/media/raspi-photoframe/5621deba8a18b839c7a4321764bb05e8_hub05f2d0d129c7ee7542169c2c963abde_86374_3f5a7eb7c7a059ffa19f361f5c9be38d.webp 400w,
/media/raspi-photoframe/5621deba8a18b839c7a4321764bb05e8_hub05f2d0d129c7ee7542169c2c963abde_86374_26bbc4e9cdb29660629bcf887c20be66.webp 760w,
/media/raspi-photoframe/5621deba8a18b839c7a4321764bb05e8_hub05f2d0d129c7ee7542169c2c963abde_86374_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://yre.jp/media/raspi-photoframe/5621deba8a18b839c7a4321764bb05e8_hub05f2d0d129c7ee7542169c2c963abde_86374_3f5a7eb7c7a059ffa19f361f5c9be38d.webp"
width="720"
height="405"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
The concept: automatic photo sync from cloud storage to the photo frame
&lt;/figcaption>&lt;/figure>
&lt;/p>
&lt;h2 id="hardware">Hardware&lt;/h2>
&lt;h3 id="raspberry-pi-4">Raspberry Pi 4&lt;/h3>
&lt;p>A photo frame runs 24/7, so low power consumption matters. Raspberry Pi 4 fits well.&lt;/p>
&lt;a href="https://amzn.to/4mAJmpt" target="_blank" rel="noopener nofollow sponsored" class="amazon-card">
&lt;div class="amazon-card-image">
&lt;img src="https://m.media-amazon.com/images/I/51ETv8Le3nL._AC_.jpg" alt="Raspberry Pi 4 Model B 4GB (Japan authorized distributor)">
&lt;/div>
&lt;div class="amazon-card-info">
&lt;div class="amazon-card-title">Raspberry Pi 4 Model B 4GB (Japan authorized distributor)&lt;/div>
&lt;div class="amazon-card-meta">
&lt;span class="amazon-btn">Amazonで見る&lt;/span>
&lt;/div>
&lt;/div>
&lt;/a>
&lt;h3 id="mobile-monitor">Mobile Monitor&lt;/h3>
&lt;p>A 15.6-inch FullHD IPS mobile monitor. Choosing an IPS panel avoids the narrow viewing angles common in off-the-shelf photo frames. Mobile monitors are compact and flexible to position.&lt;/p>
&lt;a href="https://amzn.to/4vwkOSR" target="_blank" rel="noopener nofollow sponsored" class="amazon-card">
&lt;div class="amazon-card-image">
&lt;img src="https://m.media-amazon.com/images/I/71lbYPykVrL._AC_SL1500_.jpg" alt="15.6-inch Mobile Monitor with Touch Panel">
&lt;/div>
&lt;div class="amazon-card-info">
&lt;div class="amazon-card-title">15.6-inch Mobile Monitor with Touch Panel&lt;/div>
&lt;div class="amazon-card-meta">
&lt;span class="amazon-btn">Amazonで見る&lt;/span>
&lt;/div>
&lt;/div>
&lt;/a>
&lt;h3 id="microsd-card-and-power-supply">microSD Card and Power Supply&lt;/h3>
&lt;a href="https://amzn.to/4ch1OA3" target="_blank" rel="noopener nofollow sponsored" class="amazon-card">
&lt;div class="amazon-card-image">
&lt;img src="https://m.media-amazon.com/images/I/615exWhvZ0L._AC_SL1200_.jpg" alt="SanDisk High Endurance microSDHC 32GB for Dashcam and Action Cameras">
&lt;/div>
&lt;div class="amazon-card-info">
&lt;div class="amazon-card-title">SanDisk High Endurance microSDHC 32GB for Dashcam and Action Cameras&lt;/div>
&lt;div class="amazon-card-meta">
&lt;span class="amazon-btn">Amazonで見る&lt;/span>
&lt;/div>
&lt;/div>
&lt;/a>
&lt;a href="https://amzn.to/4cf3SbU" target="_blank" rel="noopener nofollow sponsored" class="amazon-card">
&lt;div class="amazon-card-image">
&lt;img src="https://m.media-amazon.com/images/I/61W8QsDXSYL._AC_SL1500_.jpg" alt="Miuzei Raspberry Pi 4 USB-C Power Supply 5.1V 3A with Switch (PSE certified)">
&lt;/div>
&lt;div class="amazon-card-info">
&lt;div class="amazon-card-title">Miuzei Raspberry Pi 4 USB-C Power Supply 5.1V 3A with Switch (PSE certified)&lt;/div>
&lt;div class="amazon-card-meta">
&lt;span class="amazon-btn">Amazonで見る&lt;/span>
&lt;/div>
&lt;/div>
&lt;/a>
&lt;h2 id="system-architecture">System Architecture&lt;/h2>
&lt;h3 id="os-raspberry-pi-os">OS: Raspberry Pi OS&lt;/h3>
&lt;p>Write &lt;a href="https://www.raspberrypi.com/software/" target="_blank" rel="noopener">Raspberry Pi OS&lt;/a> to the SD card using Raspberry Pi Imager. Since no desktop is needed for a photo frame, the Lite (CLI-only) version is sufficient.&lt;/p>
&lt;h3 id="image-display-fbi">Image Display: fbi&lt;/h3>
&lt;p>&lt;code>fbi&lt;/code> renders images directly to the framebuffer from the command line. An earlier version used a GUI on Ubuntu but proved unstable, so I switched to this CLI-based approach.&lt;/p>
&lt;h3 id="cloud-storage-sync-rclone">Cloud Storage Sync: rclone&lt;/h3>
&lt;p>&lt;a href="https://rclone.org" target="_blank" rel="noopener">rclone&lt;/a> downloads photos from Google Drive on a schedule. It supports over 70 cloud storage providers including Dropbox and S3.&lt;/p>
&lt;p>The flow is: rclone downloads photos → fbi displays them as a slideshow.&lt;/p>
&lt;h2 id="setup">Setup&lt;/h2>
&lt;h3 id="installing-raspberry-pi-os">Installing Raspberry Pi OS&lt;/h3>
&lt;p>Use Raspberry Pi Imager to write the image to the SD card.&lt;/p>
&lt;p>
&lt;figure id="figure-writing-the-os-image-with-raspberry-pi-imager">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="Raspberry Pi Imager screen showing OS selection and SD card write options. The WRITE button is visible" srcset="
/media/raspi-photoframe/8ffcb7bfb32b5079533396b7542ed9a1_hu8982ae701f5d02b9ab9d1e54062b4b24_153362_fa36f9d2badcc15fd6500bcdc35fea83.webp 400w,
/media/raspi-photoframe/8ffcb7bfb32b5079533396b7542ed9a1_hu8982ae701f5d02b9ab9d1e54062b4b24_153362_5221b7fcaf02876b6223f09d17408d34.webp 760w,
/media/raspi-photoframe/8ffcb7bfb32b5079533396b7542ed9a1_hu8982ae701f5d02b9ab9d1e54062b4b24_153362_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="https://yre.jp/media/raspi-photoframe/8ffcb7bfb32b5079533396b7542ed9a1_hu8982ae701f5d02b9ab9d1e54062b4b24_153362_fa36f9d2badcc15fd6500bcdc35fea83.webp"
width="760"
height="504"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Writing the OS image with Raspberry Pi Imager
&lt;/figcaption>&lt;/figure>
&lt;/p>
&lt;p>Either 32-bit or 64-bit works for this use case.&lt;/p>
&lt;h3 id="installing-fbi">Installing fbi&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">sudo apt-get -y install fbi
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="granting-permissions">Granting Permissions&lt;/h4>
&lt;p>By default only root can use fbi to display images. Add the &lt;code>pi&lt;/code> user to the &lt;code>video&lt;/code> group:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">pi@raspi3-photo:~ $ ls -Fla /dev/fb0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crw-rw---- &lt;span class="m">1&lt;/span> root video 29, &lt;span class="m">0&lt;/span> Apr &lt;span class="m">7&lt;/span> 10:33 /dev/fb0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">sudo usermod -aG video pi
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="installing-rclone">Installing rclone&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">curl https://rclone.org/install.sh &lt;span class="p">|&lt;/span> sudo bash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>After installing, run &lt;code>rclone config&lt;/code> to authenticate with Google Drive.&lt;/p>
&lt;div class="alert alert-note">
&lt;div>
In a headless SSH-only environment, &lt;code>rclone config&lt;/code> will display a browser authentication URL during setup. Open that URL on another device to authorize access to your Google account.
&lt;/div>
&lt;/div>
&lt;h2 id="slideshow-program">Slideshow Program&lt;/h2>
&lt;h3 id="algorithm">Algorithm&lt;/h3>
&lt;ol>
&lt;li>Use &lt;code>rclone ls&lt;/code> to list photos in the designated cloud storage folder&lt;/li>
&lt;li>Start downloading images at random once an initial batch is available&lt;/li>
&lt;li>Display downloaded images with &lt;code>fbi&lt;/code>&lt;/li>
&lt;li>Continue fetching more images in the background&lt;/li>
&lt;li>Advance to a random new image at the configured interval&lt;/li>
&lt;li>Use weighted random selection — recently shown images are deprioritized&lt;/li>
&lt;li>Run &lt;code>rclone ls&lt;/code> weekly to merge newly added photos into the database&lt;/li>
&lt;li>Keep the database in memory (not a JSON file) for faster merging&lt;/li>
&lt;/ol>
&lt;h3 id="language-python">Language: Python&lt;/h3>
&lt;p>The slideshow controller is written in Python. The refactored object-oriented version reduced startup time by &lt;strong>1700%&lt;/strong> compared to the original.&lt;/p>
&lt;p>For Python learning, &lt;a href="https://www.udemy.com/course/python-beginner/" target="_blank" rel="noopener">Python 3 Bootcamp by Silicon Valley Engineer (Udemy)&lt;/a> was helpful.&lt;/p>
&lt;h2 id="source-code">Source Code&lt;/h2>
&lt;p>Published on GitHub:&lt;/p>
&lt;p>&lt;a href="https://github.com/yukishita/photoView4" target="_blank" rel="noopener">GitHub - yukishita/photoView4: Cloud-connected slideshow program&lt;/a>&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>Add this to crontab to start the slideshow at boot:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">@reboot /home/pi/photoView4/photoView4.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="demonstration">Demonstration&lt;/h2>
&lt;p>The improved v4 demo. Startup to first image display is dramatically faster than the original:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/VP7y_E34EJA?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"
>&lt;/iframe>
&lt;/div>
&lt;h3 id="original-version-for-reference">Original Version (for reference)&lt;/h3>
&lt;p>The original downloads the full file list before starting, which makes startup slow:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/-dxP_aHSjIU?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"
>&lt;/iframe>
&lt;/div>
&lt;h2 id="tips-scheduled-display-power-off">Tips: Scheduled Display Power Off&lt;/h2>
&lt;p>Running the display 24/7 wastes electricity. Use &lt;code>vcgencmd&lt;/code> in crontab to schedule power:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> * * * /usr/bin/vcgencmd display_power &lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">30&lt;/span> &lt;span class="m">6&lt;/span> * * * /usr/bin/vcgencmd display_power &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This turns the display off at midnight and back on at 6:30 AM. A motion or light sensor can make this even more automatic.&lt;/p>
&lt;h2 id="summary">Summary&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Component&lt;/th>
&lt;th>Role&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Raspberry Pi 4&lt;/td>
&lt;td>Main computer (low power, always-on)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mobile monitor&lt;/td>
&lt;td>FullHD IPS display for high-quality photo viewing&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>fbi&lt;/td>
&lt;td>Direct framebuffer image rendering from CLI&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>rclone&lt;/td>
&lt;td>Automatically downloads photos from Google Drive&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Python&lt;/td>
&lt;td>Slideshow control with weighted random selection&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Raspberry Pi 4 was used here, but Raspberry Pi Zero 2 W should also work. For an always-on device, choosing a lower-power board reduces running costs.&lt;/p></description></item><item><title>DIY JJY Simulator with ATOM Lite: Sync a Radio-Controlled Clock Without a Signal</title><link>https://yre.jp/en/post/jjy/</link><pubDate>Thu, 12 May 2022 00:00:00 +0000</pubDate><guid>https://yre.jp/en/post/jjy/</guid><description>&lt;p>After moving to a new home where my radio-controlled clock could no longer receive the JJY time signal, I built a low-cost JJY simulator using an M5Stack ATOM Lite and a JJY antenna board. This is a record of how I solved the problem for well under JPY 5,000.&lt;/p>
&lt;h2 id="the-problem-radio-controlled-clock-stopped-syncing-after-moving">The Problem: Radio-Controlled Clock Stopped Syncing After Moving&lt;/h2>
&lt;p>Radio-controlled clocks are convenient precisely because they set themselves automatically. After moving, however, my clock stopped receiving the JJY signal indoors, and the displayed time slowly drifted out of sync.&lt;/p>
&lt;p>The clock could still pick up the signal near a window, but carrying it there and back every time it needed syncing was not a practical long-term solution.&lt;/p>
&lt;h2 id="what-is-jjy">What Is JJY?&lt;/h2>
&lt;p>JJY is the call sign for Japan&amp;rsquo;s standard time radio signal, broadcast by the National Institute of Information and Communications Technology (NICT). Two transmitters cover the country: 40 kHz from Fukushima (Ōtakadoya-yama) and 60 kHz from Saga (Haganeyama). Radio-controlled clocks receive this signal to maintain accurate time automatically.&lt;/p>
&lt;p>The device described in this article &lt;strong>simulates the JJY signal and rebroadcasts it locally&lt;/strong>, allowing a clock to sync even when it cannot receive the real transmission.&lt;/p>
&lt;h2 id="commercial-retransmitters-are-expensive">Commercial Retransmitters Are Expensive&lt;/h2>
&lt;p>There are commercial products designed to solve exactly this problem — they receive accurate time from NTP servers or GPS and retransmit a JJY-compatible signal indoors.&lt;/p>
&lt;a href="https://amzn.to/3OviZVw" target="_blank" rel="noopener nofollow sponsored" class="amazon-card">
&lt;div class="amazon-card-image">
&lt;img src="https://m.media-amazon.com/images/I/51dhtr4Mv6L._AC_SL1000_.jpg" alt="Kyohritsu Denshi AC-Synchronized Time Transmitter P18-NTPAC">
&lt;/div>
&lt;div class="amazon-card-info">
&lt;div class="amazon-card-title">Kyohritsu Denshi AC-Synchronized Time Transmitter P18-NTPAC&lt;/div>
&lt;div class="amazon-card-meta">
&lt;span class="amazon-btn">Amazonで見る&lt;/span>
&lt;/div>
&lt;/div>
&lt;/a>
&lt;a href="https://amzn.to/4sHgo93" target="_blank" rel="noopener nofollow sponsored" class="amazon-card">
&lt;div class="amazon-card-image">
&lt;img src="https://m.media-amazon.com/images/I/515VVAwTGWL._AC_SL1000_.jpg" alt="KEISEEDS GPS Radio Clock Repeater P18-NTPGR">
&lt;/div>
&lt;div class="amazon-card-info">
&lt;div class="amazon-card-title">KEISEEDS GPS Radio Clock Repeater P18-NTPGR&lt;/div>
&lt;div class="amazon-card-meta">
&lt;span class="amazon-btn">Amazonで見る&lt;/span>
&lt;/div>
&lt;/div>
&lt;/a>
&lt;a href="https://amzn.to/4tcEJod" target="_blank" rel="noopener nofollow sponsored" class="amazon-card">
&lt;div class="amazon-card-image">
&lt;img src="https://m.media-amazon.com/images/I/71BT1PnUJIL._AC_SL1500_.jpg" alt="Radio Clock Signal Transmitter with Built-in Clock P18-NTPLR">
&lt;/div>
&lt;div class="amazon-card-info">
&lt;div class="amazon-card-title">Radio Clock Signal Transmitter with Built-in Clock P18-NTPLR&lt;/div>
&lt;div class="amazon-card-meta">
&lt;span class="amazon-btn">Amazonで見る&lt;/span>
&lt;/div>
&lt;/div>
&lt;/a>
&lt;p>These products work well, but they typically cost JPY 10,000–30,000. Hard to justify for a single clock at home.&lt;/p>
&lt;h2 id="the-diy-solution-atom-lite--jjy-antenna-board">The DIY Solution: ATOM Lite + JJY Antenna Board&lt;/h2>
&lt;p>Searching &lt;a href="https://www.switch-science.com/" target="_blank" rel="noopener">Switch Science&lt;/a> (a Japanese electronics parts retailer), I found a JJY antenna board designed to work with M5Stack devices — exactly what I needed.&lt;/p>
&lt;h3 id="required-parts">Required Parts&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Product&lt;/th>
&lt;th>Link&lt;/th>
&lt;th>Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>JJY antenna board for M5StickC&lt;/td>
&lt;td>&lt;a href="https://www.switch-science.com/products/6527" target="_blank" rel="noopener">Switch Science&lt;/a>&lt;/td>
&lt;td>M5StickC specific&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>JJY antenna board for M5Atom&lt;/td>
&lt;td>&lt;a href="https://www.switch-science.com/products/6746" target="_blank" rel="noopener">Switch Science&lt;/a>&lt;/td>
&lt;td>For ATOM Lite/Matrix&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>M5StickC&lt;/td>
&lt;td>&lt;a href="https://www.switch-science.com/products/5517" target="_blank" rel="noopener">Switch Science&lt;/a>&lt;/td>
&lt;td>&lt;strong>Discontinued&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ATOM Lite&lt;/td>
&lt;td>&lt;a href="https://www.switch-science.com/products/6262" target="_blank" rel="noopener">Switch Science&lt;/a>&lt;/td>
&lt;td>Available now — recommended&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ATOM Matrix&lt;/td>
&lt;td>&lt;a href="https://www.switch-science.com/products/6260" target="_blank" rel="noopener">Switch Science&lt;/a>&lt;/td>
&lt;td>Available now&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;strong>Note:&lt;/strong> M5StickC has been discontinued. For new builds, the recommended combination is &lt;strong>ATOM Lite&lt;/strong> with the &lt;strong>JJY antenna board for M5Atom&lt;/strong>. The original article used M5StickC, which is what appears in the photos below.&lt;/p>
&lt;/blockquote>
&lt;p>At the time of purchase, the antenna board and M5 device together came to under JPY 5,000 (prices may vary — check current listings before ordering). That is roughly one-third to one-sixth the cost of a commercial retransmitter.&lt;/p>
&lt;h2 id="setup">Setup&lt;/h2>
&lt;p>Setup follows the instructions in the GitHub repository linked from the Switch Science product page:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/botanicfields/BF-018A" target="_blank" rel="noopener">Project page — GitHub: BF-018A&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/botanicfields/BF-018A/blob/main/BF-018A/BF-018A.ino" target="_blank" rel="noopener">JJY simulator sketch (.ino)&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://qiita.com/BotanicFields/items/a78c80f947388caf0d36" target="_blank" rel="noopener">Qiita article: Generating a JJY-like signal with M5StickC / M5Atom using Ticker&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Flash the firmware following the instructions and there are no unusual steps. It worked on the first attempt without any issues.&lt;/p>
&lt;h2 id="testing">Testing&lt;/h2>
&lt;p>With the firmware flashed, connect the M5 device to the JJY antenna board and place it next to the radio-controlled clock.&lt;/p>
&lt;p>
&lt;figure id="figure-place-the-device-right-next-to-the-clock-to-receive-the-simulated-signal">
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="M5StickC with JJY antenna board placed directly beside a radio-controlled clock, which is attempting to receive the simulated signal" srcset="
/media/jjy/ILCE-7M4-_DSC9136_hu98206837892c374cd2028613e5b10c88_58536_43bc2ce870154c5227402d96206f8f51.webp 400w,
/media/jjy/ILCE-7M4-_DSC9136_hu98206837892c374cd2028613e5b10c88_58536_abb0fd5f0bb8778fd9f895a7e7278219.webp 760w,
/media/jjy/ILCE-7M4-_DSC9136_hu98206837892c374cd2028613e5b10c88_58536_1200x1200_fit_q75_h2_lanczos.webp 1200w"
src="https://yre.jp/media/jjy/ILCE-7M4-_DSC9136_hu98206837892c374cd2028613e5b10c88_58536_43bc2ce870154c5227402d96206f8f51.webp"
width="760"
height="506"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;figcaption>
Place the device right next to the clock to receive the simulated signal
&lt;/figcaption>&lt;/figure>
&lt;/p>
&lt;p>The transmitted signal is weak and short-range. The device needs to be within a few centimeters to a few tens of centimeters of the clock to sync reliably. In practice this is not a problem — once the clock has synced, it holds accurate time on its own until the next sync cycle.&lt;/p>
&lt;h2 id="known-limitation">Known Limitation&lt;/h2>
&lt;p>One issue worth noting: &lt;strong>if the device is used near a microwave oven, the Wi-Fi connection drops and does not automatically reconnect&lt;/strong>. A manual restart is required. Either keep the device away from the microwave, or add a periodic auto-reset to the firmware.&lt;/p>
&lt;h2 id="summary">Summary&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Item&lt;/th>
&lt;th>Detail&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Total parts cost&lt;/td>
&lt;td>Under JPY 5,000 (roughly 1/3–1/6 of commercial alternatives)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Soldering required&lt;/td>
&lt;td>None&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Setup difficulty&lt;/td>
&lt;td>Low — flash firmware from GitHub and place next to clock&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Signal range&lt;/td>
&lt;td>Short (a few cm to a few tens of cm)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Known issue&lt;/td>
&lt;td>Wi-Fi drops near microwave, requires manual restart&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>A practical and affordable way to keep a radio-controlled clock synced in a room with poor JJY reception. If you are in a similar situation, this combination is well worth trying.&lt;/p></description></item></channel></rss>