TOP > 電子部品> 無線通信 nRF24L01+

無線通信 (nRF24L01+)

 (2021.11.23 作成)

 このページでは2.4GHzの無線通信ができるNordic社nRF24L01+(nRF24L01p)について紹介したいと思います。

 ただこのICですが既に後継のnRF52シリーズが販売されており、新規設計には非推奨となっています。一方でnRF52はこのページ作成時点でAliexpressで500円超なのに対しnRF24は100円以下と大変お手頃なので、いましばらくは生き残るのではないでしょうか?

 ちなみに今ではESP32やESP8266などでWiFiやBluetoothを使った無線通信ができるのでArduinoでやり取りするだけならそちらの方が簡単だと思います。nRF24もこれらと同じ2.4GHzの通信帯を使っているのですが、異なるプロトコルを使用しているので互換性はありません。管理人の偏見によるBluetoothなどとの違いは

  • Wi-FiやBluetoothに比べて通信が安定している気がする
  • 単純なので仕組みを理解しやすい
  • マイコンが含まれていないので別途制御マイコンが必要

ということになるかと思います。Logicoolの無線マウスはnRF24が使われているらしいのですが、Bluetoothマウスが頻繁に切れてストレスになるのに対しLogicoolのマウスは切れたことがないので勝手にBluetoothより安定していると思い込んでいます。

 nRF24を使う際にはArduino用の優秀なライブラリがいくつか出ているので、それを使うのが手っ取り早いかと思います。ただArduino嫌いの管理人としては遊びも兼ねてソフトを自作してみましたのでここでご紹介しようと思った次第です。

特徴

 さて、このページにたどり着いている方は多くの場合他の素晴らしいサイト様を見てnRF24の特長についてはご存知だと思うので、ソフトを自作するという観点で管理人が気づいた点を書いてみたいと思います。相変わらず文字ばかりで申し訳ないです。。。

サンプル

 Nordic社のサイトにサンプルが置いてあります(nAN24-12)。この中にはhalというフォルダがあり、マイコン種に依存せず使えるライブラリがあるのでこれをベースにソフト開発を行うのが良いと思います。halはHardware Abstraction Layerの略ですね。ドキュメントpdfも含まれておりソフトの構造が解説されているため、比較的理解しやすいのではないでしょうか?それでもそこそこ複雑ですが、、、

無線通信

 通信に際してアドレスと使用する周波数がRX(受信側)とTX(送信側)で一致している必要があります。1つのRXに対して6個のTXを接続できるのですが、これらはそれぞれのパイプを通じて通信することになります。ただ管理人は1対1通信しかやったことがないのでよくわかりません。

 通信は必ずTXから開始され、RXはこれに対し無応答、ACK応答、ACK+返信メッセージという応答が可能です。この最後のACK+応答メッセージは32バイトまでの任意のデータを入れられるので、この機能を利用して双方向通信が可能になります。メッセージを入れていないとACKだけが帰るので2番目のACK応答のみと同じ動作になります。

 1パケットは最大32バイトですが、Dynamic Payloadという機能を使うことで固定長でない32バイトまでのデータを送受信できます。

マイコンとの通信

 マイコンとはSPI通信を行います。また通常のSPI通信に加え、制御用のCEピンと割り込みのIRQピンを接続する必要があります。通常のSPI通信はレジスタを指定して、次に読み書きデータを2バイト目以降に行うと思いますが、最初のレジスタ指定時(1バイト目)に戻り値としてその際のステータスレジスタ値が戻ってきます。これは管理人にとって初めての仕様だったのですがとても面白いと思いました。その他制御関係もちょっと複雑ではありますが、分かる範囲だと思います。

デバッグ

 送受信のデバッグはnRF24+マイコンのセットが2つ必要なのは当然なのですが、PCも2台あった方が断然よいです。しかし管理人は1台しかPCを持っていないため、結局頑張ってロジアナ(DSLogic)を使用してデバッグを行いました。

 配線だらけで混沌としていますが、2つのSTM32F103C8T6基板とnRF24L01+基板で通信しています。右側はデバッグ時の解析結果ですが、TX,RXそれぞれ6本の信号線があるので、合計12本の信号を見ています。細かい解説は特にしませんが上段6本がTXになっており、3回データを送信し、3回ACKが返っているのが見えています。

 パソコンが1台だけなのでデバッグ実行もできず、頻繁にST-Linkを差し替えるのでかなり面倒なのですが何とか動作せることができました。

ライブラリ

 ということで作成したライブラリとTX,RXのサンプルプログラムを以下に置きます。上記の通りデバッグが面倒なので、まだまだバグがあるかもしれないですが一応公開しておきます。気が向いたら更新するかもしれません。

  Download

 ライブラリは基本的に上述のNordic社によるnAN24-12のHALライブラリを真似た(パクった)関数名になっています。

 サンプルプログラムを動かすために不足しているライブラリはこちらにあります。またCubeIDE1.7.0を使用していますがSTM32のLLドライバなどへのリンクはこちらに解説を書いてあります。ただどれも親切な内容ではないので動かすのはかなり困難を極めるのではないかと思います。

 いかがでしょうか?相変わらず文字ばかりで誰に向けた解説かよくわからないですが誰かの参考になれば幸いです。

コメント: 1
  • #1

    前田 健 (月曜日, 11 12月 2023 06:46)

    大変丁寧は説明をありがとうございます。私もAndroidのライブラリでOKというのはあまり好きではなくて、あれこれと模索しながら工作するのが大好きな人間なので、このような記事は大変有難いです。
    まだまだ、理解できていないところが多いですが、今後もこのサイトを参考に勉強をさせてください。