« PICでI2C - MPL115A2の大気圧計算法 | トップページ | 温度を一定に保つ方法 - ミニ恒温槽の作成に向けて(3) »

2014年9月15日 (月)

同じアドレスのI2Cデバイスを使う

この記事ではアナログスイッチ2個を使ってI2Cバスの切り替えを行っています。現在は74HC4066を2個使って4系統のI2Cバスを切り替えています。16bitADコンバータMCP3425を4個使うのに必要だったので (^^;;

じつはI2Cの切り替えについてはPCA9547Dという専用のICがあるそうです。これは16個のアナログスイッチを使って8チャンネルのI2Cバスを切り替える機能があります。28ピンとピン数が多いですが74HC4066を使って8チャンネルを切り替えようとするとSCLの方は切り替えないとしても4066を4個、さらに3to8ラインデコーダが必要でトータル72ピンくらいになります。

I2Cが3系統以上必要だったらPCA9547Dの方がずっと使いやすい(楽)と思います。ただ1.27mmピッチなので変換基板は必須でしょう。

PCA9547は
きむしげさんが製作(実験)記事を書かれています。

  「
きむ茶工房ガレージハウス - I2C通信の実験  - 《PCA9547D-I2Cマルチプレクサー(I2Cバス切換器)》  」

--------

同じアドレスのものが二つだけならSSPが二個あるPIC18F26K22を使うという手もあります。SSPはI2CとSPIの切り替えができるようなのでこの手を使ってもSPIデバイスは使えそうです。一つのSSPをI2CとSPIに使って例があります。

  ほよほよのブログ - 超高精度リアルタイムクロックDS3234Sを動かす

--------------------

温度とか気圧とか湿度とか測ってそのデータを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が落ちていたのでこれを使ってデバイスを切り替える方法をやってみました。

こんな風にしました。
Sameaddress

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デバイスがぶらさがっていて毎秒一回すべてのデバイスを順番にアクセスしています。同じアドレスのデバイスを連続して使わないようにしデバイスを使ったらすぐに反対側のバスに切り替えるということで時間が稼げるので特にウェイトは入れていません。

経験を積み重ねて(まずいこととか)わかったことがあったら追記します。

さらにMCP3425 の四個使いも問題ありませんでした。いろいろ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) »

趣味の電子工作」カテゴリの記事

コメント

もう普通にコンピュータ通信ですね。そのうちイーサネットみたいにコリジョンディテクトまでできるようになったりしそうな勢いです^^。
とても楽しそうです。
ところでアナログスイッチというものを使ったことが無いのですが、MOSFETでも代用できますか?
MOSFETはOn抵抗が数オームのものを持っているのですが双方向で使っていいのかどうかがわかりません(基本ができてないのがバレバレですが^^;)。

確かにコンピュータ間通信ですね。センサーの中にもCPUが入っているわけでしょうし。
コリジョンディテクトができたらI2Cのバスライン上にマスターは一つだけ、という制約がなくなってしまいますね。

アナログ・スイッチの中がどうなっているかなんてあんまり意識していなかったので探してみました。
マキシム・ジャパンにこんな資料がありました。
http://www.maximintegrated.com/jp/app-notes/index.mvp/id/5299
原理的にはpMOSとnMOSを並列にしたもののようです。
この資料を見てもわかるのですが74HC4066は前世紀の遺物扱いのようです (^^;;
秋月で予備を買っておこうと思ったら店頭にはおいてありませんでした(販売品のリストにはあります)
安価でスイッチングが速いのでそこそこニーズはあるようなんですが....

こんばんは
おひさでしょうか?
実は
I2Cのバスライン上にマスターは複数設置出来ます。
マルチ マスター モードと言う物が有ったりします、って実験は行っていないので
あんまり大きな声で言えないのですが......

あれ、そうなんですか (^^;;
何せPIC初心者なものなので記事(やコメ返)を書くときもっと簡単なやり方があるんじゃないだろうかといつもヒヤヒヤです。
ご指摘ありがとうございました。これからもよろしくお願いします m(._.)m
マルチマスターモードの記事を期待してます (^^)

PIC18F26K22を買ってきました (^^)v

おはようございます

”PCA9547D-I2Cマルチプレクサー”の記事を追加しました。
これは8チャンネルのI2Cバスを切り換えてくれるもので、
アドレスの重複や、プルアップ抵抗の調整や、電圧レベル変換等に
役立ちます。
操作もとっても簡単で、重宝しそうな一品です。
お暇な時にでもお立ち寄り下さい。

わざわざお知らせいただきありがとうございます m(._.)m
誰でも必要そうな機能はやっぱり専用ICがあるんですね。
I2Cは74HC4066で4系統まで増設してしまったのでなんだか損したような気分です (^^;;
PCA9547Dのことは記事に追記しておきました。

PICであれこれ自作をやり出してから、参考に拝見させて頂いている者です。
一番最初はPICのDACを使った正弦波発生回路からですが、その後も非常に役立つ内容を掲載されており大変重宝させて頂いています。
自分も勉強した知識などをブログで出していけたらと思いますが、結構エネルギーが必要な作業になりまともに公開出来る状況には至っておりません。
このたびもPICで4つのI2CでドライブするDACを動かそうと回路を作り始めて秋月で買ったDACって全部同じアドレス(MCP4726)だと気付いて大急ぎでアナログスイッチを追加してこれからプログラムを作るところです。
アナログスイッチが思いのほかスイッチング速度が速いので自分の目的だと特に問題なく作れるはずだと期待してます。

コメントありがとうございます。お役に立てるところがあれば幸いです。
I2Cデバイスの切り替えについは記事の冒頭に書いたようにPCA9547Dというのがあるので
これも検討されたらいいと思います。
なお、私は汎用性があるアナログスイッチを利用することが多かったのですが、
アナログスイッチはメーカー・型番によって耐圧などスペックがかなり違うので
そのあたりに配慮が必要でしょうか。

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 同じアドレスのI2Cデバイスを使う:

« PICでI2C - MPL115A2の大気圧計算法 | トップページ | 温度を一定に保つ方法 - ミニ恒温槽の作成に向けて(3) »

フォト

サイト内検索

  • 記事を探されるんでしたらこれがいちばん早くて確実です。私も使ってます (^^;; 検索窓が表示されるのにちょっと時間がかかるのはどうにかしてほしいです。

新着記事

リンク元別アクセス数

  • (アクセス元≒リンク元、原則PCのみ・ドメイン別、サイト内等除く)

人気記事ランキング

  • (原則PCのみ、直近2週間)
無料ブログはココログ