Microchip RN487x Bluetoothモジュールをマスター:低消費電力ペリフェラル開発ガイド
Microchip RN487xファミリーのBluetoothモジュールを低消費電力ペリフェラルプロジェクト向けに設定する方法を学ぶ
コンパクトでエネルギー効率の良いデバイスを構築する場合、Bluetoothはほぼ常に通信手段の第一選択肢となります。長年にわたり標準は成熟し、今日では多くのペリフェラルのニーズを満たす、完璧なシステムオンチップ(SoC)を提供する多種多様な即戦力モジュールが利用可能です。代表的な例がNordicのnrf52840で、32ビットプロセッサ、マルチプロトコルBluetoothラジオ、GPIO、PWM、USB、SPI、I²Sなどの完全なI/Oインターフェースを搭載しています。
強力ですが、これらのSoCは手強い存在でもあります。組み込みファームウェアの統合に必要な学習曲線と開発時間は相当なものです。アナログまたはデジタルチャネルがわずかしかないリモートセンシングや制御といった一般的なユースケースでは、よりシンプルで焦点を絞ったソリューションが好ましいことが多々あります。
そこで登場するのがMicrochipのRN487xファミリーです。このファミリーの2モジュール(RN4870とRN4871)は、設計フットプリントとファームウェアの手間を最小限に抑えながら、複数の同時双方向デジタルおよびアナログチャネルを提供します。各モジュールはコンパクトな設定を不揮発性RAMに格納し、ペリフェラルの機能を要件に合わせてカスタマイズ可能です。重要なのは、Bluetooth Low Energy(BLE)標準に完全準拠しており、最新のスマートフォンや他のBLEクライアントとシームレスにペアリングできることです。
この3部構成のシリーズでは、典型的な4つのタスク(デジタルセンサー、デジタル制御、アナログセンサー、アナログ制御)に対応する完全に機能するBluetooth対応ペリフェラルの作成を解説します。各例にはリファレンス回路、正確なRN487x設定手順、Linuxホストからペリフェラルと対話する方法を示すシンプルなPythonスクリプトが含まれます。スクリプトは詳細に文書化されているため、ペリフェラルを大規模設計のサブシステムとして容易に組み込めます。
設計概要
以下は「アナログセンサー」例のグラフィカルな説明で、主要インターフェースを赤でハイライトしています。

Linuxシステムがペリフェラルと通信する様子の表現
この例では以下の3つのコアコンポーネントを構築します:
- センサー信号を提供するペリフェラルハードウェア。この場合、可変電圧を生成するアナログトランスデューサー。
- ユーザーにデータを提示するホストアプリケーション。今回はPythonスクリプト。
- 物理信号をホストが使用するGATTデータベースにマッピングするRN487x設定。
コンポーネント選択
RN487xファミリーにはRN4870とRN4871の2バリエーションがあります。主な違いはピン数と利用可能なI/Oタイプです。どちらのチップがプロジェクトに最適か判断するため、ピン予算表を再編成しました。
モジュールには3つのI/Oピンカテゴリがあります:
| タイプ | 説明 |
| ADC | アナログ入力:電圧を数値に変換 |
| PWM | アナログ出力:2つの数値で周波数とデューティサイクルを設定する方形波を生成 |
| DIO | デジタル入力または出力:ハイ/ローレベルでロジック1/0を表現 |
RN4870

RN487xデータシートより
| ピン名/機能 | P1_0 | P1_1 | P1_2 | P1_3 | P2_2 | P2_3 | P2_4 | P2_5 |
| ADC | x | x | x | x | ||||
| PWM | x | x | ||||||
| DIO | x | x | x | x | x |
RN4871

RN487xデータシートより
| ピン名/機能 | P1_2 | P1_3 |
| ADC | x | |
| PWM | ||
| DIO | x | x |
これらの表から、設計が単一のアナログ入力のみ必要でPWM出力が不要なら、RN4871が最もコンパクトな選択肢であることがわかります。複数の信号やPWMが必要なプロジェクトにはRN4870が適しています。アナログセンサーの例ではRN4871を使用し、センサーをピンP1_2に接続します。
BLEプロトコルスタックのGATT(Generic Attribute)プロファイル層
ホストアプリケーションを書く前に、ホストとペリフェラル間の通信を仲介するGATT APIを理解することが不可欠です。
すべてのBLEデバイスは、ペリフェラル(サーバー)がデータを格納するGATTデータベースを公開します。ホスト(クライアント)はGATT呼び出しを使って、ハンドルまたは名前で識別される値を読み書きします。典型的なPython GATT操作は以下のようになります:
gatt_rq.connect() # 特性ハンドルに値を書き込み gatt_rq.write_by_handle(vh_light, str(bytearray([8])))
最初の呼び出しで接続を確立し、2番目でデータを書き込むと、即座にペリフェラルの出力に反映されます。GATT APIはiOS、Android、Windows、Linuxでサポートされています。広範な互換性のため、例ではLinux上のPythonを使用します。
モジュール設定
物理信号をGATTデータベースに橋渡しするには、RN487xのNVRAMに2つの重要な設定ブロックをプログラミングする必要があります:
- 特性定義:データベーススペースを割り当て、各値に一意の識別子を割り当てます。
- ピンバインディング:物理I/Oピンをデータベース特性にマッピングし、自動データ変換を可能にします。
RN487xは設定用の軽量コマンド言語を使用します。コンソール接続の確立と設定コマンドの発行については付録を参照してください。プログラミング後、モジュールのNVRAMは以下のようになります:

すべての設定値は、サービスと特性の2階層階層内に存在します。これはマルチセンサーやマルチ制御設計へのスケーリング時に有用です。
以上で、3部構成のRN487xチュートリアルシリーズの第1部を終了します。第2部と第3部では、デジタル入力、デジタル制御、アナログセンサー、アナログ制御の実装を解説します。第4部では全例に適用可能な高度なトピックを議論します。
以下は、詳細なプロジェクトに入る前にモジュールを設定する方法をまとめた付録です。
コンソール接続を使用したRN487xの設定
モジュールに電源を供給し、ワークステーションとのシリアルリンクを確立します。各デモ回路には、RX、TX、GNDを露出させる3ピンの「prog」ジャンパーが含まれます。ガイダンスが必要な場合は、こちらの優れたガイドを参照してください。
ターミナルエミュレータを起動します。多くのPythonディストリビューションに同梱されているminitermユーティリティが適しています。シェルで以下のように起動:
python -m serial.tools.miniterm --eol LF /dev/ttyUSB0 115200
デフォルトボーレート115200はRN487xに適しています。
3つのドル記号("$$$")を入力してDATAモードからCOMMANDモードに切り替えます。文字は表示されませんが、プロンプトが以下に変わります:
CMD>
dを押してEnterを押すと、モジュールがステータスをエコーします:
CMD> BTA=D88039F80080 Name=RN_BLE Connected=no Authen=2 Features=0000 Services=00 CMD>
入力キーを表示したい場合は+とEnterを押してエコーを有効化:
CMD> ECHO ON CMD>
新しいGATTサービスの作成は、単一のPSコマンドを発行するだけで簡単です。例:
CMD> PS,59c88760536411e7b114b2f933d5fe66 AOK
プロジェクト設定には複数行のスクリプトも必要です。WWでスクリプトを開始し、各行を入力し、Escでコミット:
CMD> ww @CONN |O,08,72 AOK CMD>
モジュールの共通初期化
RN487xモジュールをプロジェクト間で再利用する場合、前回の設定が新しい用途に干渉する可能性があります。各例の前に以下のクリーンアップ手順を実行してください:
- 既存のスクリプトを消去
- スクリプト処理を有効化
- 既存のサービス/特性定義を消去
- 使用するピン(例:P1_2)から特殊機能を削除
- モジュールを再起動
以下のコマンドシーケンスを実行:
CMD> WC AOK CMD> SR,0040 AOK CMD> PZ AOK CMD> SW,0A,00 AOK CMD> R,1 Rebooting
Pythonサンプルスクリプト実行に必要なLinux環境設定
ハードウェア
ホストシステムにBLEハードウェア(Bluetooth 4.0以降)があることを確認してください。USBアダプターが必要な場合は、Qualcomm CSR8510ベースのものを推奨します。入手先は こちら。
ソフトウェア
サンプルスクリプトはDebian 10でテスト済みで、Ubuntuなどの他のDebian系ディストリビューションでも動作するはずです。デフォルトでインストールされていない2つのPythonパッケージが必要です:
python-bluez- Bluetoothスタックへのアクセスを提供gattlib- GATT操作のPythonバインディングを提供(pipでインストール)
gattlibのインストールではELFライブラリがビルドされるため、ビルドツールとライブラリが必要です。すべての依存関係をインストールするヘルパースクリプトが こちら にあります。ダウンロード後、実行権限を付けて実行してください。
参考資料
- RN487xデータシート
- RN487xユーザーガイド
- WindowsでのGATT API
- iOSでのGATT API
- PythonでのGATT API
次回以降のパートでは、デジタル入力とデジタル制御の完全な例を構築します。お楽しみに。
プロジェクト1と2へジャンプ:デジタル入力とデジタル制御の構築。
モノのインターネットテクノロジー
- ネイティブADCなしでRaspberry Pi上のアナログセンサーを測定
- Raspberry PiとZabbixでアナログセンサーを読み取り - ステップバイステップガイド
- Bluetooth Mesh設計の選択:モジュールかディスクリートデバイスか
- Contrinex 2020:クラウド対応センサ & Bluetoothライトカーテンで安全性向上
- ADLINK、NVIDIA EGXプラットフォームでエッジからクラウドへAIを展開:高速エッジ コンピューティング ソリューション
- セルラーIoTとBluetooth LEの融合:次世代接続への相乗的アプローチ
- 「信頼性のインターネット」におけるデータ活用:効果的管理のための戦略
- エッジからクラウドへ:IoTデータパイプラインのマスター
- 食品・飲料業界のデジタル化:安全性、トレーサビリティ、効率性の向上
- IoT World 2019から見るエッジコンピューティングとIoT戦略のインサイト
- 統合IIoTプラットフォームがデジタル製造成功をどう推進するか