MPU-9150のI2Cのアドレスはどのように設定できるのか?

このQ&Aのポイント
  • MPU-9150は、8つのセンサーを1つのArduino Mega 2560に繋げることができます。
  • MPU-9150の各センサーに異なるI2Cアドレスを指定することはできるのか疑問です。
  • もし指定できない場合は、I2C Muxを使用して最大4つのMPU-9150を繋げることができます。さらに別の方法で8つのMPU-9150を繋げる方法があるのか知りたいです。
回答を見る
  • ベストアンサー

MPU-9150のI2Cのアドレス?

8つのMPU-9150を1つのArduino Mega 2560に繋げて同時に用いることを考えています。MPU-9150は: http://www.switch-science.com/catalog/1183/ です。 I2Cのアドレスを分ければ同時に繋げれるとのことらしいですが、センサーであるMPU-9150にそれぞれ異なるアドレスを指定することはできるのでしょうか? もし指定できない場合、I2C Muxの以下のような製品で4つまで繋げることを知りました: http://www.dsscircuits.com/index.php/i2c-multiplexer これは4チャンネルまでなのですが、このように別の方法で8つのMPU-9150を繋げれる方法があればそれでもいいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.3

#2補足 PCA9548Aと考え方は同じです、すでに製品化されていたとは!勉強不足です PCA9548AはI2Cコマンドで8っのI2Cバスを切り換えることが出来ますが、PCA9306はそれぞれのENにI/Oポートを繋ぎ制御するしかありません(OUTPUTポート4ヶ必要) PCA9548Aを使えれば回路が簡単になり、制御もしやすいと思います MPU-9150 2ヶを(AD0=L/AD0=H)に設定してPCA9306 3.3V側に接続 それを4組作製(3.3V側プルアップ抵抗はOFF) PCA9306 5V側は4っ束ねてArduino SDA SCLにつながります (5V側プルアップ抵抗は1っのみ有効にする) I2Cレベル変換で調べてみました、内部は単なるFETで切り換えしているようです、製作例もありました。

leime_0420
質問者

補足

PCA9306のデータシートを読んでみました。ボルテージ・レベル・トランスレータなので、(下にも書きましたが)アドレスを振り分けることは無理です。4組作製してENにI/Oポートを繋ぎ制御しても、Arduino側にとってはMPU-9150のAD0=L/AD0=Hの2つのアドレスが各4つあるだけので同時に扱うことは不可能なようです。PCA9548Aか、アドレスを分けて2つのPCA9544Aを用いれば、両者ともMuxなので出来そうです。

その他の回答 (2)

  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.2

#1補足 MPU-9150をそれぞれAD0=L/AD0=H(GNDパターンカット3.3VCC接続)設定することによりI2Cバスに2っ接続することが出来ます Arduino Mega 2560は5Vで動作してるので、MPU-9150 3.3V を接続するにはSDA,SCLのレベル相互変換が必要になります Arduino Mega 2560 3.3V電源は、50mA MAX です外部に5V→3,3Vレギュレータを設けたほうが無難 1) 内蔵I2C機能を使用しない場合 Wireライブラリは使えません、独自にライブラリを作成する必要があります 参考 http://s2jp.com/2013/01/tiny10-i2c-master/ 2) PCA9306にMPU-9150を2っ(AD0=L/AD0=H)接続 これを4組で計8ヶMPU-9150が接続でき あとはPCA9306のEN イネーブル機能でI2Cバスを切り換えて制御します (電気的に切り離されます) 3) MPU-9150はAD0のGNDへのパターンをCUTすることにより外部AD0ピンにてアドレスセレクトが可能 入力トレラントの3.3V 74VHC138で各AD0をセレクトする SDA SCL はPCA9306でレベル変換 http://www.semicon.toshiba.co.jp/contact/faq/product/logic/answer21.html http://www.marutsu.co.jp/shohin_14701/ MPU-9150はI2Cプルアップ内蔵なので、PCA9306のプルアップ機能は不要です 他に、3,3V動作のArduino mega 2560の互換ボードもあります、これならばI2C 5V-3.3Vレベル変換 3.3V電源レギュレータは不要です (5V系シールドは使用できなくなります) http://www.switch-science.com/catalog/947/

leime_0420
質問者

お礼

有難うございます。質問ばかりで恐縮です。 > 2) PCA9306にMPU-9150を2っ(AD0=L/AD0=H)接続 これを4組で計8ヶMPU-9150が接続できあとはPCA9306のEN イネーブル機能でI2Cバスを切り換えて制御します (電気的に切り離されます) MPU-9150をそれぞれAD0=L/AD0=H設定することによりI2Cバスに2つ接続することが出来ることと、PCA9306を5V→3,3Vレギュレータとして用いることは納得できました。PCA9306にMPU-9150を2つ(AD0=L/AD0=H)接続する部分がよく分かりません。まずこの4組のI2Cのアドレスをどのように振り分けれるかが疑問です。次にMPU-9150をPCA9306の3.3V側に繋げるのは理解できるのですが、もう一つは5V側に繋げるという意味でしょうか?さらに同時に使いたいのでPCA9306のENイネーブル機能でI2Cバスを切り換えていては同時使用は不可能となるのではないでしょうか? PCA9306を調べている時にたまたま見つけたのですが、むしろPCA9548Aを使って8チャンネルのI2Cを使ってはどうかと思いました...(これに関してはまだ調べている最中です)。 http://www.nxp.com/documents/data_sheet/PCA9548A.pdf よろしくお願いします。

  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.1

MPU-9150のアドレスセレクトがAD0のみなので、同一バス上に2つまで接続できます MPU-9150は3.3V電源I/Oのみなので5V系に接続する場合は信号レベルの変換が必要になりますhttp://akizukidenshi.com/download/ds/akizuki/m5452-ae-pca9306.pdf 1) 内蔵I2Cモジュール以外に、ソフトウェアでI2C信号を作成しを他のI/Oピンに接続する 2) PCA9306のEN機能でI2C信号を切り替える(プルアップ抵抗を重複させないこと 供給電圧 VREF1<VREF2) 3) MPU-9150のADOをチップセレクト信号として使用する (セレクトするチップのみADO=L 他はADO=H に設定し AD0=0 でのみI2Cアクセスを行う 但しMPU-9150が対応しているか調べる必要があります) 私的には、PCA9306を4ヶ使い順次I2C信号を切り換えてアクセスするのが良いと思います 実際に試した訳ではありません、検証は自己で願います。 https://strawberry-linux.com/catalog/items?code=12150

leime_0420
質問者

お礼

ありがとうございます。いろいろ調べてみましたが、分からない部分が出てきたのでよろしくお願いします。 >MPU-9150のアドレスセレクトがAD0のみなので、同一バス上に2つまで接続できます I2CアドレスLSB設定用はんだジャンパあり 、I2Cスレーブアドレス:初期値1101000。ジャンパーにより、1101001への切り換え可能、の部分のことでしょうか? > MPU-9150は3.3V電源I/Oのみなので5V系に接続する場合は信号レベルの変換が必要になりますhttp://akizukidenshi.com/download/ds/akizuki/m54 … Arduino Mega 2560の3.3Vから直接繋ぐことは可能でしょうか? > 1) 内蔵I2Cモジュール以外に、ソフトウェアでI2C信号を作成しを他のI/Oピンに接続する Wireライブラリを用いずに、I2CのためのNewSoftSerial(これはシリアル用)のようなライブラリを作りSCLとSDA以外でも繋げるようにする、という意味でしょうか,,,? >2) PCA9306のEN機能でI2C信号を切り替える(プルアップ抵抗を重複させないこと 供給電圧 VREF1<VREF2) この場合、2つのI2Cを同時に用いることは可能でしょうか(もし意味を取り違えていたらすみません)? > 3) MPU-9150のADOをチップセレクト信号として使用する (セレクトするチップのみADO=L 他はADO=H に設定し AD0=0 でのみI2Cアクセスを行う 但しMPU-9150が対応しているか調べる必要があります) 物理的にジャンパで切り替えなければならない場合、可能でしょうか?(アナログのロジックゲートでArduinoから選択することも少し考えたのですが) よろしくお願いします!

関連するQ&A

  • MPU-9150のI2Cアドレス

    MPU-9150のI2CアドレスをAD0=L/AD0=H、つまりGNDか3.3VCC接続に接続することによって、2つの異なる設定をしようとしています。ArduinoのスケッチでもMPU9150_I2C_ADDRESS = 0x68 か MPU9150_I2C_ADDRESS = 0x69に書き換えているのですが、AD0がGNDに繋げられ、MPU9150_I2C_ADDRESS = 0x68の時は正常に動くのですが、AD0が3.3VCCでMPU9150_I2C_ADDRESS = 0x69の際はMPU9150からデーターを受け取れません(常に全ての数値が0です)。どなたかこれに関する経験がございました、詳細を教えていただければ幸いです。よろしくお願いします。

  • I2C通信のスレーブアドレスについて

    電子回路初学者です。 I2C通信は、まず自分が (例としてマイコンが) マスターになる宣言をし、バスの所有権を得て、次に通信相手となるスレーブアドレスを指定し、データを送受信するものだと理解しています。そこで質問があります。 このスレーブアドレスとは製品固有のものなのでしょうか。 例えば、X社製のXというセンサーはスレーブアドレスが0x74である、といった具合です。 それとも、マイコンのポートxのyビット目 (SDAまたはSCL) にぶら下がっているスレーブにスレーブアドレス0x74を持たせる、といった具合に任意に決定できるのでしょうか。 実際に使用する場合の解説が見当たらず悩んでおりました。 よろしくお願い致します。

  • ArduinoのI2Cで書き込み

    Arduino(Lazurite)を用いてINA231というICとI2Cで通信するプログラムを作成しています.マスタがArduino,スレーブがINA231です. INA231のレジスタアドレスの値を読み取ることはできましたが,レジスタの値を書き換えることが出来ません. 書き込み用の関数は以下のsetINA231になります. void setINA231(char SlaveAddress,const unsigned char *WriteData,char s){ Wire.begin(); Wire.beginTransmission(SlaveAddress); Wire.write(WriteData,s); Serial.write_byte(Wire.endTransmission(true)); } 上記関数を使用して,例えばスレーブアドレス0x40のレジスタアドレス0x00の値を0x4227に書き換えるように値を設定して関数を実行したところ,添付図の波形を取得出来,問題なく通信出来ているように感じます. どのようにすればI2Cでスレーブデバイスの値を書き換えることが出来ますでしょうか?何卒ご教授よろしくお願い致します.

  • 82c930,82c931と表示されるサウンドドライバの設定のしかたを教えてください。

    サウンドのドライバ(82c930,82c931と表示)を入れたいのですが設定の仕方がわかりません。 I/O AddressやIRQやDMA Play/Rec ChannetやMPU-401 configrationなどの表示が出るのですが、 どのように設定すれば使えるようになるのでしょうか?どなたか詳しく教えていただけませんか。 もしくは詳しく説明されたさいとを教えていただけませんか?

  • 82c930,82c931と表示されるサウンドドライバの設定のしかたを教えてください。

    サウンドのドライバ(82c930,82c931と表示)を入れたいのですが設定の仕方がわかりません。 I/O AddressやIRQやDMA Play/Rec ChannetやMPU-401 configrationなどの表示が出るのですが、 どのように設定すれば使えるようになるのでしょうか?どなたか詳しく教えていただけませんか。 もしくは詳しく説明されたさいとを教えていただけませんか? OS:XP

  • I2CでZJM162A というLCDを稼働できない

    複数のLCDをPICでI2Cインターフェースで表示用に使用しようとしています。 I2Cを使わず、パラレルで繋ぐと問題なく表示します。 コネクタで簡単に別なLCDと交換できるようになっており バックライトありの1602Aや2004Aから差替えても表示すべき内容が表示されます。 I2C環境下も同じ初期化で命令で1602Aや2004Aは問題ありません。 しかし、ZJM162A では2ライン設定しているにもかかわらず、1行で文字化けします。 タイミングを変更してテストしても、ZJM162A だけは初期化で指定した通りにならず、文字も 0x?F のコードしか表示しません。 4bitモード/2Lines/5x8dotで初期化しているだけです。 LiquidCrystal_I2Cのソースを参考に初期化手順は全く同じにしても ZJM162A だけは1行モード/文字化けで表示します。 MPLAB IDE v8.63 PIC16F1938 ZJM162A/I2Cカード I2Cカード http://ht-deko.com/arduino/pic/i2c_lcd_03.jpg LCD http://www.aitendo.com/data/aitendo/_/70726f647563742f32303132303730345f3061633864372e6a7067003235300000660066.jpg よろしくお願いします。

  • arduinoで同じセンサーを2つ使いたい

    I2C通信で、同じセンサーを2つ使ってやりたいことがあります。 このような場合、片方のセンサーのアドレスを変えるのでしょうか? また、センサーのアドレスを変えるにはどうしたらよいでしょうか? 素人のため、スケッチを教えてほしいです。 使用するセンサーは下記方位センサーです。 <http://www.parallax.com/product/29133> よろしくお願いいたします

  • 指定アドレスのブロック

    とあるサイトを開いたときに同時に開けてしまう宣伝などをブロックする方法を教えていただけませんか。 例えばその宣伝サイトのアドレスを指定してブロック出来たり。 よろしくお願いします。

  • メールアドレスを変更

    softbankのiPhone 4Sを使っていますメールアドレスを変更したいと思っています。 MySoftBankのサイトで「@softbank.ne.jp」の方はメールアドレスを変更できたのですが 「@i.softbank.jp」と「@me.com」の変更方法はどこでするんのでしょうか? ちなみにAppleIDも作っています。「@me.com」で使用中です どうしてもMySoftBankのサイトで「@i.softbank.jp」と「@me.com」の変更方法が見つからないので教えてください。

  • PIC C Liteを使い加速度センサの値を読む

    始めまして。 最近PICの勉強を始めました。 ADWINのキットを買い、後閑さんの本を読んでいる最中ですが、質門があります。 【Kionix社の加速度センサ「KXP84-2050」を使い、その値を取り込むにはどうすればいいのでしょうか。】 学生時代にC言語を少し触っており簡単な気持ちで始めたら、大変なことになりました。 PC内部だけでプログラムするのとは分けが違い、途方に暮れています。 どうか、皆様のお力をお借りしたいです。 以下、質問の詳細です。 1.X軸の信号値を8個のLEDで8bitデータに見立てて表示しようと考えています。   センサを傾けると、 秋月電子でセンサーのモジュールを買いました。   私の理解では   ・あるポートのレジスタ(ここではRB0とします)をまずは入力ポートにする   ・センサーからの値を代入する   ・その値をLEDに出力する  です。 ここで、センサーの仕様書にはレジスタネーム「XOUT_H」のアドレスは0x00であり、これはMSBで送られてくる。(8bitデータ)I2Cでのデータ送受信時 センサ側のデータをどう受信して、値を格納すればいいのでしょうか? センサ側のアドレスを指定する? などがADWINの入門書ではまったく無いので・・・ PIC側とセンサー側のやり取りが分からず困っています。 シリアルでデータがくるので、8bitデータをもらうのには8回ループをまわして、別に定義した変数にセンサデータを入れればいいのでしょうか? センサーとPICを繋ぐ線は1つですので、シリアルデータの扱い方がわかりません。 PIC側で、 char X_data[8]のような配列を定義し を定義し、 そこに X_data[i]=XOUT_H[i]そして出力でしょうか? 私なりに、ネットも調べたのですが分からずじまいでした。 よろしくお願いします。 乱文申し訳ございません。