summaryrefslogtreecommitdiffstats
path: root/_projects/e-reader.md
diff options
context:
space:
mode:
Diffstat (limited to '_projects/e-reader.md')
-rw-r--r--_projects/e-reader.md88
1 files changed, 88 insertions, 0 deletions
diff --git a/_projects/e-reader.md b/_projects/e-reader.md
new file mode 100644
index 0000000..be34473
--- /dev/null
+++ b/_projects/e-reader.md
@@ -0,0 +1,88 @@
+---
+title: Prototype e-reader
+date: 2023-10-24
+author: W. D. Sadeep Madurange
+thumbnail: thumb.png
+layout: post
+---
+
+This project features a prototype e-reader powered by a 7.5-inch {{< link
+src="https://www.waveshare.com/" class="external" target="_blank"
+rel="noopener noreferrer">}}Waveshare{{< /link >}} e-paper display and an
+ESP-WROOM-32 development board.
+
+{% include video.html src="ereader.mp4" %}
+
+#### Overview
+
+In 2017, during a short stint as a project manager, I was tasked with
+installing some e-paper displays in a car park. Not knowing how they worked, I
+remember marveling at their sight like a muggle witnessing magic. As someone
+who enjoys reading, I found e-paper to be a true innovation. This project was
+born out of that enduring curiosity and love of e-paper technology.
+
+The prototype, while far from ready for daily use, has some nifty features that
+fellow hobbyists and tinkerers may find interesting. The reader can display
+books of arbitrary sizes by streaming them over HTTP. It employs sleep modes to
+minimize power consumption when not in use and records the reading progress in
+the chip's RTC memory.
+
+The following schematic outlines the electrical connections of the e-reader.
+
+![circuit](circuit.svg)
+
+The biggest challenge when building an e-reader using an ESP32 board is its low
+memory and lack of storage. My ESP-WROOM-32 board has 512 KB of SRAM and 4 MB
+of flash memory, which the freeRTOS, ESP-IDF, and my own program have to share.
+To put things into perspective, compare that to a Kindle Paperwhite, which has
+at least 256 MB of memory and 8 GB of storage.
+
+Despite its constraints, 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 amusing to embrace the constraints and build my e-reader using
+just a $5 MCU and the power of C programming.
+
+#### The file format
+
+The file format dictates the complexity of the embedded software. So, I’ll
+begin there. The e-reader works by downloading and rendering a rasterized
+monochrome image of a page (a .ebm file).
+
+The EBM file contains a series of bitmaps, where each bitmap corresponds to a
+page of a book sized to fit the e-paper display. Each byte contains information
+for rendering eight pixels. For my display, which has a resolution of 480x800,
+the bitmaps are laid out along 48 KB boundaries. This simple file format lends
+well to HTTP streaming, which is its main advantage, as we will soon see.
+
+The enclosed pdftoebm.py script in the tarball at the end of the page converts
+PDF documents to an EBM file. I use it to make EBM files before uploading them
+to a web server.
+
+#### 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 location of the
+file is configured via the `EBM_ARCH_URL` setting in the Kconfig.projbuild
+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 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
+two cores of the MCU 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 pin the two routines to each core.
+
+I designed the EBM format with HTTP streaming in mind. To download a page based
+on the current reading progress, the e-reader specifies the page offset and the
+chunk size using the HTTP Range header.
+
+#### Afterword
+
+It's been six years since the car park and the displays. At the time, I knew
+nothing about embedded systems or display drivers. It took a long time to
+develop the skill set, but now, at last, I know how those displays worked and
+how to build my own.
+
+Files: [source.tar.gz](source.tar.gz)