2018年6月6日水曜日

【Arduino】I2Cセンサーの複数認識実験


前回あたり軸センサーのアドレス変更をやりました。
ADOの端子にHIGH信号を流すと0x68→0x69となるらしい…というやつです。
これをやったときに少し気になったことがあったのでその実験です。

それは、
「このままだと2つまでしか認識できないが、
 0x69を取得する前提で、取得する箇所のセンサーだけADOに電流を流したら、
 どうなんです?」
ってところなんです。

1個ずつタイミングをずらして取得するので、
完全同期で取得することは出来ないのですが、
ある程度タイムラグに目を瞑りさえすれば、
2個以上の軸センサーの情報が取れるかもしれない、ということ。

気になったんで、試してみましょう。
といった感じのが今回の趣旨です。

















で、とりあえずArduinoはこんな感じ。
もう配線が分かりませんね…。
くっちゃくちゃでどーなってんのか分かりづらいですが、
前回の軸センサー2つ付けた状態にさらに2つ付けた状態になっています。
そして、それぞれのADO端子にデジタルの出力ピンをつなげています。

次にソース


#include <Wire.h>
#define define_NUM_SERIALNUM 9600
#define define_NUM_LOOPWAIT 1000
#define define_NUM_NOERROR 0
#define define_NUM_DEVERROR 4
const int pinA = 12;
const int pinB = 11;
const int pinC = 10;
const int pinD = 9;
int state = 0;
void setup()
{
  pinMode( pinA, OUTPUT );
  pinMode( pinB, OUTPUT );
  pinMode( pinC, OUTPUT );
  pinMode( pinD, OUTPUT );

  Wire.begin();
  Serial.begin( define_NUM_SERIALNUM );
  while ( !Serial );
  Serial.println( "\nBegin I2C_Scanner" );
}
void loop()
{
  byte error, address;
  int nDevices;
  state++;
  if ( state >= 5 ) state = 0;

  Serial.print( "State..." );
  Serial.println( state );
  if ( state == 0 )
  {
    digitalWrite( pinA, HIGH );
    digitalWrite( pinB, LOW );
    digitalWrite( pinC, LOW );
    digitalWrite( pinD, LOW );
  }
  else if ( state == 1 )
  {
    digitalWrite( pinA, LOW );
    digitalWrite( pinB, HIGH );
    digitalWrite( pinC, LOW );
    digitalWrite( pinD, LOW );
  }
  else if ( state == 2 )
  {
    digitalWrite( pinA, LOW );
    digitalWrite( pinB, LOW );
    digitalWrite( pinC, HIGH );
    digitalWrite( pinD, LOW );
  }
  else if ( state == 3 )
  {
    digitalWrite( pinA, LOW );
    digitalWrite( pinB, LOW );
    digitalWrite( pinC, LOW );
    digitalWrite( pinD, HIGH );
  }
  else
  {
    digitalWrite( pinA, LOW );
    digitalWrite( pinB, LOW );
    digitalWrite( pinC, LOW );
    digitalWrite( pinD, LOW );
  }
  Serial.println( "Scanning..." );
  nDevices = 0;
  for( address = 1; address < 127; address++ )
  {
    Wire.beginTransmission( address );
    error = Wire.endTransmission();
    if ( error == define_NUM_NOERROR )
    {
      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 )
    {
      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 );
}

I2Cデバイス検索のプログラムに追加した感じの作りになってます。
1つずつADO位置へHIGHを流すタイミングをずらして行っています。

コードがうーん汚いけど…とりあえず動かしてしまおう。


このプログラムをArduinoに流し、シリアルモニタで確認してみたところ、
一番最後のステートではすべてADOがLOWになるのですが、
この時は0x69のアドレスは検出されませんでした。
また、そのほかの状態では4つのどれかがADO=HIGHとなるのですが、
0x68、0x69が検出された状態となりました。


最後のステートの状態から見て、
他のステートで0x69として検出されている軸センサーはそれぞれ
違う軸センサーが検出されているものと思われます(多分)
配線さえなんとかできればなんかできそうな感じがしてきました!

本来の使い方としては…どうなんだろうか?
まだまだ勉強中ですなあ。


0 件のコメント:

コメントを投稿