diff options
Diffstat (limited to '_projects/e-reader')
| -rw-r--r-- | _projects/e-reader/index.md | 91 |
1 files changed, 0 insertions, 91 deletions
diff --git a/_projects/e-reader/index.md b/_projects/e-reader/index.md deleted file mode 100644 index 2b907bb..0000000 --- a/_projects/e-reader/index.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: Prototype e-reader -date: 2023-10-24T00:00:00+08:00 -author: W. D. Sadeep Madurange -thumbnail: thumb.png ---- - -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. - -<video style="max-width:100%" controls="" poster=thumb.png> - <source src="ereader.mp4" type="video/mp4"> -</video> - -{{< 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. - - - -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) |
