summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSadeep Madurange <sadeep@asciimx.com>2025-12-10 21:25:04 +0800
committerSadeep Madurange <sadeep@asciimx.com>2025-12-10 21:25:04 +0800
commitfa2d2df753da5320a9334ba7398f32609bd19a15 (patch)
tree893dc7fba5df4e8ad05b489dda9319e656e7442a
parent7950119c458c6a18cd382c8fa7863071766deea7 (diff)
downloadwww-fa2d2df753da5320a9334ba7398f32609bd19a15.tar.gz
Improve e-reader write up.
-rw-r--r--_projects/e-reader.md48
-rw-r--r--_site/about/index.html2
-rw-r--r--_site/feed.xml2
-rw-r--r--_site/posts.xml2
-rw-r--r--_site/projects/e-reader/index.html48
-rw-r--r--_site/projects/index.html4
-rw-r--r--about.html2
7 files changed, 59 insertions, 49 deletions
diff --git a/_projects/e-reader.md b/_projects/e-reader.md
index 1a0892e..dcafca0 100644
--- a/_projects/e-reader.md
+++ b/_projects/e-reader.md
@@ -1,14 +1,14 @@
---
-title: Prototype e-reader
+title: Experimental e-reader
date: 2023-10-24
thumbnail: thumb.png
layout: post
---
-This project features a prototype e-reader powered by an ESP-WROOM-32
-development board and a 7.5-inch <a href="https://www.waveshare.com/"
-class="external" target="_blank" rel="noopener noreferrer">Waveshare</a>
-e-paper display.
+This project features a minimal e-reader powered by an ESP-WROOM-32 development
+board and a 7.5-inch <a href="https://www.waveshare.com/" class="external"
+target="_blank" rel="noopener noreferrer">Waveshare</a> e-paper display built
+with the intention of learning about e-paper displays.
<video style="max-width:100%;" controls="" poster="thumb.png">
<source src="ereader.mp4" type="video/mp4">
@@ -57,20 +57,20 @@ PDF documents to EBM files.
## How does it work?
-As the e-reader has no storage, it can't store books locally. Instead, I first
-have to upload the EBM file I want to read to a web server. The `EBM_ARCH_URL`
-setting in the Kconfig.projbuild file points to the URL of the file. To read a
-different book, I create an EBM file with the same name and upload it to the
-original location. That way, I don't have to modify the `EBM_ARCH_URL` value,
-which requires recompiling the embedded software.
+As the e-reader has no storage, it can't store books locally. Instead, it
+downloads pages of the EBM file over HTTP from the location pointed to by the
+`EBM_ARCH_URL` setting in the Kconfig.projbuild file on demand. To read a
+different book, we have to replace the old file with the new one or change the
+`EBM_ARCH_URL` value. The latter requires us to recompile the embedded
+software.
Upon powering up, the e-reader checks the reading progress stored in the RTC
memory. It then downloads three pages (current, previous, and next) to a
-circular buffer in DMA-capable memory. When the user turns a page, one of the
-microprocessor's two cores transfers it from the buffer to the display over a
-Serial Peripheral Interface (SPI). The other downloads a new page in the
-background. I use the ESP-IDF task API to distribute the two tasks between the
-available cores for maximum parallelism.
+circular buffer in DMA-capable memory. When the user turns a page by pressing a
+button, one of the microprocessor's two cores transfers it from the buffer to
+the display over a Serial Peripheral Interface (SPI). The other downloads a new
+page in the background. I used the ESP-IDF's task API to distribute the two
+tasks between the available cores to make the reader more responsive.
I designed the EBM format with HTTP streaming in mind. Since the pages are laid
out in the EBM file along predictable boundaries, the e-reader can request
@@ -80,11 +80,15 @@ web server will process this request without custom logic.
## Reflections
It's been six years since the car park and the displays. I began this project
-hoping to learn the low-level workings of e-paper displays. As a bonus, it led
-me to explore some of ESP32's most fascinating features: sleep modes, multicore
-processing, DMA, and RTC memory. Embedded systems are magical things: invisible
-particles swirl into form as the programmer whispers C.
-
-
+hoping to learn more about e-paper displays, and I got that and more. By
+working within the constraints of the ESP32, I forced myself to explore some of
+its advanced features: sleep modes, multicore task scheduling, DMA transfers,
+and RTC memory.
+
+As for the prototype, while it's no match for a commercial e-reader with
+features like an offline library of books and touch screens, there's something
+to be said about reading on hardware you built yourself. You are no longer the
+powerless Muggle watching others perform magic. You are the wizard who makes
+the invisible particles swirl into form by whispering C to it.
Files: [source.tar.gz](source.tar.gz)
diff --git a/_site/about/index.html b/_site/about/index.html
index 060f09d..6c44c47 100644
--- a/_site/about/index.html
+++ b/_site/about/index.html
@@ -49,7 +49,7 @@
<h4>Navigation</h4>
<ul>
- <li>hme: Home page, listing latest articles.</li>
+ <li>hme: Home page, listing the latest articles.</li>
<li>blg: Notes and tutorials about software and embedded systems.</li>
<li>poc: Projects, prototypes, and experiments.</li>
<li>abt: Site information.</li>
diff --git a/_site/feed.xml b/_site/feed.xml
index a5979a1..495fe32 100644
--- a/_site/feed.xml
+++ b/_site/feed.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2025-12-09T23:04:17+08:00</updated><id>/feed.xml</id><title type="html">ASCIIMX | Blog</title><author><name>W. D. Sadeep Madurange</name></author><entry><title type="html">How I manage Suckless software packages</title><link href="/blog/suckless-software/" rel="alternate" type="text/html" title="How I manage Suckless software packages" /><published>2025-11-30T00:00:00+08:00</published><updated>2025-11-30T00:00:00+08:00</updated><id>/blog/suckless-software</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[Since suckless software requires users to modify the source code and recompile to customize, I need a way to maintain patches over the long term while retaining the ability to upgrade the software as new versions are released.]]></summary></entry><entry><title type="html">Neo4J A* search</title><link href="/blog/neo4j-a-star-search/" rel="alternate" type="text/html" title="Neo4J A* search" /><published>2025-09-14T00:00:00+08:00</published><updated>2025-09-14T00:00:00+08:00</updated><id>/blog/neo4j-a-star-search</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[Back in 2018, we used Neo4J graph database to track the movement of marine vessels. We were interested in the shortest path a ship could take through a network of about 13,000 route points. Algorithms based on graph theory, such as A* search, provide optimal solutions to such problems. In other words, the set of route points lends itself well to a model based on graphs.]]></summary></entry><entry><title type="html">MOSFETs as electronic switches</title><link href="/blog/mosfet-switches/" rel="alternate" type="text/html" title="MOSFETs as electronic switches" /><published>2025-06-22T00:00:00+08:00</published><updated>2025-06-22T00:00:00+08:00</updated><id>/blog/mosfet-switches</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[Recently, I needed a low-power circuit for one of my battery-operated projects. Much of the system’s power savings depended on its ability to electronically switch off components, such as servos, that draw high levels of quiescent currents. My search for a solution led me to MOSFETs, transistors capable of controlling circuits operating at voltages far above their own.]]></summary></entry><entry><title type="html">How to configure ATmega328P microcontrollers to run at 3.3V and 5V</title><link href="/blog/arduino-uno/" rel="alternate" type="text/html" title="How to configure ATmega328P microcontrollers to run at 3.3V and 5V" /><published>2025-04-10T00:00:00+08:00</published><updated>2025-04-10T00:00:00+08:00</updated><id>/blog/arduino-uno</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[This is a quick reference for wiring up ATmega328P ICs to run at 5V and 3.3V. While the 5V configuration is common, the 3.3V configuration can be useful in low-power applications and when interfacing with parts that themselves run at 3.3V. In this guide, the 5V setup is configured with a 16MHz crystal oscillator, while the 3.3V configuration makes use of an 8MHz crystal oscillator.]]></summary></entry><entry><title type="html">How to set up ATSAM3X8E microcontrollers for bare-metal programming in C</title><link href="/blog/arduino-due/" rel="alternate" type="text/html" title="How to set up ATSAM3X8E microcontrollers for bare-metal programming in C" /><published>2024-10-05T00:00:00+08:00</published><updated>2024-10-05T00:00:00+08:00</updated><id>/blog/arduino-due</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[This article is a step-by-step guide for programming bare-metal ATSAM3X8E chips found on Arduino Due boards. It also includes notes on the chip’s memory layout relevant for writing linker scripts. The steps described in this article were tested on an OpenBSD workstation.]]></summary></entry></feed> \ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2025-12-10T21:24:48+08:00</updated><id>/feed.xml</id><title type="html">ASCIIMX | Blog</title><author><name>W. D. Sadeep Madurange</name></author><entry><title type="html">How I manage Suckless software packages</title><link href="/blog/suckless-software/" rel="alternate" type="text/html" title="How I manage Suckless software packages" /><published>2025-11-30T00:00:00+08:00</published><updated>2025-11-30T00:00:00+08:00</updated><id>/blog/suckless-software</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[Since suckless software requires users to modify the source code and recompile to customize, I need a way to maintain patches over the long term while retaining the ability to upgrade the software as new versions are released.]]></summary></entry><entry><title type="html">Neo4J A* search</title><link href="/blog/neo4j-a-star-search/" rel="alternate" type="text/html" title="Neo4J A* search" /><published>2025-09-14T00:00:00+08:00</published><updated>2025-09-14T00:00:00+08:00</updated><id>/blog/neo4j-a-star-search</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[Back in 2018, we used Neo4J graph database to track the movement of marine vessels. We were interested in the shortest path a ship could take through a network of about 13,000 route points. Algorithms based on graph theory, such as A* search, provide optimal solutions to such problems. In other words, the set of route points lends itself well to a model based on graphs.]]></summary></entry><entry><title type="html">MOSFETs as electronic switches</title><link href="/blog/mosfet-switches/" rel="alternate" type="text/html" title="MOSFETs as electronic switches" /><published>2025-06-22T00:00:00+08:00</published><updated>2025-06-22T00:00:00+08:00</updated><id>/blog/mosfet-switches</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[Recently, I needed a low-power circuit for one of my battery-operated projects. Much of the system’s power savings depended on its ability to electronically switch off components, such as servos, that draw high levels of quiescent currents. My search for a solution led me to MOSFETs, transistors capable of controlling circuits operating at voltages far above their own.]]></summary></entry><entry><title type="html">How to configure ATmega328P microcontrollers to run at 3.3V and 5V</title><link href="/blog/arduino-uno/" rel="alternate" type="text/html" title="How to configure ATmega328P microcontrollers to run at 3.3V and 5V" /><published>2025-04-10T00:00:00+08:00</published><updated>2025-04-10T00:00:00+08:00</updated><id>/blog/arduino-uno</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[This is a quick reference for wiring up ATmega328P ICs to run at 5V and 3.3V. While the 5V configuration is common, the 3.3V configuration can be useful in low-power applications and when interfacing with parts that themselves run at 3.3V. In this guide, the 5V setup is configured with a 16MHz crystal oscillator, while the 3.3V configuration makes use of an 8MHz crystal oscillator.]]></summary></entry><entry><title type="html">How to set up ATSAM3X8E microcontrollers for bare-metal programming in C</title><link href="/blog/arduino-due/" rel="alternate" type="text/html" title="How to set up ATSAM3X8E microcontrollers for bare-metal programming in C" /><published>2024-10-05T00:00:00+08:00</published><updated>2024-10-05T00:00:00+08:00</updated><id>/blog/arduino-due</id><author><name>W. D. Sadeep Madurange</name></author><summary type="html"><![CDATA[This article is a step-by-step guide for programming bare-metal ATSAM3X8E chips found on Arduino Due boards. It also includes notes on the chip’s memory layout relevant for writing linker scripts. The steps described in this article were tested on an OpenBSD workstation.]]></summary></entry></feed> \ No newline at end of file
diff --git a/_site/posts.xml b/_site/posts.xml
index 537fbb6..c9e25f0 100644
--- a/_site/posts.xml
+++ b/_site/posts.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="/posts.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2025-12-09T23:04:17+08:00</updated><id>/posts.xml</id><title type="html">ASCIIMX</title><author><name>W. D. Sadeep Madurange</name></author></feed> \ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="/posts.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2025-12-10T21:24:48+08:00</updated><id>/posts.xml</id><title type="html">ASCIIMX</title><author><name>W. D. Sadeep Madurange</name></author></feed> \ No newline at end of file
diff --git a/_site/projects/e-reader/index.html b/_site/projects/e-reader/index.html
index 5fe3341..9d26ee2 100644
--- a/_site/projects/e-reader/index.html
+++ b/_site/projects/e-reader/index.html
@@ -2,12 +2,12 @@
<html>
<head>
<meta charset="utf-8">
- <title>Prototype e-reader</title>
+ <title>Experimental e-reader</title>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Prototype e-reader</title>
+ <title>Experimental e-reader</title>
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="stylesheet" href="/assets/css/skeleton.css">
</head>
@@ -41,12 +41,12 @@
<main>
<div class="container">
<div class="container-2">
- <h2 class="center" id="title">PROTOTYPE E-READER</h2>
+ <h2 class="center" id="title">EXPERIMENTAL E-READER</h2>
<h6 class="center">24 OCTOBER 2023</h5>
<br>
- <div class="twocol justify"><p>This project features a prototype e-reader powered by an ESP-WROOM-32
-development board and a 7.5-inch <a href="https://www.waveshare.com/" class="external" target="_blank" rel="noopener noreferrer">Waveshare</a>
-e-paper display.</p>
+ <div class="twocol justify"><p>This project features a minimal e-reader powered by an ESP-WROOM-32 development
+board and a 7.5-inch <a href="https://www.waveshare.com/" class="external" target="_blank" rel="noopener noreferrer">Waveshare</a> e-paper display built
+with the intention of learning about e-paper displays.</p>
<video style="max-width:100%;" controls="" poster="thumb.png">
<source src="ereader.mp4" type="video/mp4" />
@@ -95,20 +95,20 @@ PDF documents to EBM files.</p>
<h2 id="how-does-it-work">How does it work?</h2>
-<p>As the e-reader has no storage, it can’t store books locally. Instead, I first
-have to upload the EBM file I want to read to a web server. The <code class="language-plaintext highlighter-rouge">EBM_ARCH_URL</code>
-setting in the Kconfig.projbuild file points to the URL of the file. To read a
-different book, I create an EBM file with the same name and upload it to the
-original location. That way, I don’t have to modify the <code class="language-plaintext highlighter-rouge">EBM_ARCH_URL</code> value,
-which requires recompiling the embedded software.</p>
+<p>As the e-reader has no storage, it can’t store books locally. Instead, it
+downloads pages of the EBM file over HTTP from the location pointed to by the
+<code class="language-plaintext highlighter-rouge">EBM_ARCH_URL</code> setting in the Kconfig.projbuild file on demand. To read a
+different book, we have to replace the old file with the new one or change the
+<code class="language-plaintext highlighter-rouge">EBM_ARCH_URL</code> value. The latter requires us to recompile the embedded
+software.</p>
<p>Upon powering up, the e-reader checks the reading progress stored in the RTC
memory. It then downloads three pages (current, previous, and next) to a
-circular buffer in DMA-capable memory. When the user turns a page, one of the
-microprocessor’s two cores transfers it from the buffer to the display over a
-Serial Peripheral Interface (SPI). The other downloads a new page in the
-background. I use the ESP-IDF task API to distribute the two tasks between the
-available cores for maximum parallelism.</p>
+circular buffer in DMA-capable memory. When the user turns a page by pressing a
+button, one of the microprocessor’s two cores transfers it from the buffer to
+the display over a Serial Peripheral Interface (SPI). The other downloads a new
+page in the background. I used the ESP-IDF’s task API to distribute the two
+tasks between the available cores to make the reader more responsive.</p>
<p>I designed the EBM format with HTTP streaming in mind. Since the pages are laid
out in the EBM file along predictable boundaries, the e-reader can request
@@ -118,10 +118,16 @@ web server will process this request without custom logic.</p>
<h2 id="reflections">Reflections</h2>
<p>It’s been six years since the car park and the displays. I began this project
-hoping to learn the low-level workings of e-paper displays. As a bonus, it led
-me to explore some of ESP32’s most fascinating features: sleep modes, multicore
-processing, DMA, and RTC memory. Embedded systems are magical things: invisible
-particles swirl into form as the programmer whispers C.</p>
+hoping to learn more about e-paper displays, and I got that and more. By
+working within the constraints of the ESP32, I forced myself to explore some of
+its advanced features: sleep modes, multicore task scheduling, DMA transfers,
+and RTC memory.</p>
+
+<p>As for the prototype, while it’s no match for a commercial e-reader with
+features like an offline library of books and touch screens, there’s something
+to be said about reading on hardware you built yourself. You are no longer the
+powerless Muggle watching others perform magic. You are the wizard who makes
+the invisible particles swirl into form by whispering C to it.</p>
<p>Files: <a href="source.tar.gz">source.tar.gz</a></p>
</div>
diff --git a/_site/projects/index.html b/_site/projects/index.html
index 924dbad..95cbe6b 100644
--- a/_site/projects/index.html
+++ b/_site/projects/index.html
@@ -45,8 +45,8 @@
<td class="project-item">
- <img src="e-reader/thumb.png" alt="Prototype e-reader">
- <h5><a href="e-reader" class="link-decor-none">Prototype e-reader</a></h5>
+ <img src="e-reader/thumb.png" alt="Experimental e-reader">
+ <h5><a href="e-reader" class="link-decor-none">Experimental e-reader</a></h5>
</td>
<td class="project-item">
diff --git a/about.html b/about.html
index 3f71d59..ff88eb9 100644
--- a/about.html
+++ b/about.html
@@ -18,7 +18,7 @@ title: About
<h4>Navigation</h4>
<ul>
- <li>hme: Home page, listing latest articles.</li>
+ <li>hme: Home page, listing the latest articles.</li>
<li>blg: Notes and tutorials about software and embedded systems.</li>
<li>poc: Projects, prototypes, and experiments.</li>
<li>abt: Site information.</li>