時間ステップはコレ↓で数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 件のコメント:
コメントを投稿