Seeed Studio XIAO ESP32C6 でBLEビーコンを試してみる(2)

この記事では、Seeed Studio XIAO ESP32C6を使って、MicroPythonからBluetooth Low Energy(BLE)のアドバタイズを発信し、スマートフォンからビーコンを検出してみます。

この記事で学べること

  • BLEを有効にする
  • デバイス名を発信する
  • スマホで検出する

ステップごとの解説

  1. 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
  1. VSCodeで以前、作ったプロジェクトを選択する
    VSCodeを起動して、以前、作ったプロジェクトを選択します。
  1. エディタで新しいファイルを作成する
    左側のエクスプローラにて右クリックして、「新しいファイル」を選択します。ファイル名を入力する欄が表示されるので、適当に名前を入力します。今回は、「beacon.py」としました。
  1. 下記コードをエディターで記入する
    「beacon.py」を選択すると、エディター画面が開くので、下記コードを記入して保存します。
import bluetooth

# BLEを初期化
ble = bluetooth.BLE()
ble.active(True)

print(ble.active())
  1. 「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

>>> 
  1. 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)
  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

  1. プログラムを確認する
    プログラムの内容を順番に見ていきます。
    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の仕様に合わせて調整されます。

  1. スマートフォンで確認する
    次に、スマートフォンでBLEスキャナアプリを起動します。今回は、「nRF Connect」を使います。
    BLEをスキャンすると、下図のようにXIAO ESP32C6から発信されているAdvertisingを検出できるはずです。

これで、

XIAO ESP32C6
      │
      │ BLE Advertising
      │
      ▼
スマートフォン
      │
      ▼
BLEスキャナ
      │
      └── XIAO-ESP32C6

というBLEビーコンの基本的な仕組みを実際に確認できました。

  1. 今回の実験で分かったこと
    今回の実験では、XIAO ESP32C6からBLE Advertisingを発信し、スマートフォンから検出できることを確認しました。
    ポイントをまとめると、
  • bluetooth.BLE()でBLEを初期化する
  • ble.active(True)でBLEを有効にする
  • gap_advertise()でAdvertisingを開始する
  • Advertisingには、Flagsやデバイス名などの情報を含めることができる
  • Advertisingは、BLE接続を確立しなくても周囲へ情報を発信できる

ということが分かりました。
今回はまだ単純なデバイス名を発信しただけですが、Advertisingデータにはさまざまな情報を含めることができます。
次回は、このAdvertisingデータをもう少し詳しく調べてみます。続く

類似投稿