i2cの仕様について

106 views
Skip to first unread message

tonny

unread,
Dec 23, 2010, 9:29:26 AM12/23/10
to funnel-dev-talk-ja
初めまして、チンと申します。

processing.funnel.i2cの下にADXL345に関するクラスを追加しようと存じますが、ながながio.sendSysexというメ
ソッドに迷っております。
例えば、ADXL345の場合、arduinoで次のように起動させることができます。

Wire.beginTransmission(0x53);
Wire.send(0x2D);
Wire.send(8); //measuring enable
Wire.endTransmission();

これに対して、

byte[] nu = {COM_I2C_REQUEST,COM_WRITE,0x53,0x2D,0x08};
という書き方が正しいでございますか。

また、データを取得する際には、arduinoで

Wire.requestFrom(ADXAddress,2);
...
X0 = Wire.receive();
X1 = Wire.receive();
...

に対して、

byte[] xu = {COM_I2C_REQUEST,COM_READ,0x53,,0x02};
の方は正しいでございますか。

遠藤先生のソースを勝手に参照して作ったものなんですが、勉強不足のせいでうまくいけなかったです。。

ぜひ皆さんご指導賜りますようお願いいたします。

takanori endo

unread,
Dec 23, 2010, 8:56:19 PM12/23/10
to funnel-de...@googlegroups.com
この件に関して
以下のように回答しました

ProcessingライブラリのI2C周りは突貫でつくったので自分でも分かりづらい
のちのち直していきたいです

遠藤孝則

cessingライブラリ担当の遠藤と申します
ADXL345を実際に持っていないので、データシートを見る限りですが、

> Wire.beginTransmission(0x53);
> Wire.send(0x2D);
> Wire.send(8); //measuring enable
> Wire.endTransmission();

は正しいと思います。

データを取得する際は、
データシートには、軸の値はレジスタ0x32から0x37とありますので
0x32から6バイト読み出す必要があります

byte[] bu = {COM_I2C_REQUEST,COM_READ,0x32,0x06};

となると思います
読みだした値はreceiveData()関数内で参照できますので、

public void receiveData(int regAddress,byte[] data){
switch(regAddress){
case 0x32:
x = (((int)data[1]) << 8) | data[0];
y = (((int)data[3])<< 8) | data[2];
z = (((int)data[5]) << 8) | data[4];

}
}

という感じになると思います
コードは実際に動作を確認してませんので注意してください


遠藤孝則

2010年12月23日23:29 tonny <tonn...@gmail.com>:

> --
> このメールは Google グループのグループ「funnel-dev-talk-ja」の登録者に送られています。
> このグループに投稿するには、funnel-de...@googlegroups.com にメールを送信してください。
> このグループから退会するには、funnel-dev-talk...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/funnel-dev-talk-ja?hl=ja からこのグループにアクセスしてください。
>
>

--
endo takanori

tonny

unread,
Dec 24, 2010, 10:28:46 AM12/24/10
to funnel-dev-talk-ja
遠藤先生

早速ご回答いただきまして、ありがとうございます。

ご添付いただいたソースを拝見した上で、実行してみますが、データが取得していなかったです。(data[0]からdata[5]までは全部0です)

もう一回データシートを読みますと、9ページ目のところで(http://www.sparkfun.com/datasheets/Sensors/
Accelerometer/ADXL345.pdf)Figure 9. I2C Device Addressingという図がありました。この図
によりますと、データを取得する際には、まずREGISTER ADDRESSをWRITEしてから、READできます。
従いまして、

     byte[] vu = {COM_I2C_REQUEST,COM_WRITE,0x53,0x32,0x33};
io.sendSysex(conectedModule.getModuleID(),vu.length,vu);

byte[] bu = {COM_I2C_REQUEST,COM_READ,slaveAddress,0x32, 0x02};
io.sendSysex(conectedModule.getModuleID(),bu.length,bu);
を試していきますが、相変わらず取得したデータは0でした。

どこか問題があるはずと存じますが、はっきりわかりません。この点について、教えていただきませんでしょうか。

> 2010年12月23日23:29 tonny <tonny1...@gmail.com>:

Shigeru Kobayashi

unread,
Jan 3, 2011, 9:25:35 PM1/3/11
to funnel-de...@googlegroups.com
チンさん

小林です

いまさらのリプライですみません。ADXL345のデータシート10ページによりますと

> With the SDO/ALT ADDRESS pin high, the 7-bit I2C address for the device is 0x1D, followed by the R/W bit. This translates to 0x3A for a write and 0x3B for a read. An alternate I2C address of 0x53 (followed by the R/W bit) can be chosen by grounding the SDO/ALT ADDRESS pin (Pin 12). This translates to 0xA6 for a write and 0xA7 for a read.

とあります。

このbreakout boardの回路図

http://www.sparkfun.com/datasheets/Sensors/Accelerometer/ADXL345-BreakoutBoard-v10.pdf

を見る限り、SDO/ALT ADDRESSピンは初期状態ではどこにもつながっていないように見えるのですが、このピンはどこに接続されていますか?

このピンは内部でプルアップされているとも、プルダウンされているとも書かれていませんので、もしかするとどちらかに接続する必要があるのでは、と思っています。勘違いだったらすみません。


2010/12/25 tonny <tonn...@gmail.com>:

takanori endo

unread,
Jan 3, 2011, 11:19:14 PM1/3/11
to funnel-de...@googlegroups.com
リでのI2Cの定義をすこし分かりやすくしました。


レジスタの書き込みは
ArduinoのWire.hのような感じで記述できます

読み出しは
requestFromRegister();
を使います
詳しくはHMC6352.javaを確認してみてください。

http://www.iamas.ac.jp/~endo/funnelP5lib-r767.zip


遠藤孝則


2011年1月4日11:25 Shigeru Kobayashi <koto...@gmail.com>:

--
endo takanori

tonny

unread,
Jan 5, 2011, 10:10:04 AM1/5/11
to funnel-dev-talk-ja
明けましておめでとうございます。

小林先生

ご指摘ありがとうございます。
私の実装ではSDOがプルアップに設定し、データシートによりますと、I2Cアドレスが0x53はずです。

遠藤先生

最新のリブを使って、正確にadxl345よりデータを取得してまいりました。ありがとうございました。
ところで、endTransmissionとrequestFromRegisterの中身を見ますと、もともとの実装方法


 byte[] vu = {COM_I2C_REQUEST,COM_WRITE,0x53,0x32,0x33};
 io.sendSysex(conectedModule.getModuleID(),vu.length,vu);

 byte[] bu = {COM_I2C_REQUEST,COM_READ,0x53,0x32, 0x02};
 io.sendSysex(conectedModule.getModuleID(),bu.length,bu);
は、今の
 beginTransmission();
 send(0x32);
 send(0x33);
 endTransmission();

 requestFromRegister(0x3, 2, false);
とほぼ同じですが、なぜもとのはうまくいかなかったのがまだ謎です。。。

お忙しいところご指導を賜り心から厚くお礼申し上げます。

On 1月4日, 下午1时19分, takanori endo <sweetamana...@gmail.com> wrote:
> リでのI2Cの定義をすこし分かりやすくしました。
>
> レジスタの書き込みは
> ArduinoのWire.hのような感じで記述できます
>
> 読み出しは
> requestFromRegister();
> を使います
> 詳しくはHMC6352.javaを確認してみてください。
>
> http://www.iamas.ac.jp/~endo/funnelP5lib-r767.zip
>
> 遠藤孝則
>

> 2011年1月4日11:25 Shigeru Kobayashi <kotob...@gmail.com>:


>
>
>
>
>
> > チンさん
>
> > 小林です
>
> > いまさらのリプライですみません。ADXL345のデータシート10ページによりますと
>
> >> With the SDO/ALT ADDRESS pin high, the 7-bit I2C address for the device is 0x1D, followed by the R/W bit. This translates to 0x3A for a write and 0x3B for a read. An alternate I2C address of 0x53 (followed by the R/W bit) can be chosen by grounding the SDO/ALT ADDRESS pin (Pin 12). This translates to 0xA6 for a write and 0xA7 for a read.
>
> > とあります。
>
> > このbreakout boardの回路図
>

> >http://www.sparkfun.com/datasheets/Sensors/Accelerometer/ADXL345-Brea...


>
> > を見る限り、SDO/ALT ADDRESSピンは初期状態ではどこにもつながっていないように見えるのですが、このピンはどこに接続されていますか?
>
> > このピンは内部でプルアップされているとも、プルダウンされているとも書かれていませんので、もしかするとどちらかに接続する必要があるのでは、と思っています 。勘違いだったらすみません。
>

> > 2010/12/25 tonny <tonny1...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages