diff options
Diffstat (limited to '_site/projects/e-reader/index.html')
| -rw-r--r-- | _site/projects/e-reader/index.html | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/_site/projects/e-reader/index.html b/_site/projects/e-reader/index.html new file mode 100644 index 0000000..bc23c7b --- /dev/null +++ b/_site/projects/e-reader/index.html @@ -0,0 +1,136 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>Prototype e-reader</title> + <head> +<meta charset="utf-8"> + <title>Prototype e-reader</title> + <link rel="stylesheet" href="/assets/css/main.css"> + <link rel="stylesheet" href="/assets/css/normalize.css"> + <link rel="stylesheet" href="/assets/css/skeleton.css"> +</head> + + + </head> + <body> + + <div class="container"> + <ul id="navlist" class="left"> + <li > + <a href="/">hme</a> + </li> + <li > + <a href="/projects/">tnk</a> + </li> + <li > + <a href="/about/">abt</a> + </li> + <li><a href="/feed.xml">rss</a></li> + </ul> +</div> + + + + <main> + <div class="container"> + <img src="/assets/img/grunge.png" alt="" class="line"> + <p class="center">[ N<sup>o</sup> ] + <span> </span></p> + <img src="/assets/img/grunge.png" alt="" class="line flip"> + + <h2 class="brand center" id="title">PROTOTYPE E-READER</h2> + + + <br> + <h4 class="center space"></h4> + <h5 class="center">24 OCTOBER 2023</h5> + + <div class="threecol justify"> + <p>This project features a prototype e-reader powered by a 7.5-inch Waveshare e-paper display and an +ESP-WROOM-32 development board.</p> + +<iframe style="max-width: 100%" src="ereader.mp4" frameborder="0" allowfullscreen=""></iframe> + +<h4 id="overview">Overview</h4> + +<p>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.</p> + +<p>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.</p> + +<p>The following schematic outlines the electrical connections of the e-reader.</p> + +<p><img src="circuit.svg" alt="circuit" /></p> + +<p>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.</p> + +<p>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.</p> + +<h4 id="the-file-format">The file format</h4> + +<p>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).</p> + +<p>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.</p> + +<p>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.</p> + +<h4 id="how-does-it-work">How does it work?</h4> + +<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 location of the +file is configured via the <code class="language-plaintext highlighter-rouge">EBM_ARCH_URL</code> 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.</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 +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.</p> + +<p>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.</p> + +<h4 id="afterword">Afterword</h4> + +<p>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.</p> + +<p>Files: <a href="source.tar.gz">source.tar.gz</a></p> + + </div> + + <p class="right italics">by W. D. Sadeep Madurange</p> + </div> + </main> + + </body> +</html> |
