Raspberry Pi Pico WのBluetoothのすべて

PiCockpit Pico W Bluetooth タイトル画像

ラズベリーパイ財団はこのほど、次のように発表した。 C/C++ SDKバージョン1.5.1のリリースによるBluetoothのサポート C/C++ SDKとPico W上のMicropythonの新しいリリースとともに。

そして、どうだろう!ピコWをお持ちなら、新たに購入する必要はない。

ピコWをまだお持ちでない方は、購入することができます。 これ.

私たちはすでに、この記事を取り上げている。 ピコWについて知っておくべきすべてのこと.さらに、もしあなたがピコWの初心者なら、次のことができる。 この記事をチェックする.

しかし、ここでは、あなたが知っておく必要があるすべてのことをカバーしています。 ブルートゥース をRaspberry Pi Pico Wにインストールした。

ピコWの背景

まず、ピコWのスペックについて説明しよう。

Pico Wは、CYW43439ワイヤレスチップによりワイヤレス機能を備えている。

各Pico Wの心臓部には、ラズベリー・パイ初のシリコンチップであるRP2040が搭載されている。

インフィニオンのCYW43439は、IEEE 802.11 b/g/n WLAN(Wi-Fi)とBluetooth 5.2をサポートしている。発売当初は、Wi-Fiのみがファームウェアとソフトウェアでサポートされていた。

CYW43439はBLEをサポートし、Wi-FiとBluetoothを共有する単一のアンテナを備えている。

Raspberry PiとPico Wアンテナ

Pico Wをよく見ると、Raspberry Pi 4と同じような三角形のPCBアンテナがあることに気がつきます。Raspberry Piは、ABRACON社からライセンスを受けたオンボードアンテナを使用しています。

つまり、追加のアンテナは必要ありません。無線インターフェースは、SPIを介してRP2040に接続されています。

のです。 公式データシート また、最高のワイヤレス性能を得るためには、アンテナの下や近くに金属を置くべきでないことも示唆しています。しかし、アンテナの側面に接地した金属を追加すると、アンテナの帯域幅を改善することができます。

オンボードのLEDは,Infineon 43439チップのWL_GPIO0ピンを介して制御されます。Picoでは、LEDはGPIOピン25に接続されていました。

さらに、SWDデバッグピンは、PCBアンテナ用のスペースを確保するために、ボードの中央に向かって移動しました。RP2040とCYW43439の間にあり、左からSWCLK、GND、SWDIOの順番で並んでいるのが見えます。

Pico Wでは、C/C++とMicroPythonでプログラミングできる。

ブルートゥース・クラシック&BLE

Pico WはBluetooth ClassicとBluetooth Low Energyの両方で動作します。Bluetooth ClassicとBluetooth Low Energy(BLE)は、Bluetooth仕様の中でデバイスが通信するための2つの異なる方法です。

Bluetooth Classicは、Bluetooth Basic Rate/Enhanced Data Rate(BR/EDR)としても知られ、Bluetoothのオリジナルバージョンである。高速データ転送、オーディオストリーミング、デバイスのペアリング用に設計された。Bluetooth Classicは一般的に、ワイヤレス・オーディオ・スピーカー、キーボード、マウス、デバイス間のファイル転送などの用途に使用されています。

Bluetooth Smartとしても知られるBluetooth Low Energy(BLE)は、Bluetoothの電力効率に優れた亜種である。BLEはBluetooth 4.0仕様の一部として導入され、フィットネストラッカー、スマートウォッチ、ホームオートメーションデバイス、ワイヤレスセンサーなど、長いバッテリー寿命を必要とする低消費電力デバイス向けに最適化されている。

Pico Wは中央装置としても周辺装置としても機能する。

Pico WでBluetoothを始める

さっそく、Bluetoothが正しく動作することを確認するための簡単なプロジェクトを始めましょう。

Pico WのオンボードLEDを点灯させる古典的なプログラムを、Bluetoothを使って実行する。

これには、ピコW、マイクロUSBケーブル、ブレッドボードが必要だ。

ピコW

ステップ・ワン

まず最初に必要なのは、以下をダウンロードすることだ。 ソンニーIDEもしまだ持っていないなら。

ThonnyはPico WにMicroPythonをプログラムする超簡単な方法だ。

をダウンロードする必要がある。 このUF2ファイルこれはWi-FiとBLEの両方をサポートしている。ダウンロードが完了したら、Pico WのBOOTSELボタンを押したまま、USBでコンピューターに接続します。約3秒後にBOOTSELボタンを離す。

RPI-RP2」というリモートドライブが表示されます。UF2ファイルをこのドライブに移動します。

するとドライブは消える。

ステップ2

これで、Pico Wの接続を解除し、再接続することができます(このとき、BOOTSELボタンは押したままにしないでください)。

トニーを開けろ。

イメージ:Pico W Bluetooth the Thonny IDE
テーマとフォントを変更して、目を保護しよう!

Thonnyを開いたら、Tools > Options > Interpreterと進み、インタプリタがMicropythonに、PortがPico Wに設定されていることを確認する:

あなたのピコWは別の名前で表示されるかもしれない。

OKをクリックすれば準備完了です。

次のコードをコピーして、セクションに貼り付ける:

from micropython import const
import struct
import bluetooth

_ADV_TYPE_FLAGS = const(0x01)
_ADV_TYPE_NAME = const(0x09)
_ADV_TYPE_UUID16_COMPLETE = const(0x3)
_ADV_TYPE_UUID32_COMPLETE = const(0x5)
_ADV_TYPE_UUID128_COMPLETE = const(0x7)
_ADV_TYPE_UUID16_MORE = const(0x2)
_ADV_TYPE_UUID32_MORE = const(0x4)
_ADV_TYPE_UUID128_MORE = const(0x6)
_ADV_TYPE_APPEARANCE = const(0x19)

def advertising_payload(limited_disc=False, br_edr=False, name=None, services=None, appearance=0):
    payload = bytearray()

    def _append(adv_type, value):
        nonlocal payload
        payload += struct.pack("BB", len(value) + 1, adv_type) + value

    _append(
        _ADV_TYPE_FLAGS,
        struct.pack("B", (0x01 if limited_disc else 0x02) + (0x18 if br_edr else 0x04)),
    )

    if name:
        _append(_ADV_TYPE_NAME, name)

    if services:
        for uuid in services:
            b = bytes(uuid)
            if len(b) == 2:
                _append(_ADV_TYPE_UUID16_COMPLETE, b)
            elif len(b) == 4:
                _append(_ADV_TYPE_UUID32_COMPLETE, b)
            elif len(b) == 16:
                _append(_ADV_TYPE_UUID128_COMPLETE, b)

    if appearance:
        _append(_ADV_TYPE_APPEARANCE, struct.pack("<h", appearance))

    return payload


def decode_field(payload, adv_type):
    i = 0
    result = []
    while i + 1 < len(payload):
        if payload[i + 1] == adv_type:
            result.append(payload[i + 2 : i + payload[i] + 1])
        i += 1 + payload[i]
    return result


def decode_name(payload):
    n = decode_field(payload, _ADV_TYPE_NAME)
    return str(n[0], "utf-8") if n else ""


def decode_services(payload):
    services = []
    for u in decode_field(payload, _ADV_TYPE_UUID16_COMPLETE):
        services.append(bluetooth.UUID(struct.unpack("<h", u)[0]))
    for u in decode_field(payload, _ADV_TYPE_UUID32_COMPLETE):
        services.append(bluetooth.UUID(struct.unpack("<d", u)[0]))
    for u in decode_field(payload, _ADV_TYPE_UUID128_COMPLETE):
        services.append(bluetooth.UUID(u))
    return services


def demo():
    payload = advertising_payload(
        name="micropython",
        services=[bluetooth.UUID(0x181A), bluetooth.UUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")],
    )
    print(payload)
    print(decode_name(payload))
    print(decode_services(payload))


if __name__ == "__main__":
    demo()

そのファイルを "ble_advertising.py "としてRaspberry Pi Pico Wに保存します。このファイルはPico Wが他のデバイスを読んだり、読まれたりできるようにするためのものです。

次に、Thonnyで新規ファイルを開き、以下のコードを貼り付ける:

# PiCockpit.com

import bluetooth
import random
import struct
import time
from machine import Pin
from ble_advertising import advertising_payload

from micropython import const

_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)

_FLAG_READ = const(0x0002)
_FLAG_WRITE_NO_RESPONSE = const(0x0004)
_FLAG_WRITE = const(0x0008)
_FLAG_NOTIFY = const(0x0010)

_UART_UUID = bluetooth.UUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")
_UART_TX = (
    bluetooth.UUID("6E400003-B5A3-F393-E0A9-E50E24DCCA9E"),
    _FLAG_READ | _FLAG_NOTIFY,
)
_UART_RX = (
    bluetooth.UUID("6E400002-B5A3-F393-E0A9-E50E24DCCA9E"),
    _FLAG_WRITE | _FLAG_WRITE_NO_RESPONSE,
)
_UART_SERVICE = (
    _UART_UUID,
    (_UART_TX, _UART_RX),
)


class BLESimplePeripheral:
    def __init__(self, ble, name="mpy-uart"):
        self._ble = ble
        self._ble.active(True)
        self._ble.irq(self._irq)
        ((self._handle_tx, self._handle_rx),) = self._ble.gatts_register_services((_UART_SERVICE,))
        self._connections = set()
        self._write_callback = None
        self._payload = advertising_payload(name=name, services=[_UART_UUID])
        self._advertise()

    def _irq(self, event, data):
        if event == _IRQ_CENTRAL_CONNECT:
            conn_handle, _, _ = data
            print("New connection", conn_handle)
            self._connections.add(conn_handle)
        elif event == _IRQ_CENTRAL_DISCONNECT:
            conn_handle, _, _ = data
            print("Disconnected", conn_handle)
            self._connections.remove(conn_handle)
            self._advertise()
        elif event == _IRQ_GATTS_WRITE:
            conn_handle, value_handle = data
            value = self._ble.gatts_read(value_handle)
            if value_handle == self._handle_rx and self._write_callback:
                self._write_callback(value)

    def send(self, data):
        for conn_handle in self._connections:
            self._ble.gatts_notify(conn_handle, self._handle_tx, data)

    def is_connected(self):
        return len(self._connections) > 0

    def _advertise(self, interval_us=500000):
        print("Starting advertising")
        self._ble.gap_advertise(interval_us, adv_data=self._payload)

    def on_write(self, callback):
        self._write_callback = callback


def demo():
    led_onboard = Pin("LED", Pin.OUT)
    ble = bluetooth.BLE()
    p = BLESimplePeripheral(ble)

    def on_rx(v):
        print("RX", v)

    p.on_write(on_rx)

    i = 0
    while True:
        if p.is_connected():
            led_onboard.on()
            for _ in range(3):
                data = str(i) + "_"
                print("TX", data)
                p.send(data)
                i += 1
        time.sleep_ms(100)


if __name__ == "__main__":
    demo()

前回と同じように、ファイルをPico Wに保存し、今回は "led_peripheral.py "とします。advertisingファイルがPico Wと他のデバイスとの通信を可能にするのに対して、peripheralファイルはPico Wと他のデバイスとの通信を可能にします。 機能 を周辺機器として使用する。この場合、その機能はLEDを点灯させることである。

ここで、Thonnyツールバーの「現在のスクリプトを実行」を押す。

イメージ:Pico W Bluetooth the Thonny IDE

写真のように、コンソールに "Starting advertising "と出力されます。この時点で、携帯電話などのBluetoothデバイスと接続することができます。mpy-uart "を探してペアリングしてください。

アンドロイド携帯のブルートゥース接続イメージ

2つをペアリングすると、Pico WのLEDが点灯し、Thonnyコンソールが2つの長さをカウントし始める:

イメージ:Pico W Bluetooth the Thonny IDE

おめでとうございます!これでPico WのBluetoothが動作していることが確認できたので、次のプロジェクトに集中することができます!

Pico W Bluetooth プロジェクト

次のPico Wプロジェクトを始める際には、他の人が行ったプロジェクトを参考にしてください。Pico WはBluetoothの公式サポートを受けたばかりなので、新しいプロジェクトはまだ始まったばかりです。

以下は、これまでに登場したプロジェクトの(増えつつある)リストである:

  1. ピコWブルートゥース リモコン
  2. ピコWブルートゥース ロボット
  3. ピコWブルートゥース マウス
  4. ピコWブルートゥース ライト
  5. Pico W USB Bluetooth オーディオ・アダプター
  6. ピコWブルートゥース PicoDRO(デジタル表示)

よくある質問

Pico WでBluetooth Classicは使えますか?

もちろん、Pico WはBluetooth ClassicとBLEをサポートしている!

Pico Wに複数の機器を同時に接続できますか?

はい、Pico Wはセンターデバイスとして機能し、複数のBluetooth周辺機器に同時に接続できます。また、Bluetooth ClassicとBLEを同時に使用することもできます。そのため、Pico Wが多数のセンサーと通信したり、複数のデバイスを同時に制御したりする超複雑なシステムを構築できます。

Pico WのBluetooth範囲は?

通常、開けた場所では最大30メートル(98フィート)。ただし、障害物、干渉、信号強度などの環境要因によって範囲は異なる場合があります。

Pico WをBluetooth周辺機器として使用できますか?

Pico Wは中央デバイスとしても周辺デバイスとしても機能する。そのため、他のブルートゥース中心機器(スマートフォン、タブレット、コンピューターなど)を接続することができる。これらはすべて PiCockpitところで!

Pico WでBluetooth機能をプログラムするには?

Raspberry Pi Pico SDKバージョン1.5.1を使用して、Pico WのBluetooth機能をプログラムすることができます。SDKはBluetooth開発専用のライブラリとサンプルを提供します。Bluetoothのサービスや特性を実装し、通信プロトコルを扱うことができます。

Pico WのBluetoothに必要な電力は?

Bluetoothは電力効率に優れた設計になっています。そのため、Pico Wはアイドル時の消費電力を最小限に抑え、スリープモードや低電力状態などのテクニックを使用することで、コードをさらに最適化することができます。具体的な電力要件は、明らかにアプリケーションと使用シナリオによって異なります。

11コメント

  1. Marcos Gutierrez on 8月 4, 2023 at 1:13 am となります。

    Hola puedo adaptar la pico w a scoppy osciloscopy.agrdeceria su respuesta y como lo haria

  2. Electronikmx on 8月 17, 2023 at 12:16 am となります。

    数秒後、デバイスはエラーを表示し、接続を解除します。

    • Adam on 8月 17, 2023 at 6:51 am となります。

      いつですか?

      • Electronikmx on 8月 17, 2023 at 4:19 pm となります。

        コメントしたように、携帯電話でブルートゥース経由の接続を要求して "接続 "した瞬間に、RPI pico Wは "TX 1_, TX 2_ ... "という文字列でプログラム固有の番号を送信します。しかし、数秒後、携帯電話やタブレット(3つのデバイスを使用した場合)は、接続時にエラーが発生したと表示され、携帯電話のブルートゥース接続が解除され、"Disconected 64 "というメッセージが表示され、その下に新たに "Starting advertising "と表示され、新たに接続する必要があります。

        • Javier on 10月 5, 2023 at 11:08 pm となります。

          私も同じだ

  3. Alex on 10月 2, 2023 at 8:00 am となります。

    pi pico Wでブルートゥース接続と同時に無線LAN接続を開くことはできますか?できなければ、リアルタイムで切り替えられますか?

  4. Javier on 10月 5, 2023 at 11:10 pm となります。

    私も同じだ......いろいろなデバイスやアプリケーションで試してみたが、機能しなかった。機能しませんでした。

  5. Peter on 11月 12, 2023 at 11:33 am となります。

    kitronik mini Picoコントローラをkitronik Picoロボットボードとペアリングし、制御するためのセットアップ方法は?

  6. Brian on 11月 27, 2023 at 12:27 am となります。

    こんにちは。あなたの指示に従いましたが、iPhoneのBluetoothでmpy-uartが見つかりません。

    ピコWをUSBでコンピューターに接続している。
    UF2をフラッシュした
    あなたのコードをコピーし、Thonnyを通してピコWに名前を付けて保存した。
    私はThonnyを動かしていて、右下にはMicroPython (Raspberry Pi Pico)というファクトリーがあります。
    led_peripheral.pyを実行します。
    シェルは "Starting advertising" と出力する。
    iPhoneでは見ることができない

    何かお考えは?

    貢献してくれてありがとう。

    • Anant on 3月 19, 2024 at 2:31 pm となります。

      同じ問題に直面している。解決できた?

  7. Paul B. on 2月 22, 2024 at 3:04 pm となります。

    携帯電話とのBTリンクではなく、Bluetoothで座標を送信するArduino GPSモジュールを持っているのですが、Pico Wとペアリングしてその信号を読み取る方法はありますか?

コメントを残す