2018年5月17日木曜日

【Arduino】I2Cセンサー検出のやり方


ハンダ付けしたセンサーも出来てきたので、
改めてArduinoと接続です。
















今回は正常につながりますねー。
前回みたいな端子を押し付けないと通電しないとかもなさそうです。






やっぱりピンヘッダがどうこうとかでなく、
こういったバラバラのは自己責任できちんとハンダ付けしないと、
しっかり動かないというか、通電の保証がないみたいですね。
不良品とか言ってしまい本当に申し訳ない…。


そういや
ハンダ付けしていないバラバラ基盤のをブレイクアウト基盤っていうらしいっすよ?
まあ、だからなんだって話ですが…


で、本題なんですけど、
ArduinoのI2Cセンサーの検出ですね。
これが当初分からなくて、大分手間取ったわけです。

ただ、きちんと調べてみたら、公式ページにも検出ソースがありました。
流石だなあ、親切だなあ。


Arduino nanoはSCLがA5、SDAがA4なので、
下記のようなつなぎ方をすればMPU-6500のセンサーはとりあえず検出できます。

VCC: 3.3V
GND: GND
SCL: A5
SDA: A4


んで、検出するとシリアルモニタに見つかったアドレスが表示されます。
(コードは下に記載)
MPU-6500のセンサーは「0x68」のアドレスが振られているので、
この番号が検出できますね!















公式に使用するソースはもう載っているのであんまり必要ないかもですが、
自分用にコメントを載せたのを記載します。
ブログに乗せるよりGITに上げた方がいいのかも?


// -----------------------------------
// I2C_Scanner
// 現在接続されているI2Cセンサーを検出し、アドレスを表示する
// 例としてはMPU-6500のセンサーは「x68」と表示される
// コード自体は公式の(https://playground.arduino.cc/Main/I2cScanner)とほぼ同じ
// 注釈を追加しただけ
// 2018/05/17
// -----------------------------------
// -----------------------------------
// INCLUDE
// -----------------------------------
#include <Wire.h>
// -----------------------------------
// DEFINE
// -----------------------------------
#define define_NUM_SERIALNUM 9600
#define define_NUM_LOOPWAIT 5000
#define define_NUM_NOERROR 0
#define define_NUM_DEVERROR 4
// -----------------------------------
// SETUP
// -----------------------------------
void setup()
{
  Wire.begin();
  Serial.begin( define_NUM_SERIALNUM );
  while ( !Serial );
  Serial.println( "\nBegin I2C_Scanner" );
}
// -----------------------------------
// LOOP
// -----------------------------------
void loop()
{
  byte error, address;
  int nDevices;

  Serial.println( "Scanning..." );
  // 0~127のアドレスを順にアクセスする
  // I2Cデバイスが見つかった場合はそのアドレスを表示する
  // アドレスは16進数でシリアルモニタ上に表示する
  nDevices = 0;
  for( address = 1; address < 127; address++ )
  {
    Wire.beginTransmission( address );
    error = Wire.endTransmission();

    if ( error == define_NUM_NOERROR )
    {
      // I2Cデバイスが正常に見つかった
      Serial.print( "I2C device found at address 0x" );
     
      if ( address < 16 ) Serial.print( "0" );
      Serial.print( address, HEX );
      Serial.println( "  !" );

      nDevices++;
    }
    else if ( error == define_NUM_DEVERROR )
    {
       // I2Cデバイスが異常ありで見つかった
      Serial.print( "Unknown error at address 0x" );
      if ( address < 16 ) Serial.print( "0" );
      Serial.println( address, HEX );
    }   
  }
  // 見つかったかどうか表示する
  if (nDevices == 0) Serial.println( "No I2C devices found\n" );
  else               Serial.println( "done\n" );
  // 一定時間待ち、再度処理を行う
  delay( define_NUM_LOOPWAIT );
}


ではでは



0 件のコメント:

コメントを投稿