同じアドレスのI2Cデバイスを使う
温度とか気圧とか湿度とか測ってそのデータをPCに転送して記録できるようになりました。
こうなるとやっぱり測定時刻もいっしょに記録したくなります。
「PICでI2C - MPL115A2の大気圧計算法」の画面には時刻が入っていますが、あれはTeraTermのタイムスタンプの機能を使ったもので自前で時刻を記録しているわけではありません。
秋月のリストでリアルタイム・クロックを探したら「I2C接続RTC(リアルタイムクロック)DS1307+」というのがありました。
今電源は基本3.3Vに統一しているので電源が5Vというのが気になるのですが、考えたらI2Cの場合はデバイス間の接点はSCL/SDAしかなくてこれらの端子はオープンコレクターなので電源電圧の違いは問題にならないでしょう。DS1307のVIHはMin.2.2VなのでI2Cバスラインを3.3Vのラインにプルアップしていても動作するはずです。
ということで買っては来たんですがもっと大きな問題がありました。「PICでI2C - ADコンバーター・MCP3425の使い方」に書いた16bitのADコンバータとアドレスがかち合っているのです。MCP3425は白金薄膜抵抗の抵抗値の測定に使っており、さらに熱電対の起電力測定に使う計画もあります。さすがにこれははずせません。
秋月で入手できるデバイスのアドレスは主なものだけですが「I2Cデバイス・アドレス一覧」にあります。もう少しばらけていればいいのですが....
------
そこでI2Cのアドレスが重複するデバイスをどうやったらいっしょに使えるか考えてみました。
いろいろ方法は考えられます。いちばん安全確実なのはSSPが二系統あるPICを使う方法でしょうか。PICさえ買ってくれば手間もかからないと思います。
SSPが二系統あるPICとしてはPIC18F26K22があります。こういうのを使うとかなり多機能なものが作れます。例えば「PIC+SPI+I2C 自記温湿度計+気圧計+8ch電圧計+周波数カウンタ(技術要素一覧表)」とか。ただこの例では二系統あるSSPをI2CとSPIで使ってしまっておりI2Cのアドレス切り替えはこの記事にあるようなアナログ・スイッチで行っています。
SSPが一系統しかないとすればSCL/SDAを切り替えればいいわけですから極端な話スイッチでもいいはずです。これを自動的にやるならリレーという手もあります。じつはリレーを使う方法は考えたのですが1秒一回切り替えるとすると一日動かすと10万回くらい切り替えることになるので耐久性を考えてやめにしました。
がらくた箱をあさってみたらアナログ・スイッチ74HC4066が落ちていたのでこれを使ってデバイスを切り替える方法をやってみました。
こんな風にしました。
SCLとSDAの両方を切り替えるのがほんとだと思いますが、クロック(SCL)がなければデータのやりとりは行われないわけでSCLの方だけ切り替えてみることにしました。
試しにSCLの方は接続したままにしてSDAの方だけ切り替える方法も試してみたのですが、それでもよさそうでした。
アナログ・スイッチは文字通りスイッチで方向性はないので、こういう信号が双方向に流れるケースでも使えます。オン抵抗がかなり大きい(100Ω弱くらい?)、オフ抵抗が無限大とみなせるほど大きくはない、ということでどんなスイッチの代わりにもなるというわけでもありませんが。
RB3とRB4は"10"あるいは"01"のどちらかにします。RB3がHighなら(1/4)のアナログスイッチがOnになりMCP3425が有効になります。RB4がHighなら(2/4)の方に接続されたDS1307が有効になります。
上の図ではI2Cのバスラインから分岐する形で二つのデバイスを使うような図になっていますが、分岐先に複数のデバイスを接続するというのも可能なはずです。
この方法はいくつもあるデバイスのうちアドレスが同じになるデバイスの組がいくつあっても同じアドレスの組に含まれるデバイスが二つしかないならアナログ・スイッチは二つだけですみます。
またアナログスイッチはまだ2個余っているので同じアドレスのデバイス四つまでは使えます。MCP3425をもう一個追加しようかと思っています (^^)
切り離されたデバイスもプルアップしておいた方がよさそうです。プルアップが二箇所に入ることになるので二つ合わせて適切な抵抗値になるようにしました。
私の場合は温度センサーを魔法瓶の中にいれたりするのでI2Cバスラインがかなり長くなっており容量性になっていると思うのでで抵抗値が小さめのプルアップ抵抗を使いたいというのがあります。
今回はMCP3425やDS1307であればこの方法でうまくいくようだというだけです。どんなデバイス同士でもこれでうまくいくかどうかはわかりません。
その後MCP3425の二個使いもうまく行きました。これから実績を積んでいきます (^^)
こういう方法がI2Cの規格から考えて問題ないかどうかは検討していません。今わかっているのはこうやったら正常に動作しているように見える、ということだけです。
それからバスラインを切り替えたあとすこしウェイトした方がいいのかもしれません。
私の場合はいろんなI2Cデバイスがぶらさがっていて毎秒一回すべてのデバイスを順番にアクセスしています。同じアドレスのデバイスを連続して使わないようにしデバイスを使ったらすぐに反対側のバスに切り替えるということで時間が稼げるので特にウェイトは入れていません。
経験を積み重ねて(まずいこととか)わかったことがあったら追記します。
------
関連
「I2C大気圧センサーLPS331の驚くべき分解能」
「I2C大気圧温度センサーLPS331 - 海面更生気圧を気象庁とくらべてみた」
「I2C大気圧センサーLPS331の分解能はほんとうに高いのか?(温度編)」
「I2Cデバイス・アドレス一覧」
「PICで平方根 - 白金薄膜抵抗で温度を測る」
「PICでI2C - ADコンバーター・MCP3425の使い方」
「PICでI2C - MPL115A2の大気圧計算法」
「PICでI2C - 1 (温度計を作る)」
「PICでI2C - 液晶(LCD)ディスプレイ(ACM1602N1-FLW-FBW)に表示する」
「PICでI2C - LCD(液晶)ディスプレイによる違い」
「サーミスタによる温度測定の精度」
「サーミスタ温度計の精度を調べる - 1」
「PICで作るお手軽サーミスタ温度計」
「炭素皮膜抵抗の温度係数を測定する話」
「ミニ恒温槽の作成に向けて - 1」
「ミニ恒温槽の作成に向けて - 魔法瓶の活用」
参考
「きむ茶工房ガレージハウス - PICの動かせ方入門はこちら - 16F1938覚書」
「きむ茶工房ガレージハウス - I2C通信の実験」
「きむ茶工房ガレージハウス - 気圧センサーで大気圧と標高を測定して見ます(MPL115A1)(MPL115A2)」
以上は予習として拝見していたのですが、とても参考になります。他にも勉強になる記事が多いです。
私の記事を読んでI2Cのセンサーを使って温度計とか気圧計とかそういうものを作りたくなった方も実際に作られるときはこちらを読まれた方がいいと思います。
« PICでI2C - MPL115A2の大気圧計算法 | トップページ | 温度を一定に保つ方法 - ミニ恒温槽の作成に向けて(3) »
「趣味の電子工作」カテゴリの記事
- 24ビットバイナリーカウンター(12STAGEリップルキャリー・バイナリー・カウンター TC4040BP+SN74HC4040AP)(2015.01.24)
- 26ビット(12bit+14bit)バイナリーカウンター - SN74HC4040 + SN74HC4060(2015.08.05)
- TD62308とTD62083 - 恒温槽のヒーターの電源(2015.07.25)
- (続)TD62308とTD62083 - 恒温槽のヒーターの電源(2015.07.26)
- PICの出力ピンを増やす方法(2015.05.23)
コメント
トラックバック
この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1994983/57381298
この記事へのトラックバック一覧です: 同じアドレスのI2Cデバイスを使う:
« PICでI2C - MPL115A2の大気圧計算法 | トップページ | 温度を一定に保つ方法 - ミニ恒温槽の作成に向けて(3) »
もう普通にコンピュータ通信ですね。そのうちイーサネットみたいにコリジョンディテクトまでできるようになったりしそうな勢いです^^。
とても楽しそうです。
ところでアナログスイッチというものを使ったことが無いのですが、MOSFETでも代用できますか?
MOSFETはOn抵抗が数オームのものを持っているのですが双方向で使っていいのかどうかがわかりません(基本ができてないのがバレバレですが^^;)。
投稿: ほよほよ | 2014年9月17日 (水) 08時55分
確かにコンピュータ間通信ですね。センサーの中にもCPUが入っているわけでしょうし。
コリジョンディテクトができたらI2Cのバスライン上にマスターは一つだけ、という制約がなくなってしまいますね。
アナログ・スイッチの中がどうなっているかなんてあんまり意識していなかったので探してみました。
マキシム・ジャパンにこんな資料がありました。
http://www.maximintegrated.com/jp/app-notes/index.mvp/id/5299
原理的にはpMOSとnMOSを並列にしたもののようです。
この資料を見てもわかるのですが74HC4066は前世紀の遺物扱いのようです (^^;;
秋月で予備を買っておこうと思ったら店頭にはおいてありませんでした(販売品のリストにはあります)
安価でスイッチングが速いのでそこそこニーズはあるようなんですが....
投稿: セッピーナ | 2014年9月17日 (水) 12時55分
こんばんは
おひさでしょうか?
実は
I2Cのバスライン上にマスターは複数設置出来ます。
マルチ マスター モードと言う物が有ったりします、って実験は行っていないので
あんまり大きな声で言えないのですが......
投稿: きむしげ | 2014年9月21日 (日) 00時52分
あれ、そうなんですか (^^;;
何せPIC初心者なものなので記事(やコメ返)を書くときもっと簡単なやり方があるんじゃないだろうかといつもヒヤヒヤです。
ご指摘ありがとうございました。これからもよろしくお願いします m(._.)m
マルチマスターモードの記事を期待してます (^^)
PIC18F26K22を買ってきました (^^)v
投稿: セッピーナ | 2014年9月21日 (日) 08時29分