Seeed Studio XIAO ESP32C6 でBLEビーコンを試してみる(2)
この記事では、Seeed Studio XIAO ESP32C6を使って、MicroPythonからBluetooth Low Energy(BLE)のアドバタイズを発信し、スマートフォンからビーコンを検出してみます。
この記事で学べること
- BLEを有効にする
- デバイス名を発信する
- スマホで検出する
ステップごとの解説
- Seeed Studio XIAO ESP32C6をPCに接続する
Seeed Studio XIAO ESP32C6とPCをUSBケーブルで接続します。接続できているか確認します。
ls -l /dev/tty.usbmodem*
crw-rw-rw- 1 root wheel 0x9000004 9月 22 16:00 /dev/tty.usbmodem11101
- VSCodeで以前、作ったプロジェクトを選択する
VSCodeを起動して、以前、作ったプロジェクトを選択します。

- エディタで新しいファイルを作成する
左側のエクスプローラにて右クリックして、「新しいファイル」を選択します。ファイル名を入力する欄が表示されるので、適当に名前を入力します。今回は、「beacon.py」としました。

- 下記コードをエディターで記入する
「beacon.py」を選択すると、エディター画面が開くので、下記コードを記入して保存します。
import bluetooth
# BLEを初期化
ble = bluetooth.BLE()
ble.active(True)
print(ble.active())
- 「beacon.py」を実行する
左のエクスプローラにて、「beacon.py」を選択して、右クリックから、「Run current file on Pico」をクリックすると、REPL画面に下記のように、Trueが表示されれば、BLEが有効となります。
MicroPython v1.29.0 on 2026-08-24; Seeed XIAO ESP32C6 with ESP32-C6
Type "help()" for more information or .help for custom vREPL commands.
>>>
True
>>>
- XIAO ESP32C6から最初のBLE Advertisingを発信する
ここまでで、XIAO ESP32C6にMicroPythonを書き込み、BLEを有効にするところまで確認しました。
次は、XIAO ESP32C6から実際に**BLE Advertising(アドバタイジング)**を発信してみます。
今回の実験では、まずできるだけシンプルなAdvertisingを発信し、スマートフォンからXIAO ESP32C6を検出できることを確認します。
BLE Advertisingを発信する
MicroPythonでは、bluetoothモジュールを使用します。
まず、次のプログラムをXIAO ESP32C6で実行するため、さきほどの「beacon.py」を選択して、下記コードを記入して保存します。
import bluetooth
import time
# BLEを初期化
ble = bluetooth.BLE()
ble.active(True)
# デバイス名
name = "XIAO-ESP32C6"
# Advertisingデータ
adv_data = b"\x02\x01\x06"
# Complete Local Name
name_bytes = name.encode()
adv_data += bytes([len(name_bytes) + 1, 0x09])
adv_data += name_bytes
# BLE Advertisingを開始
ble.gap_advertise(
100000,
adv_data=adv_data
)
print("BLE Advertising started")
print("Device name:", name)
while True:
time.sleep(1)
- 「beacon.py」を実行する
左のエクスプローラにて、「beacon.py」を選択して、右クリックから、「Run current file on Pico」をクリックすると、REPL画面に下記のように、「BLE Advertising started」が表示されます。これでXIAO ESP32C6は、BLEのAdvertisingパケットを定期的に発信する状態になります。
MicroPython v1.29.0 on 2026-08-24; Seeed XIAO ESP32C6 with ESP32-C6
Type "help()" for more information or .help for custom vREPL commands.
>>>
BLE Advertising started
Device name: XIAO-ESP32C6
- プログラムを確認する
プログラムの内容を順番に見ていきます。
bluetoothモジュールをインポートする
import bluetooth
MicroPythonでBLEを利用するために、bluetoothモジュールをインポートします。
BLEを初期化する
ble = bluetooth.BLE()
ble.active(True)
bluetooth.BLE()でBLEオブジェクトを作成し、active(True)でBLEを有効にします。
これでXIAO ESP32C6からBLEを利用できる状態になります。
Advertisingデータを作る
今回のAdvertisingデータは、
adv_data = b"\x02\x01\x06"
02 01 06
│ │ │
│ │ └─ Flagsの値
│ └──── AD Type
└─────── Length
としています。
この3バイトは、BLE AdvertisingのFlagsを表しています。
デバイス名の部分
Advertisingデータの中にデバイス名を追加しています。
ポイントとなるのが、この部分です。
name_bytes = name.encode()
adv_data += bytes([len(name_bytes) + 1, 0x09])
adv_data += name_bytes
name.encode()によって、
XIAO-ESP32C6
という文字列をバイト列に変換しています。
そして、
0x09
は、BLE AdvertisingにおけるComplete Local Nameを示すAD Typeです。
そのため、Advertisingデータは概念的には、
Flags
+
Complete Local Name
+
XIAO-ESP32C6
という構造になります。
BLEのAdvertisingデータは、複数の「AD Structure」と呼ばれるデータのまとまりで構成されています。
Advertisingを開始する
Advertisingの開始には、
ble.gap_advertise(
100000,
adv_data=adv_data
)
を使用します。
ここで指定している100000は、Advertisingの間隔です。
単位は**マイクロ秒(μs)**なので、
100000 μs = 100 ms
となります。
つまり、約100ms間隔でAdvertisingを発信する設定です。
MicroPythonのgap_advertise()では、Advertising間隔をマイクロ秒で指定します。また、指定値はBLEの仕様に合わせて調整されます。
- スマートフォンで確認する
次に、スマートフォンでBLEスキャナアプリを起動します。今回は、「nRF Connect」を使います。
BLEをスキャンすると、下図のようにXIAO ESP32C6から発信されているAdvertisingを検出できるはずです。

これで、
XIAO ESP32C6
│
│ BLE Advertising
│
▼
スマートフォン
│
▼
BLEスキャナ
│
└── XIAO-ESP32C6
というBLEビーコンの基本的な仕組みを実際に確認できました。
- 今回の実験で分かったこと
今回の実験では、XIAO ESP32C6からBLE Advertisingを発信し、スマートフォンから検出できることを確認しました。
ポイントをまとめると、
bluetooth.BLE()でBLEを初期化するble.active(True)でBLEを有効にするgap_advertise()でAdvertisingを開始する- Advertisingには、Flagsやデバイス名などの情報を含めることができる
- Advertisingは、BLE接続を確立しなくても周囲へ情報を発信できる
ということが分かりました。
今回はまだ単純なデバイス名を発信しただけですが、Advertisingデータにはさまざまな情報を含めることができます。
次回は、このAdvertisingデータをもう少し詳しく調べてみます。続く
