オンボードペリフェラルの使用
このページでは、1.14'' IPS Display の各オンボードペリフェラル向けに、単体で動作する機能別デモをまとめています。各セクションは独立しているため、他を読むことなく自分のユースケースに合うものだけを選んで使うことができます。
このページのデモGIFは、短く収めるために再生速度を上げています。
このページのすべてのデモには、Getting Started で説明している Seeed nRF52 Boards (1.1.13) に加え、以下の手順で手動インストールする Seeed_GFX2 ライブラリが必要です。
- Library Manager — Sketch > Include Library > Manage Libraries... に移動し、次を検索してインストールします:
| Library | Search Keyword | Author | Required by |
|---|---|---|---|
| Seeed Arduino LSM6DS3 | Seeed Arduino LSM6DS3 | Seeed Studio | IMU デモ |
- Seeed_GFX2 (Manual Installation) — このライブラリは Library Manager にはないため、手動でインストールする必要があります:
Step 1. 上のボタンをクリックして、Seeed_GFX2 v1.0.0 をZIPファイルとしてダウンロードします(チュートリアルの再現性を保つため、リリースタグに固定されています)。あるいは、Seeed-Studio/Seeed_GFX2 からリポジトリを clone しても構いません。
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_...>()という1回の呼び出しでディスプレイを初期化します。Board テンプレートはピンマップ(CS/DC/SCK/MOSI/RST/BL)を保持し、Panel Config は 135×240 の解像度、色順序、反転設定を組み込みます。driver.hや手動のピン設定は不要です。 - このボードでは、デモは
Board_XIAO_1inch14_LCD<38, 37>(RST=38, BL=37)とConfig_Seeed_1inch14_LCD_ST7789(135×240)を使用します。いくつかのデモでは、BGR カラー順序用にスケッチローカルなConfig_XIAO_1inch14_LCD_ST7789_BGRオーバーライドを定義しています。 - IMU デモは、(上でインストールした)Seeed Arduino LSM6DS3 ライブラリを使用します。
- 1.14'' IPS Display には タッチコントローラも SD カードスロットもない ため、タッチや SD 用のライブラリは不要です。
Flash Recorder チュートリアルで使用する PDM、Adafruit TinyUSB、Adafruit LittleFS、InternalFileSystem ライブラリは、Seeed nRF52 Boards 1.1.13 に同梱されています — Library Manager から別バージョンをインストールしないでください。
録音データは nRF52840 の 内部 Flash ファイルシステム に保存されます。このディスプレイには SD カードスロットがなく、このチュートリアルでは SdFat を使用しません。
デモコードの入手
このページのすべてのデモは、code_GFX2/Function/ ディレクトリ以下の Display-Gadgets リポジトリ内にあります。各デモは1つの .ino スケッチを含むフォルダです。GitHub の Web ビューから .ino のソースだけをコピーするのではなく、必ずフォルダ全体をダウンロードしてください。
オプションA — リポジトリをZIPでダウンロード(推奨):
- github.com/Seeed-Projects/Display-Gadgets を開き、Code > Download ZIP をクリックして、任意の場所にアーカイブを展開します。
code_GFX2/Function/に移動し、各デモの Code location 行に示されているフォルダを開きます。例えば、このボード向けの GraphicTest デモはcode_GFX2/Function/114_nRF52840/xiao_nrf52840_114_graphictest/にあります。.inoファイルをダブルクリックして Arduino IDE で開きます。
オプションB — git clone:
git clone https://github.com/Seeed-Projects/Display-Gadgets.git
その後、clone した code_GFX2/Function/... フォルダからデモの .ino ファイルを開きます。
画面表示 — GraphicTest
このデモは、1.14インチ ST7789 IPS パネル(135×240)上でフルグラフィックスベンチマークを実行し、カラーバー、線、矩形、円、三角形、角丸矩形、テキスト、ピクセルグラデーションを網羅します。画面が正しく配線されていること、およびすべての描画呼び出しが期待どおり動作することを確認するために使用できます。
Code location: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_graphictest/
動作概要
このスケッチは Seeed_GFX2 を介して ST7789 IPS パネルを初期化し、その後10種類のグラフィックスプリミティブを順番に実行します。それぞれの実行時間を micros() で計測し、結果をシリアルモニタに出力します。
ディスプレイは次の1回のテンプレート呼び出しで初期化されます:
display.begin<Board_XIAO_1inch14_LCD<38, 37>,
Config_Seeed_1inch14_LCD_ST7789>();
Board テンプレートはピンマップ — CS=D2, DC=D3, SCK=D8, MOSI=D10 — を保持し、その <RST, BL> テンプレートパラメータには生の GPIO 番号を指定するため、<38, 37> は RST=GPIO38、BL=GPIO37 を意味します。Panel Config は 135×240 の解像度、色順序、反転設定(invert = true)を組み込んでいるため、driver.h や手動の invertDisplay() 呼び出しは不要です。
デモの実行
Step 1. Arduino IDE で xiao_nrf52840_114_graphictest.ino を開きます。
Step 2. Tools > Board > Seeed nRF52 Boards > Seeed XIAO nRF52840 Plus と正しい Port を選択します。
Step 3. Upload をクリックします。
Step 4. Tools > Serial Monitor(115200ボー)を開きます。各テストのタイミング出力が表示されるはずです:
LCD width: 135
LCD height: 240
Color bars: 34.18 ms
Lines: 2599.61 ms
Fast lines: 57.62 ms
Rectangles: 44.92 ms
Filled rectangles: 125.98 ms
Circles: 291.02 ms
Triangles: 289.06 ms
Round rectangles: 95.70 ms
Text: 1416.02 ms
Pixel gradient: 4774.42 ms
Graphic test finished.
画面上では、各テストパターンが約1秒間表示され、その後次のパターンに切り替わります。すべてのテストが完了すると、「Finished」画面が表示されます。
期待される結果

スケッチがすべてのパターンを実行し終えると、画面には「Finished」というメッセージが表示されます。テストを再度実行するには、ボードをリセットしてください。
IMU
1.14'' IPS Display には、D4/D5 の I2C 接続でオンボード 6軸 IMU(LSM6DS3)が搭載されています。D14 上のモーション割り込みラインは、ハードウェアウェイクアップとジェスチャ検出をサポートします。
以下の2つのデモはいずれも、I2C アドレス 0x6A の LSM6DS3 を使用します。
デモ1: Electronic Quicksand
このデモでは、画面がインタラクティブな流体シミュレーションになります — オンボード 6軸 IMU で計測した重力に従って流れ、沈殿する金色の砂粒です。ボードを傾けると、砂がリアルタイムにその方向へと移動します。
Code location: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_electronic_quicksand/
動作の仕組み
このシミュレーションでは、135×240 の画面上に 22×40 の占有グリッド を重ね合わせており、各セルは 6×6 ピクセルです。グリッド内には約 150 個のパーティクル が配置されており、それぞれ位置、速度、そして金色のカラ―グラデーションを持ちます。
IMU は Seeed Arduino LSM6DS3 ライブラリを用いて I2C(D4/D5)経由でアドレス 0x6A から読み出します。生の加速度値はローパスフィルタで平滑化され、重力ベクトルの算出に使用されます。ボードを傾けると:
- 重力ベクトルの更新 — 加速度センサのデータは指数移動平均でスムージングされ、ジッタを抑えます。
- パーティクルの速度 — 各パーティクルは重力ベクトルの方向に加速し、減衰と、フロー内での深さに基づくパーティクルごとの可動性係数が適用されます。
- セルの占有状態 — フローのより深い位置(重力に対して「底」に近い)にあるパーティクルほど可動性が低くなり、リアルな詰まり(パッキング)効果を生み出します。
- 差分レンダリング — パーティクルが出入りしたセルのみを再描画することで、SPI トラフィックを最小限に抑え、アニメーションを滑らかに保ちます。
表面付近のパーティクルは自由に流れ(高い可動性)、より深く埋もれたパーティクルは密に詰まり(低い可動性)、実際の砂の挙動を模倣します。
デモの実行
ステップ 1. Arduino IDE で xiao_nrf52840_114_electronic_quicksand.ino を開きます。
ステップ 2. ボードとポートを選択し、Upload をクリックします。
ステップ 3. アップロードが完了すると、画面下部が金色のパーティクルで満たされます。ボードをさまざまな方向に傾けると、砂が重力に引かれるように流れます。
ステップ 4. Tools > Serial Monitor(115200 ボー)を開き、初期化を確認します:
=== Electronic Quicksand 1.14 ===
imu.begin=0
期待される結果

ボードを傾けると、金色の砂のパーティクルが滑らかに流れます。水平に保つと、砂は画面の下部に落ち着きます。ボードを 90 度回転させると、1 秒以内に砂が新しい「底」に向かって流れます。
デモ 2: 持ち上げてスリープ解除
このデモでは、IMU に内蔵されたモーション割り込みを D14 で利用し、画面のスリープ/ウェイクシステム を実装しています。設定可能なアイドル時間後に画面が自動的にオフ(バックライトオフ + nRF52 System ON スリープ)になり、デバイスを持ち上げたり動かしたりすると即座に復帰します。
コードの場所: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_wakeup/
動作の仕組み
このデモでは、LSM6DS3 の 組み込みウェイクアップイベント検出器 を使用します。これは、加速度センサのデータを内部で監視し、モーションが設定可能なしきい値を超えたときに INT1 ピン(このボードでは D14 に接続)をアサートするハードウェア機能です。これにより、MCU は加速度センサを継続的にポーリングする必要がありません。
IMU 設定(LSM6DS3):
| レジスタ | 値 | 目的 |
|---|---|---|
CTRL1_XL | 0x40 | 加速度センサ @ 104 Hz, ±2g |
TAP_CFG | 0x80 | 組み込み割り込みを有効化 |
WAKE_UP_THS | 0x05 | ウェイクアップしきい値(中〜低感度) |
WAKE_UP_DUR | 0x00 | 継続時間フィルタなし(応答性の高いウェイク) |
MD1_CFG | 0x20 | ウェイクアップを INT1 にルーティング |
スリープ/ウェイクのフロー:
- アクティブ状態 — 画面はオンでバックライトは最大輝度、UI は 250 ms ごとにリアルタイム IMU データで更新されます。カウントダウンタイマーには自動スリープまでの残り秒数が表示されます。
- 自動スリープ — アイドルタイムアウト後、スケッチはバックライトをオフにし、「Sleeping... Pick up device to wake」というメッセージを表示してから、nRF52 System ON スリープ(RAM を保持する低消費電力モード)に入ります。IMU のウェイク割り込み(D14)は起動時にすでに設定されているため、スリープ中もモーション検出は有効のままです。
- ウェイクアップ — ユーザがボードを持ち上げると、IMU がモーションを検出して D14 を HIGH にアサートします。nRF52840 は System ON スリープから復帰し、バックライトを元に戻して UI を再描画します。LCD と IMU は 再初期化されません。System ON スリープでは RAM とペリフェラル設定が保持されるため、どちらも起動時に適用した設定を維持します。
手動テストボタン:
| ボタン | ピン | 動作 |
|---|---|---|
| USR1 | D6 | 強制スリープ |
| USR2 | D7 | 強制ウェイク |
デモの実行
ステップ 1. Arduino IDE で xiao_nrf52840_114_wakeup.ino を開き、ボードとポートを選択して Upload をクリックします。
ステップ 2. 画面には電源状態、モーションデータ、カウントダウンタイマーを備えたダッシュボードが表示されます。ボードを静置すると、アイドル時間後に自動的にスリープに入ります。
ステップ 3. ボードを持ち上げるか、軽く振ると、画面が即座に復帰します。
ステップ 4. Tools > Serial Monitor(115200 ボー)を開き、スリープ/ウェイクの遷移を確認します:
LCD: 135x240
[IMU] Seeed LSM6DS3 begin=0
[IMU] D14 wake interrupt OK
[BOOT] done. Screen should be on.
[WAKE] reason=IMU_D14 wakeCount=1 sleptMs=3568 sleepLoops=0
[SLEEP] screen off, entering System ON sleep
[SLEEP] loops=1 D14=0 awake=N
[WAKE] reason=IMU_D14 wakeCount=2 sleptMs=1378 sleepLoops=439
期待される結果

スリープ解除中は、画面にリアルタイムのモーションデータが表示されます。静止した状態でアイドル時間が経過すると、画面が暗くなり、nRF52840 は低消費電力スリープに入ります。デバイスを持ち上げると画面が即座に復帰し、ウェイクカウンタがインクリメントされます。
マイク & スピーカー
1.14'' IPS Display には、1.47" バージョンと同じ PDM デジタルマイクが搭載されており、同じピンに接続されています:
| ピン | 信号 | 機能 |
|---|---|---|
| D0 | PDM_CLK | マイクへの PDM クロック出力 |
| D1 | MIC_DATA | マイクからの PDM データ入力 |
デモ 1: ボイスバー
このデモでは、PDM マイクのリアルタイム音声入力を、ダイナミックなイコライザ風の波形とセグメント化されたボリュームバーとして可視化します。オンボードマイクに向かって話したり、手を叩いたり、息を吹きかけたりすると、バーが即座に反応する様子が確認できます。
コードの場所: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_voice_bar/
動作の仕組み
このスケッチでは、nRF52840 の PDM ペリフェラルを PDM ライブラリ(Seeed nRF52 Boards に同梱)経由で、16 kHz・シングルチャネルで使用します。ISR(onPDMdata)は 256 サンプルのリングバッファに生の PDM サンプルを取り込み、ピーク振幅を計算します。
画面は 3 つのゾーンに分割されています:
| ゾーン | 位置 | 説明 |
|---|---|---|
| 波形 | 上部(y=30–95) | 27 本のバーからなるイコライザビジュアライザ。生サンプルをダウンサンプリングし、中央のベースラインを中心に対称なバーとして描画します。波形の色は、ボリュームバーとパーセンテージラベルと同じ平滑化されたボリューム値に基づいて変化し、緑(<50%)、黄(50–90%)、赤(>90%)で色分けされます。 |
| パーセンテージ | 中央 | 大きな数値のボリュームパーセンテージ(0–100%)。緑(<50%)、黄(50–90%)、赤(>90%)で色分けされます。 |
| ボリュームバー | 下部 (y=130–225) | 10 セグメントバー(緑/黄/赤のグラデーション)。PDM ピークから平滑化された音量で更新されます。 |
信号処理:
- PDM ISR —
onPDMdata()が約 62 Hz(16000 / 256)で発火します。生サンプルを読み取り、ピーク振幅を計算し、波形ビジュアライザ用に 27 ビンへダウンサンプリングします。 - 正規化 — ピーク値が 10 未満の場合は無音として扱います。1500 を超える値は 100% に飽和します。その間は線形マッピングにより 0.0〜1.0 の音量レベルを生成します。
- 指数平滑化 — 表示される音量はジッタを避けるため、20% のミックス係数(
SMOOTH = 0.20)で平滑化されます。無音時には音量はフレームごとに 6% ずつ減衰します。 - 差分レンダリング — ボリュームバーとパーセンテージラベルは値が変化したときのみ再描画され、SPI トラフィックを最小限に抑えます。
デモの実行
ステップ 1. Arduino IDE で xiao_nrf52840_114_voice_bar.ino を開きます。
ステップ 2. Tools > Board > Seeed nRF52 Boards > Seeed XIAO nRF52840 Plus と正しい Port を選択します。
ステップ 3. Upload をクリックします。
ステップ 4. Tools > Serial Monitor(115200 ボー)を開きます。次のような表示が見えるはずです:
[MIC] ready
ステップ 5. マイクに向かって話す、手を叩く、息を吹きかけるなどします。波形とボリュームバーがリアルタイムに反応します。音量が上がるにつれてパーセンテージラベルの色が変化します。
期待される結果

無音時には波形はフラットで、ボリュームバーは空(0%)です。マイクに向かって話すと、イコライザバーがアニメーションし、ボリュームバーが緑から黄、赤へと満たされていきます。パーセンテージラベルはリアルタイムに更新されます。
デモ 2: I2S 再生付きフラッシュレコーダー
このデモでは、オンボード PDM マイクから nRF52840 の内部フラッシュファイルシステムに短い音声クリップを録音し、その後外部 I2S アンプとスピーカーを通して再生します:
- USR1 はオンボード PDM マイクから録音します。
- 録音は 16 kHz、16 ビット、モノラル です。
- 各クリップは約 0.7 秒(11,200 サンプル、22,400 バイトの PCM)です。
- クリップは内部フラッシュファイルシステム内の
/REC_RAW.WAVとして保存されます。 - USR2 は外部 MAX98357A とスピーカーを通して録音を再生します。
- このデモは Seeed nRF52 Boards 1.1.13 を用いて XIAO nRF52840 Plus 上でコンパイル、書き込み、およびハードウェア検証済みです。
コードの場所: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_flash_record/
ハードウェアセットアップ
再生には外部のI2S オーディオアンプとスピーカーが必要です。このデモは、ボードの I2S 出力パッドに接続された MAX98357A ブレイクアウト用に作成されています:
| ディスプレイボード | MAX98357A |
|---|---|
| 3V3 | VIN |
| GND | GND |
| D11 / I2S_SD | DIN |
| D12 / I2S_SCK | BCLK |
| D13 / I2S_WS | LRC / WS |
スピーカーを MAX98357A の SPK+ および SPK- 端子に接続します。スピーカーの片側を GND に接続してはいけません — MAX98357A はブリッジ接続負荷(BTL)アンプなので、両方のスピーカー端子を SPK 出力に接続する必要があります。
アンプとスピーカーの配線を行う前に USB 電源を切断してください。
動作の仕組み
- PDM マイクは D0 (CLK) と D1 (DATA) を使用します。
PDMライブラリは 16 kHz モノラルでマイクをキャプチャします。- WAV ファイルは 44 バイトのヘッダーと 22,400 バイトの PCM データで構成されます。
- 内部フラッシュファイルシステム(InternalFS)は約 28 KB しかないため、各録音はおよそ 0.7 秒 に制限されます。
- 再生には nRF52840 の I2S ハードウェアペリフェラルを Philips I2S フォーマット、16 ビット、ステレオ出力で使用します。
- モノラルサンプルは左チャネルと右チャネルの両方に複製されます。
- I2S ピンは D11、D12、D13 です。
チュートリアルの実行
ステップ 1. USB 電源を切断し、上図のように MAX98357A とスピーカーを配線します。
ステップ 2. Arduino IDE で xiao_nrf52840_114_flash_record.ino を開きます。
ステップ 3. Tools > Board > Seeed nRF52 Boards > Seeed XIAO nRF52840 Plus と正しい Port を選択します。
ステップ 4. スケッチをコンパイルしてアップロードします。
ステップ 5. USR1 を押し、すぐにオンボードマイクに向かって約 0.7 秒 話します。
録音は USR1 を押した瞬間に開始されます — 赤い進行バーが表示されるのを待たないでください。0.7 秒のウィンドウは USR1 が押された瞬間からカウントされるため、すぐに話し始めないとクリップの冒頭が欠けてしまいます。
ステップ 6. 画面に Saved WAV と表示されるまで待ちます。
ステップ 7. USR2 を押すと、スピーカーから録音が再生されます。
期待される結果
- 起動時、画面には Flash Recorder と表示されます。
- 録音が存在しない場合、画面には No recording と表示されます。
- 録音中は、画面に進行状況の表示が出ます。
- 保存が完了すると、画面には Saved WAV と表示されます。
- USR2 を押すと、スピーカーから録音が再生されます。

Grove I2C
1.14'' IPS ディスプレイには、標準的な 4 ピン Grove ソケット(GND / 3V3 / SDA / SCL)上に D4(SDA)と D5(SCL)を引き出した専用のGrove I2C コネクタがあります。D4/D5 がタッチコントローラとも共有されている 1.47" 版とは異なり、1.14" ディスプレイでは D4/D5 はオンボード IMU とだけ共有されています(タッチコントローラはありません)。
| Grove ピン | XIAO ピン | 備考 |
|---|---|---|
| GND | GND | 共通グラウンド |
| 3V3 | 3V3 | 3.3V 電源出力 |
| SDA | D4 | I2C データ — オンボード IMU と共有 |
| SCL | D5 | I2C クロック — オンボード IMU と共有 |
D4/D5 は Grove コネクタとオンボード IMU で共有されています。IMU のアドレスは 0x6A です。外部 I2C デバイスを接続する際は、このアドレスと競合しないことを確認してください。
デモ: SHT31 温度 & 湿度
このデモでは、Grove I2C コネクタに接続した Grove SHT31 センサーから温度と湿度を読み取り、その値を画面に表示します。スケッチは Wire.h を使って I2C 経由でセンサーと直接通信し(SHT31 ライブラリは不要)、各読み取り値をセンサーの CRC で検証します。
コードの場所: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_sht31_temperature_humidity/
ハードウェアセットアップ
Grove SHT31 温度・湿度センサーを Grove I2C コネクタに接続します。センサーは 3.3V で給電され、I2C アドレス 0x44 で通信します:
| Grove ピン | XIAO ピン | SHT31 |
|---|---|---|
| GND | GND | GND |
| 3V3 | 3V3 | VCC |
| SDA | D4 | SDA |
| SCL | D5 | SCL |
動作の仕組み
スケッチは I2C アドレス 0x44 で Wire を使って SHT31 を直接読み取ります:
- I2C スキャン — 起動時に I2C バスをスキャンし、見つかったすべてのデバイスを報告します。
- シングルショット測定 — 高繰り返し精度のシングルショットコマンド(
0x24 0x00、クロックストレッチなし)を送信し、20 ms 待ってから 6 バイトを読み取ります: 温度の上位/下位 + CRC、湿度の上位/下位 + CRC。 - CRC チェック — 各 16 ビット値をその CRC バイトと照合して検証し、不一致の場合はエラー(配線不良またはモジュールの破損/ノイズ)として報告します。
- 変換 — 生データを温度(
-45 + 175 × raw / 65535°C)および相対湿度(100 × raw / 65535%)に変換します。
ディスプレイは Board_XIAO_1inch14_LCD<38, 37> とスケッチローカルの Config_XIAO_1inch14_LCD_ST7789_BGR(135×240、BGR カラー順、反転)で初期化され、色が正しく表示されます。画面には「SHT31 OK」とライブの温度と湿度が表示され、読み取りに失敗した場合は「SHT31 ERROR」とエラーコードが表示されます。
デモの実行
ステップ 1. Arduino IDE で xiao_nrf52840_114_sht31_temperature_humidity.ino を開きます。
ステップ 2. Tools > Board > Seeed nRF52 Boards > Seeed XIAO nRF52840 Plus と正しい Port を選択し、Upload をクリックします。
ステップ 3. Tools > Serial Monitor(115200 ボー)を開きます。次のように表示されます:
=== XIAO nRF52840 1.14 SHT31 Temperature/Humidity ===
[PIN] SDA=D4 SCL=D5 address=0x44
[I2C] scan start
[I2C] found 0x44
[I2C] scan done
[SHT31] OK T=26.81 C H=48.32 %
画面には温度と湿度とともに「SHT31 OK」が表示され、1 秒ごとに更新されます。センサーが切断された場合や CRC チェックに失敗した場合、画面にはエラーコード付きで「SHT31 ERROR」が表示されます。
期待される結果

画面上の温度と湿度は 1 秒ごとに更新されます。センサーに息を吹きかけると、湿度の値が上昇します。
ユーザーボタン
1.14'' IPS ディスプレイには、XIAO nRF52840 Plus に接続された3 つの物理プッシュボタンがあります。3 つすべてのボタンにはボード上に外付けの 1 KΩ プルアップ抵抗があるため、対応するピンを INPUT として設定できます(内部プルアップは不要です):
| ボタン | ピン | ロジック | シルク印字ラベル | ブレイクアウトパッド |
|---|---|---|---|---|
| USR1 | D6 | アクティブ Low(押下 = LOW) | USR1 | U1 |
| USR2 | D7 | アクティブ Low(押下 = LOW) | USR2 | U2 |
| USR3 | D19 | アクティブ Low(押下 = LOW) | USR3 | U3 |
ボタンの読み取り
ボード上にはすでに 1 KΩ の外付けプルアップがあるため、シンプルなダイレクトリードでボタンを読み取ることができます:
const int USR1 = D6;
const int USR2 = D7;
const int USR3 = D19;
void setup() {
// External 1K pull-up on the board — no internal pull-up needed.
pinMode(USR1, INPUT);
pinMode(USR2, INPUT);
pinMode(USR3, INPUT);
Serial.begin(115200);
}
void loop() {
if (digitalRead(USR1) == LOW) {
Serial.println("USR1 (D6) pressed");
delay(200); // simple debounce
}
if (digitalRead(USR2) == LOW) {
Serial.println("USR2 (D7) pressed");
delay(200);
}
if (digitalRead(USR3) == LOW) {
Serial.println("USR3 (D19) pressed");
delay(200);
}
}
割り込みによるデバウンス
メインループをブロックせずに、応答性の高いデバウンス済みボタン処理を行うには、ピンチェンジ割り込みを使用できます:
volatile bool btn1Flag = false;
volatile bool btn2Flag = false;
volatile bool btn3Flag = false;
void btn1Isr() { btn1Flag = true; }
void btn2Isr() { btn2Flag = true; }
void btn3Isr() { btn3Flag = true; }
void setup() {
pinMode(D6, INPUT);
pinMode(D7, INPUT);
pinMode(D19, INPUT);
attachInterrupt(digitalPinToInterrupt(D6), btn1Isr, FALLING);
attachInterrupt(digitalPinToInterrupt(D7), btn2Isr, FALLING);
attachInterrupt(digitalPinToInterrupt(D19), btn3Isr, FALLING);
}
void loop() {
if (btn1Flag) {
btn1Flag = false;
delay(30); // debounce settling time
if (digitalRead(D6) == LOW) {
// handle USR1 press
}
}
if (btn2Flag) {
btn2Flag = false;
delay(30);
if (digitalRead(D7) == LOW) {
// handle USR2 press
}
}
if (btn3Flag) {
btn3Flag = false;
delay(30);
if (digitalRead(D19) == LOW) {
// handle USR3 press
}
}
}
ファクトリーダッシュボードでのデフォルト動作
プリインストールされているファームウェアでは、ボタンは次のように割り当てられています(自分のコードでこれらを上書きできます):
| ボタン | ピン | 動作 |
|---|---|---|
| USR1 | D6 | 画面の明るさを切り替え(100% → 75% → 50% → 25% → 100%) |
| USR2 | D7 | 画面のオン/オフを切り替え(オフ / 最後の明るさに復帰) |
| USR3 | D19 | ヘッダータイトルを「Hello,XIAO!」と「Seeed」の間で切り替え |
ボタンのブレイクアウトパッド(ボード上では U1、U2、U3 と表示)は、それぞれ D6、D7、D19 に対応しており、必要に応じて外部ボタンを接続できます。
バッテリーステータス
このデモでは、1.14'' IPS ディスプレイにバッテリーアイコン(充電レベルと充電状態)を表示してバッテリーステータスを示します。LiPo バッテリーが物理的に接続されているかどうかを検出し、次の 3 つの状態のいずれかを表示します:USB PWR(バッテリーなし)、パーセンテージ(バッテリーのみ)、または 充電中(USB + バッテリー)。
1.14'' IPS ディスプレイには、XIAO nRF52840 Plus に接続されたオンボードのバッテリー電圧測定回路が含まれています。
コードの場所: code_GFX2/Function/114_nRF52840/xiao_nrf52840_114_battery_status/
動作の仕組み
ディスプレイ:
画面は Seeed_GFX2 によって駆動され、Board_XIAO_1inch14_LCD<38, 37> と Config_Seeed_1inch14_LCD_ST7789(135×240、BGR、回転 2)の BGR オーバーライドを使用し、10 MHz のハードウェア SPI 経由で動作します。
バッテリー回路:
nRF52840 Plus は、3 本の GPIO ピンを使用して完全なバッテリーモニタリングシステムを構成します:
| 信号 | nRF52840 ピン | 機能 |
|---|---|---|
READ_BAT | P0.14 | バッテリー分圧回路のイネーブル。アクティブ Low — 分圧器を有効にするには LOW に設定し、その後は電力を節約するために HIGH(高インピーダンス)に戻します。 |
VBAT_ADC | PIN_VBAT (AIN7 / P0.31) | 分圧されたバッテリー電圧を読み取るアナログ入力。 |
CHG | P0.17 | 充電ステータスインジケータ。アクティブ Low — 充電器が接続されバッテリーが充電中のとき LOW を読み取ります。 |
検出:
USB-C 接続時には、静的な VBAT 電圧だけではバッテリーが存在するかどうかを判断できません。バッテリーが接続されていなくても、充電器の BAT ノードは実際のリチウムイオンセルのように見えることがあります。そのため、このデモではまず USB のみのベースラインを学習し、その後、VBAT の持続的な低下があった場合にのみバッテリーの挿入を確認し、ノイズの多い/ジャンプした読み取りと ~CHG が HIGH になることを組み合わせて取り外しを確認します。これはファクトリーダッシュボードの検出ロジックを反映したものです。
アイコン状態:
- バッテリーなし — 赤いバツ印付きのグレーのバッテリーアウトラインで、USB PWR と表示。
- バッテリーあり — 白いアウトラインのバッテリーに色付きのフィル(パーセンテージに応じて緑 / 黄 / 赤)が入り、パーセンテージと電圧が表示されます。
- 充電中 — シアンのフィルと稲妻アイコンが表示され、パーセンテージと電圧が表示されます。
~CHG ピンは、digitalRead() ではなく nRF52840 の 生の GPIO レジスタ(nrf_gpio_cfg_input() と NRF_P0->IN)を通して読み取られます。Arduino API では、ピン番号はボードパッケージのマッピングに従っており、digitalRead(17) は実際には P0.17 ではなく P0.07(6D IMU の I2C データライン)を読み取ります。ここでの定数 14 と 17 は 生の Nordic P0.x ピン番号(P0.14 と P0.17)であり、これはレジスタ呼び出しが期待しているものと完全に一致します。
このデモでは、ファクトリーキャリブレーションされた 499 kΩ のローサイド抵抗(分圧比 ≈ 3.004)を使用しており、510 kΩ の公称値ではありません。分圧器はディスプレイボードではなく、XIAO nRF52840 Plus モジュール自体に内蔵されています。P0.14 のイネーブルピンは アクティブ Low です:分圧器を有効にするには LOW に駆動し、バッテリーを測定していないときの静止電流消費を最小限に抑えるために、高インピーダンス(INPUT)に戻します。
デモの実行
ステップ 1. Arduino IDE で xiao_nrf52840_114_battery_status.ino を開きます。
ステップ 2. Tools > Board > Seeed nRF52 Boards > Seeed XIAO nRF52840 Plus と正しい Port を選択します。
ステップ 3. Upload をクリックします。
ステップ 4. 画面を観察します — 現在の状態に応じたバッテリーアイコンが表示されます。LiPo バッテリー(または USB-C ケーブル)を抜き差しして、アイコンが 3 つの状態の間で切り替わる様子を確認します。
期待される結果
![]() USB PWR(バッテリーなし) | ![]() Percentage(バッテリーのみ) |
![]() Charging(USB + バッテリー) | ![]() Battery connector(背面) |
バッテリーがない場合、画面には赤いバツ印が付いた灰色のバッテリーと USB PWR というラベルが表示されます。LiPo バッテリーを挿入すると、アイコンは色付きの残量表示に変わり、パーセンテージと電圧が表示されます。バッテリーが接続されている状態で USB-C を接続すると、残量表示は稲妻マーク付きのシアン色になり、充電中であることを示します。
このデモは 500 ms ごとにシリアルモニタへ診断用の行も出力します。例:
VBAT 3.87V charging 85 spread=5 usb=ON base=4.140 baseValid=Y state=PRESENT filter=STABLE removeCount=0
リソース
- 🗃️[PCB Design Files] XIAO 1.14'' IPS Display (nRF52840) KiCad プロジェクト
- 📄[Schematic] XIAO 1.14'' IPS Display (nRF52840) 回路図
- 📦[3D Model] XIAO 1.14'' IPS Display (STEP) 3D モデル
- 📄[Datasheet] 1.14 インチディスプレイ データシート
- 💾[Factory Firmware] XIAO 1.14'' IPS Display (nRF52840) 工場出荷時ファームウェア
- [Demo] XIAO Display Board デモコード — すべての機能デモは
code_GFX2/Function/114_nRF52840/ディレクトリ内にあります
技術サポート & 製品ディスカッション
弊社製品をお選びいただきありがとうございます。私たちは、製品をできるだけスムーズにご利用いただけるよう、さまざまなサポートを提供しています。お好みやニーズに合わせてお選びいただける複数のコミュニケーションチャネルをご用意しています。



