📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
ページの作成:「== 概要 == <br><br> == 接続 == ArduinoとST7735の一般的な接続方法を以下に示す。<br> <br> SCLとSDAはハードウェアSPIを使用するため、指定のピンを使用する必要がある。<br> RESET、D/C、CSは任意のデジタルピンに接続可能であるが、下表上に示すような組み合わせが一般的である。<br> <br> もし、ST7735に背景光用のLEDピンがある場合、適切な抵抗を介して任意の…」 |
|||
| 195行目: | 195行目: | ||
tft.setTextColor(color); | tft.setTextColor(color); | ||
tft.print(text); | tft.print(text); | ||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== アニメーションの描画 == | |||
ST7735を使用してアニメーションを描画することができる。<br> | |||
また、複数のアニメーションの組み合わせる、あるいは、パラメータの調整を行うことにより、より複雑な動きを実現することも可能である。<br> | |||
<br> | |||
ただし、メモリ使用量に注意する必要がある。<br> | |||
また、更新頻度が高すぎると描画が追いつかない可能性があるため、可能な限り必要な部分のみを更新する。<br> | |||
<br> | |||
<u>delay関数は使用せずに、millis関数 (ノンブロッキング処理) を使用してタイミング制御をする必要がある。</u><br> | |||
<br> | |||
==== 例 : バウンドするボール ==== | |||
<syntaxhighlight lang="c++"> | |||
// アニメーションの状態変数 | |||
int ballX = 64; // ボールのX座標 | |||
int ballY = 64; // ボールのY座標 | |||
int ballSize = 10; // ボールの大きさ | |||
int ballSpeedX = 2; // X方向の速度 | |||
int ballSpeedY = 2; // Y方向の速度 | |||
void setup() | |||
{ | |||
tft.initR(INITR_BLACKTAB); | |||
tft.fillScreen(ST77XX_BLACK); | |||
} | |||
void loop() | |||
{ | |||
// 前のフレームのボールを消す | |||
tft.fillCircle(ballX, ballY, ballSize, ST77XX_BLACK); | |||
// ボールの位置を更新 | |||
ballX += ballSpeedX; | |||
ballY += ballSpeedY; | |||
// 画面端での跳ね返り | |||
if (ballX >= tft.width() - ballSize || ballX <= ballSize) { | |||
ballSpeedX = -ballSpeedX; | |||
} | |||
if (ballY >= tft.height() - ballSize || ballY <= ballSize) { | |||
ballSpeedY = -ballSpeedY; | |||
} | |||
// 新しい位置にボールを描画 | |||
tft.fillCircle(ballX, ballY, ballSize, ST77XX_RED); | |||
delay(30); // アニメーションの速度調整 | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== 例 : 回転する線 ==== | |||
<syntaxhighlight lang="c++"> | |||
float angle = 0; | |||
int centerX = tft.width() / 2; | |||
int centerY = tft.height() / 2; | |||
int radius = 30; | |||
void loop() | |||
{ | |||
// 前のフレームをクリア | |||
tft.fillScreen(ST77XX_BLACK); | |||
// 新しい線を描画 | |||
int endX = centerX + cos(angle) * radius; | |||
int endY = centerY + sin(angle) * radius; | |||
tft.drawLine(centerX, centerY, endX, endY, ST77XX_WHITE); | |||
angle += 0.1; // 回転角度を更新 | |||
delay(30); | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== 例 : プログレスバー ==== | |||
<syntaxhighlight lang="c++"> | |||
void animateProgressBar() | |||
{ | |||
int barWidth = tft.width() - 20; // バーの幅 | |||
int barHeight = 10; // バーの高さ | |||
int startX = 10; // 開始X座標 | |||
int startY = tft.height() / 2; // 開始Y座標 | |||
for (int progress = 0; progress <= barWidth; progress++) { | |||
// バーの背景 | |||
tft.drawRect(startX, startY, barWidth, barHeight, ST77XX_WHITE); | |||
// プログレス部分 | |||
tft.fillRect(startX, startY, progress, barHeight, ST77XX_BLUE); | |||
delay(20); | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== アニメーションを滑らかにする手順 ==== | |||
===== ダブルバッファリング ===== | |||
<syntaxhighlight lang="c++"> | |||
// 前のフレームを消去してから新しいフレームを描画 | |||
void clearPreviousFrame() | |||
{ | |||
// 特定の領域だけを消去 | |||
tft.fillRect(x, y, width, height, ST77XX_BLACK); | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
===== フレームレート制御 ===== | |||
<syntaxhighlight lang="c++"> | |||
unsigned long previousMillis = 0; | |||
const long frameInterval = 33; // 約30[FPS] | |||
void loop() | |||
{ | |||
unsigned long currentMillis = millis(); | |||
if (currentMillis - previousMillis >= frameInterval) { | |||
previousMillis = currentMillis; | |||
// アニメーションの更新処理 | |||
updateAnimation(); | |||
} | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||