SDカードに地図の画像データを複数書き込み、M5Stack Core2 for AWSでランダムに画像を表示します。アプリの開発はarduino IDEを使用します。

使用したSDカード

M5Stack Core2 for AWSで使用したSDカードは、容量が16Gbyteで、「FAT32」でフォーマットしました。

SDカードのパーティションは1つに。当たり前ですが、いくら調べてもPCでは見えるのに、M5Stack Core2 for AWSで検出しないので悩みました。

SDカード入力アプリの作成

SDカード入力アプリ「sdcardcheck2.ino」を次のように作成します。

  • 13-24行目でSDカードが正常に検出されているかを確認するために、カードタイプとカードサイズをチェックします。
  • SDカードに保存されているファイルをすべて調べて一覧を作成します。

sdcardcheck2.ino

#include <M5Core2.h>

const int maxFile = 100;
String fileList[maxFile];
int fileCount = 0;

void setup() {
  M5.begin();
  delay(500);

  sdcard_type_t Type = SD.cardType();

  if ( Type == CARD_UNKNOWN || Type == CARD_NONE )
  {
    Serial.printf("SDCard error \r\n");
  }
  else
  {
    Serial.printf("SDCard Type = %d \r\n", Type);
    Serial.printf("SDCard Size = %d Mbyte\r\n", (int)(SD.cardSize() / 1024 / 1024));
    Serial.printf("SDCard Use Size = %d Kbyte\r\n", (int)(SD.usedBytes() / 1024 ));
  }

  File root = SD.open("/");
  if (root) {
    File file = root.openNextFile();
    while (file) {
      if (file.isDirectory()) {
        // Dir skip
      } else {
        // File
        String filename = file.name();
        Serial.println(filename);
        Serial.println(filename.indexOf(".jpg"));
        if (filename.indexOf(".jpg") != -1 || filename.indexOf(".bmp") != -1 ) {
          // Find
          fileList[fileCount] = filename;
          fileCount++;
          if (maxFile <= fileCount) {
            break;
          }
        }
      }
      file = root.openNextFile();
    }
  }

  Serial.println("File List");
  for (int i = 0; i < fileCount; i++) {
    Serial.println(fileList[i]);
  }
}

void loop() {
  int index = random(0, fileCount);
  String filename = fileList[index];
  int x = random(0, M5.Lcd.width() * 3 / 4);
  int y = random(0, M5.Lcd.height() * 3 / 4);
 
  Serial.printf("Index=%d, File=%s, %d, %d\n", index, filename.c_str(), x, y);
  String fileNameStr = "/";
  fileNameStr += filename.c_str();
  if (filename.indexOf(".jpg") != -1) {
    M5.Lcd.drawJpgFile(SD, (const char*)&fileNameStr, x, y);
  } else {
    M5.Lcd.drawBmpFile(SD, (const char*)&fileNameStr, x, y);
  }

  delay(5000);
  M5.Lcd.clear(BLACK);
}

「 M5.Lcd.drawPngFile」関数でpng画像を表示させようとしましたが、画像表示が途中で止まりました。コンパイルエラーは表示されないですが、ドキュメントには記述されていません。

SDカード入力アプリの実行

SDカード入力アプリ「sdcardcheck2.ino」を実行すると、arduino IDEのシリアルモニタに次のように表示されます。bmpファイル(256x256px、192Kb)は表示させるのに2分以上かかります。

ets Jul 29 2019 12:21:46

rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1184
load:0x40078000,len:12804
ho 0 tail 12 room 4
load:0x40080400,len:3032
entry 0x400805e4
M5Core2 initializing...axp: vbus limit off
axp: gpio1 init
axp: gpio2 init
axp: rtc battery charging enabled
axp: esp32 power voltage was set to 3.35v
axp: lcd backlight voltage was set to 2.80v
axp: lcd logic and sdcard voltage preset to 3.3v
axp: vibrator voltage preset to 2v
E (1460) ledc: ledc_channel_config(369): gpio_num argument is invalid
touch: FT6336 ready (fw id 0x10 rel 1, lib 0x300E)
OK
SDCard Type = 3 
SDCard Size = 15193 Mbyte
SDCard Use Size = 400 Kbyte
50.png
-1
49.jpg
2
50.bmp
-1
File List
49.jpg
50.bmp
Index=0, File=49.jpg, 233, 75
Index=0, File=49.jpg, 61, 93
Index=1, File=50.bmp, 86, 126
Loaded in 143170 ms
Index=0, File=49.jpg, 89, 156
Index=1, File=50.bmp, 169, 91
Loaded in 148707 ms
Index=0, File=49.jpg, 148, 154
Index=0, File=49.jpg, 43, 161
Index=0, File=49.jpg, 207, 121

M5Stack Core2 for AWSには次のようにランダムな位置にランダムに選択された画像が表示されます。

  • アプリ起動時、もしくは画像ファイルを表示中に、SDカードへのアクセスが上手くいかないことがわりと頻発します。SDカードへのアクセスが異常な場合は、M5Stack Core2 for AWSのリセットボタンを押します。
  • Photoshopでフルサイズ(320x240px)で作成し、ファイルがシリアル端末に正常に表示されているのに、画像が表示されない場合、ペイントツールにより画像を縮尺するとなぜかうまく表示されます。