summaryrefslogtreecommitdiffstats
path: root/_site/projects/e-reader
diff options
context:
space:
mode:
Diffstat (limited to '_site/projects/e-reader')
-rw-r--r--_site/projects/e-reader/index.html58
1 files changed, 32 insertions, 26 deletions
diff --git a/_site/projects/e-reader/index.html b/_site/projects/e-reader/index.html
index 5fe3341..2e04274 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" />
@@ -67,13 +67,13 @@ minimize power consumption when not in use and records the reading progress in
the chip’s RTC memory.</p>
<p>The most formidable challenge when trying to build an e-reader with an ESP32
-board is its limited memory and storage. My ESP-WROOM-32 board has 512 KB of
-SRAM and 4 MB of flash memory, which the freeRTOS, ESP-IDF, and the e-reader
+board is its limited memory and storage. My ESP-WROOM-32 board has 512KB of
+SRAM and 4MB of flash memory, which the freeRTOS, ESP-IDF, and the e-reader
application must share. To put things into perspective, a Kindle Paperwhite has
-at least 256 MB of memory and 8 GB of storage.</p>
+at least 256MB of memory and 8GB of storage.</p>
<p>Despite its size, as microcontrollers go, ESP32 is a powerful system-on-a-chip
-with a 160 MHz dual-core processor and integrated WiFi. So, I thought it’d be
+with a 160MHz dual-core processor and integrated WiFi. So, I thought it’d be
amusing to embrace the constraints and build my e-reader using a $5 MCU and the
power of C programming.</p>
@@ -86,7 +86,7 @@ monochrome image of a page (a .ebm file).</p>
<p>The EBM file contains a series of bitmaps, one for each page of the book. The
dimensions of each bitmap are equal to the size of the display. Each byte of
the bitmap encodes information for rendering eight pixels. For my display,
-which has a resolution of 480x800, the bitmaps are laid out along 48 KB
+which has a resolution of 480x800, the bitmaps are laid out along 48KB
boundaries. This simple file format lends well to HTTP streaming, which is its
main advantage, as we will soon see.</p>
@@ -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>