- 前提・実現したいこと
Arduinoの、1つのI2Cバスに
複数のスレーブデバイスを接続しようとしています。
実現したいこととしては、I2Cのバスに接続されているスレーブデバイスの素性をマスター側で自動的に検出し、
スレーブデバイスに合わせて動的に通信フォーマットを変更することです。
Arduinoの2つのI2Cバス、I2Cバス1・I2Cバス2を使用するものとし、
I2Cバス1に、スレーブデバイスA・スレーブデバイスB・スレーブデバイスC・スレーブデバイスD
I2Cバス2に、スレーブデバイスE・スレーブデバイスF・スレーブデバイスG・スレーブデバイスH
がつながる場合と、
I2Cバス1に、スレーブデバイスE・スレーブデバイスB・スレーブデバイスC・スレーブデバイスD
I2Cバス2に、スレーブデバイスA・スレーブデバイスF・スレーブデバイスG・スレーブデバイスH
がつながる場合があります。
スレーブデバイスA~Hは、すべて仕様の全く異なるスレーブデバイスですが、
スレーブデバイスA・スレーブデバイスEのスレーブアドレスが重複しており、
アドレス重複は回避できないものとします(重複回避方法があることは知っていますが、それができない前提です)。
- 発生している問題・エラーメッセージ
すぐに思いつくのは、
【方法1】
- I2Cバスに、アドレス0~127までのスレーブに対してスタートコンディションを送信する。
- ACK応答のあったアドレスのスレーブデバイスが接続されていると判断する。
- マスターでアドレスからスレーブデバイスの素性を判断する
- つながっているスレーブデバイスに合わせた通信フォーマットで、スレーブデバイスと通信を行う
のようなものですが、
スレーブデバイスA・スレーブデバイスEのような
スレーブアドレスが全く同じ、通信フォーマットの異なるセンサーがつながる場合があるため
この方法は使えません。
また、スレーブアドレスとスレーブデバイスの素性を対応づける方法だと
スレーブアドレスが同じ、素性の異なるスレーブデバイスが存在してはならないため
112種類のスレーブデバイスしか接続候補になることができず、拡張性に問題があります。
- 自分で調べたことや試したこと
【方法1】で、つながっているスレーブデバイスのアドレスを特定することで、
スレーブデバイスA・スレーブデバイスEのどちらかがつながっていることまでは特定できます。
ここからさらに、スレーブデバイスA・スレーブデバイスEと実際に通信を試みて、
ACK応答があったデバイスが実際につながっていると判断する方法を考えています。
ただし、スレーブデバイスA・スレーブデバイスEの通信フォーマットが異なることが
前提条件となります。
まだ考えている段階で、これから設計・実装をしていこうと考えているのですが、
私の考えている案は、現実的でしょうか?
一般的には、このような問題はどうやって解決されているのでしょうか?
ご助言いただければ、幸いです。
宜しくお願い致します。

回答3件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/02/12 15:16
2022/02/13 23:12