メインコンテンツまでスキップ

オンボードペリフェラルの使い方

このページでは、1.47'' IPS Display の各オンボードペリフェラル向けに、単体で動作する機能別デモをまとめています。各セクションはそれぞれ独立しており、他を読むことなく自分のユースケースに合うものだけを選んで使うことができます。

ヒント

このページのデモ GIF は、短く収めるために再生速度を上げています。

注記

このページのすべてのデモは、Getting Started で説明している esp32 Boards by Espressif (3.3.11) が必要であり、さらに下記のように手動でインストールする Seeed_GFX2 ライブラリが必要です。

  • Seeed_GFX2(手動インストール) — このライブラリは Library Manager には登録されていないため、手動でインストールする必要があります:

Step 1. 上のボタンをクリックして、Seeed_GFX2 v1.0.0 を ZIP ファイルとしてダウンロードします(チュートリアルの再現性を保つため、リリースタグに固定されています)。あるいは、Seeed-Studio/Seeed_GFX2 からリポジトリをクローンしても構いません。

Step 2. Arduino IDE で Sketch > Include Library > Add .ZIP Library... を開き、ダウンロードした ZIP を選択します。IDE は library.properties を読み取り、正しい Seeed_GFX2 フォルダに自動的にインストールします — 展開したフォルダ名を変更する必要はありません。(代わりに手動でインストールする場合は、アーカイブを解凍し、展開されたフォルダ名を Seeed_GFX2 に変更してから Documents/Arduino/libraries/ に配置します。)

Step 3. 新しいライブラリが認識されるように Arduino IDE を再起動します。

ヒント
  • Seeed_GFX2 は、Board + Panel Config というレイヤ構造の上に構築された Seeed Studio のグラフィックスライブラリです。各デモは、単一の display.begin<Board_..., Config_...>() 呼び出しでディスプレイを初期化します。ここで Board テンプレートがピンマップ(CS/DC/SCK/MOSI/RST/BL)を保持し、Panel Config が解像度、色順序(BGR)、向きを組み込みます。driver.h や手動のピン設定は不要です。
  • このボードでは、デモは Board_XIAO_1inch47_Touch_Display<13, 12>(RST=13, BL=12)と Config_Seeed_1inch47_Touch_JD9853A(172×320、BGR、反転なし)を使用します。
  • タッチコントローラ(AXS5106L)は、Seeed_GFX2 の Touch レイヤ(Touch_AXS5106L)によって処理され、追加のライブラリは不要です。IMU はスケッチ内で素の I2C(Wire)経由で読み取ります。
  • SD BMP Reader と SD Recorder のサンプルは、SD カードアクセスに ESP32 ボードパッケージに内蔵されている SD.h を使用します。

デモコードの入手​

このページのすべてのデモは、code_GFX2/Function/ ディレクトリ以下の Display-Gadgets リポジトリに含まれています。各デモは 1 つの .ino スケッチを含むフォルダです。GitHub の Web ビューから .ino のソースだけをコピーするのではなく、必ずフォルダ全体をダウンロードしてください。

オプション A — リポジトリを ZIP としてダウンロード(推奨):

  1. github.com/Seeed-Projects/Display-Gadgets を開き、Code > Download ZIP をクリックしてから、任意の場所にアーカイブを展開します。
  2. code_GFX2/Function/ に移動し、各デモの Code location 行に示されているフォルダを開きます。例えば、このボード向けの GraphicTest デモは code_GFX2/Function/147_ESP32/xiao_esp32s3_147_graphictest/ にあります。
  3. .ino ファイルをダブルクリックして Arduino IDE で開きます。

オプション B — git clone:

git clone https://github.com/Seeed-Projects/Display-Gadgets.git

その後、クローンした code_GFX2/Function/... フォルダからデモの .ino ファイルを開きます。

画面表示 — GraphicTest​

このデモは、1.47 インチ JD9853A パネル上でフルグラフィックスベンチマークを実行し、カラーバー、線、矩形、円、三角形、角丸矩形、テキスト、ピクセルグラデーションを網羅します。画面が正しく配線されていること、およびすべての描画呼び出しが期待どおり動作することを確認するために使用します。

コードの場所: code_GFX2/Function/147_ESP32/xiao_esp32s3_147_graphictest/


動作の仕組み​

スケッチは Seeed_GFX2 を介して JD9853A パネルを初期化し、その後 10 種類のグラフィックスプリミティブを順番に実行し、それぞれの実行時間を micros() で計測してシリアルモニタに出力します。

ディスプレイは次の 1 回のテンプレート呼び出しで初期化されます:

display.begin<Board_XIAO_1inch47_Touch_Display<13, 12>,
Config_Seeed_1inch47_Touch_JD9853A>();

Board テンプレートはピンマップ — CS=D2、DC=D3、SCK=D8、MOSI=D10 — を保持し、その <RST, BL> テンプレートパラメータには生の GPIO 番号を指定するため、<13, 12> は RST=GPIO13(D17)、BL=GPIO12(D18)を意味します。Panel Config は 172×320 の解像度、BGR の色順序、反転なしを組み込みます — driver.h や手動の MADCTL 書き込みは不要です。

デモの実行​

Step 1. Arduino IDE で xiao_esp32s3_147_graphictest.ino を開きます。

Step 2. Tools > Board > esp32 > XIAO_ESP32S3_PLUS と正しい Port を選択します。

Step 3. Upload をクリックします。

Step 4. Tools > Serial Monitor(115200 ボー)を開きます。各テストのタイミング出力が表示されるはずです:

=== XIAO ESP32-S3 Plus 1.47 graphic test ===
LCD width: 172
LCD height: 320
Color bars: 162.32 ms
Lines: 4562.40 ms
Fast lines: 240.45 ms
Rectangles: 189.31 ms
Filled rectangles: 644.85 ms
Circles: 667.74 ms
Triangles: 531.25 ms
Round rectangles: 236.16 ms
Text: 1899.09 ms
Pixel gradient: 7933.69 ms
Graphic test finished.

画面上では、各テストパターンが約 1 秒間表示され、その後次のパターンに切り替わります。すべてのテストが完了すると、青い角丸枠線付きの「Finished」画面が表示されます。

期待される結果​

スケッチがすべてのパターンを実行し終えると、画面には「Graphic Test / Finished」というメッセージが表示されます。テストを再度実行するには、ボードをリセットしてください。


タッチ — Touch Circle​

このデモは、1.47 インチタッチスクリーンをインタラクティブなお絵描きパッドに変えます。画面上の任意の場所をタップすると、指先の位置に白い円が表示されます。円は画面上に残り、タップするたびに増えていきます。画面下部の CLEAR バーをタップすると、すべての円が消去され、最初からやり直すことができます。

コードの場所: code_GFX2/Function/147_ESP32/xiao_esp32s3_147_touch_circle/


動作の仕組み​

このデモでは、I2C アドレス 0x63 の AXS5106L 静電容量式タッチコントローラを使用しており、D4/D5 の I2C に接続されています。コントローラはディスプレイのピクセル範囲内で絶対座標 (X, Y) を報告します。タッチは Seeed_GFX2 の Touch レイヤ(Touch_AXS5106L)によって処理されます。

Touch_AXS5106L touch(-1, D7, Wire, 172, 320);
display.attachTouch(touch, display.panel().driver().bus());
// ...
display.getTouch(&x, &y);
PinFunction
D4 (SDA)IMU と共有される I2C データバス
D5 (SCL)IMU と共有される I2C クロックバス
D7タッチ割り込み (INT)
RSTLCD リセット (GPIO13 / D17) と共有

エッジトリガの描画。 このスケッチはエッジ検出方式を使用します。タッチ(指を下ろした瞬間)のフォーリングエッジでのみ円を追加し、指を押し続けている間は追加しません。これにより、ドラッグ中に軌跡を塗り続けるのではなく、意図したタップでくっきりと描画できる動作になります。

X 軸の反転。 タッチパネルは LCD とは異なる向きで物理的に実装されているため、生の X 座標を反転させる必要があります。display.getTouch() は内部ですでにこの反転を適用し、画面座標を返すため、手動で screenX = 172 - 1 - rawX のような変換を行う必要はありません。

円バッファ。 最大 120 個の円がリングバッファに保存されます。バッファがいっぱいになると最も古い円が削除され、表示をきれいに保つために画面が再描画されます。

CLEAR ゾーン。 画面下部 36 ピクセルは CLEAR バーとして予約されています。この領域をタップすると、新しい円を描く代わりにすべての円が消去され、カウンタがリセットされます。

安全な描画領域。 円が完全に表示される領域を、薄いグレーの枠線で示します。

デモの実行​

Step 1. Arduino IDE で xiao_esp32s3_147_touch_circle.ino を開きます。

Step 2. ボードとポートを選択し、Upload をクリックします。

Step 3. Tools > Serial Monitor(115200 ボー)を開きます。次のような表示が見えるはずです:

=== XIAO ESP32-S3 Touch Circle Demo ===
LCD: 172x320
Touch: AXS5106L ready
Tap screen to draw white circles.
Tap CLEAR bar at bottom to erase.

Step 4. 画面をタップします。タップするたびにマッピングされた画面座標が出力され、CLEAR バーをタップすると消去メッセージが出力されます:

Touch: (76,163)
Touch: (64,226)
Touch: (32,80)
Touch: (118,100)
Touch: (37,311)
Clear zone tapped — erasing all circles.
Touch: (72,143)
Touch: (134,61)
Touch: (61,293)
Clear zone tapped — erasing all circles.

期待される結果​

タップするたびに、指先の位置に白い円が残ります。画面のタイトルバーにはタップ数の累計が表示されます。CLEAR バーをタップすると、画面がリセットされ、枠線とタイトルバーだけが再描画された空の状態になります。


SD カード — BMP リーダー​

このデモは、MicroSD カードから 24 ビット非圧縮の .bmp 画像を読み込み、画面に表示します。SD のプローブテスト(書き込み/読み出し)が内蔵されており、シリアルモニタに詳細な診断情報を出力するため、SD カードアクセスと BMP デコードの両方を検証するのに役立ちます。172×320 より大きい画像は中央部分がクロップされ、小さい画像は画面中央に配置されます。

コードの場所: code_GFX2/Function/147_ESP32/xiao_esp32s3plus_147_sd_bmp_reader_diag_v0_8/


動作の仕組み​

LCD と SD カードは同じ物理 SPI ピン(SCK = D8、MOSI = D10、MISO = D9)を共有しますが、別々の SPI ホストを使用します。LCD は Seeed_GFX2 の HSPI ホスト上で動作し、SD カードはデフォルトの ESP32 FSPI ホスト上で動作します。SD のチップセレクト(D6)はアイドル時に HIGH に保たれ、カードが共有バスから切り離されるようになっています。スケッチは 最初に SD カードを読み出し、その後で LCD を初期化します。つまり、SD をマウントし、BMP を RAM フレームバッファにデコードし、SD.end() を呼び出してから、ディスプレイを初期化します。この順序により、2 つの SPI ホストが共有ピン D8/D10 を取り合うことを防ぎます。

スケッチは SD カードを複数の SPI 周波数(4 MHz → 1 MHz → 400 kHz)でマウントし、その後、画像をデコードする前にファイルシステムへアクセスできることを確認するため、簡単な書き込み/読み出しプローブ(/SDPROBE.TXT)を実行します。次に SD ルート内の BMP ファイル(推奨ファイル名:/test.bmp、/TEST.BMP、/image.bmp、/IMAGE.BMP など)を探し、行ごとに RGB565 フレームバッファへデコードし、「BMP OK」ヘッダ(デコード時間を表示)と画面下端のファイルパスとともに描画します。

対応している BMP 形式:

FormatBit DepthNotes
非圧縮 BMP (BI_RGB)24 ビット(16/32 ビットも可)表示用に BGR888 を RGB565 に変換

172×320 より大きい画像は中央部分がクロップされ、小さい画像は中央に配置されます。最良の結果を得るには、サイズがちょうど 172×320 ピクセルで、24 ビット非圧縮の BMP を /test.bmp という名前で使用してください。

デモの実行​

Step 1. MicroSD カードを FAT32 でフォーマットします。

Step 2. test.bmp という名前の 24 ビット非圧縮 BMP 画像(できれば 172×320 ピクセル)を SD カードのルートにコピーします。

Step 3. SD カードをディスプレイボード上の MicroSD スロットに挿入します。

Step 4. Arduino IDE で xiao_esp32s3plus_147_sd_bmp_reader_diag_v0_8.ino を開き、ボードとポートを選択して Upload をクリックします。

Step 5. Tools > Serial Monitor(115200 ボー)を開きます。次のような表示が見えるはずです:

=== XIAO ESP32-S3 Plus 1.47 SD BMP Reader Diagnostic v0.8 ===
[PIN] SD CS=D6 SCK=D8 MISO=D9 MOSI=D10
[IMG] Put /test.bmp in SD root
[SD] Trying 4000000 Hz...
[SD] OK card=15193 MB freq=4000000 Hz
[PROBE] write /SDPROBE.TXT
[PROBE] write OK
[PROBE] read /SDPROBE.TXT
[PROBE] read OK: XIAO ESP32-S3 SD probe OK

[IMG] open start /test.bmp
[IMG] open done /test.bmp
[IMG] file size=117814
[BMP] header OK path=/test.bmp size=122x320 bpp=24 row=368 offset=54
[IMG] BMP loaded /test.bmp
[DONE] BMP loaded path=/test.bmp readMs=7881 totalMs=8016
注記

card=15193 MB、file size=117814、readMs=7881 などの具体的な値は、使用する SD カードや BMP ファイルによって異なるため、あなたの出力はここに示したものとは異なります。

その後、画面にはデコードされた画像が表示され、緑色の「BMP OK」ヘッダ(ミリ秒単位のデコード時間を表示)と、画面下部にファイルパスが表示されます。

期待される結果​

画像が画面に表示され、緑色の「BMP OK」ヘッダ(デコード時間を表示)と、下部にファイルパスが表示されます。BMP ファイルが見つからない場合は、「No BMP loaded」と表示され、シリアルモニタを確認し /test.bmp を使用するように指示が表示されます。


マイク & スピーカー​

デモ 1: ボリュームバー​

このデモは、オンボードの PDM マイクを大きく応答性の高いボリュームメーターに変えます。10 セグメントのバーが画面中央に表示され、低レベルでは緑、中程度では黄色、大きな音量では赤で塗りつぶされます。バーの上にはパーセンテージが表示され、レベルに応じて色が変化します。

コードの場所: code_GFX2/Function/147_ESP32/xiao_esp32s3_147_mic_canvas/


動作の仕組み​

オンボードの PDM(Pulse Density Modulation)デジタルマイクは、PDM RX モードに設定された ESP32-S3 の I2S ペリフェラルを通してサンプリングされます。ESP-IDF v5(Arduino core 3.3.11)では、新しいドライバ API(driver/i2s_pdm.h)を使用します:

PinSignalFunction
D0PDM_CLKマイクへの PDM クロック出力
D1MIC_DATAマイクからの PDM データ入力

I2S ペリフェラルは 16 kHz モノラル に設定され、256 フレームずつの DMA ディスクリプタを 4 個使用します。PDM CLK のドライブ強度は、電気的な結合を最小限に抑えるため初期化後に下げられます。サンプルはメインループ内で i2s_channel_read() によって 20 ms のタイムアウト付きで読み出されます。

信号処理:

  1. ピーク抽出 — 各 256 サンプルバッファを走査し、最大絶対値(ピーク振幅)を求めます。
  2. 正規化 — 生のピーク値を下限 40、上限 16,000 にマッピングし、0.0〜1.0 の音量値を生成します。下限未満の値は無音として扱われます。
  3. 指数平滑化 — 表示される音量は、生のピーク値に対する指数移動平均(α = 0.20)で、ジッタを防ぎます。無音が検出された場合、表示値はフレームごとに ×0.94 で減衰します。

バー描画:

セグメント色音量レンジ
0–4(下から 5)緑0% – 50%
5–8(中央 4)黄50% – 90%
9(最上段)赤90% – 100%

バーは差分レンダリングを使用します:前フレームから状態が変化したセグメントのみを再描画します。変化していないセグメントはそのまま残し、SPI トラフィックを最小限に抑えつつフリッカーを防ぎます。

デモの実行​

Step 1. Arduino IDE で xiao_esp32s3_147_mic_canvas.ino を開きます。

Step 2. ボードとポートを選択し、Upload をクリックします。

Step 3. Tools > Serial Monitor(115200 ボー)を開きます。次のような表示が見えるはずです:

=== Volume Bar (ESP32-S3) ===
[MIC] PDM RX ready (IDF v5)
[MIC] ready — speak or blow into the mic

Step 4. PDM マイク(ディスプレイボード左下付近にあります)に向かって話すか、息を吹きかけます。バーは緑から黄、赤へと満たされ、その上に表示されるパーセンテージが更新されます。

期待される結果​

バーはリアルタイムに反応します。静かな部屋ではバーは空のままです。約 20 cm 離れた位置から通常の声量で話すと、緑のセグメントが点灯します。マイクに直接息を吹きかけると、黄色または赤のレンジまで上がります。


デモ 2: SD レコーダー​

このデモでは、ボードをシンプルなボイスレコーダーとして動作させます。USR1 を押すと、オンボード PDM マイクから 5 秒間の音声を録音して MicroSD カードに WAV ファイルとして保存し、その後 USR2 を押すと、外付けの MAX98357A I2S アンプとスピーカーから録音を再生します。

コードの場所: code_GFX2/Function/147_ESP32/xiao_esp32s3_147_sd_record/


注記

このデモは、画面上のステータス表示に Seeed_GFX2 を使用し、ファイルアクセスには esp32 ボードパッケージに含まれる 組み込みの SD.h を使用します。SdFat は不要です。

ハードウェアセットアップ​

MicroSD カード。 スケッチを書き込む前、または電源を入れる前に、FAT32 でフォーマットされた MicroSD カードをディスプレイボードのカードスロットに挿入します。オンボード PDM マイクには外部配線は不要です。

スピーカー出力。 MAX98357A I2S アンプモジュールを、下部の I2S ブレークアウトパッドに接続します:

I2S パッドXIAO ピンGPIOMAX98357A
I2S_SDD11GPIO38DIN
I2S_SCKD12GPIO39BCLK
I2S_WSD13GPIO40LRC / WS
3V33V3—VIN
GNDGND—GND

スピーカーを MAX98357A の SPK+ および SPK- 端子に接続します。

動作概要​

このデモは 4 つのステージを順番に実行し、4 種類のペリフェラルを順に使用します:

PDM マイク(録音)。 オンボード PDM マイクは、D0 (PDM_CLK) と D1 (MIC_DATA) 上の I2S ペリフェラルを PDM RX モードで使用し、16 kHz モノラルでサンプリングされます。録音開始時のクリック音を避けるため、最初の 300 ms の取得データはウォームアップデータとして破棄されます。

RAM バッファ。 16 kHz、16 ビットモノラルで 5 秒間録音すると、160,000 バイト(5 s × 16,000 samples/s × 2 bytes)を占有します。サンプルは SD カードに書き込まれる前に RAM バッファに保持されます。

SD カード(ストレージ)。 録音は ESP32 ボードパッケージの組み込み SD.h を使用して、MicroSD カード上の /REC_RAW.WAV に書き込まれます。スケッチは、8 MHz → 4 MHz → 1 MHz → 0.4 MHz の順に複数の SPI 周波数でカードのマウントを試行し、成功するまで繰り返します。新しい録音は前のファイルを上書きします。

注意

このデモは起動時に /REC_RAW.WAV を削除します。録音を保持したい場合は、ボードを再起動する前に録音をコンピュータへコピーしてください。

I2S 再生。 再生では、I2S ペリフェラルをマスター / 送信モードで 16 kHz、16 ビット、Philips ステレオ に設定して使用します。モノラルサンプルは I2S の左右両チャンネルに複製されるため、MAX98357A のチャンネル選択に関わらず再生できます。

共有 LCD/SD バス。 LCD と SD カードは D8(SCK)、D9(MISO)、D10(MOSI)ピンを共有します。このデモでは、それぞれに専用の SPI ホストを割り当てることで競合を防いでいます:

  • LCD は Seeed_GFX2 の HSPI ホストを使用します。
  • SD カード は ESP32 のデフォルト FSPI ホストを使用します。
  • SD カードへの書き込みや読み出しを行う前に、スケッチは display.end() を呼び出して共有ピンに対する LCD の占有を解放し、SD 転送が完了したらディスプレイを再初期化します。

この分離により、LCD のリフレッシュと SD カードアクセスの間で SPI トランザクションの競合が発生するのを防ぎます。

デモの実行​

Step 1. ディスプレイボードのカードスロットに FAT32 の MicroSD カードを挿入します。

Step 2. 上記の説明どおりに、MAX98357A アンプとスピーカーを I2S ブレークアウトパッドに接続します。

Step 3. Arduino IDE で xiao_esp32s3_147_sd_record.ino を開きます。

Step 4. Tools > Board > esp32 > XIAO_ESP32S3_PLUS(esp32 ボードパッケージ 3.3.11)と正しい Port を選択し、Upload をクリックします。

Step 5. 書き込みが完了すると、画面に "SD Recorder" と表示されます。

Step 6. USR1 を押し、オンボード PDM マイクに向かって 5 秒間話します。

Step 7. 画面に "Saved SD WAV" と表示されるまで待ちます — 録音が SD カードに書き込まれたことを示します。

Step 8. USR2 を押して、スピーカーから録音を再生します。

期待される結果​

  • 録音中、画面には録音の進行状況が表示されます。
  • 録音が完了すると、画面に "Saved SD WAV" と表示されます。
  • SD カード上に /REC_RAW.WAV ファイルが作成されます。
  • USR2 を押すと、先ほど録音した音声がスピーカーから再生されます。

IMU​

1.47'' IPS Display には、D4/D5 上の I2C 接続されたオンボード 6 軸 IMU(LSM6DS3)が搭載されています。D14 上のモーション割り込みラインは、ハードウェアウェイクアップとジェスチャ検出をサポートします。

注記

オンボード IMU は LSM6DS3 です(ボードの回路図および I2C アドレス 0x6A から確認済み)。デモスケッチは防御的なフォールバックとして QMI8658 互換センサも探索しますが、出荷されている 1.47'' IPS Display には LSM6DS3 が使用されています。

以下の 2 つのデモはいずれも、I2C 経由でオンボードの LSM6DS3 を読み取ります。スケッチは防御的なフォールバックとして QMI8658 互換センサも探索しますが、持ち上げて起動する機能の設定は LSM6DS3 のレジスタを対象としています。

デモ 1: 電子流砂​

このデモでは、画面をインタラクティブな流体シミュレーションに変えます — オンボード 6 軸 IMU で計測された重力に従って流れ、沈殿する金色の砂粒です。ボードを傾けると、砂はリアルタイムに向きを変えて移動します。

コードの場所: code_GFX2/Function/147_ESP32/xiao_esp32s3_147_electronic_quicksand/


動作の仕組み​

このシミュレーションでは、172×320 の画面上に 24×45 の占有グリッド を重ね、その各セルは 7×7 ピクセルになっています。グリッド内には約 180 個のパーティクル が配置されており、それぞれ位置、速度、そしてゴールドのカラ―グラデーションを持ちます。

IMU は I2C(D4/D5)経由で 8 ms ごと に読み取られます。スケッチは既知の 2 つのアドレスで IMU を探索し、まず QMI8658、次に LSM6DS3 を試し、応答した方を使用します。生の加速度値はローパスフィルタで平滑化され、重力ベクトルの算出に使われます。ボードを傾けると、次のように動作します:

  1. 重力ベクトルの更新 — 加速度センサのデータは、ジッタを避けるために指数移動平均で平滑化されます。
  2. パーティクルの速度 — 各パーティクルは重力ベクトルの方向に加速し、減衰と、流れの深さに基づくパーティクルごとの可動性係数が適用されます。
  3. セルの占有状態 — 流れのより深い位置(重力に対して「底」に近い)にあるパーティクルは可動性が低くなり、現実的な詰まり(パッキング)効果を生み出します。
  4. 差分レンダリング — パーティクルが出入りしたセルだけを再描画することで、SPI トラフィックを最小限に抑え、アニメーションを滑らかに保ちます。

表面付近のパーティクルは自由に流れ(高い可動性)、より深く埋もれたパーティクルはきつく詰まり(低い可動性)、実際の砂の挙動を模倣します。

デモの実行​

Step 1. Arduino IDE で xiao_esp32s3_147_electronic_quicksand.ino を開きます。

Step 2. ボードとポートを選択し、Upload をクリックします。

Step 3. アップロードが完了すると、画面の下部が金色のパーティクルで満たされます。ボードをさまざまな方向に傾けると、砂が重力に引かれているかのように流れます。

Step 4. Tools > Serial Monitor(115200 ボー)を開き、初期化を確認します:

=== Electronic Quicksand ESP32-S3 1.47 ===
[IMU] LSM6-compatible at 0x6A, WHO=0x6A

期待される結果​

ボードを傾けると、パーティクルは低い側の端に向かって流れます。ディスプレイを水平に置くと、デモは直前の重力方向を保持します。


デモ 2: 持ち上げてスリープ解除​

このデモは、IMU に内蔵されたウェイクアップ割り込みを D14 で利用する 画面のスリープ/ウェイクシステム を実装しています。8 秒間操作がないと画面が自動的にオフ(バックライトオフ + ESP32 のライトスリープ)になり、デバイスを持ち上げたり動かしたりすると即座に復帰します。

コードの場所: code_GFX2/Function/147_ESP32/xiao_esp32s3_147_wakeup/


動作の仕組み​

このデモでは、IMU の 組み込みウェイクアップイベント検出器 を使用します。これは、加速度センサのデータを内部で監視し、モーションが設定可能なしきい値を超えたときに INT1 ピン(このボードでは D14 に接続)をアサートするハードウェア機能です。つまり、MCU が加速度センサを常時ポーリングする必要はありません。

「持ち上げてスリープ解除」デモでは、オンボードの LSM6DS3 をモーション・トリガのウェイクアップ用に設定します。

IMU 設定(LSM6DS3):

レジスタ値目的
CTRL1_XL0x40加速度センサ @ 104 Hz, ±2g
TAP_CFG0x80組み込み割り込みを有効化
WAKE_UP_THS0x05ウェイクアップしきい値(中〜低感度)
WAKE_UP_DUR0x00継続時間フィルタなし(応答性の高いウェイク)
MD1_CFG0x20ウェイクアップを INT1 にルーティング

スリープ/ウェイクの流れ:

  1. アクティブ状態 — 画面はオンで、バックライトは PWM 160。IMU データとバッテリ電圧はそれぞれ 250 ms / 1000 ms ごとに更新されます。カウントダウンタイマーには自動スリープまでの残り秒数が表示されます。
  2. 自動スリープ — 8 秒間何も操作がないと、スケッチはバックライトをオフにし、「Sleeping... Pick up device to wake」というメッセージを表示し、esp_sleep_enable_gpio_wakeup() を使って D14 をウェイクアップソースとして設定し、ESP32 をライトスリープに入れます。
  3. ウェイクアップ — ユーザーがボードを持ち上げると、IMU がモーションを検出して D14 を HIGH にアサートします。ESP32 はライトスリープから復帰し、UI を再描画します。

手動テストボタン:

ボタンピン動作
USR1D19強制ウェイク
USR2D15強制スリープ

デモの実行​

Step 1. Arduino IDE で xiao_esp32s3_147_wakeup.ino を開き、ボードとポートを選択して Upload をクリックします。

Step 2. 画面には電源状態、モーションデータ、カウントダウンタイマーを備えたダッシュボードが表示されます。ボードを 8 秒間静置すると、自動的にスリープします。

Step 3. ボードを持ち上げるか、軽く振ると、画面がすぐに復帰します。

Step 4. Tools > Serial Monitor(115200 ボー)を開き、IMU の検出とウェイクイベントを観察します:

=== XIAO ESP32-S3 Plus 1.47 IMU Wake Demo ===
[IMU] LSM6-compatible at 0x6A, WHO=0x6A
[IMU] wake config OK
[WAKE] IMU_D14 count=1
[WAKE] IMU_D14 count=2

モーションによるウェイクごとに、カウントがインクリメントされた [WAKE] IMU_D14 count=N 行が新たに出力されます。スリープへの遷移は画面上にのみ表示され、ボードがスリープに入るときにはシリアル出力は行われません。

期待される結果​

スリープ解除中は、画面にリアルタイムの加速度センサおよびジャイロスコープデータが表示されます。8 秒間静止すると画面が暗くなり、ESP32-S3 はライトスリープに入ります。デバイスを持ち上げると、画面は一瞬で復帰し、ウェイクカウンタがインクリメントされます。


ユーザーボタン​

1.47'' IPS ディスプレイには、XIAO ESP32-S3 Plus に接続された 2 つの物理プッシュボタン があります:

ボタンピンロジックシルク印刷ラベル
BTN_AD19アクティブ Low(押下 = LOW)USR1
BTN_BD15アクティブ Low(押下 = LOW)USR2

ボタンの読み取り​

両方のボタンは XIAO の内部プルアップ抵抗を使用します。単純なポーリング読み取りとデバウンスは次のようになります:

const int BTN_A = D19;
const int BTN_B = D15;

void setup() {
pinMode(BTN_A, INPUT_PULLUP);
pinMode(BTN_B, INPUT_PULLUP);
Serial.begin(115200);
}

void loop() {
if (digitalRead(BTN_A) == LOW) {
Serial.println("BTN_A pressed");
delay(200); // simple debounce
}
if (digitalRead(BTN_B) == LOW) {
Serial.println("BTN_B pressed");
delay(200);
}
}

割り込みを使ったデバウンス​

応答性が高くデバウンスされたボタン処理には、短い安定待ち時間付きで GPIO 割り込みを使用できます:

volatile bool btnAFlag = false;
volatile bool btnBFlag = false;

void btnAIsr() { btnAFlag = true; }
void btnBIsr() { btnBFlag = true; }

void setup() {
pinMode(D19, INPUT_PULLUP);
pinMode(D15, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(D19), btnAIsr, FALLING);
attachInterrupt(digitalPinToInterrupt(D15), btnBIsr, FALLING);
}

void loop() {
if (btnAFlag) {
btnAFlag = false;
delay(30); // debounce settling time
if (digitalRead(D19) == LOW) {
// handle BTN_A press
}
}
if (btnBFlag) {
btnBFlag = false;
delay(30);
if (digitalRead(D15) == LOW) {
// handle BTN_B press
}
}
}

工場出荷時ダッシュボードでのデフォルト動作​

プリインストールされている工場出荷時ファームウェアでは、ボタンは次のように割り当てられています(自分のコードでこれらを上書きできます):

ボタン動作
BTN_A (D19)短押し:画面の明るさを循環 100% → 75% → 50% → 25% → 0% → 100%
BTN_B (D15)短押し:画面のオフ/最後の明るさへの復帰をトグル

ボタンのブレークアウトパッド(基板上では U1 と U2 と表示)は、それぞれ D19 と D15 に対応しており、必要に応じて外部ボタンを接続できます。

バッテリ電圧検出​

このデモでは、オンボードのバッテリ分圧回路を D16 で読み取り、1.47'' IPS ディスプレイに 2 つの黄色のライブ値として表示します:D16 分圧の生電圧と、計算されたバッテリ電圧です。電圧値のみを表示し、バッテリ残量の推定や充電状態の報告は行いません。

コードの場所: code_GFX2/Function/147_ESP32/xiao_esp32s3_147_battery_status/


動作の仕組み​

バッテリー回路:

ESP32-S3 Plus は、オンボードの分圧回路を介して LiPo バッテリー電圧を D16 から読み取ります:

SignalESP32-S3 PinFunction
BAT_ADCD16分圧されたバッテリー電圧を読み取るアナログ入力。内部で分圧回路(316K / 160K)に接続されています。このピンを外部には使用しないでください。

分圧比: R14 = 316 kΩ、R15 = 160 kΩ → 分圧比 = (316 + 160) / 160 ≈ 2.975

読み取り:

スケッチは Board_XIAO_1inch47_Touch_Display<13, 12> と Config_Seeed_1inch47_Touch_JD9853A(172×320、BGR、反転なし)でディスプレイを初期化し、その後 analogReadMilliVolts() を使って 12 ビット分解能・11 dB 減衰で D16 を 12 回(700 µs 間隔)サンプリングします。サンプルを平均して分圧後の生の電圧を求め、それに分圧比を掛けてバッテリー電圧(Calc = D16 × 2.975)を算出し、両方を中央寄せの黄色い 2 行として描画します。画面は、いずれかの値が有意な量だけ変化したときのみ更新されます(D16 ≥ 0.02 V または Calc ≥ 0.05 V)。

注記

充電状態の信号は、どの ESP32-S3 GPIO にも接続されていません。このデモは電圧値のみを表示し、バッテリーの有無や充電状態の検出、バッテリー残量の推定は行いません。

デモの実行​

ステップ 1. Arduino IDE で xiao_esp32s3_147_battery_status.ino を開きます。

ステップ 2. Tools > Board > esp32 > XIAO_ESP32S3_PLUS と正しい Port を選択します。

ステップ 3. Upload をクリックします。

ステップ 4. 画面を観察します — 2 本の黄色い線が表示されます。上が生の D16 分圧電圧、下が計算されたバッテリー電圧です。LiPo バッテリー(または USB-C ケーブル)を接続・取り外しして、値がどのように更新されるか確認してください。

期待される結果​


電圧読み取り(D16 + Calc)

バッテリーコネクタ(背面)

画面には、上の行に生の D16 分圧電圧、下の行に計算されたバッテリー電圧(Calc)が表示されます。LiPo バッテリーを接続すると、Calc はバッテリー端子電圧のおおよその値になります。USB 電源のみでも値が表示される場合があるため、Calc だけではバッテリーが接続されているかどうかを判定できません。

このデモは、シリアルモニタに 1 秒ごとに診断用の 1 行も出力します。例:

D16 1.39V | Calc 4.14V

リソース​

技術サポート & 製品ディスカッション​

弊社製品をお選びいただきありがとうございます。私たちは、製品をできるだけスムーズにご利用いただけるよう、さまざまなサポートを提供しています。お好みやニーズに合わせて選べる、複数のコミュニケーションチャネルをご用意しています。

Loading Comments...