2022年10月7日金曜日

M5StickC Plus 加速度センサー(MPU6886)その2

時間ステップはコレ↓で数10μsecの誤差に収まりました。CPUクロックは80MHzでもOKです。10msec=100Hzサンプリングの例です。

    //delay(9);
    while (millis()-10*sTime<10){
      delayMicroseconds(100);
    }
    sTime++;

EXCEL の代わりに MobaXterm でシリアル接続。最大表示&他の作業の裏で動かしていると、欠測が生じました。また、M5側でLCDへの波形の作画自体は問題ないのですが、全消しタイミングで計測の遅れが生じました。MobaXterm 最小表示 & 他の作業ナシ & M5 LCD 波形表示なしでは、欠測なく受信できました。うーん。

SDカードスロットを付けると良いのかな?
今回は、ここまでにしておきましょう。

********************************************************
20221008追記

コード全体です。Aボタンを押す毎に、波形表示・非表示を切り替えます。XYZ 軸の+-方向と重力加速度の方向の扱いについては、イマイチ理解できませんでした。 ←解決。
https://phreeqc.blogspot.com/2022/10/mems.html

公式サンプルコードに加え、波形表示は以下を参考にさせていただきました。感謝。https://gist.github.com/TakehikoShimojima/d136e81e13eeea603a8e594a8f5ef90f#file-m5vibration-ino

/***********************************************************
Copyright (c) 2022 fal
Released under the MIT license
https://github.com/m5stack/M5StickC-Plus/blob/master/LICENSE
************************************************************/

#include <M5StickCPlus.h>

float accX = 0;
float accY = 0;
float accZ = 0;
float gyroX = 0;
float gyroY = 0;
float gyroZ = 0;
unsigned long sTime = 1;

int n = 0;
float ax[240];
float ay[240];
float az[240];
int amin = -1000;
int amax = 1000;
int btn = 0;

void header(const char *string, uint16_t color) {
    M5.Lcd.fillScreen(color);
    M5.Lcd.setTextSize(1); // フォントサイズ(文字倍率)
    M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);//フォント色、背景色
    M5.Lcd.fillRect(0, 0, 120, 20, TFT_BLACK);// 四角形(線分)(左上x,左上y,幅,高さ,色)
    M5.Lcd.setTextDatum(TC_DATUM);
    M5.Lcd.drawString(string, 120, 2, 4);//(string, x, y, font)
    //font1:Adafruit 8ピクセルASCIIフォント
    //font2:16ピクセルASCIIフォント
    //font4:26ピクセルASCIIフォント
    //font6:26ピクセル数字フォント
    //font7:48ピクセル7セグ風フォント
}

void setup() {
    M5.begin();                // Init M5StickC Plus.
    Serial.begin(115200);
    M5.Imu.Init();             // Init IMU.
    M5.Lcd.setRotation(3);     // Rotate the screen.
    header("MPU6886",TFT_BLACK);
}


void loop() {
  M5.update();
  if (M5.BtnA.wasPressed()) {
    if (btn==0){
      btn=1;
    }else{
      btn=0;
    }
  }

  M5.Imu.getAccelData(&accX, &accY, &accZ);
  //M5.Imu.getGyroData(&gyroX, &gyroY, &gyroZ);
  ax[n]=(accX)*1000;
  ay[n]=(accY)*1000;
  az[n]=(accZ)*1000;
   
  Serial.print(millis());
  Serial.print(",");
  Serial.print(accX*1000, 2);
  Serial.print(",");
  Serial.print(accY*1000, 2);
  Serial.print(",");
  Serial.println(accZ*1000, 2);
  //Serial.print(",");
  //Serial.print(gyroX, 2);
  //Serial.print(",");
  //Serial.print(gyroY, 2);
  //Serial.print(",");
  //Serial.println(gyroZ*1000, 2);
  //M5.Lcd.printf("Temperature : %.2f C", temp);

  if (btn==0){
    if (n == 239){
      header("MPU6886",TFT_BLACK);
      n = -1;
    }else if (n != 0){
      int x0 = map((int)(ax[n - 1]), amin, amax, M5.Lcd.height(), 30);
      int x1 = map((int)(ax[n])    , amin, amax, M5.Lcd.height(), 30);
      int y0 = map((int)(ay[n - 1]), amin, amax, M5.Lcd.height(), 30);
      int y1 = map((int)(ay[n])    , amin, amax, M5.Lcd.height(), 30);
      int z0 = map((int)(az[n - 1]), amin, amax, M5.Lcd.height(), 30);
      int z1 = map((int)(az[n])    , amin, amax, M5.Lcd.height(), 30);
      M5.Lcd.drawLine(n - 1 + 5, x0, n + 5, x1, BLUE);
      M5.Lcd.drawLine(n - 1 + 5, y0, n + 5, y1, YELLOW);
      M5.Lcd.drawLine(n - 1 + 5, z0, n + 5, z1, MAGENTA);
    }
    n++;
  }
 

  while (millis()-10*sTime<10){
    delayMicroseconds(100);
  }
  sTime++;    
}


20240408追記
M5Tough + ADXL355 を用いた振動計のコードを以下に公開しました。FIRフィルタを実装していますので、周波数領域も扱えます。
https://github.com/T40O0/ADXL355_SPI_M5_SD_FIR.git

0 件のコメント:

コメントを投稿