- nRF52開発キット:
- Segger Embedded Studio
- nRF52DKを使用したDHT11
- Bluetooth Low Energy(BLE)の操作方法は?
- BLEサービス/特性図
- nRF52BLEプログラムの説明
- nRFConnectを使用したプログラムのテスト
フィットネスバンド、スマートウォッチ、その他のウェアラブルデバイスの普及に伴い、Bluetooth 5 / Bluetooth LowEnergyの使用がますます普及しています。通信規格は広く採用されています。 BLEは、非常に少ない電力で短距離でデータを交換するのに役立ちます。これは、ウェアラブルなどのバッテリー駆動デバイスにとって非常に重要です。また、ワイヤレスBLEメッシュネットワークのセットアップにも役立ちます。この機能は、閉じた環境で複数のデバイスが相互に通信する必要があるホームオートメーションデバイスに役立ちます。いくつかの基本的なBLE機能を実行するために、すでにRaspberry PiでBLEを使用し、ESP32でBLEを使用しています。エンジニアはBLEを実験して、小型バッテリーで長時間動作できるポータブルワイヤレスデバイスを設計しています。BLEで動作するために利用できる開発キットは複数あります。 Arduino Nano 33に関する最近のレビューでは、ボードにBLE機能を備えたnRF52840があることにも気づきました。
このチュートリアルでは、BLEを使用して温度と湿度を測定するためのnRF52DKと呼ばれるもう1つのエキサイティングで人気のある開発ボードについて説明します。デフォルトでは、BLE環境センシングプロファイルは幅広い環境パラメータをサポートしていますが、このチュートリアルは温度と湿度の値のみに制限されています。このソリューションは、Bluetooth Low Energyを介してスマートフォンに接続し、温度、湿度などの環境パラメーターに関する頻繁な更新を提供します。DHT1センサーを使用し、温度測定は摂氏0.01度の分解能で実行され、湿度測定は0.01パーセントの分解能で実行されます。
nRF52開発キット:
nRF52DK は、Bluetooth LowEnergyおよび2.4GHzワイヤレスモノのインターネットアプリケーション用の完全なプロトタイピングプラットフォームです。開発キットは、オープンソース、GCCなどのさまざまな標準Nordicツールチェーンと、Keil、IAR、Segger Embedded Studio などの商用統合開発環境を サポートします。Nordicは、nRF52DKの完全なサポートを含む、nRF52用の本格的なソフトウェア開発キットも提供します。
nRF52DKは、512Kバイトのフラッシュメモリと64KバイトのSRAMが統合されたnRF52832ARMCortex -M4Fマイクロコントローラーを搭載してい ます。 nRF52DKには、統合されたSegger J-Link On Boardデバッガーがあり、外部/追加のjtagデバッグデバイスなしで、より簡単で高速なデバッグを提供します。Arduino UnoRev3互換コネクタも含まれてい ますは、アナログおよびデジタル入力とマイクロプロセッサとのインターフェイスをサポートし、I2C(Inter-Integrated Circuit)、SPI(Serial Peripheral Interface)、UART(Universal Asynchronous Receiver andTransmitter)などの標準通信プロトコルも含みます。この開発キットは、スマートフォン、ラップトップ、タブレットと接続するためにBluetooth LowEnergyを使用した短距離ワイヤレス通信を提供する統合PCBアンテナを使用して設計されています。
Segger Embedded Studio
開発ボードをプログラムするには 、Segger EmbeddedStudioとnRF52を使用します。Segger Embedded Studioは、組み込みシステム開発を特に対象とした強力なC / C ++統合開発環境(IDE)です。これにより、組み込みCプログラミング、開発、およびデバッグに必要なすべてを含む完全なオールインワンソリューションが提供されます。これには、ARM Cortexデバイスをサポートするプロジェクト管理、エディター、デバッガーを備えた、組み込みシステムのプログラミングと開発のための完全なワークフローが含まれます。この強力で使いやすいIDEは、コードサイズの制限なしに、フルライセンスで北欧のお客様に完全に無料で提供されます。IDEは、以下のリンクからダウンロードできます。
Segger EmbeddedStudioをダウンロードする
nRF52DKを使用したDHT11
DHT11は、抵抗型湿度測定コンポーネントとNTC型温度測定コンポーネントを備えたフル機能の温度および湿度センサーです。優れた品質、高速応答、費用対効果を提供します。デフォルトでは、すべてのDHT11センサーはラボで校正されているため、非常に高い精度と信頼性が得られます。シングルワイヤーシリアルインターフェースシステムを使用して通信し、その他の仕様を以下に示します。
DHT11の仕様:
- 湿度範囲:20 – 90%RH
- 温度範囲:0〜50℃
- 湿度精度:±5%RH
- 温度精度:±2℃
DHT11のタイミング図:
DHT11センサーからのデータの読み取りは、上記のタイミング図を使用すると比較的簡単です。手順は他のコントローラーと同様であり、このセンサーはすでに次のような他の開発プラットフォームで使用されています。
- RaspberryPiを搭載したDHT11センサー
- PIC16F877Aを備えたDHT11センサー
- STM32F103C8を備えたDHT11センサー
- NodeMCUを備えたDHT11センサー
DHT11温度および湿度センサーをnRF52開発キットと接続するには、以下の接続図に従ってください。
コネクタモジュールを使用してセンサーをボードに接続しているので、最終的なセットアップは次のようになります。
DHT11と通信するためのフローチャート:
以下のフローチャートは、nRF52DKとDHT11の間の通信に使用するプログラムの論理フローを説明しています。
データ形式:
Bluetooth Low Energy(BLE)の操作方法は?
BLE機能の使用方法を理解するには、以下で説明するいくつかの基本的な用語を理解する必要があります。また、ESP32BLEの記事を読んでBLEについて詳しく知ることもできます。
Generic Access Profile(GAP)
Generic Access Profileは、BLEペリフェラル と セントラル デバイス間の通信接続を確立する完全な責任を負い ます。GAPは、デバイスのスキャン/検出、リンク層接続の確立、リンクの終了、セキュリティ機能のハンドシェイク、本格的なデバイス構成など、さまざまな手順も提供します。GAPは、次のデバイス状態で機能します
ギャップ状態 |
説明 |
待機する |
リセット時のデバイスの初期状態 |
広告主 |
イニシエータースキャンに役立つデータを使用したデバイス広告 |
スキャナー |
スキャンリクエストを受信して広告主に送信します |
イニシエータ |
リンクを確立するための接続要求を送信します |
スレーブ/マスター |
接続時に、デバイスは広告主の場合はスレーブ、イニシエーターの場合はマスター |
ジェネリック属性プロファイルレイヤー(GATT)
GATTはGenericAttribute Profile Layerの略で、2つのBLEデバイス(Peripheral&Central)間のデータ通信を担当します。データ通信は、データを通信および保存する特性の形式で特徴付けられます。BLEデバイスは、以下に示すデバイス通信で2つの異なる役割を果たします。
- GATTサーバーには、読み取りと書き込みに使用される特性情報が含まれています。私たちのチュートリアルでは、DHT11センサーと開発者。キットはGATTサーバーです。
- GATTクライアントは、GATTサーバーとの間でデータの読み取りと書き込みを行います。スマートフォンは、センサーボードにデータを読み書きするGATTクライアントです。
Bluetooth SIG
Bluetooth Special Interest Group(SIG)は、Bluetooth標準の開発とBluetoothテクノロジのライセンスを監視する標準化団体です。SIGグループは、Bluetooth製品を製造または販売していません。Bluetoothの仕様と標準化を定義します。これらは、Bluetooth LowEnergyプロファイルとそれぞれの特性の一意の識別子を定義します。GATTプロファイルの仕様は以下のリンクにあります
GATTプロファイル仕様
上記のリンクに記載されているGATT仕様に基づいて、プロジェクトに必要な一意の識別子を収集しました。これを以下に示します。
プロファイル/特性 |
UUID |
GAP(汎用アクセス) |
0x1800 |
GATT(一般属性) |
0x1801 |
ESS(環境センシング) |
0x181A |
温度 |
0x2A6E |
湿度 |
0x2A6F |
BLEサービス/特性図
BLE UUID
UUID |
16ビット値 |
128ビットUUID |
ESSサービス |
0x181A |
0000181A-0000-0000-0000-00000000000 |
テンプチャー |
0x2A6E |
00002A6E-0000-0000-0000-00000000000 |
湿度文字 |
0x2A6F |
00002A6F-0000-0000-0000-00000000000 |
温度特性
プロパティ |
説明 |
単位 |
0.01度の解像度で摂氏度 |
フォーマット |
sint16 |
UUID |
0x2A6E |
10進指数 |
2 |
読んだ |
必須 |
湿度特性
プロパティ |
説明 |
単位 |
0.01パーセントの解像度のパーセンテージ |
フォーマット |
uint16 |
UUID |
0x2A6F |
10進指数 |
2 |
読んだ |
必須 |
nRF52BLEプログラムの説明
nRF52開発キットをプログラムするためにnRF5SDKを使用し ます。nRF5 SDKは、多数のBluetooth Low Energyプロファイル、GATTシリアライザー、およびnRF5シリーズSoC上のすべての周辺機器のドライバーサポートと統合された完全なソフトウェア開発キットです。このSDKは、開発者がnRF52およびnRF51シリーズのマイクロコントローラーを使用して、フル機能で信頼性が高く安全なBluetooth LowEnergyアプリケーションを構築するのに役立ちます。完全なプログラムはここからダウンロードできます。コードの説明は次のとおりです。
プルアップを有効にして、DHT11DATAピンをnrf52の入力として構成します。nRF52がDHT11データピンに適切なプルアップを提供することを確認するには、ピンステータスをハイにする必要があります
/ *入力に設定し、信号がプルアップされるかどうかを確認します* / Data_SetInput(); DelayUSec(50); if(Data_GetVal()== 0){return DHT11_NO_PULLUP; }
nRF52マイクロコントローラーからSTART信号を生成し、確認応答信号を確認します。
/ *開始信号を送信します* / Data_SetOutput(); Data_ClrVal(); DelayMSec(20); / *信号を少なくとも18ミリ秒間ローに保ちます* / Data_SetInput(); DelayUSec(50); / *確認応答信号をチェックします* / if(Data_GetVal()!= 0){/ *信号はセンサーによってローに引き下げられる必要があります* / return DHT11_NO_ACK_0; } / *センサーからのack信号を最大100us待つ* / cntr = 18; while(Data_GetVal()== 0){/ *シグナルが上がるまで待つ* / DelayUSec(5); if(-cntr == 0){return DHT11_NO_ACK_1; / *ここでACKの信号がアップしている必要があります* /}} / *再びダウンするまで待機し、ackシーケンスが終了します* / cntr = 18; while(Data_GetVal()!= 0){/ *シグナルがダウンするまで待つ* / DelayUSec(5); if(-cntr == 0){return DHT11_NO_ACK_0; / *ここで信号が再びゼロになるはずです* /}}
次に、2バイトの温度、2バイトの湿度、および1バイトのチェックサムを含む40ビットのデータを読み取ります。
/ * 40ビットデータを読み取る* / i = 0; データ= 0; loopBits = 40; do {cntr = 11; / *最大55us待機* / while(Data_GetVal()== 0){DelayUSec(5); if(-cntr == 0){return DHT11_NO_DATA_0; }} cntr = 15; / *最大75us待機* / while(Data_GetVal()!= 0){DelayUSec(5); if(-cntr == 0){return DHT11_NO_DATA_1; }}データ<< = 1; / *次のデータビット* / if(cntr <10){/ *データ信号ハイ> 30 us ==>データビット1 * / data- = 1; } if((loopBits&0x7)== 1){/ *次のバイト* / buffer = data; i ++; データ= 0; }} while(-loopBits!= 0);
チェックサムを使用してデータを検証します。
/ * CRCをテストします* / if((uint8_t)(buffer + buffer + buffer + buffer)!= buffer){return DHT11_BAD_CRC; }
温度と湿度を操作して保存します
/ *呼び出し元のデータ値を格納します* /湿度=((int)buffer)* 100 + buffer; 温度=((int)buffer)* 100 + buffer;
nRF5SDKロガーサービスを初期化します。nRF52 SDKは、 nrf_log と呼ばれるロギング制御インターフェースを 備えて おり、情報のロギングにデフォルトのバックエンドを使用します。デフォルトのバックエンドはシリアルポートになります。ここでは、 nrf_log 制御インターフェースと nrf_log デフォルトバックエンドの両方も初期化 します。
ret_code_t err_code = NRF_LOG_INIT(NULL); APP_ERROR_CHECK(err_code); NRF_LOG_DEFAULT_BACKENDS_INIT();
nRF52 SDKには、アプリケーションタイマー機能があります。アプリケーションタイマーモジュールを使用すると、RTC1ペリフェラルに基づいて複数のタイマーインスタンスを作成できます。ここでは、nRF5アプリケーションタイマーモジュールを初期化します。このソリューションでは、2つのアプリケーションタイマーがデータ更新間隔に使用されます。
ret_code_t err_code = app_timer_init(); APP_ERROR_CHECK(err_code);
BLEデバイスはコイン電池で数か月間動作する必要があるため、nRF52SDKにはフル機能の 電源管理モジュールがあります。電源管理は、BLEアプリケーションで重要な役割を果たします。nRF52電源管理モジュールは完全に同じことを処理します。ここでは、nRF5SDKの電源管理モジュールを初期化します。
ret_code_t err_code; err_code = nrf_pwr_mgmt_init(); APP_ERROR_CHECK(err_code);
nRF52 SDKには、Bluetooth LowEnergyの中央スタックと周辺スタックを備えたNordicSoftDeviceファームウェアの16進ファイルが組み込まれてい ます。この高度に修飾されたプロトコルスタックには、GATT、GAP、ATT、SM、L2CAP、およびリンク層が含まれます。ここでは、nRF5 BLE無線スタック(Nordic Soft Device)を初期化した初期化シーケンスに従います。
ret_code_t err_code; err_code = nrf_sdh_enable_request(); APP_ERROR_CHECK(err_code); //デフォルト設定を使用してBLEスタックを構成します。 //アプリケーションRAMの開始アドレスを取得します。 uint32_t ram_start = 0; err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG、&ram_start); APP_ERROR_CHECK(err_code); // BLEスタックを有効にします。 err_code = nrf_sdh_ble_enable(&ram_start); APP_ERROR_CHECK(err_code); // BLEイベントのハンドラーを登録します。 NRF_SDH_BLE_OBSERVER(m_ble_observer、APP_BLE_OBSERVER_PRIO、ble_evt_handler、NULL);
GAPは、デバイスのスキャン/検出、リンクの確立、リンクの終了、セキュリティ機能の開始、および構成を担当します。 GAPは、接続間隔、スレーブレイテンシ、監視タイムアウトなどの主要な接続パラメータを備えています。これにより、Generic AccessProfile接続パラメータが初期化されます。
ret_code_terr_code; ble_gap_conn_params_tgap_conn_params; ble_gap_conn_sec_mode_t sec_mode; BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); err_code = sd_ble_gap_device_name_set(&sec_mode、 (const uint8_t *)DEVICE_NAME、 strlen(DEVICE_NAME)); APP_ERROR_CHECK(err_code); memset(&gap_conn_params、0、sizeof(gap_conn_params)); gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL; gap_conn_params.slave_latency = SLAVE_LATENCY; gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; err_code = sd_ble_gap_ppcp_set(&gap_conn_params); APP_ERROR_CHECK(err_code);
GATTは、BLE周辺機器と中央デバイス間のデータ通信を担当します。nRF52 GATTモジュールは、最大ATT_MTUサイズのネゴシエーションと追跡に役立ちます。ここでは、nRF52SDK汎用属性モジュールを初期化します。
ret_code_t err_code = nrf_ble_gatt_init(&m_gatt、NULL); APP_ERROR_CHECK(err_code);
GATTは、サービスと特性の形でデータ通信を行います。ここでは、温度や湿度などの特性の初期化を含む、GATT環境検知サービスを初期化します。
ret_code_terr_code; nrf_ble_qwr_init_t qwr_init = {0}; //キューに入れられた書き込みモジュールを初期化します。 qwr_init.error_handler = nrf_qwr_error_handler; err_code = nrf_ble_qwr_init(&m_qwr、&qwr_init); APP_ERROR_CHECK(err_code); m_ess.notif_write_handler = ble_ess_notif_write_handler; err_code = ble_ess_init(&m_ess); APP_ERROR_CHECK(err_code);
広告は、BLEアプリケーション環境で重要な役割を果たします。パケットには、アドレスタイプ、アドバタイズタイプ、アドバタイズデータ、デバイスメーカー固有のデータ、およびスキャン応答データの情報が含まれます。広告モジュールを備えたnRF52SDK。ここでは、パラメータを使用して広告モジュールの初期化を行います。
ret_code_terr_code; ble_advdata_t advdata; ble_advdata_t srdata; ble_uuid_t adv_uuids = {{ESS_UUID_SERVICE、BLE_UUID_TYPE_BLE}}; //広告データを作成して設定します。 memset(&advdata、0、sizeof(advdata)); advdata.name_type = BLE_ADVDATA_FULL_NAME; advdata.include_appearance = true; advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; memset(&srdata、0、sizeof(srdata)); srdata.uuids_complete.uuid_cnt = sizeof(adv_uuids)/ sizeof(adv_uuids); srdata.uuids_complete.p_uuids = adv_uuids; err_code = ble_advdata_encode(&advdata、m_adv_data.adv_data.p_data、&m_adv_data.adv_data.len); APP_ERROR_CHECK(err_code); err_code = ble_advdata_encode(&srdata、m_adv_data.scan_rsp_data.p_data、&m_adv_data.scan_rsp_data.len); APP_ERROR_CHECK(err_code); ble_gap_adv_params_t adv_params; //広告パラメータを設定します。 memset(&adv_params、0、sizeof(adv_params)); adv_params.primary_phy = BLE_GAP_PHY_1MBPS; adv_params.duration = APP_ADV_DURATION; adv_params.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED; adv_params.p_peer_addr = NULL; adv_params.filter_policy = BLE_GAP_ADV_FP_ANY; adv_params.interval = APP_ADV_INTERVAL; err_code = sd_ble_gap_adv_set_configure(&m_adv_handle、&m_adv_data、&adv_params); APP_ERROR_CHECK(err_code);
BLE接続は、最初の接続パラメーターの更新遅延、次の連続する遅延、更新カウント、接続イベントハンドラーコールバック関数、接続エラーコールバックイベントハンドラーなどのさまざまな接続パラメーターを使用して処理および監視されます。ここでは、BLE接続確立パラメーターの初期化と、接続イベントおよびエラーイベントのコールバックイベントハンドラーを実行します。
ret_code_terr_code; ble_conn_params_init_t cp_init; memset(&cp_init、0、sizeof(cp_init)); cp_init.p_conn_params = NULL; cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY; cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY; cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT; t_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID; cp_init.disconnect_on_fail = false; cp_init.evt_handler = on_conn_params_evt; cp_init.error_handler = conn_params_error_handler; err_code = ble_conn_params_init(&cp_init); APP_ERROR_CHECK(err_code);
システムの初期化が完了したら、ここではBLEデバイス名と機能情報のアドバタイズを開始します。ここから、この周辺機器はスマートフォンのBleスキャンリストで確認できます。
ret_code_terr_code; err_code = sd_ble_gap_adv_start(m_adv_handle、APP_BLE_CONN_CFG_TAG); APP_ERROR_CHECK(err_code);
メインループは2秒間隔で実行され、温度と湿度を読み取り、読み取りまたは通知を使用して接続されたスマートデバイスに更新します
for(;;) { uint16_t温度、湿度; DHTxx_ErrorCode dhtErrCode; idle_state_handle(); if(updtmrexp){ dhtErrCode = DHTxx_Read(&temperature、&humidity); if(dhtErrCode == DHT11_OK){ NRF_LOG_INFO( "温度:%d湿度:%d \ n"、温度、湿度); if(temp_notif_enabled){ ble_ess_notify_temp(m_conn_handle、&m_ess、温度); } else { ble_ess_update_temp(&m_ess、温度); } if(humid_notif_enabled){ ble_ess_notify_humid(m_conn_handle、&m_ess、湿度); } else { ble_ess_update_humid(&m_ess、湿度); } } updtmrexp = false; } }
nRFConnectを使用したプログラムのテスト
nRF Connectは、BLE対応の周辺機器をスキャンして探索できる強力なBluetooth LowEnergyツールです。 nRF Connect for mobileは、BluetoothSIGが採用した幅広い標準プロファイルをサポートしています。これを使用してプログラムを確認できます。アプリをインストールした後、アプリでBLEデバイスをスキャンしてnRF52ボードを電話とペアリングできます。次の図に示すように、Environmental Sensing属性内で、温度と湿度の値が更新されていることがわかります。
Hariharan Veerappan は、組み込み製品開発で15年以上の経験を持つ独立コンサルタントです。彼は組み込みファームウェア/ Linux開発のコンサルティングサービスを提供し、企業およびオンライントレーニングも提供しています。Hariharanは、電子通信工学の分野で工学士号を取得しており、記事やチュートリアルを通じて、CircuitDigestの読者と経験や考えを共有しています。