Networked eInk Screens

Sample eInk Image

I really enjoy eInk panels for their clarity and unimposing display charactistics. The purpose of this project is to build toward an ecosystem of eInk hardware and supporting software that will let me share images with my family in a distributed, low frequency network. eInk panels blend into the background like photos, and they can be slowly updated to give a taste of home from a few states away without being distracting.

This project leverages the rust language to power the embedded firmware and some supporting data manipulation. Rust works really well in this case as we can leverage the type system to make static guarantees that we aren't accessing hardware resources in competing ways, among many other benefits. This level of expression and static guarantees makes writing embedded firmware almost as convenient as writing desktop software.

Hardware and Software

  • The module
    • Panel/board is from Waveshare
    • Powered by a Raspberry Pico W
    • Firmware written in Rust
      • Uses Embassy async framework
      • Leverages embedded-hal to provide static, zero cost abstractions
      • Extracts packed 4 pixels per byte and writes to panel
  • Supporting Software
    • Simple image processing procedure in GIMP
      • Resizes image to match panel resolution
      • Quantizes to 4 color values
      • Exports as 1 byte per pixel 0-3 binary format
    • Rust utility to pack 4 pixels into a byte
      • 2 bits per pixel for 4 level grayscale
    • Simple nodejs udp networking application
      • Implements barebones protocol for sending binary packed pixel data
      • Supports configurable MTU