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)で作成し、ファイルがシリアル端末に正常に表示されているのに、画像が表示されない場合、ペイントツールにより画像を縮尺するとなぜかうまく表示されます。
