注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Communityへようこそ!仲間たちと一緒にRaspberry Pi、Arduino、ESP32についてさらに深く学びましょう。
参加する理由は?
専門家のサポート: コミュニティやチームの助けを借りて、購入後の問題や技術的な課題を解決できます。
学びと共有: ヒントやチュートリアルを交換し、スキルを向上させましょう。
限定プレビュー: 新製品の発表や先行情報をいち早く手に入れましょう。
特別割引: 最新製品の特別割引をお楽しみください。
イベント・プレゼント: プレゼント企画や祝日セールに参加しましょう。
👉 一緒に探求し、創造を楽しみませんか?[ここ]をクリックして、今すぐ参加しましょう!
8.15 Bluetooth音声制御リレー
このプロジェクトでは、Raspberry Pi Pico 2 Wを使ってリレーを制御する方法を示します。Pico WはBluetooth Low Energy (BLE)を介してスマートフォンなどのBLE対応デバイスからコマンドを受信し、「1」信号を受け取るとリレーをオンに、「0」信号を受け取るとリレーをオフに切り替えます。
Raspberry Pi Pico 2 WでのBLE通信やIoTアプリケーションを探求したい方に最適なプロジェクトです。
1. 回路を作成する
必要なコンポーネント
このプロジェクトでは、以下のコンポーネントが必要です。
キット一式を購入するのが便利です。こちらのリンクから購入できます:
名前 |
このキットに含まれるアイテム |
リンク |
|---|---|---|
Pico 2 W スターターキット |
450以上 |
以下のリンクから個別に購入することもできます。
SN |
コンポーネント |
数量 |
リンク |
|---|---|---|---|
1 |
1 |
||
2 |
Micro USBケーブル |
1 |
|
3 |
1 |
||
4 |
複数 |
||
5 |
1(S8050) |
||
6 |
1 |
||
7 |
1(1KΩ) 1(220Ω) |
||
8 |
1 |
||
9 |
1 |
||
10 |
18650バッテリー |
1 |
警告
ここではリレーを使ってLEDを制御する例を紹介していますが、実際のアプリケーションでリレーを高電圧のAC電源に接続する場合は十分注意してください。誤った使用は重大な怪我や死亡事故につながる可能性があります。安全を最優先してください。
1. Androidアプリを作成する
MIT App Inventor という無料のウェブアプリケーションを使ってAndroidアプリを開発します。ドラッグアンドドロップ操作で簡単に機能的なアプリを作成でき、Android開発初心者に適しています。
次の手順に従ってください:
Get Started with MIT App Inventor へアクセスし、"online tool"をクリックしてログインします。Googleアカウントを使ってMIT App Inventorに登録する必要があります。
ログイン後、 Projects -> Import project (.aia) from my computer を選択し、
pico-2w-kit/micropython/iot/8.15-ble_relayにあるble_relay_picow.aiaファイルをアップロードします。または、こちらから直接ファイルをダウンロードできます:
ble_relay_picow.aia
アップロードが完了すると、MIT App Inventorのインターフェイスにプリセットされたアプリのテンプレートが表示されます。プラットフォームに慣れてから、自由にカスタマイズ可能です。
MIT App Inventorには、 Designer と Blocks という2つの主要セクションがあります。ページ右上のタブから切り替えることができます。
Designer では、ボタンやテキスト、画面、デザインなどを追加・調整し、アプリの外観を整えることができます。
Blocks セクションでは、アプリの各コンポーネントに対して動作を指定するブロックを組み合わせて、機能を実装します。
スマートフォンにアプリをインストールする場合、 Build タブに移動してください。
.apkファイルを生成します。選択後、.apkファイルのダウンロードまたはQRコードスキャンのいずれかを選べます。ガイドに従ってアプリをインストールしてください。または、事前コンパイル済みのAPKファイルを以下からダウンロードできます:
ble_relay_picow.apkGoogle Playなどへの公開を希望する場合は
.aabファイルを生成できます。
3. コードを実行する
pico-2w-kit/micropython/iot/8.15-ble_relay のパスにある 8.15-ble_relay.py ファイルを開くか、以下のコードをIDEにコピーしてください。
注釈
このコードは ble_advertising.py ファイルに依存しています。実行前にPicoボードにアップロードしておいてください。
import bluetooth
import random
import struct
import time
from ble_example.ble_advertising import advertising_payload
from machine import Pin
import time
from micropython import const
relay = machine.Pin(15, machine.Pin.OUT)
_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)
_RELAY_UUID = bluetooth.UUID("46719f98-3141-4bbb-aede-47a7630d024b")
_SWITCH_CHAR = (
bluetooth.UUID("08b82cd0-6877-4308-b08d-a32520c327a2"),
_FLAG_READ | _FLAG_WRITE | _FLAG_WRITE_NO_RESPONSE,
)
_RELAY_SERVICE = (
_RELAY_UUID,
(_SWITCH_CHAR,),
)
class BLERelay:
def __init__(self, ble, name="ble-relay"):
self._ble = ble
self._ble.active(True)
self._ble.irq(self._irq)
handles = self._ble.gatts_register_services((_RELAY_SERVICE,))
# print("Registered handles:", handles)
((self._handle_note,),) = handles
self._connections = set()
self._write_callback = None
self._payload = advertising_payload(name=name, services=[_RELAY_UUID])
self._advertise()
def _irq(self, event, data):
# Track connections so we can send notifications.
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)
# Start advertising again to allow a new connection.
self._advertise()
elif event == _IRQ_GATTS_WRITE:
conn_handle, value_handle = data
value = self._ble.gatts_read(value_handle)
# print("Write event: conn_handle={}, value_handle={}, value={}".format(conn_handle, value_handle, value))
if value_handle == self._handle_note and self._write_callback:
self._write_callback(value)
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 relay_update(data):
print("Receive:", data)
decoded_data = int(data.decode('utf-8').rstrip('\x00'))
# print(decoded_data)
relay.value(decoded_data)
def demo():
ble = bluetooth.BLE()
relay = BLERelay(ble,"pico2w")
while True:
if relay.is_connected():
relay.on_write(relay_update)
# time.sleep_ms(100)
if __name__ == "__main__":
demo()
4. アプリとBluetoothの接続
先ほど作成した「Voice-Controlled Relay BLE」アプリをスマートフォンにインストールしておきましょう。
スマートフォンのBluetoothを有効にします。
Voice-Controlled Relay BLE アプリを開きます。
初回起動時には2つの連続するダイアログが表示され、権限を求められます。これらの権限はBluetooth機能を使用するために必要です。
アプリ内で Connect をタップし、Pico 2 WとBluetoothで接続します。
この画面には、すべてのBluetoothデバイスが一覧表示されます。
xx.xx.xx.xx.xx.xx pico2wといった名前のデバイスを選択します。各デバイス名にはMACアドレスが付属しています。
デバイスが表示されない場合は、スマートフォンの位置情報を有効にしてみてください。(一部のAndroidバージョンでは、位置情報設定とBluetooth機能が連動しています。)
接続が完了するとメイン画面に戻ります。マイクアイコンをタップすると音声コマンドでリレーを操作できます。音声コマンド内に「on」が含まれているとリレーはオン、「off」が含まれているとリレーはオフになります。