Skip to content

Commit 3142add

Browse files
authored
Merge pull request #174 from OUCC/blog/2024-12-23-m5stack
アドベントカレンダー2024の23日目の記事を追加
2 parents ec5cee9 + d90a34f commit 3142add

File tree

2 files changed

+202
-0
lines changed

2 files changed

+202
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"postDate": "2024-12-26T11:27:15.913Z"
3+
}
+199
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
---
2+
title: M5StackでLCDに画像を表示する
3+
description: M5StackでLCDに画像を表示する方法は複数ある。それぞれの紹介と簡単な比較をする。
4+
author: talkie
5+
category: tech
6+
tags:
7+
- advent-calendar
8+
---
9+
10+
この記事は [OUCC Advent Calendar 2024](https://adventar.org/calendars/10655) の23日目の記事です。
11+
12+
M5StackでLCDに画像を表示する方法についてM5Stackの公式ドキュメントをもとにまとめてみました。
13+
14+
## 使用する環境
15+
- PlatformIO for VScode
16+
- M5Unified 0.2.2
17+
- M5Stack Basic
18+
19+
## 基本的なコード
20+
以下のコードがM5StackでLCDに画像を表示させる基本的なコードです。最後の関数を変更することで画像の参照場所を変えたり、ファイル形式を指定したりすることができます。
21+
22+
```cpp
23+
#include <Arduino.h>
24+
#include <M5Unified.h>
25+
26+
void setup() {
27+
M5.begin();
28+
M5.Display.drawJpg("/image.jpg", 0, 0);
29+
}
30+
31+
void loop() {
32+
33+
}
34+
```
35+
36+
### `drawJpg()`の引数の説明
37+
`drawJpg()`は、本来はM5GFXライブラリのメンバー関数です。しかし、M5Unifiedライブラリを使用すると`Display`または`Lcd`というインスタンスを通じて呼び出すことが可能です。
38+
39+
#### 主な引数
40+
- **`filename`**: 表示したいJPEGファイルのパス。
41+
- **`x, y`**: 表示開始位置の座標。
42+
- **`scale` (オプション)**: 表示倍率。
43+
44+
例えば、`M5.Display.drawJpg("/image.jpg", 0, 0, 1.0);` とすると、画面の左上から等倍で画像を表示します。
45+
46+
## SDカードに保存した画像を表示
47+
SDカードに保存された画像を表示するには、以下のコードを使用します。
48+
49+
```cpp
50+
#include <Arduino.h>
51+
#include <M5Unified.h>
52+
53+
void setup() {
54+
M5.begin();
55+
56+
if (!M5.Sd.begin()) {
57+
M5.Display.print("SDカードの初期化に失敗しました\n");
58+
return;
59+
}
60+
61+
M5.Display.drawJpgFile(SD, "/image.jpg", 0, 0);
62+
}
63+
64+
void loop() {
65+
66+
}
67+
```
68+
69+
この例では、`drawJpgFile()`関数を使用してSDカードから画像を読み込み、表示します。
70+
71+
### `drawJpgFile()`の引数の説明
72+
- **`fs`**: ファイルシステムオブジェクト(例: SD、SPIFFSなど)。
73+
- **`filename`**: 読み込むファイル名。
74+
- **`x, y`**: 表示開始位置の座標。
75+
76+
## SPIFFSに保存した画像を表示
77+
SPIFFSに画像を保存することで、SDカードを使わずに画像を表示できます。
78+
79+
```cpp
80+
#include <Arduino.h>
81+
#include <M5Unified.h>
82+
#include <SPIFFS.h>
83+
84+
void setup() {
85+
M5.begin();
86+
87+
if (!SPIFFS.begin()) {
88+
M5.Display.print("SPIFFSの初期化に失敗しました\n");
89+
return;
90+
}
91+
92+
M5.Display.drawJpgFile(SPIFFS, "/image.jpg", 0, 0);
93+
}
94+
95+
void loop() {
96+
97+
}
98+
```
99+
100+
SPIFFSの初期化後、画像ファイルを`drawJpgFile()`で表示します。
101+
102+
## URLから画像を表示
103+
インターネット上の画像を直接取得して表示する場合は、`drawJpgUrl()`を使用します。以下はその例です。
104+
105+
```cpp
106+
#include <M5Unified.h>
107+
#include <WiFi.h>
108+
109+
const char* ssid = "Your_SSID"; // Wi-FiのSSID
110+
const char* password = "Your_PASSWORD"; // Wi-Fiのパスワード
111+
112+
void setup() {
113+
M5.begin();
114+
115+
// Wi-Fi接続
116+
WiFi.begin(ssid, password);
117+
while (WiFi.status() != WL_CONNECTED) {
118+
delay(500);
119+
M5.Display.print(".");
120+
}
121+
M5.Display.println("\nWi-Fi connected");
122+
123+
// URLから画像を表示
124+
const char* url = "https://example.com/image.jpg";
125+
M5.Display.drawJpgUrl(url, 0, 0);
126+
}
127+
128+
void loop() {
129+
130+
}
131+
```
132+
133+
### `drawJpgUrl()`の引数の説明
134+
- **`url`**: 取得するJPEG画像のURL。
135+
- **`x, y`**: 表示開始位置の座標。
136+
137+
## メモリから画像データを表示
138+
画像データを直接メモリに格納し、表示することも可能です。以下はその例です。
139+
140+
```cpp
141+
#include <M5Unified.h>
142+
143+
const uint8_t imageData[] = { /* 画像データ */ };
144+
145+
void setup() {
146+
M5.begin();
147+
M5.Display.drawJpg(imageData, sizeof(imageData), 0, 0);
148+
}
149+
150+
void loop() {
151+
152+
}
153+
```
154+
155+
### 画像データを別ファイルに分ける
156+
画像データをプログラム内に直接記述すると、メインコードが見にくくなります。そのため、画像データを別ファイル(例: `image_data.h`)に分けると管理しやすくなります。
157+
158+
#### `image_data.h` の例
159+
```cpp
160+
#ifndef IMAGE_DATA_H
161+
#define IMAGE_DATA_H
162+
163+
const uint8_t imageData[] = {
164+
// 画像データをここに記述
165+
};
166+
167+
#endif // IMAGE_DATA_H
168+
```
169+
170+
メインプログラムでは、このヘッダーファイルをインクルードするだけで画像データを利用できます。
171+
172+
### `drawJpg()`の引数(メモリ版)
173+
- **`buf`**: メモリ上の画像データのポインタ。
174+
- **`len`**: 画像データのサイズ(バイト単位)。
175+
- **`x, y`**: 表示開始位置の座標。
176+
177+
画像データをメモリ上に直接格納するには、画像ファイルをバイナリデータに変換する必要があります。その際、Pythonスクリプトなどを使用して変換を行うと便利です。\
178+
画像データはメインプログラムに置くと見にくくなってしまうので、
179+
180+
## その他の画像形式の対応
181+
M5Unifiedでは、JPEG以外にも以下の画像形式に対応しています。Jpgの部分を変更することで使用できます。
182+
183+
- **PNG**
184+
- **BMP**
185+
- **QOI**
186+
187+
## ピクセル操作
188+
画像以外に、ピクセル単位で描画する関数もいくつか利用可能です。
189+
190+
- `pushImage()`
191+
- `pushPixels()`
192+
- `pushPixelsDMA()`
193+
- `writePixels()`
194+
- `writePixelsDMA()`
195+
196+
これらを使用すると、メモリから直接ピクセルデータを送信し、高速に描画できます。
197+
198+
## まとめ
199+
M5StackでLCDに画像を表示する方法を解説しました。自分の作りたいものに合わせて選択してください!!

0 commit comments

Comments
 (0)