1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Prototype e-reader</title>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Prototype e-reader</title>
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="stylesheet" href="/assets/css/skeleton.css">
</head>
</head>
<body>
<div class="container">
<ul id="navlist" class="left">
<li >
<a href="/" class="link-decor-none">hme</a>
</li>
<li >
<a href="/archive/" class="link-decor-none">blg</a>
</li>
<li class="active">
<a href="/projects/" class="link-decor-none">poc</a>
</li>
<li >
<a href="/about/" class="link-decor-none">abt</a>
</li>
<li><a href="/feed.xml" class="link-decor-none">rss</a></li>
</ul>
</div>
<main>
<div class="container">
<h2 class="center" id="title">PROTOTYPE 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 a 7.5-inch <a href="https://www.waveshare.com/" class="external" target="_blank" rel="noopener noreferrer">Waveshare</a> 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 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="post-author right">by W. D. Sadeep Madurange</p>
</div>
</main>
</body>
</html>
|