前提・実現したいこと
センサモジュールを,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/ツールのバージョンなど)
- 開発環境 PlatformIO/VSCode
- Arduino Uno R3
- LSM9DS1使用9軸センサモジュール
- 使用ライブラリ
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2022/02/05 06:58