質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

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

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

2回答

12594閲覧

ArduinoにI2Cモジュールを複数接続すると読み取り出来ない

退会済みユーザー

退会済みユーザー

総合スコア0

Arduino

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

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

1クリップ

投稿2022/01/27 13:40

前提・実現したいこと

センサモジュールを,Arduino Unoの5V,GND,SCL,SDAに並列になる様に2つ接続してデータを読もうとすると,上手くいきません.

アドレスの重複はありません.
1つのセンサーモジュール(LSM9DS1)には,それぞれ別々のアドレスを持った「加速度・ジャイロセンサ」及び「地磁気センサ」が搭載された様なものとなっていますが,それぞれ別アドレスに変更出来ます.つまり,通信対象のアドレスが4つ存在する状態です.

各モジュールを単体で接続する場合,動作は正常です.

ソースコード

1つ目のモジュールの「加速度・ジャイロ」と通信後,2つ目のモジュールの「加速度・ジャイロ」と通信する事を繰り返すプログラムです.

cpp

1#include <Arduino.h> 2#include <Wire.h> 3#include <SPI.h> 4 5#define LSM9DS1_AG_2 0x6A 6#define LSM9DS1_AG_1 0x6B 7#define LSM9DS1_M_2 0x1C 8#define LSM9DS1_M_1 0x1E 9 10void setup() 11{ 12 Serial.begin(115200); 13 Wire.begin(); 14 Wire.setClock(400000L); // default fSCL = 100kHz 15 16} 17void loop() 18{ 19 uint8_t data; // `data` will store the register data 20 Serial.println("test"); 21 22 // 1つめのモジュールの「加速度・ジャイロ」と通信 23 Wire.beginTransmission(LSM9DS1_AG_1); 24 Serial.println("beginTransmission"); 25 Wire.write(0x0F); 26 Serial.println("write"); 27 Wire.endTransmission(false); 28 Serial.println("endTransmission"); 29 Wire.requestFrom(LSM9DS1_AG_1, 1); 30 Serial.println("requestFrom"); 31 data = Wire.read(); 32 Serial.println(data,BIN); 33 34 // 2つめのモジュールの「加速度・ジャイロ」と通信 35 Wire.beginTransmission(LSM9DS1_AG_2); 36 Serial.println("beginTransmission"); 37 Wire.write(0x0F); 38 Serial.println("write"); 39 Wire.endTransmission(false); 40 Serial.println("endTransmission"); 41 Wire.requestFrom(LSM9DS1_AG_2, 1); 42 Serial.println("requestFrom"); 43 data = Wire.read(); 44 Serial.println(data,BIN); 45}

出力は,以下の様に,途中で停止してしまいます.時々,数ループ動作してから停止する事もあります.

test beginTransmission write

試したこと

上記のプログラムですが,モニター中に片方のモジュールのSDA/SCLを取り外すと,途端に元気良く動き始めます.

また,単体で接続した状態で,同一モジュール中にあるがそれぞれ別々のアドレスを持つ,「加速度・ジャイロセンサ」と通信し,「地磁気センサ」と通信する場合も,問題ありません.

また,ソフトウェアI2Cのライブラリでの通信も試みましたが,これも問題無く動作しました.
bitbank2/BitBang_I2C

  • ソフトウェアI2Cで,SCL/SDAを2系統作成し,それぞれにモジュールを単体接続して通信すると問題は起こりません.
  • ソフトウェアI2Cで,SCL/SDAを1系統作成し,これに2モジュールを並列接続して通信すると,問題は起こりません.

???

自分としてはハード的な問題かなと思います.
2Cで複数接続する事について調べてみると,SDA/SCLバスにそれぞれ1つずつPU抵抗を付けている様な図を見ます.
今回使用するモジュールでは,既にモジュール側にPU抵抗が組み込まれているので,これをそのまま並列接続すると抵抗の具合が不適切になっているのかもしれないと考えています.(回路図に不慣れなので詳しい電圧計算は未検討です…)
(でも,それだとソフトウェアI2Cで上手くいくのは何故…?と思います.)

モジュール回路図は以下の様になります.
センサモジュール回路図

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答2

0

ベストアンサー

I2C通信はオープンコレクタで駆動するために、プルアップ抵抗が必ず必要になります
複数のデバイスを接続したときに、プルアップ抵抗が低くなりすぎてドライブしきれなくなる、というのは十分考えられますが、回路図の10KΩ程度であれば、2つや3つ重なったところで、大した影響はありません

それよりも、配線がいたずらに長くなっていたり、SCLとSDAのラインの長さが不均衡になってたりしませんか
I2CはSCLのエッジで駆動するため、ここでリンギングが起こったりすると破綻します

そういうハードウエアを絡めた工作をする場合は、信号波形が見れるようにオシロスコープを用意しましょう。
推測に推測を重ねて、間違った理解をしてしまってはどうしようもありません
#実際、Webの工作記事を見ているとそういう間違った理解のものが少なからずあったりします

投稿2022/01/27 22:47

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2022/02/05 06:58

ご回答頂きありがとうございます. 先日オシロで覗いてみましたが,波形がかなりガタガタになっていました. ケーブルが30cm近くあり,これによる寄生容量が原因かなと思っています. 配線長,通信速度が必要であるという事情もあり,RCの影響について試行錯誤する必要が無いSPI通信の方を採用する事にします.
guest

0

質問した矢先,モジュール購入先のQnAで関連項目を見つけました…
やっぱりPU抵抗調節の必要があったみたいです.

FAQ詳細 秋月電子通商-電子部品・ネット通販 (akizukidenshi.com)

【質問】 同一I2Cバス上に複数のモジュールを接続すると動作が不安定になります。

【回答】 各モジュール上にプルアップ抵抗が搭載されている場合は該当する抵抗器をはんだゴテを使用して取り除き、外部にて接続するモジュールの数や仕様に合わせた適切なプルアップ処理を行ってください。
なお、モジュールに因ってはプルアップ設定用のジャンパパッドが用意されている場合があります(この場合、抵抗器を取り除く必要はありません)。
その際は、該当するジャンパをオープン(未接続)として無効としてください。

搭載されているデバイスに因っては、プルアップ抵抗の抵抗値を下げる(プルアップを強くする)と信号ピンの駆動能力を超えてしまい、正しく通信ができない場合があります。
その際は、I2Cバスリピータ(PCA9515等)の使用をご検討ください。

投稿2022/01/27 13:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問