알리 쇼핑을 할 때마다 눈에 보이면 엄청나게 사재기를 하고 있는 개발 보드/키트 중에서
가장 많이 사고 있는 것이 M5Stack 제품들이다.

그렇게 2022년에 사놓고 지금까지 먼지만 쌓여가던 제품 중 하나가 M5Paper이다. (헉! 4년이 넘어서야 개봉을 하다니 😅)
왠지 낡은 느낌까지 보이니 미안한 마음까지 들었다.

내가 구매한 것은 정말 초기 제품으로 지금은 당연히 판매가 중단 되었고, 구매한 사람조차 많지 않은 모델이다.

사실 M5Paper 제품으로 유명한 것은 아래와 같은 제품으로 v1.1은 지금도 판매가 되고 있는 제품이다.

위 3개의 모델은 주로 디스플레이 차이와 일부 부품의 교체가 있고 거의 동일한 구성을 갖고 있다.
개발을 할 때에는 딱히 구분해서 처리할 부분 자체가 거의 없다.

기본적인 Spec은 다음과 같이 Wi-Fi도 있고 배터리도 있고 터치스크린도 지원한다.

개발을 위한 플랫폼은 여러가지 지원을 하고 있는데, 이번에는 PlatformIO 를 이용해보고자 한다.

PlatformIO는 임베디드 개발도 기존의 일반적인 S/W개발 경험을 그대로 가져갈 수 있도록 해주는 플랫폼으로
2015/2016 IoT 어워드에서 올해의 최고 소프트웨어 및 도구 부문 후보에 오를 정도로 많은 인기를 얻고 있다.
VSCode용 PlatformIO IDE 확장 프로그램은
Microsoft Marketplace 전체에서 2,500개 이상의 별 5개 평점을 받은 가장 인기 있는 확장 프로그램이라고 한다.
PlatformIO 설치는 다음과 같이 Marketplace에서 검색해서 Install 하면 된다.

신규 프로젝트를 진행하기 위해서는 PIO(PlatformIO) Home에서 'New Project'를 실행하면 된다.

프로젝트 이름은 임의로 지어주면 되고,
Board 부분에 M5Paper가 없으므로 호환되는 'M5Stack FIRE'로 설정하고
Framework는 'Arduino'로 설정해주면 된다.
Localtion 부분은 기본으로 하던지 아니면 원하는 곳을 지정해주자.

보드 개발을 할 때 가장 중요한 것은 'platformio.ini' 파일이다.
M5Paper 개발을 위해 필요한 설정값은 아래 내용을 참고하면 된다.

그 다음 필요한 것은 기기 연결 상태를 확인해야 하는데,
PlatformIO 에서 제공해주는 CLI 도구를 이용하면 편하다.

'> pio device list' 명령어를 실행하면 연결된 기기를 확인할 수 있다.
간단하게 작성해본 main.cpp 코드는 아래와 같다.
| #include <M5Unified.h> // 메모리 버퍼 역할을 하는 스프라이트(Canvas) 객체 생성 M5Canvas canvas(&M5.Display); void setup() { // 1. M5Unified 환경 설정 및 초기화 auto cfg = M5.config(); cfg.serial_baudrate = 115200; M5.begin(cfg); // E-Ink 고속 갱신 모드 설정 (터치 반응 속도 최적화) M5.Display.setEpdMode(epd_mode_t::epd_fastest); // 2. 화면 방향 설정 (가로 모드 960 x 540) M5.Display.setRotation(1); M5.Display.clear(TFT_WHITE); // 3. 스프라이트(Canvas) 생성 canvas.setColorDepth(4); // 4비트 (16단계 그레이스케일) canvas.createSprite(M5.Display.width(), M5.Display.height()); canvas.fillSprite(TFT_WHITE); // 4. 텍스트 및 UI 요소 그리기 canvas.setTextColor(TFT_BLACK, TFT_WHITE); canvas.setTextSize(3); canvas.drawString("M5Paper + M5Unified", 40, 40); canvas.drawFastHLine(40, 80, M5.Display.width() - 80, TFT_BLACK); canvas.setTextSize(2); canvas.drawString("Framework: Arduino (PlatformIO)", 40, 110); canvas.drawString("Graphics: M5GFX Pipeline", 40, 145); int batteryLevel = M5.Power.getBatteryLevel(); int batteryVoltage = M5.Power.getBatteryVoltage(); canvas.drawString("Battery: " + String(batteryLevel) + "% (" + String(batteryVoltage) + " mV)", 40, 190); uint32_t freePsram = ESP.getFreePsram() / 1024; canvas.drawString("Free PSRAM: " + String(freePsram) + " KB", 40, 225); canvas.drawString("Touch the screen or click wheel button.", 40, 300); // 5. 초기 화면 출력 canvas.pushSprite(0, 0); } void loop() { // 입력 상태 업데이트 (필수) M5.update(); bool needRefresh = false; // 1. 터치 입력 감지 및 화면 갱신 auto detail = M5.Touch.getDetail(); if (detail.isPressed()) { Serial.printf("Touch detected at: X=%d, Y=%d\n", detail.x, detail.y); // 터치한 위치에 작은 점 그리기 canvas.fillCircle(detail.x, detail.y, 4, TFT_BLACK); // 좌표 정보 표시 영역 갱신 canvas.fillRect(40, 350, 400, 40, TFT_WHITE); canvas.drawString("Touch: (" + String(detail.x) + ", " + String(detail.y) + ")", 40, 350); needRefresh = true; } // 2. 휠 버튼 입력 감지 (M5Paper 휠 매핑: BtnA:위, BtnB:누름, BtnC:아래) if (M5.BtnA.wasPressed() || M5.BtnB.wasPressed() || M5.BtnC.wasPressed()) { String action = ""; if (M5.BtnA.wasPressed()) action = "Wheel UP (BtnA)"; if (M5.BtnB.wasPressed()) action = "Wheel PUSH (BtnB)"; if (M5.BtnC.wasPressed()) action = "Wheel DOWN (BtnC)"; Serial.println(action + " Pressed!"); canvas.fillRect(40, 400, 500, 40, TFT_WHITE); canvas.drawString("Last Action: " + action, 40, 400); needRefresh = true; } // 3. 입력이 발생했을 때만 E-Ink 화면으로 버퍼 전송 if (needRefresh) { canvas.pushSprite(0, 0); } delay(20); } |
빌드는 VSCode 화면에서 하단에 있는 V 부분을 클릭하면 된다.

디바이스에 업로드 하는 것은 하단에 있는 → 부분을 클릭해주면 된다.

Ubuntu 환경에서 실행할 때 Upload Error가 나올 수가 있다.

권한 문제로 인해서 발생한 것이기에 이 부분을 해결해주면 된다.
| > sudo usermod -aG dialout $USER > curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules > sudo udevadm control --reload-rules > sudo udevadm trigger |
안정적인 권한 적용을 위해 재부팅 후 이어서 진행하면 된다.
업로드가 잘 되면 아래와 같이 잘 동작할 것이다.

지금은 이것으로 매일 아침 6시에 날씨, 일정, 뉴스, 운세를 보여주는 것을 만들어서 잘 사용하고 있다.
전자 잉크의 특성을 살려서 아침에 정보를 읽어오고
deep sleep을 하도록 해서 전력 소모를 줄였더니 배터리가 의외로 상당히 오래가서 깜짝 놀라고 있다.

이렇게 한 번 가지고 놀았더니 요즘 다시 재미를 붙이게 되어서
이것 저것 다른 기기들도 가지고 놀기 시작했다.
여러분들도 한 번 ESP32 개발의 세계로 빠져보시기를 ... 😍
'Fun > M5STACK' 카테고리의 다른 글
| M5StickC 가지고 놀기 #7 : HAT-PuppyC (0) | 2020.02.24 |
|---|---|
| M5StickC 가지고 놀기 #6 : HAT-BugC (1) | 2020.02.22 |
| M5StickC 가지고 놀기 #5 : HAT-YUN (온습도계) (0) | 2020.02.17 |
| M5StickC 가지고 놀기 #4 : BeetleC 가지고 놀기 (1/2) (0) | 2019.10.06 |
| M5StickC 가지고 놀기 #3 : BLE 연결하기 (Android 폰과 연결) (0) | 2019.09.29 |










































































































