XBeeモジュールの使い方(12ビットADC)


 前回の解説では、MicroPython Terminalを用いてADCの結果を読み取る際に、XBee3のADCの分解能が12ビットであることについて詳しく触れていなかったため、今回はその点について解説します。

 結論から申し上げますと、XBee3のADCは12ビットの分解能を持っています。しかし、XBeeシリーズを以前から使用されている方の中には、「XBeeのADCは10ビットである」と思い込んでおられる方が多いように感じます。

【なぜAPIフレームでは10ビットADCが使われているのか】

XBeeの通信プロトコルであるAPIフレームは、もともとZigBee規格(ZCLなど)との互換性を重視して設計されており、XBee S1やS2といった旧シリーズでは10ビットADCが標準でした。そのため、APIフレームの構造も10ビット出力を前提に作られており、ADCの値は2バイトのうちの下位10ビットのみが使用され、上位ビットは未使用となっていました。

これは、通信フレームの軽量化を目的とし、最大値1023(10ビット)で精度としては十分と判断されたことに起因します。さらに、無線通信においては帯域幅の最適化や消費電力の低減も重要であり、送信データをコンパクトに抑える必要がありました。特にセンサーネットワークのように、多数のノードが頻繁にデータを送信する環境では、通信効率の向上が求められます。この点でも、10ビットADCは理にかなった選択だったのです。

XBee3は12ビットのADCを搭載しているにもかかわらず、APIフレームを使用した通信では依然として10ビットのデータとして扱われます。これは、旧モデルとの後方互換性を維持するためと考えられます。XBee3が従来機とのシームレスな連携を可能にしている理由の一つです。

【MicroPythonで12ビットADCが利用できる理由】

 一方で、MicroPythonはXBee3のファームウェア上で動作する組み込みPython実行環境であり、通信プロトコルを介さずにハードウェアのADCに直接アクセスすることが可能です。そのため、XBee3に搭載されている実際の12ビット(0~4095)のADC分解能をフルに活用できます。

通信フレームを介さず、MicroPython上で直接ADC値を取得する場合には、APIフレームの制約に縛られず、XBee3本来の性能を最大限に引き出すことができます。

 以上をまとめると以下のようになります。

(1)XBee3は12ビットのADCを搭載しているが、互換性のためAPIフレームを使った通信では10ビットとして送信される

(2)MicroPythonを使用すれば12ビットのフル精度でADCを読み取ることが可能

 以下に温度センサの値をADCの参照電圧がVref=1.25Vの場合に、APIフレームのDIO1とMircoPython Terminalでほぼ同時に検出した結果を示します。

 Vref=1.25Vの場合、10ビットで電圧の分解能は0.0012V、一方12ビットでは0.00030Vです。APIフレームの結果は702なので換算すると0.857VですがMircoPython Terminalでは0.8583Vとなりました。

 今後、XBee3の高度な機能を活用する際は、この違いを理解した上で用途に応じた実装方法を選択することが重要です。