Getting Started
Adafruit Playground is a wonderful and safe place to share your interests with Adafruit's vibrant community of makers and doers. Have a cool project you are working on? Have a bit of code that you think others will find useful? Want to show off your electronics workbench? You have come to the right place.
The goal of Adafruit Playground is to make it as simple as possible to share your work. On the Adafruit Playground users can create Notes. A note is a single-page space where you can document your topic using Adafruit's easy-to-use editor. Notes are like Guides on the Adafruit Learning System but guides are high-fidelity content curated and maintained by Adafuit. Notes are whatever you want them to be. Have fun and be kind.
Click here to learn more about Adafruit Playground and how to get started.
-
epdsi on the Feather ThinkInk: From One Panel to Seven, One Socket
Back in my earlier post, I wrote about bringing up a single JD79661 panel on this board with a driver built from scratch. That driver has since grown into
epdsi, a publishedno_std,embedded-hal1.0 Rust crate. I went back to the same ThinkInk Feather to see how far it reaches now.Answer: seven panels, five controller ICs, one 24-pin FPC socket, no wiring changes. Swap the panel, reflash, done. All seven verified working on the first attempt:
Panel Controller Full refresh Partial/fast 1.54" Tri-Color SSD1681 17,881 ms 17,881 ms (windowed, no saving) 2.13" Mono SSD1680 3,893 ms 1,017 ms (differential) 2.13" Quad-Color JD79661 20,041 ms — 2.66" Tri-Color SSD1680 20,044 ms 16,176 ms (FastFull) 3.52" Tri-Color UC8253 17,366 ms — 3.7" Mono UC8253 2,615 ms 410 ms (FastPartial) 4.26" Mono SSD1677 3,744 ms 500 ms Two things worth calling out. Colour panels have no fast path: narrowing the RAM window reduces what's redrawn, not what it costs, so a partial refresh on a Tri-Color panel takes exactly as long as a full one. Both UC8253 panels work fine here too, which is notable because an earlier bring-up on a different ESP32-C3 board logged them as non-functional. That module later turned out to be faulty hardware, and these clean first-try runs on the ThinkInk are the evidence the driver was never the problem.
Full code, wiring notes, and measurement methodology:
adafruit-feather-thinkink-discovery.Conclusion
If you're on this board,
epdsiis worth a look regardless of which panel you're holding. One driver, one socket.One thing I'd change on the hardware side, though. The 24-pin FPC connector is genuinely great: seven panels, zero wiring, swap and reflash. But this board ships with no SWD connector, so there's no RTT logging, the easy path everyone else on
rp-rsgets by default.The workaround: route
defmtover USB CDC instead, viadefmt-bbq.epd.refresh()blocks for seconds at a time and USB needs polling every few milliseconds to stay alive, so that meant splitting the two cores. Core1 services USB and drains thedefmt-bbqbuffer; core0 runs the actual panel logic. It works, and every example in this repo uses it. But it's real plumbing I shouldn't have had to build just to see a log line mid-refresh.If there's a next revision of the ThinkInk Feather, please bring back SWD. RTT logging is the only sane way to see what's happening while a refresh is in flight, on a board that spends most of its time in long, blocking e-paper refreshes. Otherwise you're stuck inventing a second communication channel just to debug.
-
Rust on Adafruit ESP32-C6 Feather: Plug-and-Play I2C with 12 Arduino Modulino Modules
Following my previous exploration with the Adafruit RP2040 Feather and custom ThinkInk e-paper drivers, I wanted to take the next logical step in embedded Rust: building cross-platform, hardware-agnostic drivers that can jump between entirely different architectures without breaking a sweat.
I recently received the Adafruit ESP32-C6 Feather (PID 5933), featuring a single-core RISC-V SoC. To pair with it, I developed the modulino Rust library—a pure
no_stddriver that currently supports all 12 modules in the Arduino Modulino family.Thanks to the Feather's built-in STEMMA QT / Qwiic connector, getting this setup running requires absolutely zero soldering. You can hardware-verify your embedded apps by simply daisy-chaining the modules together over a standard 100kHz I2C bus.
1. Setting Up the RISC-V Environment
Unlike ARM Cortex-M or RP2040 targets, the ESP32-C6 utilizes a 32-bit RISC-V core. We can easily configure our environment using standard Rust toolchains and
espflash:Make sure your project's
.cargo/config.tomlis configured to leverageespflashfor seamless flashing and serial monitoring over the built-in USB-JTAG connection: -
Rust on Adafruit RP2040 Feather ThinkInk (JD79661 E-Paper)
I wanted to share my experience experimenting with Rust on the Adafruit RP2040 Feather ThinkInk board, specifically using a bare E-Paper display.
Hardware:
- Adafruit RP2040 Feather ThinkInk (https://www.adafruit.com/product/5727)
- Bare EPD display (JD79661 chipset): {https://www.adafruit.com/product/6373)
Background
I went through all the official tutorials for the ThinkInk Feather: https://learn.adafruit.com/adafruit-rp2040-feather-thinkink
The provided examples are excellent, but they currently focus on CircuitPython and Arduino. Adafruit already provides solid drivers for the JD79661 chipset, and the display is also well supported in the Arduino ecosystem via the GxEPD2 library: https://github.com/ZinggJM/GxEPD2
This made me curious: can I do the same thing in Rust?
Rust on RP2040
The RP2040 has very good Rust support thanks to the rp-rs ecosystem. A great starting point is the RP2040 project template: https://github.com/rp-rs/rp2040-project-template
There is also an existing HAL board definition for the Adafruit Feather RP2040 here: https://github.com/rp-rs/rp-hal-boards/tree/main/boards/adafruit-feather-rp2040
While it’s not an exact match for the ThinkInk Feather, it’s close enough to serve as a solid base, with only minor adjustments needed.
Driver work
At the moment, there is no native Rust driver for the JD79661 E-Paper controller. To move forward, I implemented a custom Rust driver, based directly on the source code from Adafruit’s CircuitPython and Arduino implementations.
Once the low-level driver was in place, everything integrated nicely with the Embedded Graphics framework. Rendering text and images worked as expected.
As a proof of concept, I was able to:
- Convert a JPG image to BMP
- Render and display it correctly on the E-Paper display
Results & Code
All of my experiments and findings are documented here: https://github.com/melastmohican/adafruit-feather-thinkink-discovery
The repository includes:
- Project setup for Rust on the ThinkInk Feather
- A custom JD79661 driver
- Examples using Embedded Graphics
- Notes on differences between the standard Feather RP2040 and the ThinkInk variant
Closing thoughts
Overall, Rust works very well on the RP2040, and bringing up an E-Paper display was quite feasible even without an existing driver. Hopefully this helps others who want to explore Rust + E-Paper + Adafruit hardware.