スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

XBeeからDIOによるI2CでSENSIRION SHT-11温度/湿度センサーを直接制御

既に書いた通り、XBeeにはI2Cのインターフェースが用意されてない。一般的な方法では、XBeeにI2Cインターフェースのセンサー等には直接接続できない。

しかし、XBeeにはDIO(GPIO)は用意されている。このDIOを制御して、I2C接続のセンサーであるSENSIRION SHT-11温度/湿度センサーを制御するソフトウェアを開発して温度/湿度を取得してみた。以前まではSHT-71を使っていたが、価格が安いので今回はSHT-11を使用。ソフトウェア的には完全互換である。

ローカル側はArduinoとSWITCH SCIENCEのXBeeシールドを使用。PCからはシリアルで温度や湿度取得の抽象的なコマンドを発行し、細かいローカル側XBeeの制御は全てArduinoが行う。取得した温度、湿度はシリアル経由でPCへ返す仕組みにした。



リモート側のハードウェアはなるべく手間をかけない方法を検討。XBeeへの電源供給とソケット、SHT-11を接続するためのユニバーサル基板を使いたかったので、同じくSWITCH SCIENCEのXBeeシールドを流用。当然だがXBeeからSHT-11を直接制御するのでArduinoは接続しない。5Vの電源のみ供給する。

I2Cは通常DATAをプルアップ抵抗で吊るが、XBeeには内蔵プルアップがあるので(デフォルトでEnable)、それを使用したため外部にプルアップ抵抗は入れてない。また、DATA出力はオープンドレイン出力となるが、HIGHはディレクションを入力にし(プルアップでHIGHになる)、LOWの時だけLOWをドライブする仕様にした。ソフトにバグが無ければ、この方法でもバスがショートすることはない。



開発したソフトウェアでリモート側XBeeのDIOを制御し、I2Cのプロトコルを生成。SHT-11と通信している様子をデジタルオシロで測定した画像。上側の黄色の波形がSHT-11のSCK信号、下側の水色の波形がDATA信号である。

信頼性を上げるためにCRCもチェックする様にしたため、コマンド送信からSHT-11がデータを返すまで7.7秒程度掛かる。



温度取得の様子を詳しく見てみる。Transmission Startから始まり、Address,Command,ACKまでがXBeeからSHT-11に対してDIOを経由で送信している。ACK送信後、XBeeは出力をHIGH(DIOの出力を入力に切り替え、内蔵プルアップでHIGHにしている)にしている。

デジタルオシロのカーソルが示す様に、220msでSHT-11がDATAをLOWにドライブしている。SHT-11にマニュアルでは、14bitの場合は210ms後にLOWになるとあるので、ほぼ規定通り。その後は、XBeeはSHT-11からデータを受信している。



XBeeはやはり時々ネットワークエラーを起こすようだ。ネットワークエラーとCRCエラー発生時はリトライ処理をする様にしたところ、今の所おかしな温度/湿度データは出力されてない。これで暫くテストしてみる。
スポンサーサイト

theme : プログラミング
genre : コンピュータ

XBee単体でI2Cを制御する:XbeeのGPIO(DIO)で最大何Hzが生成できるか?

XBeeは制御される側であれば、ホストコントローラー無しでも使える。しかし、出来るのは無線経由でのGPIOの入出力、A/D値の取得、PWMの制御となっている。アナログ値を出力するような温度センサー類を無線化するのであれば、基本的には問題は無い。しかし、精度が高い校正済みの温度センサー等を使う場合、インターフェースがI2Cだったりする。XBeeにはI2Cのインターフェースが無いため、通常ならマイコンを搭載し、マイコン経由での接続となる。将来的にバッテリー駆動なども視野に入れると、I2Cのインターフェースのためだけにマイコン1個を載せるのは避けたい。I2CくらいのプロトコルならソフトウェアでGPIOを叩き、制御が出来そうなのでトライしてみる。

先ずは、Remote AT Commandの性能測定。デジタルオシロスコープで、ローカル側のコマンドを発行後から、リモート側のDIOが変化するまでの時間を測定した。ホストコントローラー(Arduino)とローカル側Xbeeとの間の転送レートは19200bpsに設定している。モードはAPIモードを使用。

ホストコントローラーからXBeeにRemote AT Command("P1"や"P2")発行後、リモート側のDIOピンが実際に動く様子をデジタルオシロで計測した画像(デジタルオシロの測定画面のスナップショット)である。黄色がローカル側シリアルのTX、青色がリモート側のDIOである。コマンド発行から、約30ms後に、DIOのレベルがLからHに変化しているのがわかる。



I2CのCLKをDIOで生成するため、フルスピードでH/Lを変化させてみた。DIOの連続操作(H→L)時間は約50ms。



最大で10Hz程度では動かせそうだ。I2CはTransimission Start, Address, Command, Dataなど、合計で30bit以上のデータを送受信するので、3~5秒あれば1回の通信を完了することが期待できそうである。

Arduino/SoftwareSerialでXBeeを接続 / SWITCH SCIENCE XBeeシールド

今回考えているシステムでは、全体の制御をLinuxで行う予定である。本来ならLinuxからリモート側のXBeeに対してAPIモードでパケットを投げるのがシンプルな構成となるであろう。しかしI2CのプロトコルをGPIOで叩いたりすることを考えると、msオーダーでの制御やエラーのハンドリングを行う必要が出てくる。これらの処理をLinuxから直接行うのは面倒くさいし、msオーダーでの制御は基本的に無理だと思った方が良い。そこで、Linuxからのコマンドを一度Arduinoで受け、細かい制御はArduino側で行うことにした。

ここで一つ問題が生じる。ご存じの通り、ArduinoにはUARTが1ポートしか搭載されてない。上述通り、LinuxとArduinoをUARTで接続すると、ArduinoとローカルのXBeeを接続するためのUARTが不足することになる。そこで登場するのが、Software Serialである。

Software SerialはArduinoのサイトからライブラリとして提供されている。文字通りソフトウェアでUARTを実装している。任意のピンがTx/Rxにアサインできて、ハードウェアのUARTと基本的に使い方も同じである。これにより、UARTでLinux→Arduino→XBeeという接続が可能になる。

ArduinoでXBee + Software Serialを使うにあたり、選択したのがSWITCH SCIENCEのXBeeシールド。ジャンパーピンの設定で、

 Arduino:D2←XBee:Tx
 Arduino:D3→XBee:Rx

という接続が可能になる。Arduinoに接続しているUSBシリアルによって、従来通りArduinoへのソフトの書込みやデバッグメッセージの出力も出来るし、且つ、Software SerialによってXBeeも使うことができる。

早速実験を始めると、おかしな動作をすることに気付いた。ArduinoとXBeeとの間でシリアル通信が失敗するのである。Arduinoから送信はしているのだが、XBeeがレスポンスを一切返さない。

問題は通信速度のようだ。Software Serial自体は115200bpsまで転送速度が出るようだが、XBeeのライブラリと組み合わせると115200bpsは厳しいようだ。実際に実験したところ、19200bpsまでが限界であった。安全策を取って、9600bpsで運用する方が良いかもしれない。

XBeeの調査開始

別記事にある様に、安曇野の自宅に設置している全館暖房をリアルタイムでネット制御する仕組みや、温度や湿度を自動計測してTwitterで呟かせるシステムを開発した。今後、更にセンサー類を増やす予定があり、その際はセンサーの無線化をしたいと考えた。その場合、無線モジュールを使うことになる。イリーガルにならない様、技適認定された物というと、選択肢はXBeeの一つしかない。最近はTWE-Lite DIPなども出て来たので調査してみたが、Arduinoと組み合わせた時のライブラリやネット上の情報量を考え、やはりXBeeを使うことにした。

XBeeはホストコントローラー無しでも使えるが、その場合はA/Dの値の取得やGPIOの制御等のみとなる。校正済みのセンサー等を使おうとすると、I2Cなどのプロトコルを叩く必要があるため、ホストコントローラー無しでは原則として使えない。そこで、コーディネーター側からルーター/エンドデバイスに対してRemote AT CommandでGPIOを制御し、I2Cのプロトコルを生成することを最初の目標とした。

先ずはRemote AT Commandを叩いてGPIOを制御するところからスタートだ。

プロフィール

hashiken

Author:hashiken
基本的に自分で作る、直す、メンテする。東京と安曇野の二重生活。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
Photoscope∀
different version
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。