nRF52840でBLEのセントラルデバイスを実装する組み込みエンジニアコピー2023.05.03本記事はプロモーションが含まれています。こんにちは、ENGかぴです。Energy)を搭載しており、ArduinoBLEライブラリでBLE通信ができます。BLEのセントラルデバイスを実装しペリフェラルデバイスと双方向通信を行う方法をまとめました。nRF52840の2台使用します。1台目をペリフェラルデバイス(以下nRF52840(P)とする)とし、2台目をセントラルデバイス(以下nRF52840(C)とする)として使用します。ペリフェラルデバイスは下記記事のソースコードを使用しています。SAMD21)で動作確認したことについてリンクをまとめています。IDEのインストールが必要です。IDEでインストールできるようになります。XAIOの開発環境の作り方を説明しています。nRF52840の開発環境を作るBLEを使用するにあたって追加するボードの選択について説明します。Boardsをインストールします。IDEのツールからボードマネージャーを選択するとボードの検索画面に遷移します。Boardsが候補として表示されます。(URLを追加していないと表示されません)このボードマネージャをインストールします。インストール後はボードの選択を行います。Boardsをインストールする必要があります。広告ArduinoBLEライブラリを実装するBLE通信の大きな概念としてセントラルデバイスとペリフェラルデバイスの定義があります。セントラルデバイスはパソコンに加えてスマホやタブレットなどの高い処理とメモリを備えたデバイスです。Charge4(私が愛用しているスマートウォッチ)などです。IoT機器の多くがペリフェラルデバイスに分類されます。セントラルデバイスとペリフェラルデバイスのイメージイメージ図のようにセントラルデバイスはnRF52840(C)を使用します。ペリフェラルデバイスはnRF52840(P)を使用します。nRF52840(C)はnRF52840(P)のアドバタイジングパケットを確認して接続要求を行います。接続が成功すると1対1の双方向通信を行います。ペリフェラルデバイスはサービスとキャラクタリスティックを構成するサーバーとして動作します。セントラルデバイスはサーバーに接続要求を送信するクライアントとして動作します。サーバーはアドバタイジングパケットでデバイスの存在を通知してクライアントからの接続要求を待ちます。クライアントから接続要求によってトランザクション(データの送受信)を開始します。トランザクションはプロフィール、サービス、キャラクタリスティックによって構成されています。プロフィールはサービスの組み合わせたものです。サービスはデータの種別を区別するために使用され、1つ以上のキャラクタリスティックを持つことができます。サービスはUUIDで他のサービスと区別されます。16ビットUUIDはBlutooth認証したサービスに使用しますが、それ以外の任意のサービスは128ビットUUIDを使用します。キャラクタリスティックについても同様です。キャラクタリスティックはデータの読み書きに使用します。送受信するデータの種別(整数、テキスト形式)に応じて使い分けます。セントラルデバイスからペリフェラルデバイスにデータを読み書きする場合はキャラクタリスティックのUUIDが一致する必要があります。スポンサーリンクペリフェラルデバイスと共通の設定ペリフェラルデバイスが生成しているサービスとキャラクタリスティックについて下記記事からセントラルデバイスで使用する分を抜粋して説明します。詳細は下記記事を参考にしてください。nRF52840でBLEのサービスを生成するペリフェラルデバイスではキャラクタリスティックのUUIDを下記のように指定しています。UUIDは”19740bd~ee27′′の値です。//サービスの名前ペリフェラルデバイスでキャラクタリスティックをBLEByteCharacteristicクラスの変数としてswitchCharacteristic()をインスタンス化しています。第1引数のUUIDはセントラルデバイスにおいて同じUUIDを指定して書き込み操作を行います。第2引数では操作の種別を指定していますが、Read/Writeを指定しています。アドバタイジングパケットで表示するサービス名を「LED3Control」としています。セントラルデバイスではスキャン後、対象のデバイスであるかの判断として「LED3Control」のローカル名を使用します。広告セントラルデバイスを実装するセントラルデバイスはクライアントとして動作し、ペリフェラルデバイスを確認すると接続要求を行います。スキャンからキャラクタリスティックを使ったデータの書き込みまでの動作を説明します。//ペリフェラルデバイスのスキャン開始}BLEを使用するためにArduinoBLEライブラリをインクルードします。BLEのbegin()関数で初期化を行います。begin()関数による処理が正常であれば0が戻り値になるので下記のスキャンに移ります。例ではBLEの初期化に失敗した場合無限ループとしています。BLEのscan()関数でペリフェラルデバイスのスキャンを開始します。次にペリフェラルデバイスが確認できた場合の処理を追加します。}}ペリフェラルデバイスの存在を確認するためBLEDeviceクラスのperipheralをインスタンス化して使用します。BLEのavailable()関数でペリフェラルデバイスを確認します。ペリフェラルデバイスが確認できた場合はペリフェラルデバイスのペリフェラルデバイスのローカル名を確認します。ローカル名が「LED3Control」であればnRF52840(P)なので接続要求します。接続開始すると1対1の双方向通信になるため、BLEのstopScan()関数でスキャンを停止します。peripheralのconnect()関数でペリフェラルデバイスに接続します。接続が失敗した場合は再度スキャンを開始してペリフェラルデバイスの確認に戻ります。接続が成功した場合はnRF52840(P)(サーバー)に属性(Attribute)が存在しているかを確認します。BLEの概念ではサーバーが管理している属性にクライアントがアクセスします。属性の確認はATTプロトコルで行われます。Profile)と呼ばれるデータベースを使用して1対1の双方向通信を行います。属性(Attribute)が存在なければGATTによる双方向通信ができないため、属性が存在しない場合はdisconnect()関数で接続を切断します。サーバーにアクセスするキャラクタリスティックをcharacteristic()関数で指定します。引数にキャラクタリスティックのUUIDを指定します。UUIDはペリフェラルデバイスのキャラクタリスティックと同じUUIDを指定する必要があります。キャラクタリスティックが存在しないか、キャラクタリスティックが書き込み許可の属性(共通の設定のBLEWrite相当)を持っていない場合はdisconnet()で接続を切断します。BLE.scan();}connected()関数で接続状態を確認し、接続中であればキャラクタリスティックにデータを書き込みます。ペリフェラルデバイスと共通のUUIDを持つswichCharacteristicにおいてwriteValue()関数でデータを指定します。引数に書き込むデータをbyte型で指定します。複数バイト書き込む場合は第2引数に書き込むバイト数を指定します。connected()関数の結果がfalseの場合、接続が切断しているのでBLEのscan()関数でペリフェラルデバイスの確認を再開します。回路図nRF52840(C)のDIに接続したSW1で更新したカウント値をnRF52840(P)にBLE通信し、nRF52840(P)の3色LEDを操作します。USBを接続するとnRF52840(C)とnRF52840(P)が動作を開始します。nRF52840(C)はシリアルモニターで動作の確認を行います。nRF52840(C)がnRF52840(P)に接続するまではスマホで「LED3Control」が確認できますが、接続が成功すると「LED3Control」は表示されなくなります。接続中にSW1を押すとカウント(0~7)を更新してnRF52840(C)からnRF52840(P)に対してキャラクタリスティックにカウント値を書き込みnRF52840(P)の3色LEDを操作します。nRF52840(C)のシリアルモニターの結果nRF52840(C)のシリアルモニターを確認すると、SW1を押したタイミングでカウント値が更新されて3色LEDの点灯パターンが切り替わることが確認できました。nRF52840(P)の3色LEDをnRF52840(C)で操作した結果カウント値が0の場合はLEDが消灯、1は赤色で点灯、2では緑色、3では黄色、4では青色、5では紫色、6では水色、7では薄紫(白に近い)色の8パターンが確認できました。以下のソースコードはコンパイルして動作確認をしております。コメントなど細かな部分で間違っていたりやライブラリの更新などにより動作しなくなったりする可能性があります。参考としてお使いいただければと思います。}}ペリフェラルデバイス(nRF52840(P))は下記記事のソースコードを書き込む必要があります。nRF52840でBLEのサービスを生成する関連リンクArduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。最後まで、読んでいただきありがとうございました。組み込みエンジニア【オペアンプ】2次のローパスフィルタとパッシブフィルタの特性比較オペアンプを使用したフィルタはアクティブフィルタと呼ばれその中でも2次のローパスフィルタはカットオフ周波数の調整が簡単でよく使用されます。2次のローパスフィルタの特徴やオペアンプを使用しないパッシブフィルタとの特性の違いを説明しています。抵抗をたくさん使います。抵抗の使い方を間違えてしまうと消費電力が大きくなってしまい故障の原因になってしまいます。XIAOとGPSモジュールで時刻を表示するGPSモジュールは現在地の情報や時刻情報などを衛星からの電波を受信してユーザーに通知するモジュールです。XIAOを使ってGPSモジュールから時刻と位置情報を取得してLCDに表示して動作確認したことをまとめています。Arduinoは初心者のためのスターターキットです。照度センサーなど複数のセンサーが実装されておりArduinoライブラリの使い方やC言語(C++)の学習ができます。XIAO31ESP32-WROOM-32E37TWELITE(トワイライト)26PIC16F182731PIC12F67522ノウハウ(体験談)36趣味と生活29その他6タグオペアンププロフィールENGかぴ当ブログの運営者のENGカピです。組み込みエンジニアとして10年以上の経験を活かしてセンサーモジュール等の動作確認したことをまとめています。広告、アフィリエイト収益で当ブログを運営させていただいております。defined.")}))})()タイトルとURLをコピーしました。