3

私は特定のマイクロコントローラーで実行されるプログラムの変換に取り組んでおり、それをラズベリーパイで実行するように適合させています。使用しているセンサーから値を取得することに成功しましたが、問題が発生しました。これは、理解に苦労している数行のコードが原因だと思います。私は彼らが何であるかを読みましたが、まだ頭を悩ませています。以下のコードは、変数に格納される数を変更することになっているとX,Y,Z思いますが、これは現在のプログラムでは発生していないと思います。また、プログラムをエラーなしでコンパイルするには、に変更byteする必要がありました。INTこれは、私が変換した元のコードからの変更されていないコードです。とにかくこれが番号を変更しているのかどうか誰かに教えてもらえますか?

void getGyroValues () {
  byte MSB, LSB;

  MSB = readI2C(0x29);
  LSB = readI2C(0x28);
  x = ((MSB << 8) | LSB);

  MSB = readI2C(0x2B);
  LSB = readI2C(0x2A);
  y = ((MSB << 8) | LSB);

  MSB = readI2C(0x2D);
  LSB = readI2C(0x2C);
  z = ((MSB << 8) | LSB);
}

元のreadI2C関数は次のとおりです。

int readI2C (byte regAddr) {
    Wire.beginTransmission(Addr);
    Wire.write(regAddr);                // Register address to read
    Wire.endTransmission();             // Terminate request
    Wire.requestFrom(Addr, 1);          // Read a byte
    while(!Wire.available()) { };       // Wait for receipt
    return(Wire.read());                // Get result
}
4

1 に答える 1

5

I2Cは、低速周辺機器との通信に使用される 2 線式プロトコルです。

センサーは、I2C バスを介して CPU に接続する必要があります。そして、センサーから x、y、z の 3 つの値を読み取っています。これらの値は、センサーから6 x 8-bitレジスタとしてアクセスできます。

x - Addresses 0x28, 0x29
y - Addresses 0x2A, 0x2B
z - Addresses 0x2C, 0x2D

ReadI2C()関数名が示すように、センサーから特定のアドレスから 1 バイトのデータを読み取り、読み取ったデータを返します。のコードはReadI2C()、デバイスの I2C コントローラーのセットアップ方法によって異なります。

1 バイトは 8 ビットのデータです。MSB ( Most-Significant-Byte) と LSB( Least-Significant-Byte) は、それぞれ 8 ビットが読み取られることを示しますI2C。16 ビット データ (x、y、z) に関心があるようです。2 つの 8 ビット データから 16 ビット データを作成するには、 をMSB8 ビット左にシフトし、 と論理和演算を実行しLSBます。

例えば:

仮定しましょう: MSB = 0x45 LSB = 0x89

MSB << 8 = 0x4500

(MSB << 8) | LSB = 0x4589

私のコメントもインラインで見てください:

void getGyroValues () {
  byte MSB, LSB;

  MSB = readI2C(0x29);
  LSB = readI2C(0x28);
  // Shift the value in MSB left by 8 bits and OR with the 8-bits of LSB
  // And store this result in x
  x = ((MSB << 8) | LSB);

  MSB = readI2C(0x2B);
  LSB = readI2C(0x2A);
  // Do the same as above, but store the value in y
  y = ((MSB << 8) | LSB);

  MSB = readI2C(0x2D);
  LSB = readI2C(0x2C);
  // Do the same as above, but store the value in z
  z = ((MSB << 8) | LSB);
}
于 2013-03-03T07:56:35.180 に答える