pdf-icon

Arduino入門

2. デバイス&サンプル

5. 拡張モジュール&サンプル

アクセサリー

6. アプリケーション

PaperColor microSD ストレージ

PaperColor microSD ストレージに関する API とサンプルプログラムです。

サンプルプログラム

コンパイル要件

  • M5Stack ボードマネージャバージョン >= 3.2.7
  • 開発ボードオプション = M5PaperColor
  • M5Unified ライブラリバージョン >= 0.2.15
  • M5GFX ライブラリバージョン >= 0.2.21
  • M5PM1 ライブラリバージョン >= 1.0.1

microSD PNG 画像の表示

microSD カードを用意し、デモ用画像 picture_01.pngpicture_02.png を保存します。デバイスに以下のプログラムを書き込み、microSD カードを挿入すると、画像が循環表示されます。

cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
#include <Arduino.h>
#include <SPI.h>
#include <SD.h>
#include <M5Unified.h>
#include <M5GFX.h>
#include <M5PM1.h>

static constexpr uint8_t SD_SPI_CS_PIN   = 47;
static constexpr uint8_t SD_SPI_SCK_PIN  = 15;
static constexpr uint8_t SD_SPI_MOSI_PIN = 13;
static constexpr uint8_t SD_SPI_MISO_PIN = 14;

static constexpr uint32_t IMAGE_SWITCH_MS = 60000;
static const char* const imagePaths[] = {
    "/picture_01.png",
    "/picture_02.png",
};

M5PM1 pm1;
size_t currentImageIndex = 0;
uint32_t lastSwitchMs    = 0;

void setup()
{
    auto cfg = M5.config();
    cfg.clear_display = false;
    M5.begin(cfg);
    Serial.begin(115200);

    M5.Display.setEpdMode(epd_mode_t::epd_fastest);
    M5.Display.setRotation(1);

    if (pm1.begin(&M5.In_I2C) != M5PM1_OK) {
        M5.Display.setFont(&fonts::Font4);
        M5.Display.setTextColor(RED);
        M5.Display.drawString("PM1 init failed", M5.Display.width() / 2, M5.Display.height() / 2 + 20);
        Serial.println("PM1 init failed");
        for (;;) {
            delay(1000);
        }
    }

    pm1.setLdoEnable(true);
    pm1.pinMode(M5PM1_GPIO_NUM_0, OUTPUT);
    pm1.digitalWrite(M5PM1_GPIO_NUM_0, HIGH);  // PY_EPD_EN
    pm1.pinMode(M5PM1_GPIO_NUM_4, OUTPUT);
    pm1.digitalWrite(M5PM1_GPIO_NUM_4, HIGH);  // PY_SD_DET_EN
    pm1.pinMode(M5PM1_GPIO_NUM_3, OUTPUT);
    pm1.digitalWrite(M5PM1_GPIO_NUM_3, HIGH);  // PY_SD_PWR_EN
    pm1.pinMode(M5PM1_GPIO_NUM_1, INPUT_PULLUP);  // CARD_DEC

    if (pm1.digitalRead(M5PM1_GPIO_NUM_1) != LOW) {
        M5.Display.fillScreen(WHITE);
        M5.Display.setTextDatum(middle_center);
        M5.Display.setFont(&fonts::Font4);
        M5.Display.setTextColor(RED);
        M5.Display.drawString("Card not inserted", M5.Display.width() / 2, M5.Display.height() / 2);
        Serial.println("SD card not inserted.");
        for (;;) {
            delay(1000);
        }
    }

    SPI.begin(SD_SPI_SCK_PIN, SD_SPI_MISO_PIN, SD_SPI_MOSI_PIN, SD_SPI_CS_PIN);
    if (!SD.begin(SD_SPI_CS_PIN, SPI, 25000000)) {
        M5.Display.fillScreen(WHITE);
        M5.Display.setTextDatum(middle_center);
        M5.Display.setFont(&fonts::Font4);
        M5.Display.setTextColor(RED);
        M5.Display.drawString("SD init failed", M5.Display.width() / 2, M5.Display.height() / 2);
        Serial.println("SD card initialization failed.");
        for (;;) {
            delay(1000);
        }
    }

    M5.Display.fillScreen(WHITE);
    if (!M5.Display.drawPngFile(SD, imagePaths[currentImageIndex])) {
        M5.Display.setTextDatum(middle_center);
        M5.Display.setFont(&fonts::Font4);
        M5.Display.setTextColor(RED);
        M5.Display.drawString("PNG load failed", M5.Display.width() / 2, M5.Display.height() / 2);
        Serial.printf("Failed to draw PNG: %s\r\n", imagePaths[currentImageIndex]);
        for (;;) {
            delay(1000);
        }
    }

    Serial.printf("Displayed: %s\r\n", imagePaths[currentImageIndex]);
    lastSwitchMs = millis();
}

void loop()
{
    M5.update();

    const uint32_t now = millis();
    if (now - lastSwitchMs >= IMAGE_SWITCH_MS) {
        lastSwitchMs = now;
        currentImageIndex = (currentImageIndex + 1) % 2;
        M5.Display.fillScreen(WHITE);
        if (!M5.Display.drawPngFile(SD, imagePaths[currentImageIndex])) {
            M5.Display.fillScreen(WHITE);
            M5.Display.setTextDatum(middle_center);
            M5.Display.setFont(&fonts::Font4);
            M5.Display.setTextColor(RED);
            M5.Display.drawString("PNG load failed", M5.Display.width() / 2, M5.Display.height() / 2);
            Serial.printf("Failed to draw PNG: %s\r\n", imagePaths[currentImageIndex]);
        } else {
            Serial.printf("Displayed: %s\r\n", imagePaths[currentImageIndex]);
        }
    }

    delay(100);
}

API

PaperColor microSD カード部分は Arduino SD 標準ライブラリを使用しています。関連する API の詳細は以下のドキュメントを参照してください:

On This Page