<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[insert newline RSS]]></title><description><![CDATA[insert newline is a blog]]></description><link>https://insertnewline.com</link><generator>GatsbyJS</generator><lastBuildDate>Sat, 27 Dec 2025 18:14:55 GMT</lastBuildDate><item><title><![CDATA[Aeon Photo Frame]]></title><description><![CDATA[Introduction Colour e-ink displays are a relatively new technology that have become available to consumers in the last few years. E-ink…]]></description><link>https://insertnewline.com/blog/aeon/</link><guid isPermaLink="false">https://insertnewline.com/blog/aeon/</guid><pubDate>Sat, 22 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 67.72151898734178%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/acb59362d8785f11afd3963b23f346b6/dc87c/aeon-cover.avif 158w,
/static/acb59362d8785f11afd3963b23f346b6/383b4/aeon-cover.avif 315w,
/static/acb59362d8785f11afd3963b23f346b6/d0061/aeon-cover.avif 630w,
/static/acb59362d8785f11afd3963b23f346b6/20e2c/aeon-cover.avif 945w,
/static/acb59362d8785f11afd3963b23f346b6/9eba6/aeon-cover.avif 1260w,
/static/acb59362d8785f11afd3963b23f346b6/9aa9d/aeon-cover.avif 4752w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/acb59362d8785f11afd3963b23f346b6/5787a/aeon-cover.webp 158w,
/static/acb59362d8785f11afd3963b23f346b6/89f54/aeon-cover.webp 315w,
/static/acb59362d8785f11afd3963b23f346b6/4d353/aeon-cover.webp 630w,
/static/acb59362d8785f11afd3963b23f346b6/0f41d/aeon-cover.webp 945w,
/static/acb59362d8785f11afd3963b23f346b6/f27a3/aeon-cover.webp 1260w,
/static/acb59362d8785f11afd3963b23f346b6/b3cdb/aeon-cover.webp 4752w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/acb59362d8785f11afd3963b23f346b6/ebfe4/aeon-cover.jpg 158w,
/static/acb59362d8785f11afd3963b23f346b6/4fcc2/aeon-cover.jpg 315w,
/static/acb59362d8785f11afd3963b23f346b6/83b6b/aeon-cover.jpg 630w,
/static/acb59362d8785f11afd3963b23f346b6/33bb3/aeon-cover.jpg 945w,
/static/acb59362d8785f11afd3963b23f346b6/54265/aeon-cover.jpg 1260w,
/static/acb59362d8785f11afd3963b23f346b6/62af7/aeon-cover.jpg 4752w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/acb59362d8785f11afd3963b23f346b6/83b6b/aeon-cover.jpg&quot;
            alt=&quot;Aeon displaying a butterfly, with PCB shown&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;introduction&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#introduction&quot; aria-label=&quot;introduction permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Colour e-ink displays are a relatively new technology that have become available to consumers in the last few years. E-ink displays are unique in that they are bistable, meaning they only consume power when the image displayed is changed. This makes them ideal for applications where the displayed image is static for long periods of time, such as e-readers. They also have the added benefit of working reflectively, increasing their visiblity as the level of ambient light increases.&lt;/p&gt;
&lt;p&gt;The relatively recent commercial availability of these displays served as the inspiration for this project. Digital photo frames that utilise these displays &lt;a href=&quot;https://www.amazon.com/dp/B0C4TS1NMS/&quot;&gt;already exist&lt;/a&gt;; however, these would only run for a few years on a single charge (which is, admittedly, still quite impressive). I wanted to build something that would run (effectively) indefinitely, keeping to the theme of what I think is the coolest feature of e-ink displays, their ability to retain a displayed image forever. As such, this project was designed from the ground up with a focus on longevity.&lt;/p&gt;
&lt;p&gt;The final device should be indistinguishable from a normal photo frame, in both appearance and typical usage. That is, you should be able to treat it like a normal, static photo frame, and it should &lt;em&gt;just work&lt;/em&gt;, ideally for an extended duration of time (think a decade or two). The only difference to a normal photo frame, the photo displayed will change maybe once a day, and to achieve this functionality, the device should never need to be charged.&lt;/p&gt;
&lt;h2 id=&quot;hardware&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hardware&quot; aria-label=&quot;hardware permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hardware&lt;/h2&gt;
&lt;p&gt;The central device that Aeon was designed around was the &lt;a href=&quot;https://www.waveshare.com/7.3inch-e-paper-hat-f.htm&quot;&gt;Waveshare 7.3&quot; 7-colour e-ink display&lt;/a&gt;, chosen for its ability to display a range of colours, and its suitable size to fit in a 6x4 photo frame.&lt;/p&gt;
&lt;p&gt;Since the final appearance of the device was important, all the electronics were required to fit within a fairly thin profile, which necessitated the use of a custom PCB.&lt;/p&gt;
&lt;p&gt;The main electronic systems on the PCB consist of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Power management&lt;/strong&gt;: energy harvesting and storage, output regulation and voltage rail switching&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processing&lt;/strong&gt;: a low-power microcontroller to transfer image data from an SD card to the display, an FRAM IC to store configuration data&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Display driver&lt;/strong&gt;: power circuitry for the e-ink display&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 74.68354430379746%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/36872e8170c1c3348112184b84231bda/dc87c/aeon-pcb.avif 158w,
/static/36872e8170c1c3348112184b84231bda/383b4/aeon-pcb.avif 315w,
/static/36872e8170c1c3348112184b84231bda/d0061/aeon-pcb.avif 630w,
/static/36872e8170c1c3348112184b84231bda/20e2c/aeon-pcb.avif 945w,
/static/36872e8170c1c3348112184b84231bda/9eba6/aeon-pcb.avif 1260w,
/static/36872e8170c1c3348112184b84231bda/2b03e/aeon-pcb.avif 3935w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/36872e8170c1c3348112184b84231bda/5787a/aeon-pcb.webp 158w,
/static/36872e8170c1c3348112184b84231bda/89f54/aeon-pcb.webp 315w,
/static/36872e8170c1c3348112184b84231bda/4d353/aeon-pcb.webp 630w,
/static/36872e8170c1c3348112184b84231bda/0f41d/aeon-pcb.webp 945w,
/static/36872e8170c1c3348112184b84231bda/f27a3/aeon-pcb.webp 1260w,
/static/36872e8170c1c3348112184b84231bda/6c529/aeon-pcb.webp 3935w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/36872e8170c1c3348112184b84231bda/ebfe4/aeon-pcb.jpg 158w,
/static/36872e8170c1c3348112184b84231bda/4fcc2/aeon-pcb.jpg 315w,
/static/36872e8170c1c3348112184b84231bda/83b6b/aeon-pcb.jpg 630w,
/static/36872e8170c1c3348112184b84231bda/33bb3/aeon-pcb.jpg 945w,
/static/36872e8170c1c3348112184b84231bda/54265/aeon-pcb.jpg 1260w,
/static/36872e8170c1c3348112184b84231bda/0ae80/aeon-pcb.jpg 3935w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/36872e8170c1c3348112184b84231bda/83b6b/aeon-pcb.jpg&quot;
            alt=&quot;PCB view&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;power-system-architecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#power-system-architecture&quot; aria-label=&quot;power system architecture permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Power System Architecture&lt;/h3&gt;
&lt;p&gt;The power system of Aeon was designed to be as efficient as possible, with the goal of minimising the quiescent current consumption of the device.&lt;/p&gt;
&lt;h4 id=&quot;energy-harvesting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#energy-harvesting&quot; aria-label=&quot;energy harvesting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Energy Harvesting&lt;/h4&gt;
&lt;p&gt;One of the design goals for Aeon was continuous operation without the need for charging. This required finding a suitable ambient power source that could be harvested. Since the devices&apos; power profile involves the majority of consumption ocurring when the image is changing, with near-zero power usage when displaying static image, the &lt;strong&gt;average&lt;/strong&gt; power consumption should be very low.&lt;/p&gt;
&lt;p&gt;In terms of energy sources for harvesting, light stands out as really the only option. The household environment that Aeon is intended to be used in does not have a particular abundance of other sources that can be harvested (e.g. heat, vibration, RF). Hence, light harvesting using solar cells was chosen for the design.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.65822784810127%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/c1c5ab68fd4e0cb2e112e1608e8557b7/dc87c/aem-ehv-ic.avif 158w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/383b4/aem-ehv-ic.avif 315w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/d0061/aem-ehv-ic.avif 630w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/20e2c/aem-ehv-ic.avif 945w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/9eba6/aem-ehv-ic.avif 1260w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/7b4fe/aem-ehv-ic.avif 2545w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/c1c5ab68fd4e0cb2e112e1608e8557b7/5787a/aem-ehv-ic.webp 158w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/89f54/aem-ehv-ic.webp 315w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/4d353/aem-ehv-ic.webp 630w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/0f41d/aem-ehv-ic.webp 945w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/f27a3/aem-ehv-ic.webp 1260w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/d021b/aem-ehv-ic.webp 2545w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/c1c5ab68fd4e0cb2e112e1608e8557b7/ebfe4/aem-ehv-ic.jpg 158w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/4fcc2/aem-ehv-ic.jpg 315w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/83b6b/aem-ehv-ic.jpg 630w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/33bb3/aem-ehv-ic.jpg 945w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/54265/aem-ehv-ic.jpg 1260w,
/static/c1c5ab68fd4e0cb2e112e1608e8557b7/378b3/aem-ehv-ic.jpg 2545w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/c1c5ab68fd4e0cb2e112e1608e8557b7/83b6b/aem-ehv-ic.jpg&quot;
            alt=&quot;AEM10941 energy harvester IC close-up&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Aeon&apos;s power management circuitry is based around the &lt;a href=&quot;https://e-peas.com/product/aem10941/&quot;&gt;E-peas AEM10941&lt;/a&gt;, an impressive little chip that integrates a basic MPPT controller with dual cascaded DC-DC converters to extract as much energy as possible out of the solar cells, even under poor lighting conditions.&lt;/p&gt;
&lt;h4 id=&quot;energy-storage&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#energy-storage&quot; aria-label=&quot;energy storage permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Energy Storage&lt;/h4&gt;
&lt;p&gt;The choice of energy storage element was evaluated throughout the development process. I initially intended to use dual 6F supercapacitors to achieve the maximum longevity for the device, however, the energy storage to size ratio for these were quite poor. My calculations showed that a cold start would be required if the solar cells didn&apos;t see sun for even just a few days.&lt;/p&gt;
&lt;p&gt;To avoid these issues, I went with a tiny 160mAh Li-ion battery instead. Under normal usage in a well-lit environment, this battery only sees very shallow charge-discharge cycles. Since Aeon doesn&apos;t rely on anything even close to the full 160mAh capacity of the battery (with a 24hr refresh cycle, it would run for months on a single charge), it would be reasonable to expect that the usable lifetime of the battery could last a decade or more.&lt;/p&gt;
&lt;h5 id=&quot;battery-protection&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#battery-protection&quot; aria-label=&quot;battery protection permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Battery Protection&lt;/h5&gt;
&lt;p&gt;In the pursuit of absolutely minimising quiescent current consumption, I elected to remove the protection circuit of the Li-ion cell. &lt;strong&gt;Extreme care&lt;/strong&gt;  is needed during this process, accidentally shorting will cause even a tiny 160mAh cell to output 20+ amps of current, which can cause burns (ask me how I know). Additionally, extended shorting will permanently damage the cell and potentially cause thermal runaway.&lt;/p&gt;
&lt;p&gt;So on the whole, I would recommend against this procedure, but I decided it was worth it to save a few microamps of current consumption. I tried to ensure that the features provided by the protection circuit would also be facilitated by the Aeon power management circuitry. I included a PPTC resettable fuse that should limit current in the unlikely event of some other failure on the board, and the AEM10941 directly protects against overcharge and overdischarge conditions.&lt;/p&gt;
&lt;h4 id=&quot;voltage-rails&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#voltage-rails&quot; aria-label=&quot;voltage rails permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Voltage Rails&lt;/h4&gt;
&lt;p&gt;The Aeon power architecture consists of two voltage rails, the main 3.3V rail is sourced by a low-quiescent current LDO voltage regulator, and is always active while the battery is within an acceptable voltage range. The microcontroller is powered by this main 3.3V rail. While the AEM10941 does include a built-in 3.3V regulator, it was not used because the display driver’s power requirements exceed the regulator’s current limit during refresh cycles.&lt;/p&gt;
&lt;p&gt;The second voltage rail is an auxiliary 3.3V rail. This powers all the peripherals (SD card, FRAM IC, display driver). The auxiliary rail is manually enabled by the microcontroller through a P-channel MOSFET when a refresh cycle is initiated. This allows the peripherals to be completely powered off when not in use, minimising quiescent current consumption.&lt;/p&gt;
&lt;h3 id=&quot;processing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#processing&quot; aria-label=&quot;processing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Processing&lt;/h3&gt;
&lt;p&gt;The brain of this project is the &lt;a href=&quot;https://www.st.com/en/microcontrollers-microprocessors/stm32l412k8.html&quot;&gt;STM32L412K8&lt;/a&gt; microcontroller.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.9620253164557%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/c3cf68e232e5580e7b36678d6b1455e9/dc87c/stm32.avif 158w,
/static/c3cf68e232e5580e7b36678d6b1455e9/383b4/stm32.avif 315w,
/static/c3cf68e232e5580e7b36678d6b1455e9/d0061/stm32.avif 630w,
/static/c3cf68e232e5580e7b36678d6b1455e9/20e2c/stm32.avif 945w,
/static/c3cf68e232e5580e7b36678d6b1455e9/9eba6/stm32.avif 1260w,
/static/c3cf68e232e5580e7b36678d6b1455e9/d8764/stm32.avif 2982w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/c3cf68e232e5580e7b36678d6b1455e9/5787a/stm32.webp 158w,
/static/c3cf68e232e5580e7b36678d6b1455e9/89f54/stm32.webp 315w,
/static/c3cf68e232e5580e7b36678d6b1455e9/4d353/stm32.webp 630w,
/static/c3cf68e232e5580e7b36678d6b1455e9/0f41d/stm32.webp 945w,
/static/c3cf68e232e5580e7b36678d6b1455e9/f27a3/stm32.webp 1260w,
/static/c3cf68e232e5580e7b36678d6b1455e9/38e04/stm32.webp 2982w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/c3cf68e232e5580e7b36678d6b1455e9/ebfe4/stm32.jpg 158w,
/static/c3cf68e232e5580e7b36678d6b1455e9/4fcc2/stm32.jpg 315w,
/static/c3cf68e232e5580e7b36678d6b1455e9/83b6b/stm32.jpg 630w,
/static/c3cf68e232e5580e7b36678d6b1455e9/33bb3/stm32.jpg 945w,
/static/c3cf68e232e5580e7b36678d6b1455e9/54265/stm32.jpg 1260w,
/static/c3cf68e232e5580e7b36678d6b1455e9/cf984/stm32.jpg 2982w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/c3cf68e232e5580e7b36678d6b1455e9/83b6b/stm32.jpg&quot;
            alt=&quot;STM32 microcontroller close-up&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The selection criteria for this role was primarily minimal power consumption. The STM32L412 series has reasonably low power consumption when active, and, more importantly, has impressive low power modes. In the case of the STM32L412K8 used in Aeon, the IC theoretically consumes an incredibly low 0.2uA in standby mode, while allowing it to wake up from the internal RTC or an external signal.&lt;/p&gt;
&lt;p&gt;This microcontroller handles interfacing with the SD card and the display, as well as scheduling RTC wakeups to ensure display refresh cycles occur at the configured intervals. Additionally, it monitors the battery voltage using the ADC and controls the auxiliary 3.3V rail, ensuring efficient power management. The STM32 communicates with all peripherals over SPI.&lt;/p&gt;
&lt;h4 id=&quot;fram&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#fram&quot; aria-label=&quot;fram permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;FRAM&lt;/h4&gt;
&lt;p&gt;A 4 Kbit FRAM IC is used to store configuration data. FRAM is a non-volatile memory technology that has the advantage of being able to be written to an effectively unlimited number of times, unlike EEPROM which has a limited number of write cycles. This IC is used to store various configuration data such as current image index, remaining sleep duration, etc.&lt;/p&gt;
&lt;h4 id=&quot;buttons-and-switches&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#buttons-and-switches&quot; aria-label=&quot;buttons and switches permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Buttons and Switches&lt;/h4&gt;
&lt;p&gt;The PCB contains two buttons, one wakes the STM32 from standby and perform a manual refresh of the display, and the other is simply wired to the reset pin of the microcontroller.&lt;/p&gt;
&lt;p&gt;Additionally, two 6x DIP switches are used to set configuration settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ON/OFF switch for the device&lt;/li&gt;
&lt;li&gt;Enable/disable shuffling of images&lt;/li&gt;
&lt;li&gt;Refresh cycle duration in hours (configurable between 1 and 1024)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;display-driver&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#display-driver&quot; aria-label=&quot;display driver permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Display Driver&lt;/h3&gt;
&lt;p&gt;The display driver circuitry mainly consists of two DC-DC converters required to generate the necessary voltages for the display. These were not designed by me, but were taken from the &lt;a href=&quot;https://files.waveshare.com/upload/8/86/7.3inch_e-Paper_%28F%29_Application_Note_Reference.pdf&quot;&gt;reference design&lt;/a&gt; provided by Waveshare for this display.&lt;/p&gt;
&lt;h3 id=&quot;electronics-development&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#electronics-development&quot; aria-label=&quot;electronics development permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Electronics Development&lt;/h3&gt;
&lt;p&gt;The Aeon schematic is shown below. For full design files, please see links at the end of this post.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 70.88607594936708%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/ae9662456f632f6afaa4d28b0ab219ff/dc87c/schematic.avif 158w,
/static/ae9662456f632f6afaa4d28b0ab219ff/383b4/schematic.avif 315w,
/static/ae9662456f632f6afaa4d28b0ab219ff/d0061/schematic.avif 630w,
/static/ae9662456f632f6afaa4d28b0ab219ff/20e2c/schematic.avif 945w,
/static/ae9662456f632f6afaa4d28b0ab219ff/9eba6/schematic.avif 1260w,
/static/ae9662456f632f6afaa4d28b0ab219ff/42d7e/schematic.avif 4961w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/ae9662456f632f6afaa4d28b0ab219ff/5787a/schematic.webp 158w,
/static/ae9662456f632f6afaa4d28b0ab219ff/89f54/schematic.webp 315w,
/static/ae9662456f632f6afaa4d28b0ab219ff/4d353/schematic.webp 630w,
/static/ae9662456f632f6afaa4d28b0ab219ff/0f41d/schematic.webp 945w,
/static/ae9662456f632f6afaa4d28b0ab219ff/f27a3/schematic.webp 1260w,
/static/ae9662456f632f6afaa4d28b0ab219ff/68ebf/schematic.webp 4961w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/ae9662456f632f6afaa4d28b0ab219ff/dda05/schematic.png 158w,
/static/ae9662456f632f6afaa4d28b0ab219ff/679a3/schematic.png 315w,
/static/ae9662456f632f6afaa4d28b0ab219ff/50637/schematic.png 630w,
/static/ae9662456f632f6afaa4d28b0ab219ff/fddb0/schematic.png 945w,
/static/ae9662456f632f6afaa4d28b0ab219ff/f46b1/schematic.png 1260w,
/static/ae9662456f632f6afaa4d28b0ab219ff/84b88/schematic.png 4961w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/ae9662456f632f6afaa4d28b0ab219ff/50637/schematic.png&quot;
            alt=&quot;Aeon schematic&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This was the first custom PCB that I had designed, so there were several minor mistakes made. Additionally, due to time constraints, I worked on this project on-and-off over a few months; but these breaks worked out in my favour, as it gave me time to order new PCBs with bugfixes.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 141.13924050632912%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/c952651aeea08a1d1efc9e3047bdcb75/dc87c/pcb-revisions.avif 158w,
/static/c952651aeea08a1d1efc9e3047bdcb75/383b4/pcb-revisions.avif 315w,
/static/c952651aeea08a1d1efc9e3047bdcb75/d0061/pcb-revisions.avif 630w,
/static/c952651aeea08a1d1efc9e3047bdcb75/20e2c/pcb-revisions.avif 945w,
/static/c952651aeea08a1d1efc9e3047bdcb75/9eba6/pcb-revisions.avif 1260w,
/static/c952651aeea08a1d1efc9e3047bdcb75/6869f/pcb-revisions.avif 3455w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/c952651aeea08a1d1efc9e3047bdcb75/5787a/pcb-revisions.webp 158w,
/static/c952651aeea08a1d1efc9e3047bdcb75/89f54/pcb-revisions.webp 315w,
/static/c952651aeea08a1d1efc9e3047bdcb75/4d353/pcb-revisions.webp 630w,
/static/c952651aeea08a1d1efc9e3047bdcb75/0f41d/pcb-revisions.webp 945w,
/static/c952651aeea08a1d1efc9e3047bdcb75/f27a3/pcb-revisions.webp 1260w,
/static/c952651aeea08a1d1efc9e3047bdcb75/b7673/pcb-revisions.webp 3455w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/c952651aeea08a1d1efc9e3047bdcb75/ebfe4/pcb-revisions.jpg 158w,
/static/c952651aeea08a1d1efc9e3047bdcb75/4fcc2/pcb-revisions.jpg 315w,
/static/c952651aeea08a1d1efc9e3047bdcb75/83b6b/pcb-revisions.jpg 630w,
/static/c952651aeea08a1d1efc9e3047bdcb75/33bb3/pcb-revisions.jpg 945w,
/static/c952651aeea08a1d1efc9e3047bdcb75/54265/pcb-revisions.jpg 1260w,
/static/c952651aeea08a1d1efc9e3047bdcb75/cde43/pcb-revisions.jpg 3455w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/c952651aeea08a1d1efc9e3047bdcb75/83b6b/pcb-revisions.jpg&quot;
            alt=&quot;All PCB revisions created during development&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I went through five revisions. Several of these were semi-preventable by adding some bodge connections, but since I had the time, I decided to fix up any minor issues properly.&lt;/p&gt;
&lt;h2 id=&quot;frame-design&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#frame-design&quot; aria-label=&quot;frame design permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Frame Design&lt;/h2&gt;
&lt;p&gt;One of the key design goals for Aeon was that it should be indistinguishable from a normal photo frame. This meant the structure thickness had to be kept less than 8mm in order to fit in a standard 6x4 photo frame.&lt;/p&gt;
&lt;p&gt;This constraint posed quite a few challenges during the design process, since this thin profile had to accommodate the PCB, the display, the solar cells, and the battery.&lt;/p&gt;
&lt;p&gt;The design consists of a main body that the display, PCB and solar cells are mounted in, and a removable back cover that contains a slot for the battery. A back stand was also designed to emulate the functionality of a typical photo frame; however, its shape is slightly unconventional, designed to minimise the shadow cast on the solar cells.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.53164556962025%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/5561f27a18fe068511fda79ada30038c/dc87c/enclosure.avif 158w,
/static/5561f27a18fe068511fda79ada30038c/383b4/enclosure.avif 315w,
/static/5561f27a18fe068511fda79ada30038c/d0061/enclosure.avif 630w,
/static/5561f27a18fe068511fda79ada30038c/20e2c/enclosure.avif 945w,
/static/5561f27a18fe068511fda79ada30038c/9eba6/enclosure.avif 1260w,
/static/5561f27a18fe068511fda79ada30038c/bbb3c/enclosure.avif 5052w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/5561f27a18fe068511fda79ada30038c/5787a/enclosure.webp 158w,
/static/5561f27a18fe068511fda79ada30038c/89f54/enclosure.webp 315w,
/static/5561f27a18fe068511fda79ada30038c/4d353/enclosure.webp 630w,
/static/5561f27a18fe068511fda79ada30038c/0f41d/enclosure.webp 945w,
/static/5561f27a18fe068511fda79ada30038c/f27a3/enclosure.webp 1260w,
/static/5561f27a18fe068511fda79ada30038c/721b4/enclosure.webp 5052w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/5561f27a18fe068511fda79ada30038c/ebfe4/enclosure.jpg 158w,
/static/5561f27a18fe068511fda79ada30038c/4fcc2/enclosure.jpg 315w,
/static/5561f27a18fe068511fda79ada30038c/83b6b/enclosure.jpg 630w,
/static/5561f27a18fe068511fda79ada30038c/33bb3/enclosure.jpg 945w,
/static/5561f27a18fe068511fda79ada30038c/54265/enclosure.jpg 1260w,
/static/5561f27a18fe068511fda79ada30038c/3a360/enclosure.jpg 5052w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/5561f27a18fe068511fda79ada30038c/83b6b/enclosure.jpg&quot;
            alt=&quot;Enclosure with back cover open&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;main-body-assembly&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#main-body-assembly&quot; aria-label=&quot;main body assembly permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Main Body Assembly&lt;/h3&gt;
&lt;p&gt;The parts were designed to be 3D printed, and as such, certain objects are printed in separate pieces that then need to be assembled by gluing together. Cyanoacrylate (superglue) was used for this purpose.&lt;/p&gt;
&lt;p&gt;The far more substantial challenge was wiring and potting the solar cells. The solar cells are wired in series, and the wires are routed through the channel in the main body into the PCB area. The bare solar cells I used were incredibly thin and fragile. Soldering onto them is fairly difficult, flux is absolutely required to get the solder to flow onto the contacts on the cell. After wiring each one, they can be glued into the body using two small dabs of hot glue.&lt;/p&gt;
&lt;p&gt;Once all the cells are glued in place, clear epoxy resin can be poured onto the inset area around the cells. This is a bit of a messy process, but it is necessary such that the device can be handled without worrying about damaging the solar cells.&lt;/p&gt;
&lt;p&gt;I discovered the hard way that the resin can leak into the PCB area if the wiring channel is not properly sealed. Small amounts of epoxy can be carefully removed after curing using isopropyl alcohol and a scraping implement.&lt;/p&gt;
&lt;h3 id=&quot;final-assembly&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-assembly&quot; aria-label=&quot;final assembly permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final Assembly&lt;/h3&gt;
&lt;p&gt;The front side of the main body has an inset slot for the display to be placed into. For mounting, I simply used kapton tape on the rear of the display.&lt;/p&gt;
&lt;p&gt;A paper mask was cut to size and placed between the display and the front glass to hide the display flex cable (for printable template, see links below). Once this is in place, the front becomes almost indistinguishable from a normal photo frame&lt;/p&gt;
&lt;p&gt;The battery is attached onto the back cover using tape, and this cover can be slotted in to cover the PCB area of the main body. Finally, the removable back stand can be pushed into the slot on the back of the main body.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/be23e5ae48ac948dfe456f2e34a62e78/dc87c/assembled-back.avif 158w,
/static/be23e5ae48ac948dfe456f2e34a62e78/383b4/assembled-back.avif 315w,
/static/be23e5ae48ac948dfe456f2e34a62e78/d0061/assembled-back.avif 630w,
/static/be23e5ae48ac948dfe456f2e34a62e78/20e2c/assembled-back.avif 945w,
/static/be23e5ae48ac948dfe456f2e34a62e78/9eba6/assembled-back.avif 1260w,
/static/be23e5ae48ac948dfe456f2e34a62e78/2fd0c/assembled-back.avif 5198w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/be23e5ae48ac948dfe456f2e34a62e78/5787a/assembled-back.webp 158w,
/static/be23e5ae48ac948dfe456f2e34a62e78/89f54/assembled-back.webp 315w,
/static/be23e5ae48ac948dfe456f2e34a62e78/4d353/assembled-back.webp 630w,
/static/be23e5ae48ac948dfe456f2e34a62e78/0f41d/assembled-back.webp 945w,
/static/be23e5ae48ac948dfe456f2e34a62e78/f27a3/assembled-back.webp 1260w,
/static/be23e5ae48ac948dfe456f2e34a62e78/fd2f2/assembled-back.webp 5198w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/be23e5ae48ac948dfe456f2e34a62e78/ebfe4/assembled-back.jpg 158w,
/static/be23e5ae48ac948dfe456f2e34a62e78/4fcc2/assembled-back.jpg 315w,
/static/be23e5ae48ac948dfe456f2e34a62e78/83b6b/assembled-back.jpg 630w,
/static/be23e5ae48ac948dfe456f2e34a62e78/33bb3/assembled-back.jpg 945w,
/static/be23e5ae48ac948dfe456f2e34a62e78/54265/assembled-back.jpg 1260w,
/static/be23e5ae48ac948dfe456f2e34a62e78/b97aa/assembled-back.jpg 5198w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/be23e5ae48ac948dfe456f2e34a62e78/83b6b/assembled-back.jpg&quot;
            alt=&quot;Back of Aeon after assembly&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;software&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#software&quot; aria-label=&quot;software permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Software&lt;/h2&gt;
&lt;p&gt;The software for this project is split into two parts: the firmware running on the STM32 microcontroller, and the image conversion scripts.&lt;/p&gt;
&lt;h3 id=&quot;firmware&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#firmware&quot; aria-label=&quot;firmware permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Firmware&lt;/h3&gt;
&lt;p&gt;The firmware for the STM32 is generally quite straightforward. The basic logic that needs to be achieved is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Read next image from SD card&lt;/li&gt;
&lt;li&gt;Send image data to display&lt;/li&gt;
&lt;li&gt;Enter standby mode and set RTC wake interval for next refresh cycle&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In practice, there is a bit more complexity to this. For example, the STM32L412K8 does not have enough RAM to store an entire image, so the image data is read from the SD card in chunks and sent to the display as it is read.&lt;/p&gt;
&lt;p&gt;Additionally, the maximum RTC wake interval duration is around 18 hours, so the firmware needs to handle this limitation by chaining multiple wakeups together to achieve the desired refresh cycle duration. The FRAM is used for this chaining, and additionally for maintaining the current image index to allow the images to be changed in the desired sequence, even after a cold start.&lt;/p&gt;
&lt;p&gt;Further logic is also present to monitor battery voltage, and to handle the various configuration settings that can be set using the DIP switches.&lt;/p&gt;
&lt;h3 id=&quot;image-conversion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#image-conversion&quot; aria-label=&quot;image conversion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Image Conversion&lt;/h3&gt;
&lt;p&gt;The 7-colour e-ink display used cannot display images in the typical RGB format. Instead, images need to be converted such that each pixel is one of the 7 available colours. This conversion is done using a Python script that reads an image file and uses the Pillow library to perform the necessary dithering and colour mapping steps.&lt;/p&gt;
&lt;p&gt;Additionally, Aeon requires images to be in a specific format to be displayed correctly. The microcontroller does not have enough resources to decode image formats like JPEG, so the &lt;a href=&quot;https://github.com/bitbank2/SLIC&quot;&gt;SLIC format&lt;/a&gt; was chosen. This is a small and simple image format that was expressly designed for use in memory constrained embedded systems, while still providing a reasonable compression ratio.&lt;/p&gt;
&lt;p&gt;The provided script handles all the necessary image conversion steps. The generated &lt;code class=&quot;language-text&quot;&gt;.slc&lt;/code&gt; files can be copied to the &lt;code class=&quot;language-text&quot;&gt;/images&lt;/code&gt; directory on the SD card.&lt;/p&gt;
&lt;h2 id=&quot;evaluation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#evaluation&quot; aria-label=&quot;evaluation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Evaluation&lt;/h2&gt;
&lt;p&gt;Aeon was designed to be a set-and-forget device, and I&apos;m happy with how close it came to this ideal. However, there are a few limitations that should be noted.&lt;/p&gt;
&lt;h3 id=&quot;energy-harvesting-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#energy-harvesting-1&quot; aria-label=&quot;energy harvesting 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Energy Harvesting&lt;/h3&gt;
&lt;p&gt;One of the main limitations is the energy harvesting capability of the device. Rather, this was very informative experiment that showed how little energy is available for harvesting from indoor light sources. Initial designs had solar panels on the front of the device, but due to the inability to harvest enough energy (and since they would be visible and unsightly), these front panels were removed.&lt;/p&gt;
&lt;p&gt;The final design relies on the solar cells on the back of the device, which means the device must be placed somewhere that receives outdoor light every so often. The device can run for months on a single charge, but if left in a dark room for an extended period of time, it will eventually run out of power. Somewhere such as a windowsill would be ideal. Direct sunlight is not necessary, even indirect light from outside is sufficient to keep the device running.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/22266510f66fd2f1848fc7cf74135fea/dc87c/windowsill.avif 158w,
/static/22266510f66fd2f1848fc7cf74135fea/383b4/windowsill.avif 315w,
/static/22266510f66fd2f1848fc7cf74135fea/d0061/windowsill.avif 630w,
/static/22266510f66fd2f1848fc7cf74135fea/20e2c/windowsill.avif 945w,
/static/22266510f66fd2f1848fc7cf74135fea/9eba6/windowsill.avif 1260w,
/static/22266510f66fd2f1848fc7cf74135fea/2fd0c/windowsill.avif 5198w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/22266510f66fd2f1848fc7cf74135fea/5787a/windowsill.webp 158w,
/static/22266510f66fd2f1848fc7cf74135fea/89f54/windowsill.webp 315w,
/static/22266510f66fd2f1848fc7cf74135fea/4d353/windowsill.webp 630w,
/static/22266510f66fd2f1848fc7cf74135fea/0f41d/windowsill.webp 945w,
/static/22266510f66fd2f1848fc7cf74135fea/f27a3/windowsill.webp 1260w,
/static/22266510f66fd2f1848fc7cf74135fea/fd2f2/windowsill.webp 5198w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/22266510f66fd2f1848fc7cf74135fea/ebfe4/windowsill.jpg 158w,
/static/22266510f66fd2f1848fc7cf74135fea/4fcc2/windowsill.jpg 315w,
/static/22266510f66fd2f1848fc7cf74135fea/83b6b/windowsill.jpg 630w,
/static/22266510f66fd2f1848fc7cf74135fea/33bb3/windowsill.jpg 945w,
/static/22266510f66fd2f1848fc7cf74135fea/54265/windowsill.jpg 1260w,
/static/22266510f66fd2f1848fc7cf74135fea/b97aa/windowsill.jpg 5198w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/22266510f66fd2f1848fc7cf74135fea/83b6b/windowsill.jpg&quot;
            alt=&quot;Aeon placed on windowsill&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Overall, I&apos;m satisfied with the low power consumption of the device. The quiescent current consumption of the device is &amp;#x3C;10uA (possibly even lower, I don&apos;t have the equipment to measure this accurately), meaning if the refresh interval is increased to longer than 24 hours, the device could stay functioning for a very long time even without any light.&lt;/p&gt;
&lt;h3 id=&quot;display-hardware&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#display-hardware&quot; aria-label=&quot;display hardware permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Display Hardware&lt;/h3&gt;
&lt;p&gt;The e-ink display that was used has a few limitations.&lt;/p&gt;
&lt;p&gt;The display takes around 30 seconds to refresh, which is quite slow. This is not a huge issue for a device that is intended to be set-and-forget, but since it takes a full minute to clear the screen and display a new image, the power consumption for a refresh cycle is quite high (in comparison to a B/W e-ink display, which would only take a few seconds to refresh).&lt;/p&gt;
&lt;p&gt;&lt;del&gt;Additionally, I wasn&apos;t able to achieve the advertised 800x480 resolution. The provided example firmware for the display writes 400x480 pixels of data (pixels on the display appear to be twice as wide as they are tall). This cuts the effective resolution in half, on a display that is already quite low resolution for its size.&lt;/del&gt; Update: this issue has been fixed!&lt;/p&gt;
&lt;p&gt;Lastly the colours of the display are quite muted. This is a limitation of the technology, however it does help the display appear more paper-like.&lt;/p&gt;
&lt;p&gt;It would be interesting to create an equivalent device using a monochrome e-ink display, which have much better resolution and refresh speeds, given that they are a simpler and more mature display technology.&lt;/p&gt;
&lt;h2 id=&quot;final-thoughts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-thoughts&quot; aria-label=&quot;final thoughts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Aeon was a very fun project to work on, and I&apos;m pretty happy with how it turned out. It gave me the opportunity to design a custom PCB, which was a great learning experience. Designing a power management system to target low quiescent current consumption was also quite interesting, I&apos;m particularly looking forward to using the AEM10941 again in future projects.&lt;/p&gt;
&lt;p&gt;The device is currently sitting on my windowsill, and I&apos;m looking forward to seeing how long it will run for.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/6033f9ce065ed312a54a1b7dfaa0f4ec/dc87c/aeon-geometric.avif 158w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/383b4/aeon-geometric.avif 315w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/d0061/aeon-geometric.avif 630w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/20e2c/aeon-geometric.avif 945w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/9eba6/aeon-geometric.avif 1260w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/2fd0c/aeon-geometric.avif 5198w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/6033f9ce065ed312a54a1b7dfaa0f4ec/5787a/aeon-geometric.webp 158w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/89f54/aeon-geometric.webp 315w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/4d353/aeon-geometric.webp 630w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/0f41d/aeon-geometric.webp 945w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/f27a3/aeon-geometric.webp 1260w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/fd2f2/aeon-geometric.webp 5198w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/6033f9ce065ed312a54a1b7dfaa0f4ec/ebfe4/aeon-geometric.jpg 158w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/4fcc2/aeon-geometric.jpg 315w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/83b6b/aeon-geometric.jpg 630w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/33bb3/aeon-geometric.jpg 945w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/54265/aeon-geometric.jpg 1260w,
/static/6033f9ce065ed312a54a1b7dfaa0f4ec/b97aa/aeon-geometric.jpg 5198w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/6033f9ce065ed312a54a1b7dfaa0f4ec/83b6b/aeon-geometric.jpg&quot;
            alt=&quot;Aeon displaying geometric shapes&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;links-and-downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#links-and-downloads&quot; aria-label=&quot;links and downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Links and Downloads&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Firmware, Image Conversion Scripts, and PCB Design Files → &lt;a href=&quot;https://github.com/nextguyover/Aeon&quot;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Display Mask Template (A4) → &lt;a href=&quot;/downloads/053cb2f45ef7870bc9053b86718611fe/aeon-display-mask-template.pdf&quot; download&gt;aeon-display-mask-template.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;3D Design Files → &lt;a href=&quot;/downloads/e144007ed2098d1e572c29a733a1db5e/aeon-frame-3d-design.step&quot; download&gt;aeon-frame-3d-design.step&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;credits&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#credits&quot; aria-label=&quot;credits permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Credits&lt;/h2&gt;
&lt;p&gt;The following resources were used in the creation of this project.&lt;/p&gt;
&lt;h4 id=&quot;software-credits&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#software-credits&quot; aria-label=&quot;software credits permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Software Credits&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SLIC image format library by &lt;a href=&quot;https://github.com/bitbank2/SLIC&quot;&gt;bitbank2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;image-credits&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#image-credits&quot; aria-label=&quot;image credits permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Image Credits&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://unsplash.com/photos/twom-white-flying-rockets-during-daytime-MEW1f-yu2KI&quot;&gt;Falcon Heavy Dual Booster Landing&lt;/a&gt; by &lt;a href=&quot;https://unsplash.com/@spacex&quot;&gt;@SpaceX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://unsplash.com/photos/a-group-of-different-colored-objects-in-a-room-HBSgQ7QR8GI&quot;&gt;Abstract 3D Shapes&lt;/a&gt; by &lt;a href=&quot;https://unsplash.com/@isavelev&quot;&gt;@isavelev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Introducing Confab Comments]]></title><description><![CDATA[In my very first blogpost, I mentioned that I would like to implement a comments section for this blog at some point, followed immediately…]]></description><link>https://insertnewline.com/blog/confab/</link><guid isPermaLink="false">https://insertnewline.com/blog/confab/</guid><pubDate>Sat, 28 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.53164556962025%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/c106db660454f83b69f58303dd10a7cc/dc87c/confab.avif 158w,
/static/c106db660454f83b69f58303dd10a7cc/383b4/confab.avif 315w,
/static/c106db660454f83b69f58303dd10a7cc/d0061/confab.avif 630w,
/static/c106db660454f83b69f58303dd10a7cc/20e2c/confab.avif 945w,
/static/c106db660454f83b69f58303dd10a7cc/9eba6/confab.avif 1260w,
/static/c106db660454f83b69f58303dd10a7cc/e76ad/confab.avif 2500w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/c106db660454f83b69f58303dd10a7cc/5787a/confab.webp 158w,
/static/c106db660454f83b69f58303dd10a7cc/89f54/confab.webp 315w,
/static/c106db660454f83b69f58303dd10a7cc/4d353/confab.webp 630w,
/static/c106db660454f83b69f58303dd10a7cc/0f41d/confab.webp 945w,
/static/c106db660454f83b69f58303dd10a7cc/f27a3/confab.webp 1260w,
/static/c106db660454f83b69f58303dd10a7cc/a5cbc/confab.webp 2500w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/c106db660454f83b69f58303dd10a7cc/ebfe4/confab.jpg 158w,
/static/c106db660454f83b69f58303dd10a7cc/4fcc2/confab.jpg 315w,
/static/c106db660454f83b69f58303dd10a7cc/83b6b/confab.jpg 630w,
/static/c106db660454f83b69f58303dd10a7cc/33bb3/confab.jpg 945w,
/static/c106db660454f83b69f58303dd10a7cc/54265/confab.jpg 1260w,
/static/c106db660454f83b69f58303dd10a7cc/75ec6/confab.jpg 2500w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/c106db660454f83b69f58303dd10a7cc/83b6b/confab.jpg&quot;
            alt=&quot;Confab Comments&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In my &lt;a href=&quot;/blog/hello-world&quot;&gt;very first blogpost&lt;/a&gt;, I mentioned that I would like to implement a comments section for this blog at some point, followed immediately by saying that I didn&apos;t have the greatest track record with completing projects; I didn&apos;t want to initially take on too much work (since I already had plans for other things that I wanted to tackle first).&lt;/p&gt;
&lt;p&gt;Well, it was a smart idea... that I didn&apos;t stick to for very long. A week later, I made the first commit on the project that would end up being &lt;a href=&quot;https://confabcomments.com&quot;&gt;Confab Comments&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&apos;ve worked on Confab on and off for about a year and a half now, and (while still not completely production ready), it&apos;s at a stage now where I&apos;d consider it to be generally feature-complete. For the small-scale site that the project is aimed at (like this blog), I think it has more than enough functionality for both users and administrators.&lt;/p&gt;
&lt;p&gt;More information about the project is available on the &lt;a href=&quot;https://confabcomments.com&quot;&gt;website&lt;/a&gt;, and all the source code is available on &lt;a href=&quot;https://github.com/nextguyover/Confab&quot;&gt;GitHub&lt;/a&gt; (feel free to leave me a star while you&apos;re there 🙂). I&apos;ve also made the effort to write up comprehensive &lt;a href=&quot;https://docs.confabcomments.com&quot;&gt;documentation&lt;/a&gt; to hopefully make integrating Confab and using it effectively on your site as easy as possible.&lt;/p&gt;
&lt;p&gt;A demo instance is available on the &lt;a href=&quot;https://confabcomments.com&quot;&gt;website&lt;/a&gt;, or you can try it out by leaving a comment right here on this blogpost!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GPS Clock]]></title><description><![CDATA[Introduction I created this simple clock with a straightforward goal: I'd never have to set the time on it manually. Not when the battery…]]></description><link>https://insertnewline.com/blog/gps-clock/</link><guid isPermaLink="false">https://insertnewline.com/blog/gps-clock/</guid><pubDate>Wed, 24 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.65822784810127%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/0864e2b923a35f31bdc437225b6131e7/dc87c/clock.avif 158w,
/static/0864e2b923a35f31bdc437225b6131e7/383b4/clock.avif 315w,
/static/0864e2b923a35f31bdc437225b6131e7/d0061/clock.avif 630w,
/static/0864e2b923a35f31bdc437225b6131e7/20e2c/clock.avif 945w,
/static/0864e2b923a35f31bdc437225b6131e7/9eba6/clock.avif 1260w,
/static/0864e2b923a35f31bdc437225b6131e7/a1b91/clock.avif 4346w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/0864e2b923a35f31bdc437225b6131e7/5787a/clock.webp 158w,
/static/0864e2b923a35f31bdc437225b6131e7/89f54/clock.webp 315w,
/static/0864e2b923a35f31bdc437225b6131e7/4d353/clock.webp 630w,
/static/0864e2b923a35f31bdc437225b6131e7/0f41d/clock.webp 945w,
/static/0864e2b923a35f31bdc437225b6131e7/f27a3/clock.webp 1260w,
/static/0864e2b923a35f31bdc437225b6131e7/a7df3/clock.webp 4346w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/0864e2b923a35f31bdc437225b6131e7/ebfe4/clock.jpg 158w,
/static/0864e2b923a35f31bdc437225b6131e7/4fcc2/clock.jpg 315w,
/static/0864e2b923a35f31bdc437225b6131e7/83b6b/clock.jpg 630w,
/static/0864e2b923a35f31bdc437225b6131e7/33bb3/clock.jpg 945w,
/static/0864e2b923a35f31bdc437225b6131e7/54265/clock.jpg 1260w,
/static/0864e2b923a35f31bdc437225b6131e7/3457c/clock.jpg 4346w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/0864e2b923a35f31bdc437225b6131e7/83b6b/clock.jpg&quot;
            alt=&quot;clock&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;introduction&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#introduction&quot; aria-label=&quot;introduction permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I created this simple clock with a straightforward goal: I&apos;d never have to set the time on it manually. Not when the battery ran out (it doesn&apos;t have a battery), not when daylight savings time started or stopped.&lt;/p&gt;
&lt;h2 id=&quot;time-source&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#time-source&quot; aria-label=&quot;time source permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Time Source&lt;/h2&gt;
&lt;p&gt;Since I didn&apos;t want to set the time manually, I had a few options for the sources of time, including Wi-Fi and GPS. I ruled out Wi-Fi because I wanted the clock to be a reliable, self-contained device that isn&apos;t reliant on anything (such as a particular Wi-Fi network) that may be unavailable at times.&lt;/p&gt;
&lt;p&gt;Since the many GPS satellite constellations going offline is quite unlikely, GPS is a better choice. Using this, I&apos;d be able to power up the clock anywhere in the world and have it automatically grab the time accurately.&lt;/p&gt;
&lt;h2 id=&quot;electronics&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#electronics&quot; aria-label=&quot;electronics permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Electronics&lt;/h2&gt;
&lt;p&gt;For the display, I chose a 8x32 LED matrix display based on the MAX7219, and for the GPS module, I chose a cheap U-blox NEO-6M breakout module. For the microcontroller I went with an ESP8266 (Wemos D1 Mini) due to its compact size.&lt;/p&gt;
&lt;p&gt;Quick note regarding the GPS module: I purchased this device for around $10, and for this price, it&apos;s almost definitely a fake. The quality is also slightly questionable: the breakout board contains a small coin-cell battery that is used to hot-start the NEO-6M by storing satellite information for a duration after power off, on the board I purchased, this battery was definitely not functional. &lt;a href=&quot;https://hagensieker.com/2022/08/01/beware-the-fake-gps-modules/&quot;&gt;This blogpost&lt;/a&gt; covers this issue of fake GPS modules, and how they likely have worse performance compared to genuine modules.&lt;/p&gt;
&lt;p&gt;The only aspect of GPS performance that matters for this project is how quickly the module is able to get the first GPS fix (it displays a loading screen during this initial wait period). If you find that this period is too long (which might particularly be an issue if the clock is being used indoors away from windows where GPS signals will be weaker), you may want to spend a bit more on a genuine GPS module.&lt;/p&gt;
&lt;p&gt;The clock also contains two pushbuttons which are used to adjust the display brightness.&lt;/p&gt;
&lt;p&gt;These components should be connected together as shown in this schematic.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/downloads/2fc205c8ad27b56500d210661adafd81/gps_clock_schematic.svg&quot; alt=&quot;clock schematic&quot;&gt;&lt;/p&gt;
&lt;p&gt;And this is what this simple circuit looks like when implemented.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 29.746835443037973%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/87f5f9ac9ad35b8d70ebff5018461279/dc87c/clock_internal.avif 158w,
/static/87f5f9ac9ad35b8d70ebff5018461279/383b4/clock_internal.avif 315w,
/static/87f5f9ac9ad35b8d70ebff5018461279/d0061/clock_internal.avif 630w,
/static/87f5f9ac9ad35b8d70ebff5018461279/20e2c/clock_internal.avif 945w,
/static/87f5f9ac9ad35b8d70ebff5018461279/9eba6/clock_internal.avif 1260w,
/static/87f5f9ac9ad35b8d70ebff5018461279/77663/clock_internal.avif 4731w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/87f5f9ac9ad35b8d70ebff5018461279/5787a/clock_internal.webp 158w,
/static/87f5f9ac9ad35b8d70ebff5018461279/89f54/clock_internal.webp 315w,
/static/87f5f9ac9ad35b8d70ebff5018461279/4d353/clock_internal.webp 630w,
/static/87f5f9ac9ad35b8d70ebff5018461279/0f41d/clock_internal.webp 945w,
/static/87f5f9ac9ad35b8d70ebff5018461279/f27a3/clock_internal.webp 1260w,
/static/87f5f9ac9ad35b8d70ebff5018461279/27fc9/clock_internal.webp 4731w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/87f5f9ac9ad35b8d70ebff5018461279/ebfe4/clock_internal.jpg 158w,
/static/87f5f9ac9ad35b8d70ebff5018461279/4fcc2/clock_internal.jpg 315w,
/static/87f5f9ac9ad35b8d70ebff5018461279/83b6b/clock_internal.jpg 630w,
/static/87f5f9ac9ad35b8d70ebff5018461279/33bb3/clock_internal.jpg 945w,
/static/87f5f9ac9ad35b8d70ebff5018461279/54265/clock_internal.jpg 1260w,
/static/87f5f9ac9ad35b8d70ebff5018461279/d8bd4/clock_internal.jpg 4731w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/87f5f9ac9ad35b8d70ebff5018461279/83b6b/clock_internal.jpg&quot;
            alt=&quot;clock internals&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;After some extended use, this clock has been working great. Having a (non internet-connected) clock that keeps time perfectly, and automatically changes to match daylight savings time, feels a little bit magical.&lt;/p&gt;
&lt;p&gt;If you&apos;re interested in building something similar, as always, all links and files are available below.&lt;/p&gt;
&lt;h2 id=&quot;links-and-downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#links-and-downloads&quot; aria-label=&quot;links and downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Links and Downloads&lt;/h2&gt;
&lt;h3 id=&quot;links&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#links&quot; aria-label=&quot;links permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nextguyover/GPS-Clock&quot;&gt;Firmware GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;purchase-links&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#purchase-links&quot; aria-label=&quot;purchase links permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Purchase Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MAX7219 8x32 LED Matrix → &lt;a href=&quot;https://www.aliexpress.com/item/1005005855156717.html&quot;&gt;Aliexpress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;NEO-6M Breakout Module → &lt;a href=&quot;https://www.aliexpress.com/item/1005005975347238.html&quot;&gt;Aliexpress&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#downloads&quot; aria-label=&quot;downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Downloads&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GPS Clock Enclosure → &lt;a href=&quot;/downloads/8e119f83f5180864394fbc651f90125d/GPS-clock-front.stl&quot; download&gt;GPS-clock-front.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/d767942618a54e9beac1bdd221b66368/GPS-clock-back.stl&quot; download&gt;GPS-clock-back.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/6e75f0d2089319910c54f7a28f923424/GPS-clock.step&quot; download&gt;GPS-clock.step&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[LED Driver Design + Death Stranding Lamp Build]]></title><description><![CDATA[Introduction Death Stranding is an action-adventure game with some intriguing story and lore. An integral part of this is the Odradek…]]></description><link>https://insertnewline.com/blog/led-driver-death-stranding-lamp/</link><guid isPermaLink="false">https://insertnewline.com/blog/led-driver-death-stranding-lamp/</guid><pubDate>Sun, 21 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 124.68354430379746%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/306627c726c8f56a7b06dd54e1b9395a/dc87c/lamp.avif 158w,
/static/306627c726c8f56a7b06dd54e1b9395a/383b4/lamp.avif 315w,
/static/306627c726c8f56a7b06dd54e1b9395a/d0061/lamp.avif 630w,
/static/306627c726c8f56a7b06dd54e1b9395a/20e2c/lamp.avif 945w,
/static/306627c726c8f56a7b06dd54e1b9395a/9eba6/lamp.avif 1260w,
/static/306627c726c8f56a7b06dd54e1b9395a/645fc/lamp.avif 3114w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/306627c726c8f56a7b06dd54e1b9395a/5787a/lamp.webp 158w,
/static/306627c726c8f56a7b06dd54e1b9395a/89f54/lamp.webp 315w,
/static/306627c726c8f56a7b06dd54e1b9395a/4d353/lamp.webp 630w,
/static/306627c726c8f56a7b06dd54e1b9395a/0f41d/lamp.webp 945w,
/static/306627c726c8f56a7b06dd54e1b9395a/f27a3/lamp.webp 1260w,
/static/306627c726c8f56a7b06dd54e1b9395a/fb93c/lamp.webp 3114w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/306627c726c8f56a7b06dd54e1b9395a/ebfe4/lamp.jpg 158w,
/static/306627c726c8f56a7b06dd54e1b9395a/4fcc2/lamp.jpg 315w,
/static/306627c726c8f56a7b06dd54e1b9395a/83b6b/lamp.jpg 630w,
/static/306627c726c8f56a7b06dd54e1b9395a/33bb3/lamp.jpg 945w,
/static/306627c726c8f56a7b06dd54e1b9395a/54265/lamp.jpg 1260w,
/static/306627c726c8f56a7b06dd54e1b9395a/1e711/lamp.jpg 3114w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/306627c726c8f56a7b06dd54e1b9395a/83b6b/lamp.jpg&quot;
            alt=&quot;Odradek lamp&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;introduction&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#introduction&quot; aria-label=&quot;introduction permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Death Stranding is an action-adventure game with some intriguing story and lore. An integral part of this is the &lt;a href=&quot;https://deathstranding.fandom.com/wiki/Odradek&quot;&gt;Odradek terrain scanner&lt;/a&gt;, a futuristic piece of sci-fi equipment that facilitates some core game mechanics. Besides this, it also looks really cool. So when I found &lt;a href=&quot;https://www.printables.com/model/40386-desk-stranding-the-death-stranding-desk-lamp&quot;&gt;this incredible Odradek lamp build&lt;/a&gt; on Printables, I knew I had to build my own.&lt;/p&gt;
&lt;p&gt;Since the 3D model files have been provided by the original creator of the lamp above, in this blog post I&apos;ll be focusing on my custom electrical design for the lamp, which consists of dimmable warm/cool white LEDs, with additional support for IR remote control.&lt;/p&gt;
&lt;h2 id=&quot;electronics&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#electronics&quot; aria-label=&quot;electronics permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Electronics&lt;/h2&gt;
&lt;p&gt;One of my core goals from the start was that the lamp had to be dimmable, and had adjustable colour temperature. This led to me choosing a 24v dual warm/cool white LED strip as the light source. For simplicity, PWM control was chosen to control the brightness of each channel. I chose the Arduino Nano as the microcontroller (since extra features such as Wi-Fi was not necessary).&lt;/p&gt;
&lt;p&gt;Based on these requirements, I designed the following schematic.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/downloads/88efac2095f4713fd631569b171f7816/schematic.svg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Read on for an explanation of each of the different sections of the schematic. For pictures of the final circuit implementation of this schematic, see &lt;a href=&quot;#electronics-assembly&quot;&gt;below&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;led-driver&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#led-driver&quot; aria-label=&quot;led driver permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;LED Driver&lt;/h4&gt;
&lt;p&gt;I used a pair of IRLZ44N N-channel logic level MOSFETs to drive each LED channel. I also decided to use a dedicated MOSFET gate driver IC, the MC34152, since I wanted to use a high PWM frequency for the best light quality when dimming (to prevent any visible flickering). This has the additional benefit of reducing switching losses in the MOSFET by minimising the time it spends in the saturation region for each switching cycle.&lt;/p&gt;
&lt;p&gt;Using the maximum PWM frequency of the Arduino, 62.5kHz, the drain (CH1) and gate (CH2) waveforms of a MOSFET looks like this when switching the LEDs.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.12658227848101%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/528e67364cb0aea02c53296654dab567/dc87c/mosfet_waveform.avif 158w,
/static/528e67364cb0aea02c53296654dab567/383b4/mosfet_waveform.avif 315w,
/static/528e67364cb0aea02c53296654dab567/d0061/mosfet_waveform.avif 630w,
/static/528e67364cb0aea02c53296654dab567/c6718/mosfet_waveform.avif 800w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/528e67364cb0aea02c53296654dab567/5787a/mosfet_waveform.webp 158w,
/static/528e67364cb0aea02c53296654dab567/89f54/mosfet_waveform.webp 315w,
/static/528e67364cb0aea02c53296654dab567/4d353/mosfet_waveform.webp 630w,
/static/528e67364cb0aea02c53296654dab567/47a22/mosfet_waveform.webp 800w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/528e67364cb0aea02c53296654dab567/dda05/mosfet_waveform.png 158w,
/static/528e67364cb0aea02c53296654dab567/679a3/mosfet_waveform.png 315w,
/static/528e67364cb0aea02c53296654dab567/50637/mosfet_waveform.png 630w,
/static/528e67364cb0aea02c53296654dab567/7842b/mosfet_waveform.png 800w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/528e67364cb0aea02c53296654dab567/50637/mosfet_waveform.png&quot;
            alt=&quot;MOSFET waveforms&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The ~67v voltage spike on the drain, which is caused by small stray inductances in the load, shows that the gate driver IC is doing it&apos;s job switching the MOSFET on and off very fast. The voltage spike should also pose no issues, as we can rely on the MOSFET&apos;s avalanche behaviour to clamp this voltage.&lt;/p&gt;
&lt;p&gt;Additionally note that the MC34152 requires a decoupling capacitor placed close by to prevent instability in the supply rails. Since this IC is charging/discharging the MOSFET gates as fast as possible, it has large instantaneous current requirements.&lt;/p&gt;
&lt;h4 id=&quot;power-supply&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#power-supply&quot; aria-label=&quot;power supply permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Power Supply&lt;/h4&gt;
&lt;p&gt;I wanted the ability to power this device using USB C Power Delivery, which requires the 5-20V input to be boosted to 24V for the LEDs. Additionally, for the Arduino and the LED driver circuitry, a lower voltage level is necessary, so a small buck converter was used to get a 10V rail.&lt;/p&gt;
&lt;p&gt;I would like to note that the power supply circuitry is non-ideal; the ON/OFF switch on the lamp doesn&apos;t actually disconnect power to the 24V boost converter, and the 10V buck converter being fed from the 24V boost converter output (which results in poor efficiency). This is because the use of USB C PD was a bit of an afterthought which required me to add the boost converter to the design to step up the USB C PD voltage. (The original plan was to use a dedicated 24V PSU.)&lt;/p&gt;
&lt;h4 id=&quot;brightness-control-inputs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#brightness-control-inputs&quot; aria-label=&quot;brightness control inputs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Brightness Control Inputs&lt;/h4&gt;
&lt;p&gt;I wanted to be able to set the light brightness using control knobs on the lamp, and also using a remote control (to control the lamp from a distance). For the control knobs, a pair of potentiometers were used, and to facilitate remote control, a simple IR receiver.&lt;/p&gt;
&lt;h4 id=&quot;sound-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sound-&quot; aria-label=&quot;sound  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sound 🔊&lt;/h4&gt;
&lt;p&gt;I decided to also add a buzzer to the design, which is always nice to include as it allows for the option of using sound to communicate information to the user.&lt;/p&gt;
&lt;h2 id=&quot;firmware&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#firmware&quot; aria-label=&quot;firmware permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Firmware&lt;/h2&gt;
&lt;p&gt;The firmware is available on &lt;a href=&quot;https://github.com/nextguyover/Odradek-Lamp-Firmware&quot;&gt;this GitHub repo&lt;/a&gt;. I&apos;ll briefly cover the functionality here, but for detailed instructions on compiling and flashing this firmware yourself, see the readme file on the repo.&lt;/p&gt;
&lt;h3 id=&quot;overview&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#overview&quot; aria-label=&quot;overview permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Overview&lt;/h3&gt;
&lt;p&gt;The main functionality of the firmware involves the Arduino continuously reading the potentiometer values and setting the PWM duty cycle for each LED channel based on this value.&lt;/p&gt;
&lt;p&gt;The Arduino is also continuously waiting for signals from the IR remote control. When any IR code is received, the program switches from setting brightness from the potentiometers to instead using the data received from the remote control. In this mode, the brightness can be set independently of the value set on the potentiometers.&lt;/p&gt;
&lt;p&gt;The input mode only switches back to the potentiometers if there is any change in the potentiometer inputs. This allows the lamp to be controlled using both the physical controls knobs and the remote control.&lt;/p&gt;
&lt;h3 id=&quot;ir-functionality&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ir-functionality&quot; aria-label=&quot;ir functionality permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;IR Functionality&lt;/h3&gt;
&lt;p&gt;The IR remote adds the following functionality:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Power on/off&lt;/li&gt;
&lt;li&gt;Warm brightness up/down&lt;/li&gt;
&lt;li&gt;Cool brightness up/down&lt;/li&gt;
&lt;li&gt;Overall brightness up/down&lt;/li&gt;
&lt;li&gt;Setting brightness presets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Setting presets utilises the buzzer to provide audible feedback when the lamp is waiting for the user to select a slot, and when a preset has been set successfully. Preset brightness values are stored on the Arduino&apos;s built-in EEPROM, so they persist between power cycles.&lt;/p&gt;
&lt;h2 id=&quot;3d-model-modifications&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3d-model-modifications&quot; aria-label=&quot;3d model modifications permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3D Model Modifications&lt;/h2&gt;
&lt;p&gt;Since my design includes a few extra features compared to the original lamp, I had to make a few modifications to the original 3D models. Each of these modified files can be found at the &lt;a href=&quot;#downloads&quot;&gt;downloads section below&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Body enclosure left → New holes and mounting was required for the two brightness control potentiometers. Additionally, I used a smaller switch switch size of 15x10.5mm.&lt;/li&gt;
&lt;li&gt;Eye front → I replaced the hole for the blue LED with a small mounting slot for the IR receiver&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also had to tweak tolerances on the desk mount to body joint part. You may have to also manually fix tolerances for certain parts depending on your 3D printer.&lt;/p&gt;
&lt;h2 id=&quot;assembly&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#assembly&quot; aria-label=&quot;assembly permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Assembly&lt;/h2&gt;
&lt;p&gt;The assembly of the lamp went relatively smoothly since it was quite well designed. I was mostly able to follow the assembly instructions provided by the original creator.&lt;/p&gt;
&lt;p&gt;Here are a few tips for the assembly process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The wiring channels to each of the light frames are quite small. Since I had to route 3 wires (Warm Anode, Cool Anode, Cathode), I used 0.4mm enamelled copper wire.&lt;/li&gt;
&lt;li&gt;Using a soldering iron makes inserting the nuts into the printed parts a lot easier.&lt;/li&gt;
&lt;li&gt;The tolerances on these parts are quite tight, so double check all your wiring before closing everything up.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;electronics-assembly&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#electronics-assembly&quot; aria-label=&quot;electronics assembly permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Electronics Assembly&lt;/h3&gt;
&lt;p&gt;The driver circuit was implemented on perfboard (which was cut to size to fit inside the enclosure section of the lamp).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.65822784810127%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/e88dda43ce01bb9feadfd295fe619fe1/dc87c/circuit.avif 158w,
/static/e88dda43ce01bb9feadfd295fe619fe1/383b4/circuit.avif 315w,
/static/e88dda43ce01bb9feadfd295fe619fe1/d0061/circuit.avif 630w,
/static/e88dda43ce01bb9feadfd295fe619fe1/20e2c/circuit.avif 945w,
/static/e88dda43ce01bb9feadfd295fe619fe1/9eba6/circuit.avif 1260w,
/static/e88dda43ce01bb9feadfd295fe619fe1/e6f69/circuit.avif 4558w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/e88dda43ce01bb9feadfd295fe619fe1/5787a/circuit.webp 158w,
/static/e88dda43ce01bb9feadfd295fe619fe1/89f54/circuit.webp 315w,
/static/e88dda43ce01bb9feadfd295fe619fe1/4d353/circuit.webp 630w,
/static/e88dda43ce01bb9feadfd295fe619fe1/0f41d/circuit.webp 945w,
/static/e88dda43ce01bb9feadfd295fe619fe1/f27a3/circuit.webp 1260w,
/static/e88dda43ce01bb9feadfd295fe619fe1/be5da/circuit.webp 4558w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/e88dda43ce01bb9feadfd295fe619fe1/ebfe4/circuit.jpg 158w,
/static/e88dda43ce01bb9feadfd295fe619fe1/4fcc2/circuit.jpg 315w,
/static/e88dda43ce01bb9feadfd295fe619fe1/83b6b/circuit.jpg 630w,
/static/e88dda43ce01bb9feadfd295fe619fe1/33bb3/circuit.jpg 945w,
/static/e88dda43ce01bb9feadfd295fe619fe1/54265/circuit.jpg 1260w,
/static/e88dda43ce01bb9feadfd295fe619fe1/b1f45/circuit.jpg 4558w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/e88dda43ce01bb9feadfd295fe619fe1/83b6b/circuit.jpg&quot;
            alt=&quot;Assembled circuit&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I used an old USB charging cable as the main power cable. I decided to repurpose the D+ and D- wires of the old cable to allow for reprogramming the Arduino Nano after closing everything up. As can be seen on the picture above, I desoldered the Mini USB connector from the Nano and soldered wires to the D+ and D- terminals.&lt;/p&gt;
&lt;p&gt;The required reprogramming terminals (GND, D+, D-) can be accessed at this separate enclosure I designed to house the USB C PD trigger board.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 89.87341772151898%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/d7599214df43b63dad135123bf94a26b/dc87c/usb_c.avif 158w,
/static/d7599214df43b63dad135123bf94a26b/383b4/usb_c.avif 315w,
/static/d7599214df43b63dad135123bf94a26b/d0061/usb_c.avif 630w,
/static/d7599214df43b63dad135123bf94a26b/20e2c/usb_c.avif 945w,
/static/d7599214df43b63dad135123bf94a26b/9eba6/usb_c.avif 1260w,
/static/d7599214df43b63dad135123bf94a26b/baffe/usb_c.avif 3319w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/d7599214df43b63dad135123bf94a26b/5787a/usb_c.webp 158w,
/static/d7599214df43b63dad135123bf94a26b/89f54/usb_c.webp 315w,
/static/d7599214df43b63dad135123bf94a26b/4d353/usb_c.webp 630w,
/static/d7599214df43b63dad135123bf94a26b/0f41d/usb_c.webp 945w,
/static/d7599214df43b63dad135123bf94a26b/f27a3/usb_c.webp 1260w,
/static/d7599214df43b63dad135123bf94a26b/25e20/usb_c.webp 3319w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/d7599214df43b63dad135123bf94a26b/ebfe4/usb_c.jpg 158w,
/static/d7599214df43b63dad135123bf94a26b/4fcc2/usb_c.jpg 315w,
/static/d7599214df43b63dad135123bf94a26b/83b6b/usb_c.jpg 630w,
/static/d7599214df43b63dad135123bf94a26b/33bb3/usb_c.jpg 945w,
/static/d7599214df43b63dad135123bf94a26b/54265/usb_c.jpg 1260w,
/static/d7599214df43b63dad135123bf94a26b/6e637/usb_c.jpg 3319w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/d7599214df43b63dad135123bf94a26b/83b6b/usb_c.jpg&quot;
            alt=&quot;USB C PD trigger board enclosure&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 127.21518987341773%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/5678f8805e82561f7323cca336a2a6f7/dc87c/lamp_2.avif 158w,
/static/5678f8805e82561f7323cca336a2a6f7/383b4/lamp_2.avif 315w,
/static/5678f8805e82561f7323cca336a2a6f7/d0061/lamp_2.avif 630w,
/static/5678f8805e82561f7323cca336a2a6f7/20e2c/lamp_2.avif 945w,
/static/5678f8805e82561f7323cca336a2a6f7/9eba6/lamp_2.avif 1260w,
/static/5678f8805e82561f7323cca336a2a6f7/0fc1d/lamp_2.avif 3456w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/5678f8805e82561f7323cca336a2a6f7/5787a/lamp_2.webp 158w,
/static/5678f8805e82561f7323cca336a2a6f7/89f54/lamp_2.webp 315w,
/static/5678f8805e82561f7323cca336a2a6f7/4d353/lamp_2.webp 630w,
/static/5678f8805e82561f7323cca336a2a6f7/0f41d/lamp_2.webp 945w,
/static/5678f8805e82561f7323cca336a2a6f7/f27a3/lamp_2.webp 1260w,
/static/5678f8805e82561f7323cca336a2a6f7/76aea/lamp_2.webp 3456w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/5678f8805e82561f7323cca336a2a6f7/ebfe4/lamp_2.jpg 158w,
/static/5678f8805e82561f7323cca336a2a6f7/4fcc2/lamp_2.jpg 315w,
/static/5678f8805e82561f7323cca336a2a6f7/83b6b/lamp_2.jpg 630w,
/static/5678f8805e82561f7323cca336a2a6f7/33bb3/lamp_2.jpg 945w,
/static/5678f8805e82561f7323cca336a2a6f7/54265/lamp_2.jpg 1260w,
/static/5678f8805e82561f7323cca336a2a6f7/89e89/lamp_2.jpg 3456w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/5678f8805e82561f7323cca336a2a6f7/83b6b/lamp_2.jpg&quot;
            alt=&quot;Odradek lamp illuminating wall art&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The final product turned out quite good, I&apos;m particularly happy with the remote brightness and colour temperature control. Additionally, using USB C PD as the power source means I have the flexibility of also powering the lamp with a portable charger when needed.&lt;/p&gt;
&lt;p&gt;Once again, massive thanks to &lt;a href=&quot;https://www.printables.com/@NilsKal&quot;&gt;@NilsKal&lt;/a&gt; on Printables for providing the 3D design of this lamp and making this build possible.&lt;/p&gt;
&lt;h2 id=&quot;links-and-downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#links-and-downloads&quot; aria-label=&quot;links and downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Links and Downloads&lt;/h2&gt;
&lt;h3 id=&quot;links&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#links&quot; aria-label=&quot;links permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Original &lt;a href=&quot;https://www.printables.com/model/40386-desk-stranding-the-death-stranding-desk-lamp/&quot;&gt;Desk Stranding Lamp Design&lt;/a&gt; by &lt;a href=&quot;https://www.printables.com/@NilsKal&quot;&gt;@NilsKal&lt;/a&gt; on Printables&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nextguyover/Odradek-Lamp-Firmware&quot;&gt;Firmware GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;purchase-links&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#purchase-links&quot; aria-label=&quot;purchase links permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Purchase Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Warm/Cool White LED Strip → &lt;a href=&quot;https://www.aliexpress.com/item/32634891197.html&quot;&gt;Aliexpress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Micro Buck Converter → &lt;a href=&quot;https://www.amazon.com/Regulator-Module-Voltage-Reducer-Adjustable/dp/B08R6337QY&quot;&gt;Amazon&lt;/a&gt; or &lt;a href=&quot;https://www.aliexpress.com/item/33013014541.html&quot;&gt;Aliexpress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mini Boost Converter → &lt;a href=&quot;https://www.aliexpress.com/item/1005006035788311.html&quot;&gt;Aliexpress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;USB C PD Trigger Board → &lt;a href=&quot;https://www.aliexpress.com/item/1005006179191517.html&quot;&gt;Aliexpress&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#downloads&quot; aria-label=&quot;downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Downloads&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Modified Body Enclosure Left → &lt;a href=&quot;/downloads/c5520bbab8b08692885e86c548422f41/body-left-modified.stl&quot; download&gt;body-left-modified.stl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Modified Eye Front → &lt;a href=&quot;/downloads/f5759d4f98d3e72da58589030d94aa29/eye-front-modified.stl&quot; download&gt;eye-front-modified.stl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;USB C PD Trigger Board Enclosure → &lt;a href=&quot;/downloads/7a0f6e354b5116b4745542364620fcb2/usb-pd-trigger-enclosure-top.stl&quot; download&gt;usb-pd-trigger-enclosure-top.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/c402efbd408f4dda31b2c6e1b85664e3/usb-pd-trigger-enclosure-bottom.stl&quot; download&gt;usb-pd-trigger-enclosure-bottom.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/2421563b055970254e8e22c7c1dbfa1c/usb-pd-trigger-enclosure.step&quot; download&gt;usb-pd-trigger-enclosure.step&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Hardware I2C (and Pong) with FPGA]]></title><description><![CDATA[Introduction FPGAs (Field Programmable Gate Arrays) are cool devices that contain internal logic elements that can be reconfigured using…]]></description><link>https://insertnewline.com/blog/hardware-i2c-and-pong-with-fpga/</link><guid isPermaLink="false">https://insertnewline.com/blog/hardware-i2c-and-pong-with-fpga/</guid><pubDate>Sun, 07 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;introduction&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#introduction&quot; aria-label=&quot;introduction permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;FPGAs (Field Programmable Gate Arrays) are cool devices that contain internal logic elements that can be reconfigured using what&apos;s known as a Hardware Description Language. HDLs (such as Verilog, which I used for this project) may look like normal programming languages at first glance, but work in a completely different way, because you use HDLs to describe the actual hardware that you want your FPGA to configure to, which may be logic elements such as AND, OR, NOT gates, adders, etc.&lt;/p&gt;
&lt;p&gt;In this blogpost, I will outline how I implemented hardware for I2C communication between a DE0-Nano FPGA and a ST7567S based 128x64 LCD display. Then I&apos;ll show how I used this implementation to play a basic game of Pong.&lt;/p&gt;
&lt;p&gt;&lt;video autoplay muted loop playsinline src=&quot;/downloads/9b9da804a83b54647b3feefbfb7f27b8/pong_demo.mp4&quot; title=&quot;Pong demo&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h2 id=&quot;planning&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#planning&quot; aria-label=&quot;planning permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Planning&lt;/h2&gt;
&lt;p&gt;To keep things simple, I decided to maintain a 128x64 frame buffer on the FPGA. I would then be able to implement a module that repeatedly iterated over this frame buffer and send pixel data to the ST7567S over I2C.&lt;/p&gt;
&lt;p&gt;This design would allow writes to the frame buffer without the need for any clock synchronisation with the module that handles the I2C communication. This should hopefully make it easier to optimise the I2C clock speed (hence, maximise the refresh rate of the display).&lt;/p&gt;
&lt;h2 id=&quot;i2c-implementation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#i2c-implementation&quot; aria-label=&quot;i2c implementation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;I2C Implementation&lt;/h2&gt;
&lt;p&gt;Again, to keep things simple, I skipped a full I2C implementation and instead went with only what was required to write data to the LCD. The ST7567S IC internally contains a DRAM frame buffer that supports both read and write. Since we are maintaining a frame buffer on the FPGA, reading from the LCD frame buffer is not necessary. So, we only need to implement a write I2C transaction.&lt;/p&gt;
&lt;p&gt;Specifics of interfacing with the ST7567S over I2C is detailed in the datasheet (see Links section below).&lt;/p&gt;
&lt;h3 id=&quot;signalling&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#signalling&quot; aria-label=&quot;signalling permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Signalling&lt;/h3&gt;
&lt;p&gt;I2C consists of two open-drain connections, SDA and SCL. SCL is the clock, which in this case will only be driven by the FPGA, so SCL doesn&apos;t strictly need to be open-drain here.&lt;/p&gt;
&lt;p&gt;However, SDA will be driven by both master and slave. So on the FPGA side, a tri-state buffer is required to output either a high-impedance state (Z) or a low state (0) on the SDA line. SDA will also need a pull-up resistor to 3.3V.&lt;/p&gt;
&lt;p&gt;As such, the connections between the FPGA and LCD will look like this.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 34.177215189873415%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/e86044aece3af3094a8a0611916dcf0c/dc87c/fpga-lcd-connection.avif 158w,
/static/e86044aece3af3094a8a0611916dcf0c/383b4/fpga-lcd-connection.avif 315w,
/static/e86044aece3af3094a8a0611916dcf0c/d0061/fpga-lcd-connection.avif 630w,
/static/e86044aece3af3094a8a0611916dcf0c/20e2c/fpga-lcd-connection.avif 945w,
/static/e86044aece3af3094a8a0611916dcf0c/9eba6/fpga-lcd-connection.avif 1260w,
/static/e86044aece3af3094a8a0611916dcf0c/65ea7/fpga-lcd-connection.avif 6472w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/e86044aece3af3094a8a0611916dcf0c/5787a/fpga-lcd-connection.webp 158w,
/static/e86044aece3af3094a8a0611916dcf0c/89f54/fpga-lcd-connection.webp 315w,
/static/e86044aece3af3094a8a0611916dcf0c/4d353/fpga-lcd-connection.webp 630w,
/static/e86044aece3af3094a8a0611916dcf0c/0f41d/fpga-lcd-connection.webp 945w,
/static/e86044aece3af3094a8a0611916dcf0c/f27a3/fpga-lcd-connection.webp 1260w,
/static/e86044aece3af3094a8a0611916dcf0c/98f90/fpga-lcd-connection.webp 6472w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/e86044aece3af3094a8a0611916dcf0c/dda05/fpga-lcd-connection.png 158w,
/static/e86044aece3af3094a8a0611916dcf0c/679a3/fpga-lcd-connection.png 315w,
/static/e86044aece3af3094a8a0611916dcf0c/50637/fpga-lcd-connection.png 630w,
/static/e86044aece3af3094a8a0611916dcf0c/fddb0/fpga-lcd-connection.png 945w,
/static/e86044aece3af3094a8a0611916dcf0c/f46b1/fpga-lcd-connection.png 1260w,
/static/e86044aece3af3094a8a0611916dcf0c/d9f58/fpga-lcd-connection.png 6472w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/e86044aece3af3094a8a0611916dcf0c/50637/fpga-lcd-connection.png&quot;
            alt=&quot;Connection diagram between FPGA and LCD&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;transmitter-module&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#transmitter-module&quot; aria-label=&quot;transmitter module permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Transmitter Module&lt;/h3&gt;
&lt;p&gt;To keep things short, I won&apos;t cover the low level details of how I2C works (there are great resources available elsewhere). At a high level, the write I2C transaction consists of the following parts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start condition&lt;/li&gt;
&lt;li&gt;Slave address&lt;/li&gt;
&lt;li&gt;Receive ACK from ST7567S&lt;/li&gt;
&lt;li&gt;Register address&lt;/li&gt;
&lt;li&gt;Receive ACK from ST7567S&lt;/li&gt;
&lt;li&gt;Data byte to save to register&lt;/li&gt;
&lt;li&gt;Receive ACK from ST7567S&lt;/li&gt;
&lt;li&gt;Stop condition&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The I2C transmitter module (&lt;code class=&quot;language-text&quot;&gt;i2c_transmitter.v&lt;/code&gt;) has been implemented using a Finite State Machine (FSM). I found that a good starting point was to create one state for each part of the transaction above. I then added a few more states to handle the stop condition correctly.&lt;/p&gt;
&lt;h3 id=&quot;initialising-lcd&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#initialising-lcd&quot; aria-label=&quot;initialising lcd permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Initialising LCD&lt;/h3&gt;
&lt;p&gt;With the I2C transmitter ready, the next step involves actually sending data to the LCD. Before we can start drawing anything to the display, the LCD has to be initialised. For this, a sequence of data is written to the LCD to reset it, configure LCD drive parameters, then enable the display. See the source code linked below for a full explanation of all static data that is sent during initialisation.&lt;/p&gt;
&lt;p&gt;This static data is stored and sent to the I2C transmitter module from the &lt;code class=&quot;language-text&quot;&gt;i2c_data_static.v&lt;/code&gt; module. After this data transfer is complete, the &lt;code class=&quot;language-text&quot;&gt;init_complete&lt;/code&gt; flag is set, which switches the data source for the I2C transmitter from the static data to the frame buffer.&lt;/p&gt;
&lt;h2 id=&quot;frame-buffer-implementation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#frame-buffer-implementation&quot; aria-label=&quot;frame buffer implementation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Frame Buffer Implementation&lt;/h2&gt;
&lt;p&gt;After the initialisation data is sent to the LCD, the &lt;code class=&quot;language-text&quot;&gt;frame_buffer.v&lt;/code&gt; module takes over to send data to the I2C transmitter. This module simply iterates through the frame buffer and continuously sends display data to the LCD.&lt;/p&gt;
&lt;h3 id=&quot;optimisations&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#optimisations&quot; aria-label=&quot;optimisations permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Optimisations&lt;/h3&gt;
&lt;p&gt;To get the fastest update speed possible, I had to perform some optimisation on the main update cycle. Rather than setting the page (row of bytes) and column before sending each byte of data, the Read-modify-Write mode of the ST7567S was used, which auto-increments the column pointer when a byte is written. Additionally, incrementing the page number is only done when starting a new row.&lt;/p&gt;
&lt;p&gt;With these optimisations, I was able to achieve a display refresh rate of ~14.7Hz, with a corresponding SCL frequency of 890KHz. This decently fast for I2C, and I was likely limited due to the wires and breadboard connections I was using for my test setup.&lt;/p&gt;
&lt;p&gt;Further optimisation is still possible, as the ST7567S supports burst writes (writing multiple bytes in single transaction). Using this would allow for faster writes as the additional overhead of sending the start and stop condition would be removed. I decided against implementing burst writes for this small proof-of-concept project to keep things simple.&lt;/p&gt;
&lt;h2 id=&quot;pong-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pong-&quot; aria-label=&quot;pong  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pong! 🏓&lt;/h2&gt;
&lt;p&gt;With the frame buffer functional, I needed something to test the whole system. I chose to implement a basic version of the Pong game since it&apos;s quite simple.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;process.v&lt;/code&gt; module implements the game, which essentially involves moving through each column of 64 in the frame buffer, and for each column, setting bits to &lt;code class=&quot;language-text&quot;&gt;1&lt;/code&gt; where a paddle or the ball is found. This module can run at arbitrarily fast clock speeds in comparison to the I2C logic, as the frame buffer writes are independent of reads.&lt;/p&gt;
&lt;p&gt;The user inputs to move the paddles are from four pushbuttons (with corresponding pull-down resistors) connected to four GPIOs on the FPGA.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;That&apos;s it! Feel free to check out the Verilog source files in the Links section below.&lt;/p&gt;
&lt;h1 id=&quot;links-and-downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#links-and-downloads&quot; aria-label=&quot;links and downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Links and Downloads&lt;/h1&gt;
&lt;h3 id=&quot;links&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#links&quot; aria-label=&quot;links permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nextguyover/FPGA-I2C-Pong&quot;&gt;Verilog Source GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#downloads&quot; aria-label=&quot;downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Downloads&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ST7567S Datasheet → &lt;a href=&quot;/downloads/53c0505fed6a18bcf2075577f047c50e/ST7567S.pdf&quot; download&gt;ST7567S.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Solis Solar Data Acquisition with ESPHome]]></title><description><![CDATA[Introduction I recently had a solar system installed, which included a Solis S5-GR1P5K Inverter and a Solis-EPM1-5G Export Power Manager…]]></description><link>https://insertnewline.com/blog/Solis-solar-esphome/</link><guid isPermaLink="false">https://insertnewline.com/blog/Solis-solar-esphome/</guid><pubDate>Sun, 23 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;introduction&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#introduction&quot; aria-label=&quot;introduction permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Introduction&lt;/h1&gt;
&lt;p&gt;I recently had a solar system installed, which included a Solis S5-GR1P5K Inverter and a Solis-EPM1-5G Export Power Manager (EPM).&lt;/p&gt;
&lt;p&gt;The inverter is responsible for the DC to AC mains step-up required to use the energy generated by the photovoltaic (PV) cells for grid-connected appliances in the house, and for backfeeding into the grid when there is an excess of generated power. The EPM is simply measuring the power flowing in/out of the house. This is necessary for consumption measurement, since the inverter only reports the power generation.&lt;/p&gt;
&lt;p&gt;This system comes with a Wi-Fi adaptor that reports all generation/consumption data back to the manufacturer, Solis, who makes these available to the user through the SolisCloud App.&lt;/p&gt;
&lt;p&gt;Naturally, I wanted direct access to this data to integrate it into Home Assistant. This would let me view live data on my own custom dashboards, and also maintain long-term statistics.&lt;/p&gt;
&lt;h2 id=&quot;why-not-use-solis-api&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-not-use-solis-api&quot; aria-label=&quot;why not use solis api permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why Not Use Solis API?&lt;/h2&gt;
&lt;p&gt;To get access to the raw data values, Solis does provide an API to pull this data from their servers. Someone has created a &lt;a href=&quot;https://github.com/hultenvp/solis-sensor&quot;&gt;Home Assistant integration&lt;/a&gt; for this purpose, which works quite well. However, this solution comes with quite a few downsides.&lt;/p&gt;
&lt;p&gt;Firstly, Solis asks you to sign an NDA and agree to T&amp;#x26;Cs to get access to the API, which is an unnecessary hassle; you shouldn&apos;t need to sign anything away to get access to data that is generated by hardware that you paid for and own.&lt;/p&gt;
&lt;p&gt;Secondly, the data ingestion rate for SolisCloud is every five minutes, meaning the max rate that you can get data for your PV system is quite slow.&lt;/p&gt;
&lt;h2 id=&quot;local-data-access&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#local-data-access&quot; aria-label=&quot;local data access permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Local Data Access&lt;/h2&gt;
&lt;p&gt;This entire project would not be necessary if Solis provided a local data access method so that we could query the PV system locally without having to go through their servers. Since this is not the case, I&apos;ll be detailing how we can do this ourselves to get the data we need directly from the PV system.&lt;/p&gt;
&lt;h1 id=&quot;hardware&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hardware&quot; aria-label=&quot;hardware permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hardware&lt;/h1&gt;
&lt;p&gt;The Solis inverter, EPM, and Wi-Fi adaptor communicates with each other using the RS485 protocol. The inverter and EPM have registers that the Wi-Fi adaptor reads/writes to using this protocol (to read data, or set certain settings on the inverter or EPM). Our task is to replace the functionality of the Wi-Fi adaptor with our own hardware.&lt;/p&gt;
&lt;p&gt;For an extremely detailed reverse engineering of the original Solis Wi-Fi adaptor (plus additional details on what it takes to replace it), see &lt;a href=&quot;https://github.com/hn/ginlong-solis&quot;&gt;this GitHub Repo&lt;/a&gt;. When I was working on my own implementation detailed here, this resource was an invaluable starting point.&lt;/p&gt;
&lt;p&gt;The above repo provides information about reflashing the original Wi-Fi adaptor with ESPHome. This may be the best option if your solar system is outdoors, as the original device is weatherproof.&lt;/p&gt;
&lt;p&gt;However, my installation is indoors, so I do not need it to be weatherproof. So I decided not to do this due to a couple of reasons: I wanted to keep my original Wi-Fi adaptor functional, and building a replacement was cheaper than buying a second one.&lt;/p&gt;
&lt;h2 id=&quot;electronics&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#electronics&quot; aria-label=&quot;electronics permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Electronics&lt;/h2&gt;
&lt;p&gt;The design of the replacement is quite simple. All we need is a RS485 (Modbus) to UART module (I used the HW-0519), and an ESP8266/ESP32 (I used the ESP32) to use as the ESPHome node. These are connected together, and also to the Modbus connector as shown.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.64556962025317%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/02029eafa51af22d6ea560ac53184a71/dc87c/wiring.avif 158w,
/static/02029eafa51af22d6ea560ac53184a71/383b4/wiring.avif 315w,
/static/02029eafa51af22d6ea560ac53184a71/d0061/wiring.avif 630w,
/static/02029eafa51af22d6ea560ac53184a71/20e2c/wiring.avif 945w,
/static/02029eafa51af22d6ea560ac53184a71/9eba6/wiring.avif 1260w,
/static/02029eafa51af22d6ea560ac53184a71/ba0d3/wiring.avif 5621w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/02029eafa51af22d6ea560ac53184a71/5787a/wiring.webp 158w,
/static/02029eafa51af22d6ea560ac53184a71/89f54/wiring.webp 315w,
/static/02029eafa51af22d6ea560ac53184a71/4d353/wiring.webp 630w,
/static/02029eafa51af22d6ea560ac53184a71/0f41d/wiring.webp 945w,
/static/02029eafa51af22d6ea560ac53184a71/f27a3/wiring.webp 1260w,
/static/02029eafa51af22d6ea560ac53184a71/974e8/wiring.webp 5621w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/02029eafa51af22d6ea560ac53184a71/dda05/wiring.png 158w,
/static/02029eafa51af22d6ea560ac53184a71/679a3/wiring.png 315w,
/static/02029eafa51af22d6ea560ac53184a71/50637/wiring.png 630w,
/static/02029eafa51af22d6ea560ac53184a71/fddb0/wiring.png 945w,
/static/02029eafa51af22d6ea560ac53184a71/f46b1/wiring.png 1260w,
/static/02029eafa51af22d6ea560ac53184a71/6e105/wiring.png 5621w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/02029eafa51af22d6ea560ac53184a71/50637/wiring.png&quot;
            alt=&quot;wiring&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The system here is powered by the 5V rail from the Modbus connector.&lt;/p&gt;
&lt;h2 id=&quot;connector-and-enclosure&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#connector-and-enclosure&quot; aria-label=&quot;connector and enclosure permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Connector and Enclosure&lt;/h2&gt;
&lt;p&gt;The RS485 connection is implemented in the Solis system using the Exceedconn EC04681-2014-BF connector. This can be purchased online, but doesn&apos;t seem to be available from first-party sellers, and third party sources (see purchase links) are quite expensive.&lt;/p&gt;
&lt;p&gt;So, I instead modelled the connector and 3D printed it.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2bb62b0730b75f53abd7db2de2c8a6f5/dc87c/modbus_render.avif 158w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/383b4/modbus_render.avif 315w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/d0061/modbus_render.avif 630w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/20e2c/modbus_render.avif 945w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/9eba6/modbus_render.avif 1260w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/e76ad/modbus_render.avif 2500w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/2bb62b0730b75f53abd7db2de2c8a6f5/5787a/modbus_render.webp 158w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/89f54/modbus_render.webp 315w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/4d353/modbus_render.webp 630w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/0f41d/modbus_render.webp 945w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/f27a3/modbus_render.webp 1260w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/a5cbc/modbus_render.webp 2500w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2bb62b0730b75f53abd7db2de2c8a6f5/dda05/modbus_render.png 158w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/679a3/modbus_render.png 315w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/50637/modbus_render.png 630w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/fddb0/modbus_render.png 945w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/f46b1/modbus_render.png 1260w,
/static/2bb62b0730b75f53abd7db2de2c8a6f5/f2999/modbus_render.png 2500w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2bb62b0730b75f53abd7db2de2c8a6f5/50637/modbus_render.png&quot;
            alt=&quot;modbus render&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I printed this with a 0.4mm nozzle in TPU with, 0.12mm layer height, 0% infill and two outer wall layers. Since the connector is quite large, all the details present came through on the final print.&lt;/p&gt;
&lt;p&gt;I also designed an enclosure that would hold the electronics. This should ideally printed in something more heat-resistant than PLA (e.g. PETG or ABS). The final implementation looks like this.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 71.51898734177216%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/890be3913dd28c942b21340eff1924f6/dc87c/node_final.avif 158w,
/static/890be3913dd28c942b21340eff1924f6/383b4/node_final.avif 315w,
/static/890be3913dd28c942b21340eff1924f6/d0061/node_final.avif 630w,
/static/890be3913dd28c942b21340eff1924f6/20e2c/node_final.avif 945w,
/static/890be3913dd28c942b21340eff1924f6/9eba6/node_final.avif 1260w,
/static/890be3913dd28c942b21340eff1924f6/f95d0/node_final.avif 3301w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/890be3913dd28c942b21340eff1924f6/5787a/node_final.webp 158w,
/static/890be3913dd28c942b21340eff1924f6/89f54/node_final.webp 315w,
/static/890be3913dd28c942b21340eff1924f6/4d353/node_final.webp 630w,
/static/890be3913dd28c942b21340eff1924f6/0f41d/node_final.webp 945w,
/static/890be3913dd28c942b21340eff1924f6/f27a3/node_final.webp 1260w,
/static/890be3913dd28c942b21340eff1924f6/82552/node_final.webp 3301w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/890be3913dd28c942b21340eff1924f6/ebfe4/node_final.jpg 158w,
/static/890be3913dd28c942b21340eff1924f6/4fcc2/node_final.jpg 315w,
/static/890be3913dd28c942b21340eff1924f6/83b6b/node_final.jpg 630w,
/static/890be3913dd28c942b21340eff1924f6/33bb3/node_final.jpg 945w,
/static/890be3913dd28c942b21340eff1924f6/54265/node_final.jpg 1260w,
/static/890be3913dd28c942b21340eff1924f6/264d7/node_final.jpg 3301w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/890be3913dd28c942b21340eff1924f6/83b6b/node_final.jpg&quot;
            alt=&quot;node final&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I stripped ~35mm of low gauge wire, pulled it through the connection holes in the 3D printed Modbus connector, then bent it around to the outside and hot-glued them inside the channels on the outer cylinder. These are the DIY contacts for the connector.&lt;/p&gt;
&lt;p&gt;It&apos;s quite a janky solution, but since my installation has no weatherproofing requirements, it works without any issues.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 71.51898734177216%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/acf905303c3d943afccc5031fab10d65/dc87c/node_plugged_in.avif 158w,
/static/acf905303c3d943afccc5031fab10d65/383b4/node_plugged_in.avif 315w,
/static/acf905303c3d943afccc5031fab10d65/d0061/node_plugged_in.avif 630w,
/static/acf905303c3d943afccc5031fab10d65/20e2c/node_plugged_in.avif 945w,
/static/acf905303c3d943afccc5031fab10d65/9eba6/node_plugged_in.avif 1260w,
/static/acf905303c3d943afccc5031fab10d65/9e309/node_plugged_in.avif 4437w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/acf905303c3d943afccc5031fab10d65/5787a/node_plugged_in.webp 158w,
/static/acf905303c3d943afccc5031fab10d65/89f54/node_plugged_in.webp 315w,
/static/acf905303c3d943afccc5031fab10d65/4d353/node_plugged_in.webp 630w,
/static/acf905303c3d943afccc5031fab10d65/0f41d/node_plugged_in.webp 945w,
/static/acf905303c3d943afccc5031fab10d65/f27a3/node_plugged_in.webp 1260w,
/static/acf905303c3d943afccc5031fab10d65/dbe8a/node_plugged_in.webp 4437w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/acf905303c3d943afccc5031fab10d65/ebfe4/node_plugged_in.jpg 158w,
/static/acf905303c3d943afccc5031fab10d65/4fcc2/node_plugged_in.jpg 315w,
/static/acf905303c3d943afccc5031fab10d65/83b6b/node_plugged_in.jpg 630w,
/static/acf905303c3d943afccc5031fab10d65/33bb3/node_plugged_in.jpg 945w,
/static/acf905303c3d943afccc5031fab10d65/54265/node_plugged_in.jpg 1260w,
/static/acf905303c3d943afccc5031fab10d65/dad50/node_plugged_in.jpg 4437w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/acf905303c3d943afccc5031fab10d65/83b6b/node_plugged_in.jpg&quot;
            alt=&quot;node plugged in&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h1 id=&quot;software&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#software&quot; aria-label=&quot;software permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Software&lt;/h1&gt;
&lt;p&gt;All the config files referenced here can be found on &lt;a href=&quot;https://github.com/nextguyover/ginlong-solis&quot;&gt;my fork of the original repo&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;base-config&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#base-config&quot; aria-label=&quot;base config permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Base Config&lt;/h2&gt;
&lt;p&gt;I&apos;ve made some modifications to the original base config to work with the ESP32, this can be found &lt;a href=&quot;https://github.com/nextguyover/ginlong-solis/blob/master/solis-esphome-esp32.yaml&quot;&gt;here&lt;/a&gt;. This config requires that you have a valid &lt;code class=&quot;language-text&quot;&gt;secrets.yaml&lt;/code&gt; file with the required values. You will additionally need to fill out the timezone string for your particular location.&lt;/p&gt;
&lt;h2 id=&quot;inverter-and-epm-configs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#inverter-and-epm-configs&quot; aria-label=&quot;inverter and epm configs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Inverter and EPM Configs&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/nextguyover/ginlong-solis/blob/master/solis-modbus-inv.yaml&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;solis-modbus-inv.yaml&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://github.com/nextguyover/ginlong-solis/blob/master/solis-modbus-epm.yaml&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;solis-modbus-epm.yaml&lt;/code&gt;&lt;/a&gt; files contain the specifics of communicating with the inverter and EPM respectively. These files should be placed in the paths specified in the &lt;code class=&quot;language-text&quot;&gt;packages&lt;/code&gt; section of the base config (&lt;code class=&quot;language-text&quot;&gt;esphome/common/&lt;/code&gt; in this case).&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;solis-modbus-inv.yaml&lt;/code&gt; file was forked from the previously referenced GitHub repo, with only minor changes.&lt;/p&gt;
&lt;p&gt;I created the &lt;code class=&quot;language-text&quot;&gt;solis-modbus-epm.yaml&lt;/code&gt; file as the original author did not have a config for the EPM. This was created based on Solis RS485 protocol documentation (see below for download).&lt;/p&gt;
&lt;h3 id=&quot;limitations&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#limitations&quot; aria-label=&quot;limitations permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Limitations&lt;/h3&gt;
&lt;p&gt;The settings of the inverter and EPM can be changed over Modbus, however, I wasn&apos;t able to get this to reliably work for the inverter. Since I didn&apos;t require this functionality, I chose to remove these sections from my versions of the configs. See &lt;a href=&quot;https://github.com/hn/ginlong-solis/issues/35&quot;&gt;this GitHub issue&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h1 id=&quot;additional-data-processing-in-home-assistant&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#additional-data-processing-in-home-assistant&quot; aria-label=&quot;additional data processing in home assistant permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Additional Data Processing in Home Assistant&lt;/h1&gt;
&lt;h2 id=&quot;outlier-rejection-and-improved-power-resolution&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#outlier-rejection-and-improved-power-resolution&quot; aria-label=&quot;outlier rejection and improved power resolution permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Outlier Rejection and Improved Power Resolution&lt;/h2&gt;
&lt;p&gt;While my own implementation has been working quite well over several months, I have noticed that occasionally some of the EPM values will go unrealistically high/low. This seems to be an issue with the data that is being returned by the EPM itself, so I&apos;ve implemented some software filtering within Home Assistant to prevent these outliers flowing through to visualisations, etc.&lt;/p&gt;
&lt;p&gt;Additionally, the power figures returned by the EPM have a maximum resolution of 100w. As a workaround to get better resolution, the voltage and current can be multiplied together to get the power.&lt;/p&gt;
&lt;p&gt;Both of these fixes can be implemented as a template sensor:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# configuration.yaml&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;sensor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; template
    &lt;span class=&quot;token key atrule&quot;&gt;sensors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;solar_epm_power_a_high_res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;friendly_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Solar EPM Power A High Res&quot;&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;device_class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; power
        &lt;span class=&quot;token key atrule&quot;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; W
        &lt;span class=&quot;token key atrule&quot;&gt;value_template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
          {% if states(&apos;sensor.solar_epm_ac_i_a&apos;) | float &amp;lt;= 100 %}
            {{ (states(&apos;sensor.solar_epm_ac_i_a&apos;) | float * states(&apos;sensor.solar_epm_ac_v_a&apos;) | float) | round(-1) | int * (-1 if states(&apos;sensor.solar_epm_power_a&apos;) | int &gt; 0 else 1) }}
          {% endif %}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;calculating-energy-consumption&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#calculating-energy-consumption&quot; aria-label=&quot;calculating energy consumption permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Calculating Energy Consumption&lt;/h2&gt;
&lt;p&gt;A template sensor that monitors actual energy consumption can be implemented as follows:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# configuration.yaml&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;sensor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; template
    &lt;span class=&quot;token key atrule&quot;&gt;sensors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;solar_home_consumption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;friendly_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Solar Home Consumption&quot;&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;device_class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; power
        &lt;span class=&quot;token key atrule&quot;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; W
        &lt;span class=&quot;token key atrule&quot;&gt;value_template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ (states(&apos;sensor.solar_epm_power_a_high_res&apos;) | float + states(&apos;sensor.solar_active_power&apos;) | float(0)) | round(-1) | int }}&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1 id=&quot;final-thoughts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-thoughts&quot; aria-label=&quot;final thoughts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final Thoughts&lt;/h1&gt;
&lt;p&gt;That&apos;s it! After flashing the ESPHome config and plugging in the node, you should be able to access your Solis inverter and EPM data from Home Assistant.&lt;/p&gt;
&lt;p&gt;Do note that since you will not be able to use the original Solis Wi-Fi stick concurrently with ESPHome, your solar production and consumption data will not be getting sent to Solis. This means the SolisCloud app will not work any more; if you need data visualisation, you will need to set this up yourself within Home Assistant. Additionally, you are now responsible for saving and backing up your own data. For long term storage I use &lt;a href=&quot;https://github.com/hassio-addons/addon-influxdb&quot;&gt;InfluxDB&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&quot;links-and-downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#links-and-downloads&quot; aria-label=&quot;links and downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Links and Downloads&lt;/h1&gt;
&lt;h3 id=&quot;downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#downloads&quot; aria-label=&quot;downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Downloads&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Modbus Port 3D Model → &lt;a href=&quot;/downloads/7a45f27800e7c3a111642688967b7b9b/modbus_port.stl&quot; download&gt;modbus_port.stl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enclosure 3D Model → &lt;a href=&quot;/downloads/790481eb1000d5fe3fad9e2acd95d007/enclosure_p1.stl&quot; download&gt;enclosure_p1.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/1d3468972349d587c9c5f7a6a97bb0a7/enclosure_p2.stl&quot; download&gt;enclosure_p2.stl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ESPHome Node Full Design (port + enclosure) → &lt;a href=&quot;/downloads/0f1f0c388d309fde40d936dee706406f/solis_esphome_node_full.step&quot; download&gt;solis_esphome_node_full.step&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Solis RS485 Docs → &lt;a href=&quot;/downloads/fab54ad6c7b90b72edb7192600f8ac5a/Solis_RS485.pdf&quot; download&gt;Solis_RS485.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;purchase-links&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#purchase-links&quot; aria-label=&quot;purchase links permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Purchase Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;HW-0519 RS485 to UART Module → &lt;a href=&quot;https://www.aliexpress.com/item/1005005866372508.html&quot;&gt;Aliexpress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Exceedconn EC04681-2014-BF connector → &lt;a href=&quot;https://www.ebay.com.au/itm/155648938095&quot;&gt;eBay&lt;/a&gt; (third-party)&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[SV06 LED Lighting Fixture Mod]]></title><description><![CDATA[Introduction Nice bright lighting for your 3D printer is almost necessary if you plan on doing any kind of timelapse of your prints…]]></description><link>https://insertnewline.com/blog/SV06-led-lighting/</link><guid isPermaLink="false">https://insertnewline.com/blog/SV06-led-lighting/</guid><pubDate>Sat, 10 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;introduction&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#introduction&quot; aria-label=&quot;introduction permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Nice bright lighting for your 3D printer is almost necessary if you plan on doing any kind of timelapse of your prints. Lighting is also just useful when inspecting ongoing prints, or even just for taking glamour shots of your finished prints.&lt;/p&gt;
&lt;p&gt;In this post, I&apos;ll show how I designed, installed and wired up this lighting setup for my Sovol SV06 3D printer.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.9493670886076%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/59b86714d580b73dae6e9d18af48e419/dc87c/lighting-overall-showcase.avif 158w,
/static/59b86714d580b73dae6e9d18af48e419/383b4/lighting-overall-showcase.avif 315w,
/static/59b86714d580b73dae6e9d18af48e419/d0061/lighting-overall-showcase.avif 630w,
/static/59b86714d580b73dae6e9d18af48e419/20e2c/lighting-overall-showcase.avif 945w,
/static/59b86714d580b73dae6e9d18af48e419/9eba6/lighting-overall-showcase.avif 1260w,
/static/59b86714d580b73dae6e9d18af48e419/11253/lighting-overall-showcase.avif 4543w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/59b86714d580b73dae6e9d18af48e419/5787a/lighting-overall-showcase.webp 158w,
/static/59b86714d580b73dae6e9d18af48e419/89f54/lighting-overall-showcase.webp 315w,
/static/59b86714d580b73dae6e9d18af48e419/4d353/lighting-overall-showcase.webp 630w,
/static/59b86714d580b73dae6e9d18af48e419/0f41d/lighting-overall-showcase.webp 945w,
/static/59b86714d580b73dae6e9d18af48e419/f27a3/lighting-overall-showcase.webp 1260w,
/static/59b86714d580b73dae6e9d18af48e419/66ded/lighting-overall-showcase.webp 4543w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/59b86714d580b73dae6e9d18af48e419/ebfe4/lighting-overall-showcase.jpg 158w,
/static/59b86714d580b73dae6e9d18af48e419/4fcc2/lighting-overall-showcase.jpg 315w,
/static/59b86714d580b73dae6e9d18af48e419/83b6b/lighting-overall-showcase.jpg 630w,
/static/59b86714d580b73dae6e9d18af48e419/33bb3/lighting-overall-showcase.jpg 945w,
/static/59b86714d580b73dae6e9d18af48e419/54265/lighting-overall-showcase.jpg 1260w,
/static/59b86714d580b73dae6e9d18af48e419/896b4/lighting-overall-showcase.jpg 4543w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/59b86714d580b73dae6e9d18af48e419/83b6b/lighting-overall-showcase.jpg&quot;
            alt=&quot;lighting overall showcase&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you&apos;re interested in installing this lighting fixture yourself, downloads and links, as always, can be found at the end of this post.&lt;/p&gt;
&lt;h2 id=&quot;design&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#design&quot; aria-label=&quot;design permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Design&lt;/h2&gt;
&lt;p&gt;To keep the electrical design minimal, I used LED strips which are rated for 24v, which is the same voltage as the printer power supply, meaning they can be wired directly to the printer&apos;s power supply without any additional circuitry.&lt;/p&gt;
&lt;p&gt;Next, the physical design of the fixture. To get the best possible lighting, the fixture requires six separate parts. The first two parts are the mounts that slide snugly onto the z-axis gantry endcap of the printer.&lt;/p&gt;
&lt;p&gt;The remaining four light &apos;sticks&apos; can have LED strips glued onto them. Wiring channels are built-in, so that cable management is discrete. After the light sticks are slid into the mounts, cables can be managed at the back of the printer so they are less visible. Note that the two light sticks over the front of the printer have space for a double length LED strip section (~100mm), while the two rear light sticks only have a single length (~50mm).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/d5ba6e31ae35acf41e7b41df827cfe27/dc87c/lights-image-upward.avif 158w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/383b4/lights-image-upward.avif 315w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/d0061/lights-image-upward.avif 630w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/20e2c/lights-image-upward.avif 945w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/9eba6/lights-image-upward.avif 1260w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/ae053/lights-image-upward.avif 5184w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/d5ba6e31ae35acf41e7b41df827cfe27/5787a/lights-image-upward.webp 158w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/89f54/lights-image-upward.webp 315w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/4d353/lights-image-upward.webp 630w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/0f41d/lights-image-upward.webp 945w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/f27a3/lights-image-upward.webp 1260w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/d5be9/lights-image-upward.webp 5184w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/d5ba6e31ae35acf41e7b41df827cfe27/ebfe4/lights-image-upward.jpg 158w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/4fcc2/lights-image-upward.jpg 315w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/83b6b/lights-image-upward.jpg 630w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/33bb3/lights-image-upward.jpg 945w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/54265/lights-image-upward.jpg 1260w,
/static/d5ba6e31ae35acf41e7b41df827cfe27/640cf/lights-image-upward.jpg 5184w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/d5ba6e31ae35acf41e7b41df827cfe27/83b6b/lights-image-upward.jpg&quot;
            alt=&quot;Image of lights&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;printing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#printing&quot; aria-label=&quot;printing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Printing&lt;/h2&gt;
&lt;p&gt;Printing the mounts are very straightforward, and do not require any supports. They don&apos;t have any thermal requirements, and can be printed out in any material.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.10126582278481%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/877eb2cda48de27b7eee179aff8e18b1/dc87c/mount-showcase.avif 158w,
/static/877eb2cda48de27b7eee179aff8e18b1/383b4/mount-showcase.avif 315w,
/static/877eb2cda48de27b7eee179aff8e18b1/d0061/mount-showcase.avif 630w,
/static/877eb2cda48de27b7eee179aff8e18b1/20e2c/mount-showcase.avif 945w,
/static/877eb2cda48de27b7eee179aff8e18b1/9eba6/mount-showcase.avif 1260w,
/static/877eb2cda48de27b7eee179aff8e18b1/14258/mount-showcase.avif 5101w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/877eb2cda48de27b7eee179aff8e18b1/5787a/mount-showcase.webp 158w,
/static/877eb2cda48de27b7eee179aff8e18b1/89f54/mount-showcase.webp 315w,
/static/877eb2cda48de27b7eee179aff8e18b1/4d353/mount-showcase.webp 630w,
/static/877eb2cda48de27b7eee179aff8e18b1/0f41d/mount-showcase.webp 945w,
/static/877eb2cda48de27b7eee179aff8e18b1/f27a3/mount-showcase.webp 1260w,
/static/877eb2cda48de27b7eee179aff8e18b1/461b6/mount-showcase.webp 5101w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/877eb2cda48de27b7eee179aff8e18b1/ebfe4/mount-showcase.jpg 158w,
/static/877eb2cda48de27b7eee179aff8e18b1/4fcc2/mount-showcase.jpg 315w,
/static/877eb2cda48de27b7eee179aff8e18b1/83b6b/mount-showcase.jpg 630w,
/static/877eb2cda48de27b7eee179aff8e18b1/33bb3/mount-showcase.jpg 945w,
/static/877eb2cda48de27b7eee179aff8e18b1/54265/mount-showcase.jpg 1260w,
/static/877eb2cda48de27b7eee179aff8e18b1/dcf66/mount-showcase.jpg 5101w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/877eb2cda48de27b7eee179aff8e18b1/83b6b/mount-showcase.jpg&quot;
            alt=&quot;Mount showcase&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I tried a couple of orientations for printing the light sticks and found that the below is likely the fastest and uses the least support material. Don&apos;t forget to add supports.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 70.25316455696203%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/80c77ef98c043ca9f540974a49685b68/dc87c/light-sticks-in-slicer.avif 158w,
/static/80c77ef98c043ca9f540974a49685b68/383b4/light-sticks-in-slicer.avif 315w,
/static/80c77ef98c043ca9f540974a49685b68/d0061/light-sticks-in-slicer.avif 630w,
/static/80c77ef98c043ca9f540974a49685b68/20e2c/light-sticks-in-slicer.avif 945w,
/static/80c77ef98c043ca9f540974a49685b68/aacd4/light-sticks-in-slicer.avif 1129w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/80c77ef98c043ca9f540974a49685b68/5787a/light-sticks-in-slicer.webp 158w,
/static/80c77ef98c043ca9f540974a49685b68/89f54/light-sticks-in-slicer.webp 315w,
/static/80c77ef98c043ca9f540974a49685b68/4d353/light-sticks-in-slicer.webp 630w,
/static/80c77ef98c043ca9f540974a49685b68/0f41d/light-sticks-in-slicer.webp 945w,
/static/80c77ef98c043ca9f540974a49685b68/87aef/light-sticks-in-slicer.webp 1129w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/80c77ef98c043ca9f540974a49685b68/dda05/light-sticks-in-slicer.png 158w,
/static/80c77ef98c043ca9f540974a49685b68/679a3/light-sticks-in-slicer.png 315w,
/static/80c77ef98c043ca9f540974a49685b68/50637/light-sticks-in-slicer.png 630w,
/static/80c77ef98c043ca9f540974a49685b68/fddb0/light-sticks-in-slicer.png 945w,
/static/80c77ef98c043ca9f540974a49685b68/ceb2f/light-sticks-in-slicer.png 1129w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/80c77ef98c043ca9f540974a49685b68/50637/light-sticks-in-slicer.png&quot;
            alt=&quot;Light sticks in slicer&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;These also need to be printed out in a material that has decent temperature resistance. I eventually ended up with PETG, but I did notice that there was some very minor warping with even PETG. I would recommend using ABS, if you are comfortable printing with this material. If you are having issues with warping, another option is to add some circuitry to run the LED strips at a lower voltage.&lt;/p&gt;
&lt;h2 id=&quot;installation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#installation&quot; aria-label=&quot;installation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Installation&lt;/h2&gt;
&lt;p&gt;Firstly, prepare your LED strips by soldering adequate lengths of wires to them. For easier removal, I&apos;d also recommend soldering male headers to the other ends of the wires (you can ignore polarities, since we can just flip connections as required).&lt;/p&gt;
&lt;p&gt;Next, peel off the adhesive on the rear of the LED strips and stick them onto the flat sections of the light sticks. Then, route the wires through the channels and secure them in place with little dabs of hot glue.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.65822784810127%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/28d3b48445e6be0e674da8cc4f8ce720/dc87c/light-sticks-showcase.avif 158w,
/static/28d3b48445e6be0e674da8cc4f8ce720/383b4/light-sticks-showcase.avif 315w,
/static/28d3b48445e6be0e674da8cc4f8ce720/d0061/light-sticks-showcase.avif 630w,
/static/28d3b48445e6be0e674da8cc4f8ce720/20e2c/light-sticks-showcase.avif 945w,
/static/28d3b48445e6be0e674da8cc4f8ce720/9eba6/light-sticks-showcase.avif 1260w,
/static/28d3b48445e6be0e674da8cc4f8ce720/483d0/light-sticks-showcase.avif 4706w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/28d3b48445e6be0e674da8cc4f8ce720/5787a/light-sticks-showcase.webp 158w,
/static/28d3b48445e6be0e674da8cc4f8ce720/89f54/light-sticks-showcase.webp 315w,
/static/28d3b48445e6be0e674da8cc4f8ce720/4d353/light-sticks-showcase.webp 630w,
/static/28d3b48445e6be0e674da8cc4f8ce720/0f41d/light-sticks-showcase.webp 945w,
/static/28d3b48445e6be0e674da8cc4f8ce720/f27a3/light-sticks-showcase.webp 1260w,
/static/28d3b48445e6be0e674da8cc4f8ce720/16b12/light-sticks-showcase.webp 4706w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/28d3b48445e6be0e674da8cc4f8ce720/ebfe4/light-sticks-showcase.jpg 158w,
/static/28d3b48445e6be0e674da8cc4f8ce720/4fcc2/light-sticks-showcase.jpg 315w,
/static/28d3b48445e6be0e674da8cc4f8ce720/83b6b/light-sticks-showcase.jpg 630w,
/static/28d3b48445e6be0e674da8cc4f8ce720/33bb3/light-sticks-showcase.jpg 945w,
/static/28d3b48445e6be0e674da8cc4f8ce720/54265/light-sticks-showcase.jpg 1260w,
/static/28d3b48445e6be0e674da8cc4f8ce720/d07b9/light-sticks-showcase.jpg 4706w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/28d3b48445e6be0e674da8cc4f8ce720/83b6b/light-sticks-showcase.jpg&quot;
            alt=&quot;All four light sticks showcase&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Slide the mounts onto the z-axis gantry endcaps of the printer, then insert light sticks into the corresponding slots on the mount, making sure to guide the wire through the mount to the rear of the printer.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/0e8ec1374240a5c8d23e0fe165e00844/dc87c/lighting-wired-up.avif 158w,
/static/0e8ec1374240a5c8d23e0fe165e00844/383b4/lighting-wired-up.avif 315w,
/static/0e8ec1374240a5c8d23e0fe165e00844/d0061/lighting-wired-up.avif 630w,
/static/0e8ec1374240a5c8d23e0fe165e00844/20e2c/lighting-wired-up.avif 945w,
/static/0e8ec1374240a5c8d23e0fe165e00844/9eba6/lighting-wired-up.avif 1260w,
/static/0e8ec1374240a5c8d23e0fe165e00844/ae053/lighting-wired-up.avif 5184w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/0e8ec1374240a5c8d23e0fe165e00844/5787a/lighting-wired-up.webp 158w,
/static/0e8ec1374240a5c8d23e0fe165e00844/89f54/lighting-wired-up.webp 315w,
/static/0e8ec1374240a5c8d23e0fe165e00844/4d353/lighting-wired-up.webp 630w,
/static/0e8ec1374240a5c8d23e0fe165e00844/0f41d/lighting-wired-up.webp 945w,
/static/0e8ec1374240a5c8d23e0fe165e00844/f27a3/lighting-wired-up.webp 1260w,
/static/0e8ec1374240a5c8d23e0fe165e00844/d5be9/lighting-wired-up.webp 5184w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/0e8ec1374240a5c8d23e0fe165e00844/ebfe4/lighting-wired-up.jpg 158w,
/static/0e8ec1374240a5c8d23e0fe165e00844/4fcc2/lighting-wired-up.jpg 315w,
/static/0e8ec1374240a5c8d23e0fe165e00844/83b6b/lighting-wired-up.jpg 630w,
/static/0e8ec1374240a5c8d23e0fe165e00844/33bb3/lighting-wired-up.jpg 945w,
/static/0e8ec1374240a5c8d23e0fe165e00844/54265/lighting-wired-up.jpg 1260w,
/static/0e8ec1374240a5c8d23e0fe165e00844/640cf/lighting-wired-up.jpg 5184w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/0e8ec1374240a5c8d23e0fe165e00844/83b6b/lighting-wired-up.jpg&quot;
            alt=&quot;Lighting wired up&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;preparing-power-supply&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#preparing-power-supply&quot; aria-label=&quot;preparing power supply permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Preparing Power Supply&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;⚠ Warning ⚠ messing around with the power supply (PSU) can put you at risk of electrocution, or even turn your printer into a fire-hazard if you do the wiring incorrectly. Proceed at your own risk.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Disconnecting your printer from the wall, and disconnecting the yellow XT60 connector coming out of the PSU, remove the PSU from the printer frame by unscrewing the two screws. Carefully remove the protective cover over the front of the power supply by unscrewing the four additional screws. This will expose bare metal connectors. &lt;strong&gt;Do not unscrew the screw terminal that connects to the XT60 connector.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There should be a spare ground and +24v terminal that we can use for the lighting power. Unscrew each of these spare terminals, and screw in each wire of a female barrel jack connector. I &lt;strong&gt;highly&lt;/strong&gt; recommend that you first prep the bare wire by soldering a spade connector onto it, so that the connection onto the screw terminal is secure.&lt;/p&gt;
&lt;p&gt;You can now close the PSU back up, and screw it back onto the printer frame. Leave the female barrel plug extending outside the circular cutout on the bottom of the PSU cover. Don&apos;t forget to reconnect the yellow XT60 connector.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.82278481012659%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/dc87c/PSU-barrel-jack.avif 158w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/383b4/PSU-barrel-jack.avif 315w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/d0061/PSU-barrel-jack.avif 630w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/20e2c/PSU-barrel-jack.avif 945w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/9eba6/PSU-barrel-jack.avif 1260w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/baf6e/PSU-barrel-jack.avif 5119w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/5787a/PSU-barrel-jack.webp 158w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/89f54/PSU-barrel-jack.webp 315w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/4d353/PSU-barrel-jack.webp 630w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/0f41d/PSU-barrel-jack.webp 945w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/f27a3/PSU-barrel-jack.webp 1260w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/ef627/PSU-barrel-jack.webp 5119w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/ebfe4/PSU-barrel-jack.jpg 158w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/4fcc2/PSU-barrel-jack.jpg 315w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/83b6b/PSU-barrel-jack.jpg 630w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/33bb3/PSU-barrel-jack.jpg 945w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/54265/PSU-barrel-jack.jpg 1260w,
/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/b159b/PSU-barrel-jack.jpg 5119w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/b3a74ccb9d85b4cf13b5b5c15c7914e3/83b6b/PSU-barrel-jack.jpg&quot;
            alt=&quot;Wiring lighting into Power Supply&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;wiring&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#wiring&quot; aria-label=&quot;wiring permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Wiring&lt;/h2&gt;
&lt;p&gt;Cut some wire to the required lengths to reach from the power supply to the right and left corners of the vertical gantry. On the ends that will connect to the light sticks, solder a couple of four female connectors, such that two light sticks can connect to the female connector set. On the side of the wire that connects to the power supply, solder a male barrel jack header. Cover any exposed wire with heat shrink or electrical tape.&lt;/p&gt;
&lt;p&gt;Consult the wiring diagram below.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.82278481012659%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/e4c29e20aaaf61c2e1479f2ec40c7464/dc87c/wiring-diagram.avif 158w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/383b4/wiring-diagram.avif 315w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/d0061/wiring-diagram.avif 630w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/20e2c/wiring-diagram.avif 945w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/9eba6/wiring-diagram.avif 1260w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/5afa4/wiring-diagram.avif 13889w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/e4c29e20aaaf61c2e1479f2ec40c7464/5787a/wiring-diagram.webp 158w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/89f54/wiring-diagram.webp 315w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/4d353/wiring-diagram.webp 630w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/0f41d/wiring-diagram.webp 945w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/f27a3/wiring-diagram.webp 1260w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/ed279/wiring-diagram.webp 13889w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/e4c29e20aaaf61c2e1479f2ec40c7464/dda05/wiring-diagram.png 158w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/679a3/wiring-diagram.png 315w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/50637/wiring-diagram.png 630w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/fddb0/wiring-diagram.png 945w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/f46b1/wiring-diagram.png 1260w,
/static/e4c29e20aaaf61c2e1479f2ec40c7464/8f6be/wiring-diagram.png 13889w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/e4c29e20aaaf61c2e1479f2ec40c7464/50637/wiring-diagram.png&quot;
            alt=&quot;Wiring diagram&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Once you have created your wiring harness, plug everything in and make sure all four light sticks work. Try reversing the connector direction on any light sticks that don&apos;t light up.&lt;/p&gt;
&lt;h2 id=&quot;cable-management&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#cable-management&quot; aria-label=&quot;cable management permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Cable Management&lt;/h2&gt;
&lt;p&gt;At this point you should have quite a few loose wires hanging everywhere. Let&apos;s neaten everything up. I designed the following inserts that can be printed out in TPU, then pressed into the aluminium extrusions that the SV06 frame is made from.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 78.48101265822784%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/c445f8ff1bd4f21bf2cc6715634d9033/dc87c/insert-3d-design.avif 158w,
/static/c445f8ff1bd4f21bf2cc6715634d9033/383b4/insert-3d-design.avif 315w,
/static/c445f8ff1bd4f21bf2cc6715634d9033/d0061/insert-3d-design.avif 630w,
/static/c445f8ff1bd4f21bf2cc6715634d9033/20e2c/insert-3d-design.avif 945w,
/static/c445f8ff1bd4f21bf2cc6715634d9033/152dc/insert-3d-design.avif 1236w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/c445f8ff1bd4f21bf2cc6715634d9033/5787a/insert-3d-design.webp 158w,
/static/c445f8ff1bd4f21bf2cc6715634d9033/89f54/insert-3d-design.webp 315w,
/static/c445f8ff1bd4f21bf2cc6715634d9033/4d353/insert-3d-design.webp 630w,
/static/c445f8ff1bd4f21bf2cc6715634d9033/0f41d/insert-3d-design.webp 945w,
/static/c445f8ff1bd4f21bf2cc6715634d9033/68c44/insert-3d-design.webp 1236w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/c445f8ff1bd4f21bf2cc6715634d9033/dda05/insert-3d-design.png 158w,
/static/c445f8ff1bd4f21bf2cc6715634d9033/679a3/insert-3d-design.png 315w,
/static/c445f8ff1bd4f21bf2cc6715634d9033/50637/insert-3d-design.png 630w,
/static/c445f8ff1bd4f21bf2cc6715634d9033/fddb0/insert-3d-design.png 945w,
/static/c445f8ff1bd4f21bf2cc6715634d9033/69b0b/insert-3d-design.png 1236w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/c445f8ff1bd4f21bf2cc6715634d9033/50637/insert-3d-design.png&quot;
            alt=&quot;Insert design&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Guide loose pairs of wires into the channels on the aluminium inserts. Using some sort of long thin object, hold the loose wires against the sides on the inside of the channel. Gripping the TPU inserts with a pair of thin pliers, angle them and push them into the channel.&lt;/p&gt;
&lt;p&gt;It might take a few tries to get the hang of, but once an insert is in, it should hold the wire securely inside the channel. The inserts can also slide along the channel, which makes adjusting the position of the wires very easy.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/b82692d3c395f0dfee717ab0e2b1ae11/dc87c/wire-guide-insert-img.avif 158w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/383b4/wire-guide-insert-img.avif 315w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/d0061/wire-guide-insert-img.avif 630w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/20e2c/wire-guide-insert-img.avif 945w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/9eba6/wire-guide-insert-img.avif 1260w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/ae053/wire-guide-insert-img.avif 5184w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/b82692d3c395f0dfee717ab0e2b1ae11/5787a/wire-guide-insert-img.webp 158w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/89f54/wire-guide-insert-img.webp 315w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/4d353/wire-guide-insert-img.webp 630w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/0f41d/wire-guide-insert-img.webp 945w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/f27a3/wire-guide-insert-img.webp 1260w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/d5be9/wire-guide-insert-img.webp 5184w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/b82692d3c395f0dfee717ab0e2b1ae11/ebfe4/wire-guide-insert-img.jpg 158w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/4fcc2/wire-guide-insert-img.jpg 315w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/83b6b/wire-guide-insert-img.jpg 630w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/33bb3/wire-guide-insert-img.jpg 945w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/54265/wire-guide-insert-img.jpg 1260w,
/static/b82692d3c395f0dfee717ab0e2b1ae11/640cf/wire-guide-insert-img.jpg 5184w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/b82692d3c395f0dfee717ab0e2b1ae11/83b6b/wire-guide-insert-img.jpg&quot;
            alt=&quot;Wire guide insert usage&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;final-thoughts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-thoughts&quot; aria-label=&quot;final thoughts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;That&apos;s it! You should now have some nice lighting for your SV06 that lights up whenever the printer is powered on. If you want to turn off the lights, simply unplug the barrel jack coming out of the power supply.&lt;/p&gt;
&lt;h1 id=&quot;links-and-downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#links-and-downloads&quot; aria-label=&quot;links and downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Links and Downloads&lt;/h1&gt;
&lt;!-- &lt;a href=&quot;./&quot; download&gt;&lt;/a&gt; --&gt;
&lt;h3 id=&quot;downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#downloads&quot; aria-label=&quot;downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Downloads&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Light Fixture 3D Models All Files → &lt;a href=&quot;/downloads/a77d22c8e190fe9f8b6615c51e0d4c02/SV06_light_fixture_stl.zip&quot; download&gt;SV06_light_fixture_stl.zip&lt;/a&gt;, &lt;a href=&quot;/downloads/2964366e4d24f5f61977dea858f09b88/SV06_light_fixture_step.zip&quot; download&gt;SV06_light_fixture_step.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Light Fixture 3D Models
&lt;ul&gt;
&lt;li&gt;Mount Left → &lt;a href=&quot;/downloads/cba496bbdf89f7a403f2daa85300bda6/SV06_lighting_mount_left.stl&quot; download&gt;SV06_lighting_mount_left.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/4f52e6efd2f6f31ef98197a5db60d875/SV06_lighting_mount_left.step&quot; download&gt;SV06_lighting_mount_left.step&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mount Right → &lt;a href=&quot;/downloads/56e414e678d964171aa80dfd6e4ad45d/SV06_lighting_mount_right.stl&quot; download&gt;SV06_lighting_mount_right.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/46954dca9a5aa6866efdb9a654676dfb/SV06_lighting_mount_right.step&quot; download&gt;SV06_lighting_mount_right.step&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Light Stick Left Front → &lt;a href=&quot;/downloads/4f958e26fa4d10404fbb8e2e4f46f165/SV06_lighting_stick_left_front.stl&quot; download&gt;SV06_lighting_stick_left_front.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/967488560cf8f23b44a4ed1898d6d047/SV06_lighting_stick_left_front.step&quot; download&gt;SV06_lighting_stick_left_front.step&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Light Stick Left Back → &lt;a href=&quot;/downloads/f0da371153f1c88d6c7ffe0e58b94bcf/SV06_lighting_stick_left_back.stl&quot; download&gt;SV06_lighting_stick_left_back.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/c411d0b9edd5032ca5234cd0a41f242f/SV06_lighting_stick_left_back.step&quot; download&gt;SV06_lighting_stick_left_back.step&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Light Stick Right Front → &lt;a href=&quot;/downloads/e7a16261e0cb17a3bb717cc97d1b6d20/SV06_lighting_stick_right_front.stl&quot; download&gt;SV06_lighting_stick_right_front.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/c8688f009a57db71b4d6581f90525658/SV06_lighting_stick_right_front.step&quot; download&gt;SV06_lighting_stick_right_front.step&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Light Stick Right Back → &lt;a href=&quot;/downloads/8022c74020e57ce1f014e90acafbb0a4/SV06_lighting_stick_right_back.stl&quot; download&gt;SV06_lighting_stick_right_back.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/2b23d467e322061608123be4a7e47969/SV06_lighting_stick_right_back.step&quot; download&gt;SV06_lighting_stick_right_back.step&lt;/a&gt;&lt;a href=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Channel Insert 3D Model → &lt;a href=&quot;/downloads/25db6bd725afa440bb2bca554188df76/SV06_channel_insert.stl&quot; download&gt;SV06_channel_insert.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/0077d8e5100923e68d194451dbde2483/SV06_channel_insert.step&quot; download&gt;SV06_channel_insert.step&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;purchase-links&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#purchase-links&quot; aria-label=&quot;purchase links permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Purchase Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Led Strip 24v (these are just some examples, pick whichever LED strips work for you) → &lt;a href=&quot;https://www.amazon.com/dp/B09TVKYRRH/&quot;&gt;Amazon&lt;/a&gt;, &lt;a href=&quot;https://www.aliexpress.com/item/1005002355317307.html&quot;&gt;Aliexpress&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[SV06 Klipper Input Shaping]]></title><description><![CDATA[Introduction Input shaping/resonance compensation is the process that Klipper uses to minimise ringing/ghosting, which is a type of…]]></description><link>https://insertnewline.com/blog/SV06-klipper-input-shaping/</link><guid isPermaLink="false">https://insertnewline.com/blog/SV06-klipper-input-shaping/</guid><pubDate>Fri, 09 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;introduction&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#introduction&quot; aria-label=&quot;introduction permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Input shaping/resonance compensation is the process that Klipper uses to minimise ringing/ghosting, which is a type of repeating artifact that appears on smooth surfaces of your prints, caused by the vibrations the printer creates as it moves (particularly as you start increasing print speeds).&lt;/p&gt;
&lt;p&gt;To use input shaping with Klipper, you need to measure the resonance frequency of your printer. It&apos;s possible to do this manually, but it&apos;s a lot easier and reliable to use accelerometers to take these measurements for us instead. This post will go over this process.&lt;/p&gt;
&lt;p&gt;For your reference, &lt;a href=&quot;https://www.klipper3d.org/Measuring_Resonances.html&quot;&gt;here&lt;/a&gt; is the Klipper documentation on measuring resonances.&lt;/p&gt;
&lt;h1 id=&quot;hardware&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hardware&quot; aria-label=&quot;hardware permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hardware&lt;/h1&gt;
&lt;p&gt;For most printers, only a single accelerometer is needed to measure both the X and Y axis. However, since the SV06 is a bed-slinger style printer, the extruder moves along the X axis, and the print bed moves along the Y axis. As such, it&apos;s necessary to use two accelerometers, one to measure each axis.&lt;/p&gt;
&lt;p&gt;Using two accelerometers may pose some issues depending on the type of accelerometer that you use, as outlined in the &lt;a href=&quot;https://www.klipper3d.org/Measuring_Resonances.html#bed-slinger-printers&quot;&gt;Klipper docs&lt;/a&gt;. The documentation suggests connecting each accelerometer one at a time to do the measurements.&lt;/p&gt;
&lt;p&gt;However, with a little creativity, you can get both accelerometers working simultaneously. The accelerometer I chose to use was the MPU6050, which uses the I2C bus to communicate. The RPi 3 (which is what I run my Klipper install on) does have a second I2C bus, but using it isn&apos;t as simple as the primary one. See &lt;a href=&quot;https://www.youtube.com/watch?v=FUAiELC76aw&quot;&gt;this video&lt;/a&gt; if you are interested in going down this route.&lt;/p&gt;
&lt;p&gt;Instead, the MPU6050 breakout boards that I used has an I2C Address Select pin (ADO), which, when pulled up to VCC, changes the I2C address of that accelerometer from &lt;code class=&quot;language-text&quot;&gt;0x68&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;0x69&lt;/code&gt;. This lets us use both accelerometers on the same I2C bus.&lt;/p&gt;
&lt;h1 id=&quot;accelerometer-installation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#accelerometer-installation&quot; aria-label=&quot;accelerometer installation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Accelerometer Installation&lt;/h1&gt;
&lt;h2 id=&quot;mounting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#mounting&quot; aria-label=&quot;mounting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Mounting&lt;/h2&gt;
&lt;p&gt;The next challenge is mounting the accelerometers to the extruder and the bed. My solution were the following mounts that can be 3D printed. Massive props to Sovol for making the &lt;a href=&quot;https://github.com/Sovol3d/SV06-Fully-Open-Source&quot;&gt;SV06 Design Files&lt;/a&gt; available, which makes mods like this so much easier.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 77.21518987341771%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/496b8708db29f45e5b58ed9f4caddc48/dc87c/extruder-mount-cad.avif 158w,
/static/496b8708db29f45e5b58ed9f4caddc48/383b4/extruder-mount-cad.avif 315w,
/static/496b8708db29f45e5b58ed9f4caddc48/d0061/extruder-mount-cad.avif 630w,
/static/496b8708db29f45e5b58ed9f4caddc48/20e2c/extruder-mount-cad.avif 945w,
/static/496b8708db29f45e5b58ed9f4caddc48/9eba6/extruder-mount-cad.avif 1260w,
/static/496b8708db29f45e5b58ed9f4caddc48/21a79/extruder-mount-cad.avif 1369w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/496b8708db29f45e5b58ed9f4caddc48/5787a/extruder-mount-cad.webp 158w,
/static/496b8708db29f45e5b58ed9f4caddc48/89f54/extruder-mount-cad.webp 315w,
/static/496b8708db29f45e5b58ed9f4caddc48/4d353/extruder-mount-cad.webp 630w,
/static/496b8708db29f45e5b58ed9f4caddc48/0f41d/extruder-mount-cad.webp 945w,
/static/496b8708db29f45e5b58ed9f4caddc48/f27a3/extruder-mount-cad.webp 1260w,
/static/496b8708db29f45e5b58ed9f4caddc48/04752/extruder-mount-cad.webp 1369w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/496b8708db29f45e5b58ed9f4caddc48/dda05/extruder-mount-cad.png 158w,
/static/496b8708db29f45e5b58ed9f4caddc48/679a3/extruder-mount-cad.png 315w,
/static/496b8708db29f45e5b58ed9f4caddc48/50637/extruder-mount-cad.png 630w,
/static/496b8708db29f45e5b58ed9f4caddc48/fddb0/extruder-mount-cad.png 945w,
/static/496b8708db29f45e5b58ed9f4caddc48/f46b1/extruder-mount-cad.png 1260w,
/static/496b8708db29f45e5b58ed9f4caddc48/18370/extruder-mount-cad.png 1369w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/496b8708db29f45e5b58ed9f4caddc48/50637/extruder-mount-cad.png&quot;
            alt=&quot;Extruder mount CAD design&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.69620253164557%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/57b467b259e7390f450d032552767057/dc87c/print-bed-mount-cad.avif 158w,
/static/57b467b259e7390f450d032552767057/383b4/print-bed-mount-cad.avif 315w,
/static/57b467b259e7390f450d032552767057/d0061/print-bed-mount-cad.avif 630w,
/static/57b467b259e7390f450d032552767057/20e2c/print-bed-mount-cad.avif 945w,
/static/57b467b259e7390f450d032552767057/3156b/print-bed-mount-cad.avif 1102w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/57b467b259e7390f450d032552767057/5787a/print-bed-mount-cad.webp 158w,
/static/57b467b259e7390f450d032552767057/89f54/print-bed-mount-cad.webp 315w,
/static/57b467b259e7390f450d032552767057/4d353/print-bed-mount-cad.webp 630w,
/static/57b467b259e7390f450d032552767057/0f41d/print-bed-mount-cad.webp 945w,
/static/57b467b259e7390f450d032552767057/5c9e1/print-bed-mount-cad.webp 1102w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/57b467b259e7390f450d032552767057/dda05/print-bed-mount-cad.png 158w,
/static/57b467b259e7390f450d032552767057/679a3/print-bed-mount-cad.png 315w,
/static/57b467b259e7390f450d032552767057/50637/print-bed-mount-cad.png 630w,
/static/57b467b259e7390f450d032552767057/fddb0/print-bed-mount-cad.png 945w,
/static/57b467b259e7390f450d032552767057/9a43b/print-bed-mount-cad.png 1102w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/57b467b259e7390f450d032552767057/50637/print-bed-mount-cad.png&quot;
            alt=&quot;Print bed mount CAD design&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I recommend printing these parts in something like PETG rather than PLA, since they will be placed near heat-generating parts of the printer, and PLA might warp.&lt;/p&gt;
&lt;p&gt;The MPU6050 boards screw into the mounts using M3 screws. The extruder mount is attached as follows, and secured using a cable tie.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 70.25316455696203%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/ca3953652cda6512b8f1f2c2dd7df9e0/dc87c/accelerometer-mount-extruder.avif 158w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/383b4/accelerometer-mount-extruder.avif 315w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/d0061/accelerometer-mount-extruder.avif 630w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/20e2c/accelerometer-mount-extruder.avif 945w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/9eba6/accelerometer-mount-extruder.avif 1260w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/e01a8/accelerometer-mount-extruder.avif 3597w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/ca3953652cda6512b8f1f2c2dd7df9e0/5787a/accelerometer-mount-extruder.webp 158w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/89f54/accelerometer-mount-extruder.webp 315w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/4d353/accelerometer-mount-extruder.webp 630w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/0f41d/accelerometer-mount-extruder.webp 945w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/f27a3/accelerometer-mount-extruder.webp 1260w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/50740/accelerometer-mount-extruder.webp 3597w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/ca3953652cda6512b8f1f2c2dd7df9e0/ebfe4/accelerometer-mount-extruder.jpg 158w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/4fcc2/accelerometer-mount-extruder.jpg 315w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/83b6b/accelerometer-mount-extruder.jpg 630w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/33bb3/accelerometer-mount-extruder.jpg 945w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/54265/accelerometer-mount-extruder.jpg 1260w,
/static/ca3953652cda6512b8f1f2c2dd7df9e0/e38dd/accelerometer-mount-extruder.jpg 3597w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/ca3953652cda6512b8f1f2c2dd7df9e0/83b6b/accelerometer-mount-extruder.jpg&quot;
            alt=&quot;Accelerometer mount extruder&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The print bed accelerometer is mounted as follows. As shown in the second image, use a cable tie to secure the mount onto the post.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/20a796b7175c2787f4815fa230a4976b/dc87c/bed-mount-img-lower.avif 158w,
/static/20a796b7175c2787f4815fa230a4976b/383b4/bed-mount-img-lower.avif 315w,
/static/20a796b7175c2787f4815fa230a4976b/d0061/bed-mount-img-lower.avif 630w,
/static/20a796b7175c2787f4815fa230a4976b/20e2c/bed-mount-img-lower.avif 945w,
/static/20a796b7175c2787f4815fa230a4976b/9eba6/bed-mount-img-lower.avif 1260w,
/static/20a796b7175c2787f4815fa230a4976b/2fd0c/bed-mount-img-lower.avif 5198w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/20a796b7175c2787f4815fa230a4976b/5787a/bed-mount-img-lower.webp 158w,
/static/20a796b7175c2787f4815fa230a4976b/89f54/bed-mount-img-lower.webp 315w,
/static/20a796b7175c2787f4815fa230a4976b/4d353/bed-mount-img-lower.webp 630w,
/static/20a796b7175c2787f4815fa230a4976b/0f41d/bed-mount-img-lower.webp 945w,
/static/20a796b7175c2787f4815fa230a4976b/f27a3/bed-mount-img-lower.webp 1260w,
/static/20a796b7175c2787f4815fa230a4976b/fd2f2/bed-mount-img-lower.webp 5198w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/20a796b7175c2787f4815fa230a4976b/ebfe4/bed-mount-img-lower.jpg 158w,
/static/20a796b7175c2787f4815fa230a4976b/4fcc2/bed-mount-img-lower.jpg 315w,
/static/20a796b7175c2787f4815fa230a4976b/83b6b/bed-mount-img-lower.jpg 630w,
/static/20a796b7175c2787f4815fa230a4976b/33bb3/bed-mount-img-lower.jpg 945w,
/static/20a796b7175c2787f4815fa230a4976b/54265/bed-mount-img-lower.jpg 1260w,
/static/20a796b7175c2787f4815fa230a4976b/b97aa/bed-mount-img-lower.jpg 5198w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/20a796b7175c2787f4815fa230a4976b/83b6b/bed-mount-img-lower.jpg&quot;
            alt=&quot;Bed mount image lower&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.65822784810127%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f14f70b89ccca2fa4bbeffce8bcaabb7/dc87c/bed-mount-img-side.avif 158w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/383b4/bed-mount-img-side.avif 315w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/d0061/bed-mount-img-side.avif 630w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/20e2c/bed-mount-img-side.avif 945w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/9eba6/bed-mount-img-side.avif 1260w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/b3aee/bed-mount-img-side.avif 4669w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/f14f70b89ccca2fa4bbeffce8bcaabb7/5787a/bed-mount-img-side.webp 158w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/89f54/bed-mount-img-side.webp 315w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/4d353/bed-mount-img-side.webp 630w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/0f41d/bed-mount-img-side.webp 945w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/f27a3/bed-mount-img-side.webp 1260w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/bf65b/bed-mount-img-side.webp 4669w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f14f70b89ccca2fa4bbeffce8bcaabb7/ebfe4/bed-mount-img-side.jpg 158w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/4fcc2/bed-mount-img-side.jpg 315w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/83b6b/bed-mount-img-side.jpg 630w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/33bb3/bed-mount-img-side.jpg 945w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/54265/bed-mount-img-side.jpg 1260w,
/static/f14f70b89ccca2fa4bbeffce8bcaabb7/dae19/bed-mount-img-side.jpg 4669w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f14f70b89ccca2fa4bbeffce8bcaabb7/83b6b/bed-mount-img-side.jpg&quot;
            alt=&quot;Bed mount image side&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;: if you decide to keep the accelerometer wires installed permanently, they should be more securely cable managed.&lt;/p&gt;
&lt;h2 id=&quot;wiring&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#wiring&quot; aria-label=&quot;wiring permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Wiring&lt;/h2&gt;
&lt;p&gt;To &lt;a href=&quot;https://www.klipper3d.org/Measuring_Resonances.html#i2c-accelerometers&quot;&gt;wire I2C accelerometers&lt;/a&gt; to the RPi, Klipper documentation recommends using &lt;a href=&quot;https://www.klipper3d.org/Measuring_Resonances.html#wiring&quot;&gt;shielded ethernet cables&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The docs provide example wiring configurations for both two and three pair cables. Since ethernet cables typically come with four twisted pairs, I recommend the following configuration for optimal reliability.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;3.3V+GND
SDA+GND
SCL+GND
GND+GND&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Create a wiring harness by cutting an old ethernet cable to size. I decided to make my wiring harness removable by adding female headers to both ends. Both accelerometers can be wired in parallel (don&apos;t forget to connect the ADO pin of one accelerometer to VCC).&lt;/p&gt;
&lt;p&gt;Connect the wires to their corresponding connection pins on the Raspberry Pi (see the pinout below). Make sure to temporarily (or permanently) secure the wiring harness such that all axes can move to their full extents without interference.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 69.62025316455697%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/753b750dfbb51c32268a75bcbd147062/dc87c/rpi-i2c-pinout.avif 158w,
/static/753b750dfbb51c32268a75bcbd147062/383b4/rpi-i2c-pinout.avif 315w,
/static/753b750dfbb51c32268a75bcbd147062/d0061/rpi-i2c-pinout.avif 630w,
/static/753b750dfbb51c32268a75bcbd147062/6b5b6/rpi-i2c-pinout.avif 928w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/753b750dfbb51c32268a75bcbd147062/5787a/rpi-i2c-pinout.webp 158w,
/static/753b750dfbb51c32268a75bcbd147062/89f54/rpi-i2c-pinout.webp 315w,
/static/753b750dfbb51c32268a75bcbd147062/4d353/rpi-i2c-pinout.webp 630w,
/static/753b750dfbb51c32268a75bcbd147062/75d78/rpi-i2c-pinout.webp 928w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/753b750dfbb51c32268a75bcbd147062/dda05/rpi-i2c-pinout.png 158w,
/static/753b750dfbb51c32268a75bcbd147062/679a3/rpi-i2c-pinout.png 315w,
/static/753b750dfbb51c32268a75bcbd147062/50637/rpi-i2c-pinout.png 630w,
/static/753b750dfbb51c32268a75bcbd147062/e4a89/rpi-i2c-pinout.png 928w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/753b750dfbb51c32268a75bcbd147062/50637/rpi-i2c-pinout.png&quot;
            alt=&quot;Raspberry Pi I2C pinout&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h1 id=&quot;configuring-accelerometers&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#configuring-accelerometers&quot; aria-label=&quot;configuring accelerometers permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configuring Accelerometers&lt;/h1&gt;
&lt;p&gt;Firstly, you need to enable I2C on your RPi. Follow &lt;a href=&quot;https://www.klipper3d.org/RPi_microcontroller.html#optional-enabling-i2c&quot;&gt;this section&lt;/a&gt; of Klipper docs to achieve that. After a restart, you can check whether the accelerometers are being detected properly by running the following commands.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; i2c-tools
i2cdetect &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You should see that positions &lt;code class=&quot;language-text&quot;&gt;0x68&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;0x69&lt;/code&gt; each have a device. If not, try restarting again. If it still doesn&apos;t work, there may be something wrong with your connections.&lt;/p&gt;
&lt;p&gt;The next step is to tell Klipper to use the RPi GPIO as a microcontroller (because you would typically connect the accelerometers to a MCU, which you would then connect to the RPi). Follow Klipper docs &lt;a href=&quot;https://www.klipper3d.org/RPi_microcontroller.html&quot;&gt;here&lt;/a&gt; to set that up.&lt;/p&gt;
&lt;p&gt;The final step is to add the accelerometers to the &lt;code class=&quot;language-text&quot;&gt;printer.cfg&lt;/code&gt; file. If you mounted your accelerometers with the same orientations as me, the following can be copied verbatim. Just remember to change the address of whichever MPU6050 whose ADO pin you pulled up to VCC.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#printer.cfg&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;mcu rpi&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;serial&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /tmp/klipper_host_mcu

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;mpu9250 extruder&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;i2c_mcu&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; rpi
&lt;span class=&quot;token key atrule&quot;&gt;i2c_bus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; i2c.1
&lt;span class=&quot;token key atrule&quot;&gt;i2c_address&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;104&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# This MPU has pin AD0 pulled low&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;axes_map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; z

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;mpu9250 bed&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;i2c_mcu&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; rpi
&lt;span class=&quot;token key atrule&quot;&gt;i2c_bus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; i2c.1
&lt;span class=&quot;token key atrule&quot;&gt;i2c_address&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;105&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# This MPU has pin AD0 pulled high&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;axes_map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; z

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;resonance_tester&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Assuming the typical setup of the bed slinger printer&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;accel_chip_x&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mpu9250 extruder
&lt;span class=&quot;token key atrule&quot;&gt;accel_chip_y&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mpu9250 bed
&lt;span class=&quot;token key atrule&quot;&gt;probe_points&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you mounted your accelerometers differently, you will need to work out how the axes of the accelerometer map to axes of the printer, follow the &lt;a href=&quot;https://www.klipper3d.org/Config_Reference.html#adxl345&quot;&gt;config reference here&lt;/a&gt; to determine your &lt;code class=&quot;language-text&quot;&gt;axes_map&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;validating&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#validating&quot; aria-label=&quot;validating permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Validating&lt;/h2&gt;
&lt;p&gt;Finally, check that Klipper can read the accelerometers by entering the following commands into the Mainsail console.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ACCELEROMETER_QUERY CHIP=extruder
ACCELEROMETER_QUERY CHIP=bed&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If everything is working, you should see the accelerometer readings printed out to the console.&lt;/p&gt;
&lt;h1 id=&quot;running-resonance-measurements&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#running-resonance-measurements&quot; aria-label=&quot;running resonance measurements permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Running Resonance Measurements&lt;/h1&gt;
&lt;p&gt;Start by installing the &lt;a href=&quot;https://www.klipper3d.org/Measuring_Resonances.html#software-installation&quot;&gt;additional software dependencies&lt;/a&gt; required for the resonance measurements.&lt;/p&gt;
&lt;p&gt;Once everything is installed, Follow &lt;a href=&quot;https://www.klipper3d.org/Measuring_Resonances.html#measuring-the-resonances&quot;&gt;these instructions&lt;/a&gt; to run the resonance measurements. Following the instructions here the first time, you will generate some cool graphs using the resonance data that you measure.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/86d198d0a78d08a42fd50e992a0e8223/dc87c/shaper_calibrate_x.avif 158w,
/static/86d198d0a78d08a42fd50e992a0e8223/383b4/shaper_calibrate_x.avif 315w,
/static/86d198d0a78d08a42fd50e992a0e8223/d0061/shaper_calibrate_x.avif 630w,
/static/86d198d0a78d08a42fd50e992a0e8223/c6718/shaper_calibrate_x.avif 800w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/86d198d0a78d08a42fd50e992a0e8223/5787a/shaper_calibrate_x.webp 158w,
/static/86d198d0a78d08a42fd50e992a0e8223/89f54/shaper_calibrate_x.webp 315w,
/static/86d198d0a78d08a42fd50e992a0e8223/4d353/shaper_calibrate_x.webp 630w,
/static/86d198d0a78d08a42fd50e992a0e8223/47a22/shaper_calibrate_x.webp 800w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/86d198d0a78d08a42fd50e992a0e8223/dda05/shaper_calibrate_x.png 158w,
/static/86d198d0a78d08a42fd50e992a0e8223/679a3/shaper_calibrate_x.png 315w,
/static/86d198d0a78d08a42fd50e992a0e8223/50637/shaper_calibrate_x.png 630w,
/static/86d198d0a78d08a42fd50e992a0e8223/7842b/shaper_calibrate_x.png 800w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/86d198d0a78d08a42fd50e992a0e8223/50637/shaper_calibrate_x.png&quot;
            alt=&quot;shaper calibrate x&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A resonance frequency of ~55Hz can be clearly seen on my printer&apos;s x-axis vibration graph above.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/838789cc53d7bcf08353b4afb93589f4/dc87c/shaper_calibrate_y.avif 158w,
/static/838789cc53d7bcf08353b4afb93589f4/383b4/shaper_calibrate_y.avif 315w,
/static/838789cc53d7bcf08353b4afb93589f4/d0061/shaper_calibrate_y.avif 630w,
/static/838789cc53d7bcf08353b4afb93589f4/c6718/shaper_calibrate_y.avif 800w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/838789cc53d7bcf08353b4afb93589f4/5787a/shaper_calibrate_y.webp 158w,
/static/838789cc53d7bcf08353b4afb93589f4/89f54/shaper_calibrate_y.webp 315w,
/static/838789cc53d7bcf08353b4afb93589f4/4d353/shaper_calibrate_y.webp 630w,
/static/838789cc53d7bcf08353b4afb93589f4/47a22/shaper_calibrate_y.webp 800w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/838789cc53d7bcf08353b4afb93589f4/dda05/shaper_calibrate_y.png 158w,
/static/838789cc53d7bcf08353b4afb93589f4/679a3/shaper_calibrate_y.png 315w,
/static/838789cc53d7bcf08353b4afb93589f4/50637/shaper_calibrate_y.png 630w,
/static/838789cc53d7bcf08353b4afb93589f4/7842b/shaper_calibrate_y.png 800w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/838789cc53d7bcf08353b4afb93589f4/50637/shaper_calibrate_y.png&quot;
            alt=&quot;shaper calibrate y&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;On the y-axis graph, vibrations of the bed (y-axis) has seemingly resulted in vibrations on both the y and z axes. This could actually be the bed movement inducing vibrations in the z-axis, or it could be due to poor accelerometer mounting, stemming from a poor mount design. Regardless, the resonances on the y and z axes lie at around the same frequencies, so the input shaping algorithm should work fine.&lt;/p&gt;
&lt;p&gt;On subsequent runs, you can just use the command &lt;code class=&quot;language-text&quot;&gt;SHAPER_CALIBRATE&lt;/code&gt; to run calibration procedure for both axes automatically. It&apos;s worth noting that you should only run this procedure when you make any changes to the physical design of the printer, or move it to a new location, etc. Running resonance measurements regularly is not recommended, vibrations at the printer&apos;s resonance frequencies can be damaging.&lt;/p&gt;
&lt;h1 id=&quot;links-and-downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#links-and-downloads&quot; aria-label=&quot;links and downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Links and Downloads&lt;/h1&gt;
&lt;h3 id=&quot;downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#downloads&quot; aria-label=&quot;downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Downloads&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Extruder Accelerometer Mount 3D Model → &lt;a href=&quot;/downloads/d67a937444e66abd44c9aa6fa1301bae/MPU6050_SV06_extruder_mount.stl&quot; download&gt;MPU6050_SV06_extruder_mount.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/e446bfe30d6e90236b9548cef3c5ec41/MPU6050_SV06_extruder_mount.step&quot; download&gt;MPU6050_SV06_extruder_mount.step&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bed Accelerometer Mount 3D Model → &lt;a href=&quot;/downloads/593257c5afa0378d2fb9be1060aca99e/MPU6050_SV06_bed_mount.stl&quot; download&gt;MPU6050_SV06_bed_mount.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/064f6ed962647dd32830c1b4a4ae572a/MPU6050_SV06_bed_mount.step&quot; download&gt;MPU6050_SV06_bed_mount.step&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;purchase-links&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#purchase-links&quot; aria-label=&quot;purchase links permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Purchase Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MPU6050 Accelerometer Module → &lt;a href=&quot;https://www.amazon.com/dp/B0CDL8DVZ7&quot;&gt;Amazon&lt;/a&gt;, &lt;a href=&quot;https://www.aliexpress.com/item/1005005973839949.html&quot;&gt;Aliexpress&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[SV06 Klipper Install and Setup]]></title><description><![CDATA[Introduction This post will provide an overview of the process of getting Klipper working on a Sovol SV06 3D printer. There are better and…]]></description><link>https://insertnewline.com/blog/SV06-klipper-setup/</link><guid isPermaLink="false">https://insertnewline.com/blog/SV06-klipper-setup/</guid><pubDate>Thu, 08 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;introduction&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#introduction&quot; aria-label=&quot;introduction permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This post will provide an overview of the process of getting Klipper working on a Sovol SV06 3D printer. There are better and more detailed guides around the internet on how to do each individual step in this process, but when I was undertaking this process myself, I wasn&apos;t able to find a guide that pointed me to which steps I had to do exactly.&lt;/p&gt;
&lt;p&gt;So I&apos;m hoping this guide will serve as a jumping off point, so that you can gain a basic idea of how the Klipper ecosystem works, and which software components you will need to configure to get to a working Klipper setup.&lt;/p&gt;
&lt;h2 id=&quot;klipper&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#klipper&quot; aria-label=&quot;klipper permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Klipper&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.klipper3d.org/&quot;&gt;Klipper&lt;/a&gt; is a really powerful custom firmware for 3D printers. The SV06 runs a custom version of the &lt;a href=&quot;https://marlinfw.org/&quot;&gt;Marlin Firmware&lt;/a&gt;, but Klipper is generally considered to be superior due to the faster potential print speeds Klipper unlocks.&lt;/p&gt;
&lt;p&gt;Klipper achieves this faster speed in a few ways. Firstly, all the processing that is typically done by the microcontroller (MCU) onboard your printer&apos;s controller is offloaded to a (usually faster) external MCU/computer such as a Raspberry Pi.&lt;/p&gt;
&lt;p&gt;Secondly, printing faster decreases the quality of your prints through issues such as ringing/ghosting (repeating patterns appearing on print due to vibrations of your printer at it&apos;s resonance frequency), and oozing as the extruder moves, and blobbing when printing corners. Klipper aims to mitigate these issues using &lt;a href=&quot;https://www.klipper3d.org/Resonance_Compensation.html&quot;&gt;resonance compensation&lt;/a&gt; and &lt;a href=&quot;https://www.klipper3d.org/Pressure_Advance.html&quot;&gt;pressure advance&lt;/a&gt;. These links also explains the issues and solutions in more detail, if you are interested in further reading.&lt;/p&gt;
&lt;h3 id=&quot;overview&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#overview&quot; aria-label=&quot;overview permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Overview&lt;/h3&gt;
&lt;p&gt;Klipper has two parts, the Klipper &lt;strong&gt;Firmware&lt;/strong&gt; runs on the printer MCU, and Klipper &lt;strong&gt;Host&lt;/strong&gt; runs on a connected computer (I used a Raspberry Pi 3). The Klipper Firmware on the printer is &apos;dumb&apos;, all the smart logic, including parsing the Gcode and calculating the corresponding stepper movements are done on the Klipper Host, and sent to the Klipper Firmware on the printer, whose primary job is to forward these basic instructions the stepper drivers on the printer control board.&lt;/p&gt;
&lt;p&gt;The key here is that Klipper Firmware does minimal processing on it&apos;s own, even the logic that drives the user interface on the inbuilt printer display is handled by the connected Klipper Host.&lt;/p&gt;
&lt;h2 id=&quot;firmware-installation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#firmware-installation&quot; aria-label=&quot;firmware installation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Firmware Installation&lt;/h2&gt;
&lt;p&gt;There is a &lt;a href=&quot;https://github.com/bassamanator/Sovol-SV06-firmware&quot;&gt;fantastic GitHub Repo&lt;/a&gt; containing  some great information on the process of Klipper installation on the SV06. I found this to be a very useful resource when going through this process myself.&lt;/p&gt;
&lt;p&gt;This repo explains the installation process very well, and will be maintained better than I can update this blog post in the future. As such, I&apos;ll mostly be linking to sections of that repo rather than restating the installation process here.&lt;/p&gt;
&lt;h3 id=&quot;flashing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#flashing&quot; aria-label=&quot;flashing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Flashing&lt;/h3&gt;
&lt;p&gt;The first step is replacing the Marlin firmware on the printer with the Klipper firmware.&lt;/p&gt;
&lt;p&gt;Follow the &lt;a href=&quot;https://github.com/bassamanator/Sovol-SV06-firmware#flash-firmware&quot;&gt;flashing instructions here&lt;/a&gt;. Note that the repo states that some users have had issues using the Sovol included MicroSD card for the flashing process. However, I was able to use the included card for flashing both Klipper and the original firmware without any problems. Your mileage may vary.&lt;/p&gt;
&lt;p&gt;The flashing process is reversible, you can always go back to the &lt;a href=&quot;https://www.sovol3d.com/pages/download&quot;&gt;original firmware provided by Sovol&lt;/a&gt;. The flashing process is identical, just remember to rename the &lt;code class=&quot;language-text&quot;&gt;.bin&lt;/code&gt; file you&apos;re flashing, because a particular filename can only be flashed once.&lt;/p&gt;
&lt;h2 id=&quot;host-installation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#host-installation&quot; aria-label=&quot;host installation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Host Installation&lt;/h2&gt;
&lt;p&gt;I&apos;ll provide a brief guide here of preparing and installing Klipper Host software on a Raspberry Pi, since most guides don&apos;t supply this info.&lt;/p&gt;
&lt;p&gt;Many guides for Klipper available for this step suggests installing specific OS builds such as &lt;a href=&quot;https://github.com/guysoft/OctoPi&quot;&gt;OctoPi&lt;/a&gt; or &lt;a href=&quot;https://docs-os.mainsail.xyz/&quot;&gt;MainsailOS&lt;/a&gt;. These can make getting started with their respective software easy, but any customisation beyond the use of the intended software can result in issues.&lt;/p&gt;
&lt;p&gt;As such, I&apos;d recommend going with a vanilla Raspbian install, and then installing your preferred software stack on top of this. Additionally, Raspbian has very good community support if you run into any issues.&lt;/p&gt;
&lt;h3 id=&quot;os-install&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#os-install&quot; aria-label=&quot;os install permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;OS Install&lt;/h3&gt;
&lt;p&gt;For this step, you will need the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Raspberry Pi&lt;/li&gt;
&lt;li&gt;MicroSD Card (32 GB should be adequate)&lt;/li&gt;
&lt;li&gt;PC with &lt;a href=&quot;https://www.raspberrypi.com/software/&quot;&gt;Raspberry Pi Imager&lt;/a&gt; installed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using the Raspberry Pi Imager, first select &lt;strong&gt;Choose OS&lt;/strong&gt; → &lt;strong&gt;Raspberry Pi OS (other)&lt;/strong&gt; → &lt;strong&gt;Raspberry Pi OS Lite&lt;/strong&gt; (64-bit is preferred). Then, select the SD card you want to flash to.&lt;/p&gt;
&lt;p&gt;Next, go to Advanced Options (cog icon in bottom right corner). Set username to &lt;code class=&quot;language-text&quot;&gt;pi&lt;/code&gt; and enter a password for your user account. Enter your Wi-Fi credentials. Enable SSH, and ensure access is enabled using the user account password (only use password access for SSH if you plan on using the RPi on a trusted local network). Optionally, if you want to access the Pi at an address such as &lt;code class=&quot;language-text&quot;&gt;3dprinter.local&lt;/code&gt;, enable this option by setting a hostname.&lt;/p&gt;
&lt;p&gt;Confirming that everything looks ok, flash the SD Card.&lt;/p&gt;
&lt;h2 id=&quot;preparing-devices&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#preparing-devices&quot; aria-label=&quot;preparing devices permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Preparing Devices&lt;/h2&gt;
&lt;p&gt;Firstly, make sure that you have a quality power supply and cable for the Pi that meets the power requirements and can reliably power the Pi. You&apos;ve probably seen this advice on other guides, but it&apos;s particularly important here because if the Pi randomly turns off during a print, your print will also stop (recovering from failed prints in Klipper is not an inbuilt feature, and is a very involved, imperfect process). Mainsail will show a warning if the RPi has encountered power issues since the last boot up.&lt;/p&gt;
&lt;p&gt;Secondly, it&apos;s necessary to prepare the micro USB cable that you will be using to connect the Pi to the SV06. We do not want the +5v connection of the USB cable, so it&apos;s necessary to disconnect it. The easiest way is to cut a thin piece of electrical tape (approx. 3mm x 15mm), and stick it on the +5v pin on the USB A connector.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51.26582278481012%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/23d2dce9fa7803e3315c556410634c0e/dc87c/usb-connector-diagram.avif 158w,
/static/23d2dce9fa7803e3315c556410634c0e/383b4/usb-connector-diagram.avif 315w,
/static/23d2dce9fa7803e3315c556410634c0e/d0061/usb-connector-diagram.avif 630w,
/static/23d2dce9fa7803e3315c556410634c0e/20e2c/usb-connector-diagram.avif 945w,
/static/23d2dce9fa7803e3315c556410634c0e/9eba6/usb-connector-diagram.avif 1260w,
/static/23d2dce9fa7803e3315c556410634c0e/51f9f/usb-connector-diagram.avif 2024w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/23d2dce9fa7803e3315c556410634c0e/5787a/usb-connector-diagram.webp 158w,
/static/23d2dce9fa7803e3315c556410634c0e/89f54/usb-connector-diagram.webp 315w,
/static/23d2dce9fa7803e3315c556410634c0e/4d353/usb-connector-diagram.webp 630w,
/static/23d2dce9fa7803e3315c556410634c0e/0f41d/usb-connector-diagram.webp 945w,
/static/23d2dce9fa7803e3315c556410634c0e/f27a3/usb-connector-diagram.webp 1260w,
/static/23d2dce9fa7803e3315c556410634c0e/b8022/usb-connector-diagram.webp 2024w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/23d2dce9fa7803e3315c556410634c0e/dda05/usb-connector-diagram.png 158w,
/static/23d2dce9fa7803e3315c556410634c0e/679a3/usb-connector-diagram.png 315w,
/static/23d2dce9fa7803e3315c556410634c0e/50637/usb-connector-diagram.png 630w,
/static/23d2dce9fa7803e3315c556410634c0e/fddb0/usb-connector-diagram.png 945w,
/static/23d2dce9fa7803e3315c556410634c0e/f46b1/usb-connector-diagram.png 1260w,
/static/23d2dce9fa7803e3315c556410634c0e/e0c85/usb-connector-diagram.png 2024w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/23d2dce9fa7803e3315c556410634c0e/50637/usb-connector-diagram.png&quot;
            alt=&quot;USB connector diagram&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;configuring-raspberry-pi&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#configuring-raspberry-pi&quot; aria-label=&quot;configuring raspberry pi permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configuring Raspberry Pi&lt;/h2&gt;
&lt;p&gt;Insert the flashed SD Card into the RPi, and plug it in. Now would also be a good time to plug in the printer cable. Wait for the RPi to boot, then connect to it via SSH (easiest way to find the RPi IP is to check your router&apos;s device list).&lt;/p&gt;
&lt;p&gt;We will be installing Klipper using &lt;a href=&quot;https://github.com/dw-0/kiauh&quot;&gt;KIUAH&lt;/a&gt;. KIUAH will greatly simplify the install process for the various software components required. Follow the install instructions &lt;a href=&quot;https://github.com/dw-0/kiauh#-download-and-use-kiauh&quot;&gt;here&lt;/a&gt; to install and launch KIUAH.&lt;/p&gt;
&lt;p&gt;Next, use KIUAH to install Klipper (Host software), Moonraker (API for Klipper Host), Mainsail (Web UI for your printer).&lt;/p&gt;
&lt;p&gt;From here, return to the SV06 Klipper GitHub repository, and continue setting up Klipper from &lt;a href=&quot;https://github.com/bassamanator/Sovol-SV06-firmware#download-oss-klipper-configuration&quot;&gt;this&lt;/a&gt; step. Follow the steps on the repo to &lt;strong&gt;Download OSS Klipper Configuration&lt;/strong&gt; (download the files Klipper Host needs to correctly talk to the Klipper Firmware and control the SV06), &lt;strong&gt;Adjust Configuration with MCU Path&lt;/strong&gt; (show Klipper Host how to connect to your SV06), &lt;strong&gt;Configure Your Printer&lt;/strong&gt; (run calibrations and prepare your SV06 for printing) and &lt;strong&gt;Adjust Your Slicer&lt;/strong&gt; (set the start and end Gcode that your slicer generates to work properly with Klipper).&lt;/p&gt;
&lt;p&gt;After following these steps, you should hopefully have a working Klipper install. Mainsail, which is the web interface you will use to manage your printer, should be accessible at &lt;code class=&quot;language-text&quot;&gt;http://&amp;lt;ip of your RPi&gt;&lt;/code&gt; (or something similar to &lt;code class=&quot;language-text&quot;&gt;http://3dprinter.local&lt;/code&gt;, if you set up a hostname &lt;a href=&quot;#os-install&quot;&gt;previously&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id=&quot;webcam&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#webcam&quot; aria-label=&quot;webcam permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Webcam&lt;/h2&gt;
&lt;p&gt;A webcam is super useful to monitor your printer remotely. I had an old laptop lying around and I was able to convert its built-in webcam to USB. Here&apos;s a &lt;a href=&quot;https://www.youtube.com/watch?v=C8pFkhkTvqo&quot;&gt;great tutorial by DIY Perks&lt;/a&gt; on how to do this. My webcam was 3.3v, so I had to use a 3.3v regulator and some capacitors to drop the USB 5v down to 3.3v.&lt;/p&gt;
&lt;p&gt;Once you have a webcam connected, run KIUAH again, and install Crowsnest (management software for webcams). If you have a camera attatched, the default configuration will start the stream automatically. For further configuration of camera settings, see &lt;a href=&quot;https://crowsnest.mainsail.xyz/configuration/cam-section&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To add the webcam to the Mainsail interface, follow the instructions &lt;a href=&quot;https://docs.mainsail.xyz/overview/settings/webcams&quot;&gt;here&lt;/a&gt;. The default Crowsnest stream URL for your first webcam is &lt;code class=&quot;language-text&quot;&gt;/webcam/?action=stream&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;summary-and-final-thoughts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#summary-and-final-thoughts&quot; aria-label=&quot;summary and final thoughts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Summary and Final Thoughts&lt;/h2&gt;
&lt;p&gt;My experience using Klipper has been generally excellent. After I performed all the tuning and calibration, things were really great. I was able to push print speeds higher than I had been able to with stock firmware. My prints were completing faster, with only a minimal drop on quality, thanks to input shaping and pressure advance.&lt;/p&gt;
&lt;p&gt;I initially ran into a significant issue where the printer was randomly disconnecting from the RPi in the middle of print. Using &lt;code class=&quot;language-text&quot;&gt;dmesg&lt;/code&gt;, I found the error &lt;code class=&quot;language-text&quot;&gt;ch341-uart ttyUSB0: usb_serial_generic_read_bulk_callback - urb stopped: -32&lt;/code&gt;. I tried several things to try to fix this, including double checking power supply to the RPi, changing cables to the printer, etc. I even ended up going back to the stock firmware.&lt;/p&gt;
&lt;p&gt;But once you&apos;ve used Klipper and experienced things like print speeds that consistently outperform the slicer estimates, it&apos;s really hard to go back. So I gave Klipper another try, this time using a different MicroSD card. To my surprise, this seems to have solved all my reliability issues.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update: This did &lt;strong&gt;not&lt;/strong&gt; in fact solve my reliability issues. See USB Reliability Update section below.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;next-steps&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#next-steps&quot; aria-label=&quot;next steps permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Next Steps&lt;/h2&gt;
&lt;p&gt;Now that you have Klipper installed, consider &lt;a href=&quot;/blog/SV06-klipper-input-shaping&quot;&gt;getting input shaping working&lt;/a&gt; to improve the quality of faster prints.&lt;/p&gt;
&lt;p&gt;With Klipper you can save time and send Gcode to the printer directly from your slicer. Look into Klipper/Moonraker integrations for your slicer, here is the one for &lt;a href=&quot;https://marketplace.ultimaker.com/app/cura/plugins/JJGraphiX/KlipperSettingsPlugin&quot;&gt;Cura&lt;/a&gt; (&lt;a href=&quot;https://github.com/emtrax-ltd/Cura2MoonrakerPlugin&quot;&gt;GitHub&lt;/a&gt;). Info for other slicers is available on the &lt;a href=&quot;https://docs.mainsail.xyz/overview/quicktips/slicer-upload&quot;&gt;Klipper docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you use Home Assistant, there is a &lt;a href=&quot;https://github.com/marcolivierarsenault/moonraker-home-assistant&quot;&gt;Klipper integration&lt;/a&gt; that will let you use data about your printer for your automations.&lt;/p&gt;
&lt;p&gt;Klipper also has other quality of life features. I&apos;ve connected my printer to a smart plug, which automatically turns on the printer when I send a Gcode file, see &lt;a href=&quot;https://docs.mainsail.xyz/overview/quicktips/printer-power-switch&quot;&gt;Klipper docs&lt;/a&gt; and &lt;a href=&quot;https://moonraker.readthedocs.io/en/latest/configuration/#power&quot;&gt;Moonraker docs&lt;/a&gt; for more info on how to do this. You could set up a Home Assistant automation to automatically turn off the smart plug after a print is complete to save on electricity.&lt;/p&gt;
&lt;p&gt;Why not 3D print a case for your Raspberry Pi and mount it directly onto the printer? I 3D printed &lt;a href=&quot;https://www.printables.com/model/15876-raspberry-pi-3-sleeve-case&quot;&gt;this sleeve case&lt;/a&gt; for my RPi and mounted it just above the control box using cable ties.&lt;/p&gt;
&lt;p&gt;Now that you&apos;ve got a full linux computer strapped onto your printer, the possibilities are endless.&lt;/p&gt;
&lt;h2 id=&quot;usb-reliability-update-july-06&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#usb-reliability-update-july-06&quot; aria-label=&quot;usb reliability update july 06 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;USB Reliability Update (July 06)&lt;/h2&gt;
&lt;p&gt;After using this Klipper setup for a while, I noticed that the random printer disconnections with error &lt;code class=&quot;language-text&quot;&gt;ch341-uart ttyUSB0: usb_serial_generic_read_bulk_callback - urb stopped: -32&lt;/code&gt; had not stopped. I initially assumed that this was caused by an unreliable SD card, so I attempted to solve this by switching to an SSD boot drive. However, this did not solve the issue.&lt;/p&gt;
&lt;p&gt;I then found that &lt;a href=&quot;https://github.com/raspberrypi/linux/issues/2406&quot;&gt;others also seem to be having this issue&lt;/a&gt; with similar setups involving connections between a RPi and USB to UART ICs similar to the CH340G found in the SV06.&lt;/p&gt;
&lt;p&gt;I decided to bypass the CH340G IC altogether and use the UART interface directly built into the RPi. This involved opening up the SV06 controller and soldering two wires like this.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/20416673b9482c5921ca23f53bff6e11/dc87c/RX_TX_connections.avif 158w,
/static/20416673b9482c5921ca23f53bff6e11/383b4/RX_TX_connections.avif 315w,
/static/20416673b9482c5921ca23f53bff6e11/d0061/RX_TX_connections.avif 630w,
/static/20416673b9482c5921ca23f53bff6e11/20e2c/RX_TX_connections.avif 945w,
/static/20416673b9482c5921ca23f53bff6e11/9eba6/RX_TX_connections.avif 1260w,
/static/20416673b9482c5921ca23f53bff6e11/a18de/RX_TX_connections.avif 4000w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/20416673b9482c5921ca23f53bff6e11/5787a/RX_TX_connections.webp 158w,
/static/20416673b9482c5921ca23f53bff6e11/89f54/RX_TX_connections.webp 315w,
/static/20416673b9482c5921ca23f53bff6e11/4d353/RX_TX_connections.webp 630w,
/static/20416673b9482c5921ca23f53bff6e11/0f41d/RX_TX_connections.webp 945w,
/static/20416673b9482c5921ca23f53bff6e11/f27a3/RX_TX_connections.webp 1260w,
/static/20416673b9482c5921ca23f53bff6e11/458cb/RX_TX_connections.webp 4000w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/20416673b9482c5921ca23f53bff6e11/ebfe4/RX_TX_connections.jpg 158w,
/static/20416673b9482c5921ca23f53bff6e11/4fcc2/RX_TX_connections.jpg 315w,
/static/20416673b9482c5921ca23f53bff6e11/83b6b/RX_TX_connections.jpg 630w,
/static/20416673b9482c5921ca23f53bff6e11/33bb3/RX_TX_connections.jpg 945w,
/static/20416673b9482c5921ca23f53bff6e11/54265/RX_TX_connections.jpg 1260w,
/static/20416673b9482c5921ca23f53bff6e11/008f5/RX_TX_connections.jpg 4000w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/20416673b9482c5921ca23f53bff6e11/83b6b/RX_TX_connections.jpg&quot;
            alt=&quot;alt text&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Required connections:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CH340G Pin 2 (TX) → RPi GPIO14 (UART TX)&lt;/li&gt;
&lt;li&gt;CH340G Pin 3 (RX) → RPi GPIO15 (UART RX)&lt;/li&gt;
&lt;li&gt;GND → RPi GND&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some software configuration is necessary to get the UART interface operational on the RPi side, see &lt;a href=&quot;https://www.electronicwings.com/raspberry-pi/raspberry-pi-uart-communication-using-python-and-c&quot;&gt;this guide&lt;/a&gt; and &lt;a href=&quot;https://www.raspberrypi.com/documentation/computers/configuration.html#configure-uarts&quot;&gt;RPi documentation&lt;/a&gt;. I followed additional steps to get the better performance &lt;code class=&quot;language-text&quot;&gt;PL011&lt;/code&gt; UART working on GPIO14/15 of my RPi 3B.&lt;/p&gt;
&lt;p&gt;Getting Klipper to use the RPi&apos;s UART interface is as easy as replacing the connection line in &lt;code class=&quot;language-text&quot;&gt;printer.cfg&lt;/code&gt; with &lt;code class=&quot;language-text&quot;&gt;serial: /dev/serial0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;After this modification, the connection between the RPi and the printer has been rock solid, no more random disconnects during prints.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Samsung S5 Dummy Battery]]></title><description><![CDATA[Motivation The Samsung Galaxy S5 was my first flagship smartphone. It was an impressive piece of technology for it's time, but it's been…]]></description><link>https://insertnewline.com/blog/galaxy-s5-dummy-battery/</link><guid isPermaLink="false">https://insertnewline.com/blog/galaxy-s5-dummy-battery/</guid><pubDate>Sun, 23 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;motivation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#motivation&quot; aria-label=&quot;motivation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Motivation&lt;/h2&gt;
&lt;p&gt;The Samsung Galaxy S5 was my first flagship smartphone. It was an impressive piece of technology for it&apos;s time, but it&apos;s been almost a decade since launching in 2014, and my S5 has spent quite a few years in a dusty drawer somewhere.&lt;/p&gt;
&lt;p&gt;Reusing old tech is always nice because, best case, the energy used for recycling is conserved, or worst case, it stays out of landfill.&lt;/p&gt;
&lt;h2 id=&quot;introduction&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#introduction&quot; aria-label=&quot;introduction permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Old phones can be used to make &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.pas.webcam&quot;&gt;security cameras&lt;/a&gt;, home automation displays, etc. Smartphones are particularly useful because they are small, energy efficient computers attached to a whole suite of sensors.&lt;/p&gt;
&lt;p&gt;One issue with running an old phone in a scenario like this where they would be plugged in 24/7, is the battery. Exposing Lithium batteries to heat over long periods usually causes them to swell up. In a tethered scenario, it&apos;s pretty likely you&apos;d be doing something at least moderately computationally intensive, such as recording and broadcasting video, so heat is usually expected.&lt;/p&gt;
&lt;p&gt;Since the phone will always be tethered, there is no real need for a battery. Unfortunately, most phones will not boot without a battery. This is probably for good reason, because the phone may sometimes draw more power than the USB charging port is able to provide.&lt;/p&gt;
&lt;h2 id=&quot;design-decisions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#design-decisions&quot; aria-label=&quot;design decisions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Design Decisions&lt;/h2&gt;
&lt;h3 id=&quot;battery-circuitry&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#battery-circuitry&quot; aria-label=&quot;battery circuitry permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Battery Circuitry&lt;/h3&gt;
&lt;p&gt;Opening up the rear cover of the S5, we can remove the battery.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.9620253164557%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2767239d85d82924d888165d865c7de7/dc87c/battery.avif 158w,
/static/2767239d85d82924d888165d865c7de7/383b4/battery.avif 315w,
/static/2767239d85d82924d888165d865c7de7/d0061/battery.avif 630w,
/static/2767239d85d82924d888165d865c7de7/20e2c/battery.avif 945w,
/static/2767239d85d82924d888165d865c7de7/9eba6/battery.avif 1260w,
/static/2767239d85d82924d888165d865c7de7/421d6/battery.avif 4805w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/2767239d85d82924d888165d865c7de7/5787a/battery.webp 158w,
/static/2767239d85d82924d888165d865c7de7/89f54/battery.webp 315w,
/static/2767239d85d82924d888165d865c7de7/4d353/battery.webp 630w,
/static/2767239d85d82924d888165d865c7de7/0f41d/battery.webp 945w,
/static/2767239d85d82924d888165d865c7de7/f27a3/battery.webp 1260w,
/static/2767239d85d82924d888165d865c7de7/bedca/battery.webp 4805w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2767239d85d82924d888165d865c7de7/ebfe4/battery.jpg 158w,
/static/2767239d85d82924d888165d865c7de7/4fcc2/battery.jpg 315w,
/static/2767239d85d82924d888165d865c7de7/83b6b/battery.jpg 630w,
/static/2767239d85d82924d888165d865c7de7/33bb3/battery.jpg 945w,
/static/2767239d85d82924d888165d865c7de7/54265/battery.jpg 1260w,
/static/2767239d85d82924d888165d865c7de7/a69bc/battery.jpg 4805w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2767239d85d82924d888165d865c7de7/83b6b/battery.jpg&quot;
            alt=&quot;Battery&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;There are four contacts on the battery, with positive and negative labelled clearly. I&apos;m not certain what the other two contacts of the battery are for (at least one of them is used for the NFC coil integrated into the battery). We do, however, need the connector between positive and negative. To summarise, here are the pins that we need to emulate the battery.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/fa386c370d18385818d656343cd3c000/dc87c/pinout.avif 158w,
/static/fa386c370d18385818d656343cd3c000/383b4/pinout.avif 315w,
/static/fa386c370d18385818d656343cd3c000/d0061/pinout.avif 630w,
/static/fa386c370d18385818d656343cd3c000/20e2c/pinout.avif 945w,
/static/fa386c370d18385818d656343cd3c000/9eba6/pinout.avif 1260w,
/static/fa386c370d18385818d656343cd3c000/ae053/pinout.avif 5184w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/fa386c370d18385818d656343cd3c000/5787a/pinout.webp 158w,
/static/fa386c370d18385818d656343cd3c000/89f54/pinout.webp 315w,
/static/fa386c370d18385818d656343cd3c000/4d353/pinout.webp 630w,
/static/fa386c370d18385818d656343cd3c000/0f41d/pinout.webp 945w,
/static/fa386c370d18385818d656343cd3c000/f27a3/pinout.webp 1260w,
/static/fa386c370d18385818d656343cd3c000/d5be9/pinout.webp 5184w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/fa386c370d18385818d656343cd3c000/ebfe4/pinout.jpg 158w,
/static/fa386c370d18385818d656343cd3c000/4fcc2/pinout.jpg 315w,
/static/fa386c370d18385818d656343cd3c000/83b6b/pinout.jpg 630w,
/static/fa386c370d18385818d656343cd3c000/33bb3/pinout.jpg 945w,
/static/fa386c370d18385818d656343cd3c000/54265/pinout.jpg 1260w,
/static/fa386c370d18385818d656343cd3c000/640cf/pinout.jpg 5184w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/fa386c370d18385818d656343cd3c000/83b6b/pinout.jpg&quot;
            alt=&quot;Battery Pinout&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A 10kΩ resistor needs to be connected between the centre pin and the negative terminal, the phone will not boot properly without this resistor. Other resistor values may also work.&lt;/p&gt;
&lt;h3 id=&quot;voltage-source&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#voltage-source&quot; aria-label=&quot;voltage source permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Voltage Source&lt;/h3&gt;
&lt;p&gt;The battery here is Lithium-ion, so we need a voltage in the range of 3.7v and 4.2v. To power the phone, we will need an external power adapter. However, an external power adapter that you can buy off the shelf will likely have voltages higher than 4.2v.&lt;/p&gt;
&lt;p&gt;To deal with this, we will need to use a buck (step-down) DC-DC converter. To keep things nice and compact, I used a micro buck converter (purchase links below) that is small enough to directly integrate into the dummy battery structure that we will design next.&lt;/p&gt;
&lt;h2 id=&quot;dummy-battery-design&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dummy-battery-design&quot; aria-label=&quot;dummy battery design permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Dummy Battery Design&lt;/h2&gt;
&lt;p&gt;I 3D modelled the dummy battery in Fusion 360.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.32911392405063%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2fd7a75af193c8fe2daac5c05644ad35/dc87c/model.avif 158w,
/static/2fd7a75af193c8fe2daac5c05644ad35/383b4/model.avif 315w,
/static/2fd7a75af193c8fe2daac5c05644ad35/d0061/model.avif 630w,
/static/2fd7a75af193c8fe2daac5c05644ad35/20e2c/model.avif 945w,
/static/2fd7a75af193c8fe2daac5c05644ad35/9eba6/model.avif 1260w,
/static/2fd7a75af193c8fe2daac5c05644ad35/b16ce/model.avif 1920w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/2fd7a75af193c8fe2daac5c05644ad35/5787a/model.webp 158w,
/static/2fd7a75af193c8fe2daac5c05644ad35/89f54/model.webp 315w,
/static/2fd7a75af193c8fe2daac5c05644ad35/4d353/model.webp 630w,
/static/2fd7a75af193c8fe2daac5c05644ad35/0f41d/model.webp 945w,
/static/2fd7a75af193c8fe2daac5c05644ad35/f27a3/model.webp 1260w,
/static/2fd7a75af193c8fe2daac5c05644ad35/7e36f/model.webp 1920w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2fd7a75af193c8fe2daac5c05644ad35/dda05/model.png 158w,
/static/2fd7a75af193c8fe2daac5c05644ad35/679a3/model.png 315w,
/static/2fd7a75af193c8fe2daac5c05644ad35/50637/model.png 630w,
/static/2fd7a75af193c8fe2daac5c05644ad35/fddb0/model.png 945w,
/static/2fd7a75af193c8fe2daac5c05644ad35/f46b1/model.png 1260w,
/static/2fd7a75af193c8fe2daac5c05644ad35/88b03/model.png 1920w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2fd7a75af193c8fe2daac5c05644ad35/50637/model.png&quot;
            alt=&quot;3D Model&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The dummy contacts will be 3 male pin headers, which can be pushed into position on the dummy battery after printing. I&apos;ve also included some area on the design to fit the buck converter and circuit wires.&lt;/p&gt;
&lt;p&gt;The next step is to 3D print the model. Since the dummy battery will be exposed to relatively high temperatures by the phone SOC and the buck converter, avoid printing this with PLA, use something more heat resistant such as PETG or ABS instead. I made the mistake of using PLA for my first version, and after a few days of use, the dummy battery was warped (which you can see on the images of the blue 3D print below), and the pins weren&apos;t making contact properly.&lt;/p&gt;
&lt;h2 id=&quot;assembly&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#assembly&quot; aria-label=&quot;assembly permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Assembly&lt;/h2&gt;
&lt;p&gt;Here is the diagram for the circuit that we need to build.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 39.87341772151899%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/cb52f93b71e217af8925fff0c22600ab/dc87c/circuit_diagram.avif 158w,
/static/cb52f93b71e217af8925fff0c22600ab/383b4/circuit_diagram.avif 315w,
/static/cb52f93b71e217af8925fff0c22600ab/d0061/circuit_diagram.avif 630w,
/static/cb52f93b71e217af8925fff0c22600ab/20e2c/circuit_diagram.avif 945w,
/static/cb52f93b71e217af8925fff0c22600ab/56a58/circuit_diagram.avif 1032w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/cb52f93b71e217af8925fff0c22600ab/5787a/circuit_diagram.webp 158w,
/static/cb52f93b71e217af8925fff0c22600ab/89f54/circuit_diagram.webp 315w,
/static/cb52f93b71e217af8925fff0c22600ab/4d353/circuit_diagram.webp 630w,
/static/cb52f93b71e217af8925fff0c22600ab/0f41d/circuit_diagram.webp 945w,
/static/cb52f93b71e217af8925fff0c22600ab/c17ae/circuit_diagram.webp 1032w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/cb52f93b71e217af8925fff0c22600ab/dda05/circuit_diagram.png 158w,
/static/cb52f93b71e217af8925fff0c22600ab/679a3/circuit_diagram.png 315w,
/static/cb52f93b71e217af8925fff0c22600ab/50637/circuit_diagram.png 630w,
/static/cb52f93b71e217af8925fff0c22600ab/fddb0/circuit_diagram.png 945w,
/static/cb52f93b71e217af8925fff0c22600ab/aef12/circuit_diagram.png 1032w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/cb52f93b71e217af8925fff0c22600ab/50637/circuit_diagram.png&quot;
            alt=&quot;Circuit Diagram&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I would recommend wiring up and testing the circuit beforehand. Don&apos;t forget to adjust the buck converter potentiometer until you have a voltage of ~4.2v on the output. Check that your circuit can reliably power the phone without causing brownouts (the camera app is a good way to test high current draw).&lt;/p&gt;
&lt;p&gt;Soldering can be a little bit tricky, particularly for the male headers. These need to have wires soldered in a very specific way to make sure that the header can still be inserted into the slot on the 3D print, and such that the wires or solder don&apos;t intersect with the backstop. The backstop was added to prevent the header pins from sliding back&lt;/p&gt;
&lt;p&gt;It&apos;s a good idea to solder with wires longer than you need, then trim to size later.&lt;/p&gt;
&lt;p&gt;Here is what this circuit looks like assembled.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61.39240506329114%; position: relative; bottom: 0; left: 0; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/9f48ae14e52d7dac32b73bc89461d3c8/dc87c/circuit_assembled.avif 158w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/383b4/circuit_assembled.avif 315w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/d0061/circuit_assembled.avif 630w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/20e2c/circuit_assembled.avif 945w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/9eba6/circuit_assembled.avif 1260w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/b936a/circuit_assembled.avif 5047w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/9f48ae14e52d7dac32b73bc89461d3c8/5787a/circuit_assembled.webp 158w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/89f54/circuit_assembled.webp 315w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/4d353/circuit_assembled.webp 630w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/0f41d/circuit_assembled.webp 945w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/f27a3/circuit_assembled.webp 1260w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/ecd7a/circuit_assembled.webp 5047w&quot;
              sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/9f48ae14e52d7dac32b73bc89461d3c8/ebfe4/circuit_assembled.jpg 158w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/4fcc2/circuit_assembled.jpg 315w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/83b6b/circuit_assembled.jpg 630w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/33bb3/circuit_assembled.jpg 945w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/54265/circuit_assembled.jpg 1260w,
/static/9f48ae14e52d7dac32b73bc89461d3c8/12def/circuit_assembled.jpg 5047w&quot;
            sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/9f48ae14e52d7dac32b73bc89461d3c8/83b6b/circuit_assembled.jpg&quot;
            alt=&quot;Assembled Circuit&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;final-notes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-notes&quot; aria-label=&quot;final notes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final Notes&lt;/h2&gt;
&lt;h3 id=&quot;supply-voltage&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#supply-voltage&quot; aria-label=&quot;supply voltage permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Supply Voltage&lt;/h3&gt;
&lt;p&gt;The buck converter used here should be able to step-down voltages between 6v and 24v. However, the converter will be less efficient at higher voltages, which results in higher temperatures. My buck converter reached ~75°C in open air when supplied with 24v during testing.&lt;/p&gt;
&lt;p&gt;To avoid heat becoming an issue, choosing a supply voltage of around 12v should be optimal. Be careful choosing lower supply voltages such as 5v, as the voltage drop along longer power cables is sometimes enough to cause a brownout on the phone.&lt;/p&gt;
&lt;p&gt;Also don&apos;t forget to make sure that the power supply you use can provide 15-20w of power, since the phone can have current spikes as high as 3A at 4.2v.&lt;/p&gt;
&lt;h3 id=&quot;deployment&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#deployment&quot; aria-label=&quot;deployment permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Deployment&lt;/h3&gt;
&lt;p&gt;After slotting in the dummy battery, the external power wire will likely mean that the rear cover of the phone will not go back on. This wasn&apos;t a deal breaker for me personally, because I used a case over the phone, and I routed the power wire around the side of the phone.&lt;/p&gt;
&lt;h1 id=&quot;links-and-downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#links-and-downloads&quot; aria-label=&quot;links and downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Links and Downloads&lt;/h1&gt;
&lt;h3 id=&quot;downloads&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#downloads&quot; aria-label=&quot;downloads permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Downloads&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Dummy Battery 3D model → &lt;a href=&quot;/downloads/862ca892030f5bdcdacf1936aa09066d/dummy_battery.stl&quot; download&gt;dummy_battery.stl&lt;/a&gt;, &lt;a href=&quot;/downloads/5221c32968fe5dc8e6303b1323716d62/dummy_battery.step&quot; download&gt;dummy_battery.step&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;purchase-links&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#purchase-links&quot; aria-label=&quot;purchase links permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Purchase Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Micro Buck Converter → &lt;a href=&quot;https://www.amazon.com/Regulator-Module-Voltage-Reducer-Adjustable/dp/B08R6337QY&quot;&gt;Amazon&lt;/a&gt; or &lt;a href=&quot;https://www.aliexpress.com/item/33013014541.html&quot;&gt;Aliexpress&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Hello, World!]]></title><description><![CDATA[Hi! 😄 insert newline is a blog. I'm creating this site as a way to document my projects and adventures. These may involve stuff like…]]></description><link>https://insertnewline.com/blog/hello-world/</link><guid isPermaLink="false">https://insertnewline.com/blog/hello-world/</guid><pubDate>Sat, 22 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hi! 😄&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/&quot;&gt;insert newline&lt;/a&gt; is a blog. I&apos;m creating this site as a way to document my projects and adventures. These may involve stuff like programming, electronics, 3D design, etc.&lt;/p&gt;
&lt;p&gt;This blog is very bare-bones at the moment, I&apos;ve only spent a few days working on this, and most of the development time was spent attempting to make a nice reading experience for the blogposts.&lt;/p&gt;
&lt;p&gt;I have ideas for additional functionality (such as blogpost comments) that I&apos;d like to implement at some point, but I tend to start projects with too wide of a scope, so I&apos;m trying to do this a bit differently by starting small.&lt;/p&gt;
&lt;p&gt;In the mean time, if you would like to contact me, feel free to &lt;a href=&quot;/contact&quot;&gt;reach out&lt;/a&gt; anytime!&lt;/p&gt;</content:encoded></item></channel></rss>