A few weeks ago, I got my hands on a 7.5" e-paper display from Waveshare, which cost me $65. Typically, such displays cost about $500 (display, driver board, accessories, etc.). So, the Waveshare display, despite its low resolution, was a bargain. I connected the display to a $5 ESP-WROOM-32 development board to build a low-cost prototype e-reader for PDF documents.
Hardware configuration
The following schematic outlines the electrical connections between the MCU and the display:
The VCC
and GND
pins of the display are connected to the
3V3
and GND
pins of the MCU.
The white button, responsible for switching the e-reader on and off, connects
GPIO15
of the ESP32 to its 3V3
pin via a 10k resistor. The
yellow and blue buttons, used for turning pages, connect GPIO21
and
GPIO22
to GND
.
Setting up the e-reader
To use the e-reader, first, execute the pdftoebm.py
script on a computer
that has Poppler and
ImageMagick installed to convert
the PDF document to a bitmap archive:
$ python -m pdftoebm -o $output_path $pdf_document
Then, upload the resulting a.ebm
file to the HTTP server pointed to by the
EBM_ARCH_URL
in the Kconfig.projbuild
file. If the HTTP
server requires TLS, run the following command to obtain the root certificate for the
server and replace the contents of the cert.pem
file with the last
certificate in the chain of certificates:
$ openssl s_client -showcerts -connect $hostname:443 </dev/null
The Espressif SDK for ESP32 requires secure HTTP connections by default. If your server
does not support TLS, switch this setting off in the SDK configuration (by running the
idf.py menuconfig
command) to bypass the TLS requirement, and remove
references to the cert.pem
file in the main.c
file.
Finally, build and upload the program to the ESP32 by issuing the command
idf.py build flash
.
How does it work?
The pdftpebm.py
script converts each page of the PDF to a monochrome image
of the same size and resolution as the display. For an 800x480 display, it arranges the
PDF pages as a series of 48KB bitmaps in the a.ebm
file.
When the ESP32 starts up, it connects to WiFi (requires a 2.4GHz access point) and
downloads the first three 48KB blocks of the a.ebm
file using the HTTP Range
header. These 144KB correspond to the first three pages of the document.
Whenever the user presses the yellow or blue button, the e-reader transfers the relevant page from DMA-capable memory in the MCU to the display over SPI while downloading another page from the HTTP server.
Finally, when the user presses the white button, ESP32 shuts down all its systems except the RTC module and enters a state of deep sleep. When the user presses the white button again, the e-reader wakes up from deep sleep and restores pages based on the reading progress found in RTC memory.
Files: source.tar.gz