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

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

詳細はこちら
GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

Arduino

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

Q&A

解決済

3回答

3070閲覧

6軸センサとGPSモジュールを統合するとI2C通信ができなくなる(Arduino nano)

退会済みユーザー

退会済みユーザー

総合スコア0

GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

Arduino

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

0グッド

1クリップ

投稿2019/11/12 07:30

編集2019/11/15 09:12

前提・実現したいこと

arduino nanoを用いて6軸センサ(MPU6050)とGPSモジュールの統合制御をI2C通信で行いたいです。

発生している問題

6軸センサとGPSを配線すると6軸センサもGPSモジュールも動作しなくなります。

該当のソースコード

とりあえず6軸センサとGPSモジュールを配線した状態で6軸センサが動作するようにしたいため、
6軸センサ単体のプログラムになっています。

#include<Wire.h> #include<math.h> #define MPU_addr 0x68 int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(); Serial.begin(9600); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); Wire.endTransmission(); Wire.requestFrom(MPU_addr,14); AcX=Wire.read()<<8|Wire.read(); AcY=Wire.read()<<8|Wire.read(); AcZ=Wire.read()<<8|Wire.read(); Tmp=Wire.read()<<8|Wire.read(); GyX=Wire.read()<<8|Wire.read(); GyY=Wire.read()<<8|Wire.read(); GyZ=Wire.read()<<8|Wire.read(); Serial.print("AcX=");Serial.println(AcX); Serial.print("AcY=");Serial.println(AcY); Serial.print("AcZ=");Serial.println(AcZ); Serial.print(" | Tmp = "); Serial.println(Tmp/340.00+36.53); Serial.print("GyX=");Serial.println(GyX); Serial.print("GyY=");Serial.println(GyY); Serial.print("GyZ=");Serial.println(GyZ); delay(100); }
arduino言語

試したこと

・2つのセンサ共に給電電圧が3.3V以上になっていることを確認しました。
・6軸センサ単体での制御は正常であることを確認しました。
・GPSモジュール単体での制御は正常であることを確認しました。
・6軸センサとGPSを同時に制御した時、6軸センサの信号が出力されなくなります。オシロスコープ
で確認したところ、3.3Vのフラットラインを確認しました。
・例えば方位センサや高度計などと統合制御した場合は6軸センサ、GPSはそれぞれ正常に動作することを確認しました。6軸センサとGPSの組み合わせだけが上手く統合制御できていない状況です。

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

センサモジュールは以下を使用しています。
6軸センサ:https://www.switch-science.com/catalog/1208/
GPSモジュール:https://www.switch-science.com/catalog/3540/

私はI2Cのバスが競合しているのではないかと考えているのですがどのようなプログラムを書けばいいかなど、具体的な解決方法が分かりません。よろしくお願いします。

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

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

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

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

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

y_waiwai

2019/11/12 07:47

で、GPSモジュール単体では動作させることはできるんでしょうか
退会済みユーザー

退会済みユーザー

2019/11/12 07:51

GPS単体では動作させることができます。
y_waiwai

2019/11/12 07:56

なら問題はないはずですが、、 I2Cの2本の線にプルアップ抵抗(4.7Kぐらい?)つけてやってみてはどうでしょう
退会済みユーザー

退会済みユーザー

2019/11/12 08:36

訂正がありましたので確認お願いします。申し訳ありません。
y_waiwai

2019/11/12 09:19

両方つないでおいて、片方だけ動かすコードだと動きますか?
退会済みユーザー

退会済みユーザー

2019/11/12 11:11

上のソースコードのように6軸だけを動かすプログラムでも動きません。 GPSも同様です。
coco_bauer

2019/11/14 07:51

GPSモジュールを外して、6軸加速度センサだけをI2Cに接続したら、どうなりますか?
退会済みユーザー

退会済みユーザー

2019/11/14 07:59

6軸加速度センサのみをi2cに接続 している場合は動作します。
guest

回答3

0

回路図があるといいのですが、i2cのラインをレベル変換していないのではないでしょうか。
nanoは多分5vで相手側が3.3v、1個だけだと何とかhigh側を認識するけど、2個つないだらnano側がhigh認識しないとかでは。

投稿2019/11/21 01:26

ta.fu

総合スコア1722

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

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

退会済みユーザー

退会済みユーザー

2019/11/21 09:25

ありがとうございます。 i2cラインの電圧を確認したところ、3.3Vでした。(arduino nano)
ta.fu

2019/11/21 12:40

電圧を測るというのではなく、3.3v-5vのロジックレベル変換をしているかどうかなのですが。 nanoは5v駆動のはずなのでロジックレベル変換していないとi2cのVIH(min)が0.7Vccなのでスレーブ側の3.3vのVohだとギリギリなんじゃないかと思ったのです。 それとも3.3v駆動のnanoがあるのだろうか。
退会済みユーザー

退会済みユーザー

2019/11/22 06:28

ありがとうございます。電圧の事かと思い込んでしまっていました。 確かにレベル変換は行っていないので確認してみたいと思います。 ちなみに他のセンサの組み合わせはレベル変換なしでも動作するのですが、そういうことも あるのでしょうか?
ta.fu

2019/11/22 07:55

上に書いた通り、nanoに乗っているATmega328Pのi2cはVIH(min)はVcc*0.7なのでVccが5vの場合は最低3.5vでhigh認識することになっています。(ただピン共通のDC特性はVcc*0.6になっている) 例えばmpu-6050だと0.9*VLOGICとなっているので3.3v駆動だと最低2.97で足りないようですが、たまたま動くような電圧になっていたのでないでしょうか。
guest

0

#define MPU_addr 0x68

と定義されていて

プログラムのsetup()の中と、loopの中で

Wire.beginTransmission(MPU_addr);

というように同じスレーブアドレスへの送信を始めています。

これで、どちらか一方のセンサを接続した場合に正常に動作するという事は、両方のセンサーのスレーブアドレスが0x68であるとしか考えられません。

投稿2019/11/21 04:31

coco_bauer

総合スコア6915

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

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

退会済みユーザー

退会済みユーザー

2019/11/21 09:26

ありがとうございます。 6軸センサのセンサアドレスを変更することができるため試してみましたが、 変化はありませんでした。
guest

0

ベストアンサー

  • お互いスレーブアドレスは違うんですよね?

スレーブアドレスが同じ場合はどうあがいても同じラインにつないで動かすことはできません

  • 双方のセンサとも、電源は3.3Vのようですが、電源はどうしてるでしょうか。

Arduinoから出ている3.3Vでは電流容量が足りない可能性があります
べつに3.3の電源を用意して、双方のセンサをそれでつないでみましょう

  • 片方だけでは動いて両方では動かない、というのは、まずプルアップ抵抗が大きすぎるため、じゅうぶんにHiレベルに引き上げれない事が考えられます

ということで、I2Cの2本の線と3.3Vの間に数キロオームの抵抗を入れてやってみることでしょう

回路図、配線が間違っていない、プログラムが間違っていないという前提ですが、これでどうでしょうか

投稿2019/11/12 11:32

y_waiwai

総合スコア88038

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

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

退会済みユーザー

退会済みユーザー

2019/11/13 09:38

・スレーブアドレスは違います。試しに6軸センサの方のアドレスを変更してみましたが、それでも動きませんでした。 ・電源も別で用意してみましたが動きませんでした。 ・Arduino内部のプルアップを無効にし、外部で4.7kΩの抵抗を入れプルアップしましたが、動きませんでした。
y_waiwai

2019/11/13 09:58

それで動かないとなると、配線が間違ってるかコードが間違ってるかですね
y_waiwai

2019/11/13 09:59

あとはオシロを用意して、I2Cの信号波形を確認していく、ってことでしょうか
退会済みユーザー

退会済みユーザー

2019/11/15 06:38

6軸センサgpsともにプルアップ抵抗が内蔵されていたため、外付けのプルアップ抵抗を取り除いてみましたがそれでも動きません。 6軸センサのみを配線した状態で、GPSのSDA、SCLどちらかの線のみが配線されている場合は6軸センサは正常に動作するのですが、SDA、SCL両方の線を配線すると6軸センサが動作しなくなります。 オシロスコープで波形を見ているのですが、どこを見れば原因がわかるでしょうか..?
y_waiwai

2019/11/15 06:42

SCL,SDAのラインを見て、最小のコマンドを送ってみます それで、SDAとSCLのラインのレベルが中途半端になってたり変な波形になってないか見てください。 送受信しているデータ通りの波形になってるか見てみることです
y_waiwai

2019/11/15 09:20

フラットラインを確認って、要するに0Vになったってことかな? どー考えても、双方つないだときに配線を間違えてGNDとショートしてしまっているとしか思えない。 電源落として、テスターで信号ラインとGNDと導通チェックしてみれ。
退会済みユーザー

退会済みユーザー

2019/11/19 09:08

オシロスコープで確認したところ、3.3Vのフラットラインになっているため、ショートはしていないと思います。
y_waiwai

2019/11/19 09:11

なら、3.3Vの電源とショートしてないかチェックしてみる。 まあ、配線間違い、というのははっきりしてますね
退会済みユーザー

退会済みユーザー

2019/11/21 09:36

何度も確認していただきありがとうございます。 配線の確認をもう一度行いたいと思います。それでも上手くいかなければ配線図も載せる予定ですので、 その時はよろしければまた確認よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問