🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

2回答

2559閲覧

ArduinoのI2Cで読み取ったセンサ値を別のArduinoへ送信したい

MashT

総合スコア4

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2019/11/07 14:40

編集2019/11/07 14:47

前提・実現したいこと

Arduino初心者です.

Arduino複数台(Due1台,Uno1台,nano every2台)を用いて,圧力変動を測定するシステムを作ろうとしています.
計測は同じ種類の圧力センサ(MS5837-02BA)を4つ使用しており,I2C通信にてそれぞれのArduinoに計測値を返すようになっています.
ここで得られた数値を,代替ピン(A4,A5ピン)を用いたI2C通信でDueにまとめるようなシステムにしたいのですが,以下のような問題に直面しています.

発生している問題・エラーメッセージ

センサとArduino間の通信のためにWireライブラリが使用されており,Arduinoがマスター,センサがスレーブという関係で通信が行われています.
そのため,それぞれのArduino子機からDueにI2Cを用いて送信しようとすると,こちらでもWireライブラリが必要となってしまう上,Dueがマスター,その他子機がスレーブという関係性になってしまいます.
Dueに関してはWireライブラリによってセンシング,Wire1ライブラリでrequestFromなど呼び出し処理を行うため競合はしないのですが,その他Arduino子機ではWireライブラリが一つしかないので2種以上のI2C通信ができないです.

試したこと

Arduino子機にて,最初はWire.begin()でマスターとして通信を行いデータを取得し,
データの取得が終わったらWire.begin(8)などでスレーブアドレスを設定しました.
DueからはWire1.requestFrom(8,4)などで呼び出し,子機はデータを返す,送信が終わったら再びWire.begin()でセンサに対してマスターになる・・・というプログラムを書いてみたのですが,
実際の挙動では子機は常にマスターとなったままで,Dueで値を呼び出すことができませんでした.

このようなマスターとスレーブの切り替えはそもそも仕組みとしてできなかったりするのでしょうか?もしくはプログラムの考え方が未熟なだけなのでしょうか?

Arduinoの操作もこのサイトでの質問も慣れていないため,乱文ご容赦ください.
WireライブラリやArduino間I2Cの使用にはこだわっていないので,もし別でよりスマートな方法がございましたらそちらも検討させていただきます.

なにとぞよろしくお願いします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

PCA9547 8-channel I2C-bus multiplexer
等で I2Cバス を切り替える方法もあります
( 異なる電圧のI2Cデバイス接続可 )
PCA9547 はI2Cデバイスとして認識されるのでI2CコマンドでI2Cバスを選択します

「PCA9547 arduino」で調べてみて下さい

秋月 PCA9547

投稿2019/11/08 00:36

編集2019/11/08 00:43
koujikuu

総合スコア401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

複数のCPUの通信にI2Cは使えません。別の方法を探しましょう

I2Cのラインに複数のセンサをつないで、一つのCPUで済ますのはダメなんでしょうか
#こっちは実現可能

投稿2019/11/07 15:44

編集2019/11/07 15:45
y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MashT

2019/11/07 15:52

回答ありがとうございます。 ご提案いただいた方法も以前試そうとしたのですが、センサのスレーブアドレスが同一で変更することができず、4つを区別して値を取得することができなかったため、多少強引でもCPUを増やしてとにかく計測してしまおうという形式にしました。
y_waiwai

2019/11/07 15:58

ならWireライブラリを使わないで、ソフトウエアI2Cを実装しましょう。 そうすればGPIOのピンの数だけI2Cポートが作れます 複数のCPUを通信させようとするよりずっと簡単で現実的です おそらく、センサのマニュアルにI2Cの通信フォーマットが載ってると思います この通りに、GPIOを操作していけばいいです
y_waiwai

2019/11/07 16:01

ぐぐったらSoftWireってのあるぢゃんw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問