前提・実現したいこと
BMX055という9軸センサのジャイロセンサのみを使い、値を出力したいです。使うマイコンボードはAruduinoで、AruduinoIDEを使ってプログラムを書いています。
発生している問題・エラーメッセージ
エラーメッセージはありません。
下の画像で、青がX軸、赤がY軸、緑がZ軸となっています。画像①はセンサを動かさずに静止した状態、画像②は順番にX軸のみ、Y軸のみ、Z軸のみを動かした状態です。まず画像①を見てもらうと、明らかに青X軸が異常な値を出力していて、緑Z軸は止まる気配すら感じられません。
次に画像②を見てもらうと、最初にX軸のみを動かしたのですが、なぜか赤Y軸が反応し、本来の青X軸が反応していなさそうです。次にY軸のみを動かし、この場合は正しくY軸が反応していますが、もう少し大きく反応してもいいと思います。最後のZ軸は、おそらく正しい動きかと思われます。
〇データ画像
該当のソースコード
//BMX055-Gyro// #include<Wire.h> #define Addr_Gyro 0x69 float xGyro = 0.00; float yGyro = 0.00; float zGyro = 0.00; void setup(){ Wire.begin(); Serial.begin(9600); BMX055_Init(); pinMode(8,OUTPUT); delay(300); } #define ON LOW void loop(){ BMX055_Gyro(); //Serial.print("Gyro= "); Serial.print(xGyro); Serial.print(","); Serial.print(yGyro); Serial.print(","); Serial.print(zGyro); Serial.println(""); delay(100); } void BMX055_Init(){ Wire.beginTransmission(Addr_Gyro); Wire.write(0x0F); // 範囲レジスタを選択 Wire.write(0x04); // フルスケール= +/- 125度/秒 Wire.endTransmission(); delay(100); //------------------------------------------------------------// Wire.beginTransmission(Addr_Gyro); Wire.write(0x10); // 帯域幅レジスタを選択 Wire.write(0x07); // ODR = 100 Hz Wire.endTransmission(); delay(100); //------------------------------------------------------------// Wire.beginTransmission(Addr_Gyro); Wire.write(0x11); // LPM1レジスタを選択 Wire.write(0x00); // 通常モード、スリープ期間= 2ms Wire.endTransmission(); delay(100); } void BMX055_Gyro(){ int data[6]; for (int i = 0; i < 6; i++) { Wire.beginTransmission(Addr_Gyro); Wire.write((2 + i)); // データレジスタを選択 Wire.endTransmission(); Wire.requestFrom(Addr_Gyro, 1); // 1バイトのデータを要求する // 6バイトのデータを読み取る if (Wire.available() == 1) data[i] = Wire.read(); } // データを変換する xGyro = (data[1] * 256) + data[0]; if (xGyro > 32767) xGyro -= 65536; yGyro = (data[3] * 256) + data[2]; if (yGyro > 32767) yGyro -= 65536; zGyro = (data[5] * 256) + data[4]; if (zGyro > 32767) zGyro -= 65536; xGyro = xGyro * 0.0038; // フルスケール= +/- 125度/秒 yGyro = yGyro * 0.0038; // フルスケール= +/- 125度/秒 zGyro = zGyro * 0.0038; // フルスケール= +/- 125度/秒 }
試したこと
関係があるかは分かりませんが、こちらのページ(リンク内容)を参照して0x14、0x0f、0x10のレジスタでソフトリセットというものも試しましたが効果はありませんでした。
data[0]~data5までの出力値(プログラムは一部のみ)
画像は左からdata[0]~data[5]となっています。
void BMX055_Gyro() { int data[6]; for (int i = 0; i < 6; i++) { Wire.beginTransmission(Addr_Gyro); Wire.write((2 + i)); // データレジスタを選択 Wire.endTransmission(); Wire.requestFrom(Addr_Gyro, 1); // 1バイトのデータを要求する // 6バイトのデータを読み取る // xGyro lsb, xGyro msb, yGyro lsb, yGyro msb, zGyro lsb, zGyro msb if (Wire.available() == 1) data[i] = Wire.read(); Serial.print(data[0]); Serial.print(" ,"); Serial.print(data[1]); Serial.print(" ,"); Serial.print(data[2]); Serial.print(" ,"); Serial.print(data[3]); Serial.print(" ,"); Serial.print(data[4]); Serial.print(" ,"); Serial.print(data[5]); Serial.println(" ,"); } }
補足情報(FW/ツールのバージョンなど)
Arduinoはバージョン1.8.9です。
BMX055のデータシート(リンク内容)
購入先(リンク内容)
〇ハードウェア