このページでは3.3Vで動作するXBeeとArduinoとの信号電圧の相互変換方法に関して説明します。抵抗分圧のほか、FETやダイオードによる変換、市販の変換基板BOB-08745についても紹介します。
下表はXBeeを3.3Vで動作させた時の入出力電圧仕様です。乾電池などで電源を供給した場合は変わります。
入出力
条件
| 最小電圧
| 最大電圧
| 備考
| 入力
| Lレベル入力電圧
| VIL
| 0.0 V
| 0.7 V
| max. 0.2×VDD
| Hレベル入力電圧
| VIH
| 2.6 V
| 3.3 V
| min. 0.8×VDD
| 出力
| Lレベル出力電圧
| VOL
| 0.0 V
| 0.6 V
| max. 0.18×VDD
| Hレベル出力電圧
| VOH
| 2.7 V
| 3.3 V
| min. 0.82×VDD
| Lレベル出力電流(標準)
| IOL
|
| 4 mA
| 下記以外の | 出力端子 Hレベル出力電流(標準)
| IOH
|
| 4 mA
| Lレベル出力電流(高出力)
| IOL
|
| 8 mA
| DIO4,DIO11 | RSSI,(DIO8) Hレベル出力電流(高出力)
| IOH
|
| 8 mA
| |
下表はArduinoを5.0Vで動作させた時の入出力電圧仕様です。3.3V動作時や乾電池などで電源を供給した場合は変わります。
入出力
条件
| 最小電圧
| 最大電圧
| 備考
| 入力
| Lレベル入力電圧
| VIL
| -0.5 V
| 1.5 V
| max. 0.3×Vcc
| Hレベル入力電圧
| VIH
| 3.0 V
| 5.5 V
| min. 0.6×Vcc
| 出力
| Lレベル出力電圧
| VOL
| 0.0 V
| 0.9 V
|
| Hレベル出力電圧
| VOH
| 4.2 V
| 5.0 V
|
| Lレベル出力電流
| IOL
|
| 20 mA
|
| Hレベル出力電流
| IOH
|
| 20 mA
|
| |
まずXBeeの3.3V出力をArduinoに直結した場合、Hレベル出力時電圧(VOH)が最小2.7Vに対してHレベル入力電圧(VIH)が最小3.0Vと電圧が不足しています。これはCMOSでは一般的なことで、通常のCMOS 3.3V出力はCMOS 5.0V入力に対して電圧が不足します。したがって、製品などの量産時は出力トレラント機能をもったバッファICやレベルシフタ、MOS FETなどを使って信号電圧を変換する必要があります。MOS FET BS138を使った市販の変換基板BOB-08745については後述します。
しかし、実力としては直結でも何ら問題なく動作します。しかも、3.3V出力を5.0V入力に直結した回路が一般的にも広まっています。ボクもそれに習って、@分岐などによる他への接続負荷が無く、A数Mbps以下の低速な回路であれば、直結しています。実験や趣味のレベルでは問題なく直結可能と考えてよいでしょう(但し、自己責任で)。直結で電圧が不足して動作が不安定と感じた場合も、たいていは直結が原因ではありません。XBeeの電源電圧が3.3Vを下回っているかArduinoがLレベルを出力しているかのどちらかでしょう。
XBee→Arduinoの3.3V出力から5V入力については直結でも問題ありませんが、Arduino 5V → XBee 3.3Vの信号は必ず信号レベルを変換する必要があります。XBeeのHレベル最大入力電圧(VIH)は最大3.3Vです。これを超えると誤作動の原因になります。しかも、3.6Vを超えるとXBeeモジュールが壊れる絶対最大定格を超過してしまいます。5Vを加え続けるとXBeeモジュールが異常に発熱してしまうことになりますので、電圧シフトは必須です。
下図はレベル変換の様子を測定したArduinoのシリアル出力(TX)波形と、電圧変換後のXBeeのシリアル入力(DIN)部の波形です。左上がArduino UNOによる5Vシリアル出力です。ほぼ0Vと5Vに振り切っています。その右側にMOS FETで3.3Vに変換した波形を示しています。これだと問題なくXBeeに入力することが出来ます。
安価に電圧変換するには抵抗分圧を用います。上図の左下にSparkfun製のLogic Level Converter BOB-08745を使った変換結果を示しています。Lレベル出力(VOL)が0.5V程度、生じるのはXBee内の30kΩのプルアップが原因です。XBeeのプルアップをオフにすることで低減できます。Hレベル出力電圧(VOH)が2.6V程度とXBeeのHレベル入力電圧VIHの下限値となっているのは、Sparkfun製のLogic Level Converterの分圧抵抗が10kΩ/20k(=10k+10k)Ωだからです。そこで、6.8kΩと3.9kΩの2つの抵抗で6.8kΩ/10.7kΩの分圧にしてみたところ良好な波形が得られました(上図の右下)。
抵抗分圧だと2つの抵抗が必要ですが、実はMOS FETを使った場合と部品点数が同じで、しかも5Vで動作するMOS FET 2N7000はリード付のTO-92パッケージで市販されているので取り扱いやすいです。抵抗分圧するくらいならMOS FETで正確に変換した方が良いでしょう。下図のようにMOS FET 2N7000のゲート(G)に電源5Vを、ソース(S)側をXBeeへ、ドレイン(D)側をゲートに100kΩでプルアップしつつArduinoのシリアル出力(TX)に接続しています。ところでFETのゲート電圧を3.3Vの電源に接続すればXBee DOUT 3.3VからArduino RX 5Vへの変換にも使えそうに思いがちですが、2N7000のゲートスレッシュ電圧が最大3Vくらいあるので仕様レベルでは直結と大差がありません。
一方、ダイオードを使って部品一つで変換する方法もあります。先のFETもそうですが、XBee側でプルアップされていることが、とてもありがたいのです。
ダイオードのカソード(K)側をArduinoに、アノード(A)側をXBeeに接続すると、ArduinoのHレベル電圧がXBeeにかからなくオープンになります。この時はXBee内部のプルアップでHレベルがXBeeに入力されます。また、ArduinoがLレベルを出力するときはXBeeから電流を引き込もうとするのでLレベルが入力されます。
下図は各種のダイオードを使用した時に電圧変換後(XBeeのDIN入力)の信号波形です。いずれもLレベル出力(VOL)が少し上がっています。これはダイオードの順方向電圧VFによる影響です。ショットキーバリアダイオードのようなVFの小さなダイオードが有利です。またXBeeのプルアップ抵抗が30kΩと大きいため、立ち上がりに鈍りがありますが、9600bpsで使用する限りは問題なさそうです。
当ページの先頭に市販のレベル変換基板Sparkfun製 Logic Level Converter BOB-08745の写真を掲載しています。BOB-08745はFETを使って、XBeeのような3.3V出力信号電圧をArduinoのような5V入力信号電圧に昇圧します。回路は降圧の場合とほぼ同じですがゲート電圧を3.3Vの低圧の電源に接続しています。5Vのゲート電圧のままでも実力的に動作するでしょうが、それは直結でも実力的に動作するのと同じで、FETを追加する意味が無くなるからです。
Sparkfun製レベル変換基板で使用しているMOS FETはBSS138というゲートスレッショルド最大電圧が1.5Vと低く3V動作が可能なFETです。秋月電子でも売られていますが、リード付のTO-92パッケージは市販されていません。3V動作のFETを手軽に使用して昇圧を行いたいということであればSparkfun製のレベル変換基板は有効な方法です。
しかし、前述のとおりArduinoの5Vの出力をXBeeの3.3V入力に接続する降圧側は2.6Vまで電圧が下がってしまいますので、抵抗比を変更するかMOS FET 2N7000を使った降圧回路を使った方が良いでしょう。
以上のように少し中途半端な市販品ではありますが、表面実装部品のハンダ付けを避けたい人にとっては、BSS138を手軽に使える点でメリットがあります。昇圧側にBSS138を使用し、降圧側にリード部品の2N7000を使った降圧回路を製作するのが最も安定したレベル変換回路となるでしょう。
XBeeのADCの最大入力電圧は1.2Vです。ArduinoのPWMをRCで平滑化するだけでなく抵抗分圧で電圧を下げる必要があります。しかし、ADCの入力抵抗が大きいとAD変換値が乱れてしまう場合がありますので、量産向けの製品ではオペアンプなどによるバッファ回路が必要です。
最近、量産向けの製品設計に関する問い合わせが増えております。実験で動作がおかしいとか、情報の誤りに対しては、極力、対応させていただいていますが、その範囲を超えているものもあります。当サイトは実験レベル、趣味レベルで動作する製作に関する情報を提供しています。当サイトの情報を製品設計に使っていただくのはかまいませんが、各種のデータシートを確認して設計を見直したり、実際に信号レベルを測って検証を行ったりするのはボクではありません。また、当サイトの情報をもとに量産した製品に不具合があったとしても、当方は一切の責任を負いません。誤解の無いよう、お願いします。