본문 바로가기
  • 우당탕탕속의 잔잔함
Programming/Raspberry Pi

[E-Paper] Raspberry Pi에서 E-Paper Display 연동

by zpstls 2023. 1. 5.
반응형

 

 

이번 포스트에서는 라즈베리파이에 SPI Display 중 하나인 E-paper를 연결해 사용하는 방법에 대해 작성해보고자 합니다.

 

사용할 E-Paper는 Waveshare에서 제작한 HW입니다.

다음 링크에서 구매할 수 있습니다. (다양한 크기의 디스플레이들을 확인해보실 수 있습니다.)

 

e-Paper, Eink Display, EPD

$12.31 - $12.99 Add to Cart Add to Compare

www.waveshare.com

Waveshare E-paper

가격은 113위안 정도 되며 한화로 약 2만 2천원 정도 합니다. 3인치 Display로 400x168 Pixel이며 빨, 노, 검, 흰색만 디스플레이가 가능합니다.

 

그럼 이제 본격적으로 진행해보겠습니다.

우선, Raspberry Pi의 GPIO PinMap은 다음과 같습니다.

Raspberry Pi 4 GPIO

여기서 주된 Pin은 GPIO10 (MOSI), GPIO11 (SCLK), GPIO8 (CE0)입니다. 이는 SPI 통신을 사용하기 위한 Pin입니다.

E-Paper와 Raspbery Pi GPIO를 다음과 같이 연결합니다.

GPIO with E-paper

이후, Raspberry Pi의 Terminal에서 다음과 같은 명령어를 입력하여 SPI 설정을 완료합니다.

>> sudo raspi-config

interface option -> spi enable

 

 

 

 

 

사용한 E-paper의 경우 라이브러리가 제공되며, C와 Python 중 선택하여 사용할 수 있습니다.

다음 링크에서 연동 코드를 확인할 수 있습니다.

 

3inch e-Paper Module (G) - Waveshare Wiki

Introduction Parameters, principles, and precautions Working with Raspberry Pi User guides for the development demo of C language, Python Working with the Arduino User guides for the development demo based on Arduino UNO R3 Working with the Jetson Nano Use

www.waveshare.com

 

C 기준으로 Display 하는 코드는 다음과 같습니다.

 

  • BMP Image 파일로 Draw
UBYTE *BlackImage;
UWORD Imagesize = ((EPD_3IN0G_WIDTH % 4 == 0)? (EPD_3IN0G_WIDTH / 4 ): (EPD_3IN0G_WIDTH / 4 + 1)) * EPD_3IN0G_HEIGHT;
if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) {
        printf("Failed to apply for black memory...\r\n");
        return -1;
}
Paint_NewImage(BlackImage, EPD_3IN0G_WIDTH, EPD_3IN0G_HEIGHT, 0, EPD_3IN0G_WHITE);
Paint_SetScale(4);

Paint_SelectImage(BlackImage);
GUI_ReadBmp_RGB_4Color("./pic/3inch-3.bmp", 0, 0);
EPD_3IN0G_Display(BlackImage);
DEV_Delay_ms(2000);

코드 몇 줄로 이미지를 손쉽게 출력할 수 있습니다. 다만, Display의 크기에 따라 이미지 크기를 맞춰주어야 합니다.

현재 사용 중인 디스플레이는 400x136 Pixel이므로 이미지 크기 또한 400x136 Pixel이 되어야 합니다.

 

 

  • Paint 방식으로 Draw
Paint_SelectImage(BlackImage);
Paint_Clear(EPD_3IN0G_WHITE);

printf("Drawing:BlackImage\r\n");
Paint_DrawPoint(10, 80, EPD_3IN0G_RED, DOT_PIXEL_1X1, DOT_STYLE_DFT);
Paint_DrawPoint(10, 90, EPD_3IN0G_YELLOW, DOT_PIXEL_2X2, DOT_STYLE_DFT);
Paint_DrawPoint(10, 100, EPD_3IN0G_BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT);
Paint_DrawLine(20, 70, 70, 120, EPD_3IN0G_RED, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
Paint_DrawLine(70, 70, 20, 120, EPD_3IN0G_RED, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
Paint_DrawRectangle(20, 70, 70, 120, EPD_3IN0G_YELLOW, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
Paint_DrawRectangle(80, 70, 130, 120, EPD_3IN0G_YELLOW, DOT_PIXEL_1X1, DRAW_FILL_FULL);
Paint_DrawCircle(45, 95, 20, EPD_3IN0G_BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
Paint_DrawCircle(105, 95, 20, EPD_3IN0G_BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);
Paint_DrawLine(85, 95, 125, 95, EPD_3IN0G_RED, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
Paint_DrawLine(105, 75, 105, 115, EPD_3IN0G_YELLOW, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
Paint_DrawString_EN(10, 0, "Red, yellow, white and black", &Font16, EPD_3IN0G_RED, EPD_3IN0G_YELLOW);
Paint_DrawString_EN(10, 35, "Four color e-Paper", &Font12, EPD_3IN0G_YELLOW, EPD_3IN0G_BLACK);
Paint_DrawString_CN(10, 125, "LOOOG", &Font24CN, EPD_3IN0G_RED, EPD_3IN0G_WHITE);
Paint_DrawNum(10, 50, 123456, &Font12, EPD_3IN0G_RED, EPD_3IN0G_WHITE);

EPD_3IN0G_Display(BlackImage);
DEV_Delay_ms(3000);

Point, Line Rectangle, Circle, String 등을 그릴 수 있습니다.

 

 

위와 같은 코드를 이용하면 어떠한 것을 E-paper에 출력할 수 있습니다.

E-paper Display는 처음 사용해 보는데, 생각보다 화질을 괜찮았습니다.

그런데 제품마다 다를 것 같긴 하지만 출력 속도가 조금 느리더군요.

상시 전원 인가할 필요가 없는 출력물이라면 E-paper를 사용하는 것도 좋을 것 같습니다.

 

이로서 이번 포스트 작성을 마무리하도록 하겠습니다.

 

 

반응형

댓글