前提・実現したいこと
mbedでmpu9250を使おうと思い調べたライブラリを使ったところ、ノイズがひどくとても使える値が出てきませんでした。M5Stackの方は安定してるので勉強がてらライブラリを移植しようと考えました。
M5Stackのライブラリ : https://github.com/m5stack/M5Stack/blob/master/src/utility/MPU9250.cpp
https://github.com/m5stack/M5Stack/blob/master/src/utility/MPU9250.h
ある程度はmbed LPC1768用になったのですが、uint8_tの変数 Gscale にenum Gscale{}; の定数を代入するところでエラーが出ました。
発生している問題・エラーメッセージ
Error: Data member initializer is not allowed in "MPU9250_ByM5Stack/mpu9250.h", Line: 202, Col: 17
該当のソースコード
C++
1/* 2 Note: The MPU9250 is an I2C sensor and uses the Arduino Wire library. 3 Because the sensor is not 5V tolerant, we are using a 3.3 V 8 MHz Pro Mini or 4 a 3.3 V Teensy 3.1. We have disabled the internal pull-ups used by the Wire 5 library in the Wire.h/twi.c utility file. We are also using the 400 kHz fast 6 I2C mode by setting the TWI_FREQ to 400000L /twi.h utility file. 7 */ 8#ifndef _MPU9250_H_ 9#define _MPU9250_H_ 10 11 12// See also MPU-9250 Register Map and Descriptions, Revision 4.0, 13// RM-MPU-9250A-00, Rev. 1.4, 9/9/2013 for registers not listed in above 14// document; the MPU9250 and MPU9150 are virtually identical but the latter has 15// a different register map 16 17//Magnetometer Registers 18/* マクロ定義がすごくいっぱい*/ 19 20class MPU9250 21{ 22protected: 23 // Set initial input parameters 24 enum Ascale { 25 AFS_2G = 0, 26 AFS_4G, 27 AFS_8G, 28 AFS_16G 29 }; 30 31 enum Gscale { 32 GFS_250DPS = 0, 33 GFS_500DPS, 34 GFS_1000DPS, 35 GFS_2000DPS 36 }; 37 38 enum Mscale { 39 MFS_14BITS = 0, // 0.6 mG per LSB 40 MFS_16BITS // 0.15 mG per LSB 41 }; 42 43 // Specify sensor full scale 44 uint8_t Ascale = AFS_2G; // <- ここ 45 uint8_t Gscale = GFS_250DPS; 46 // Choose either 14-bit or 16-bit magnetometer resolution 47 uint8_t Mscale = static_cast<int>(Gscale::MFS_16BITS); 48 // 2 for 8 Hz, 6 for 100 Hz continuous magnetometer data read 49 uint8_t Mmode = 0x02; 50 51public: 52 float pitch, yaw, roll; 53 float temperature; // Stores the real internal chip temperature in Celsius 54 int16_t tempCount; // Temperature raw count output 55 uint32_t delt_t = 0; // Used to control display output rate 56 57 uint32_t count = 0, sumCount = 0; // used to control display output rate 58 float deltat = 0.0f, sum = 0.0f; // integration interval for both filter schemes 59 uint32_t lastUpdate = 0, firstUpdate = 0; // used to calculate integration interval 60 uint32_t Now = 0; // used to calculate integration interval 61 62 int16_t gyroCount[3]; // Stores the 16-bit signed gyro sensor output 63 int16_t magCount[3]; // Stores the 16-bit signed magnetometer sensor output 64 // Scale resolutions per LSB for the sensors 65 float aRes, gRes, mRes; 66 // Variables to hold latest sensor data values 67 float ax, ay, az, gx, gy, gz, mx, my, mz; 68 // Factory mag calibration and mag bias 69 float magCalibration[3] = {0, 0, 0}, magbias[3] = {0, 0, 0}; 70 // Bias corrections for gyro and accelerometer 71 float gyroBias[3] = {0, 0, 0}, accelBias[3] = {0, 0, 0}; 72 float SelfTest[6]; 73 // Stores the 16-bit signed accelerometer sensor output 74 int16_t accelCount[3]; 75 76public: 77 void getMres(); 78 void getGres(); 79 void getAres(); 80 void readAccelData(int16_t *); 81 void readGyroData(int16_t *); 82 void readMagData(int16_t *); 83 int16_t readTempData(); 84 void updateTime(); 85 void initAK8963(float *); 86 void initMPU9250(); 87 void calibrateMPU9250(float * gyroBias, float * accelBias); 88 void MPU9250SelfTest(float * destination); 89 void writeByte(uint8_t, uint8_t, uint8_t); 90 uint8_t readByte(uint8_t, uint8_t); 91 void readBytes(uint8_t, uint8_t, uint8_t, uint8_t *); 92 93private: 94 I2C i2c; 95 SPI spi; 96}; // class MPU9250 97 98#endif // _MPU9250_H_
試したこと
【列挙型⇔数値型】enumとint型を相互変換する方法と内部型への数値変換
などを参考に static_cast<int>(Ascale::AFS_2G) とかにしてみましたが同じエラーを吐かれました。
uint8_t Ascale を int Ascale にしてコンパイルしましたが同じエラー。
enum class Ascale : int{}; のようにちゃんと書いても同じエラー。(そりゃそうか)
英語の記事を翻訳して読みましたがよくわからず。。。
補足情報
mbedのオンラインコンパイラはC++11っぽそうです。
元の使ってたライブラリはローパスフィルタが実装されてないのでそれを頑張ればできるのかもしれません。(どうすればできるのか教えていただけると幸いです)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/19 02:23