Skip to content

WeActStudio display support #201

@avsaase

Description

@avsaase

Hi, I was wondering if anyone has had success with using this driver with WeActStudio displays sold on AliExpress. They are solde in 1.54, 2.13 and 2.9 inch sizes in B/W and B/W/R versions and are quite cheap. According to the product description the B/W versions support partial refreshes.

I have a 2.9 inch B/W version and I'm able to drive it using the epd2in9_v2 driver but I'm encountering a few problems. I'm able to draw basic lines on the screen but the background color is fixed to black and there's a white border around the screen. During a refresh the border flashes in the inverted color of the center of the display. It doesn't look like I'm able to draw within the white border.

Here's my test code for the RP2040 using the embassy-rp hal:

#![no_std]
#![no_main]

use defmt_rtt as _;
use embassy_executor::Spawner;
use embassy_rp::{
    gpio::{Input, Level, Output, Pull},
    spi::{Config, Spi},
};
use embassy_time::Delay;
use embedded_graphics::Drawable;
use embedded_graphics::{
    geometry::Point,
    primitives::{Line, Primitive, PrimitiveStyle},
};
use embedded_hal_bus::spi::ExclusiveDevice;
use epd_waveshare::{
    color::Color,
    epd2in9_v2::{Display2in9, Epd2in9},
    prelude::WaveshareDisplay,
};
use panic_probe as _;

#[embassy_executor::main]
async fn main(_spawner: Spawner) {
    let p = embassy_rp::init(Default::default());

    let busy = Input::new(p.PIN_16, Pull::Up);
    let res = Output::new(p.PIN_20, Level::Low);
    let dc = Output::new(p.PIN_21, Level::Low);
    let cs = Output::new(p.PIN_22, Level::High);
    let scl = p.PIN_18;
    let sda = p.PIN_19;
    let mut delay = Delay;

    let spi_bus = Spi::new_blocking_txonly(p.SPI0, scl, sda, Config::default());
    let mut spi_device = ExclusiveDevice::new(spi_bus, cs, Delay);

    let mut epd = Epd2in9::new(&mut spi_device, busy, dc, res, &mut delay, None).unwrap();

    epd.set_background_color(Color::White); // Changing this doesn't do anything
    epd.clear_frame(&mut spi_device, &mut delay).unwrap();
    epd.display_frame(&mut spi_device, &mut delay).unwrap();

    let mut display = Display2in9::default();

    let _ = Line::new(Point::new(64, 0), Point::new(64, 296))
        .into_styled(PrimitiveStyle::with_stroke(Color::Black, 5)) // When I change the color to white I get a white line
        .draw(&mut display);

    epd.update_and_display_frame(&mut spi_device, &display.buffer(), &mut delay)
        .unwrap();
}

IMG20240529232239

Clearly the driver is similar but not exactly compatible. I haven dug into the details yet, I wanted to post here first in case someone else already looked into it.

More info about the displays can be found in https://github.com/WeActStudio/WeActStudio.EpaperModule.

Metadata

Metadata

Assignees

No one assigned

    Labels

    discussionAn open discussion for new displays, boards.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions