From 79e9eec0ac05634fe367220df701b20c91523291 Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Sat, 25 Oct 2025 10:53:52 +0800 Subject: Project folder. --- _projects/e-reader/circuit.svg | 145 +++++++++++++++++++++++++++++++++++++++ _projects/e-reader/ereader.mp4 | Bin 0 -> 9775756 bytes _projects/e-reader/index.md | 90 ++++++++++++++++++++++++ _projects/e-reader/source.tar.gz | Bin 0 -> 14304 bytes _projects/e-reader/thumb.png | Bin 0 -> 674187 bytes 5 files changed, 235 insertions(+) create mode 100644 _projects/e-reader/circuit.svg create mode 100644 _projects/e-reader/ereader.mp4 create mode 100644 _projects/e-reader/index.md create mode 100644 _projects/e-reader/source.tar.gz create mode 100644 _projects/e-reader/thumb.png (limited to '_projects/e-reader') diff --git a/_projects/e-reader/circuit.svg b/_projects/e-reader/circuit.svg new file mode 100644 index 0000000..fd7508b --- /dev/null +++ b/_projects/e-reader/circuit.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + 10 kΩ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + + + + + 5 + 6 + 7 + 8 + BUS + E-Paper Display HAT + + + CS + + DC + + DIN + + CLK + + BUSY + + RST + + GND + + VCC + + ESP-WROOM-32 + + IO21 + + + IO5 + + + IO16 + + + IO23 + + + IO18 + + + IO22 + + + IO4 + + + IO2 + + + GND + + + 3V3 + + + GND + + + IO15 + + + + \ No newline at end of file diff --git a/_projects/e-reader/ereader.mp4 b/_projects/e-reader/ereader.mp4 new file mode 100644 index 0000000..a57a5b1 Binary files /dev/null and b/_projects/e-reader/ereader.mp4 differ diff --git a/_projects/e-reader/index.md b/_projects/e-reader/index.md new file mode 100644 index 0000000..a19603a --- /dev/null +++ b/_projects/e-reader/index.md @@ -0,0 +1,90 @@ +--- +title: Prototype e-reader +date: 2023-10-24T00:00:00+08:00 +author: W. D. Sadeep Madurange +--- + +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. + + + +{{< toc >}} + +## 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) diff --git a/_projects/e-reader/source.tar.gz b/_projects/e-reader/source.tar.gz new file mode 100644 index 0000000..3e343a7 Binary files /dev/null and b/_projects/e-reader/source.tar.gz differ diff --git a/_projects/e-reader/thumb.png b/_projects/e-reader/thumb.png new file mode 100644 index 0000000..1e222d2 Binary files /dev/null and b/_projects/e-reader/thumb.png differ -- cgit v1.2.3