이번 포스트에서는 라즈베리파이에 SPI Display 중 하나인 E-paper를 연결해 사용하는 방법에 대해 작성해보고자 합니다.
사용할 E-Paper는 Waveshare에서 제작한 HW입니다.
다음 링크에서 구매할 수 있습니다. (다양한 크기의 디스플레이들을 확인해보실 수 있습니다.)
가격은 113위안 정도 되며 한화로 약 2만 2천원 정도 합니다. 3인치 Display로 400x168 Pixel이며 빨, 노, 검, 흰색만 디스플레이가 가능합니다.
그럼 이제 본격적으로 진행해보겠습니다.
우선, Raspberry Pi의 GPIO PinMap은 다음과 같습니다.
여기서 주된 Pin은 GPIO10 (MOSI), GPIO11 (SCLK), GPIO8 (CE0)입니다. 이는 SPI 통신을 사용하기 위한 Pin입니다.
E-Paper와 Raspbery Pi GPIO를 다음과 같이 연결합니다.
이후, Raspberry Pi의 Terminal에서 다음과 같은 명령어를 입력하여 SPI 설정을 완료합니다.
>> sudo raspi-config
interface option -> spi enable
사용한 E-paper의 경우 라이브러리가 제공되며, C와 Python 중 선택하여 사용할 수 있습니다.
다음 링크에서 연동 코드를 확인할 수 있습니다.
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를 사용하는 것도 좋을 것 같습니다.
이로서 이번 포스트 작성을 마무리하도록 하겠습니다.
'Programming > Raspberry Pi' 카테고리의 다른 글
[Mouse] Raspberry Pi에서 마우스 커서 제어 (0) | 2023.03.23 |
---|---|
[GPIO] Raspberry Pi에 스위치/버튼 연결 후 Shutdown/Reboot, Keyboard Event 수행 (0) | 2023.03.23 |
[Environment] Raspberry Pi 초기 Setting (0) | 2023.03.23 |
[QT] Python을 이용한 Video Player 개발 (0) | 2023.03.21 |
[TensorFlow Lite] TensorFlow를 Raspberry Pi에서 사용 (0) | 2023.01.05 |
댓글