0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

M5Stackで振動をFFT解析してみる― 周波数スペクトル、回転周波数との比較 ―

0
Posted at

1.はじめに

前回は、M5Stack Core2と加速度センサーを使ってモータの振動を測定し、時間波形とRMSを確認しました。RMSを使うと「振動が大きくなったか、小さくなったか」を一つの数値で比較できます。しかし、設備の振動を詳しく見る場合には、「何Hzの振動が大きいのか」 を知りたいことがあります。

そこで今回は、加速度センサーで取得した振動データを**FFT(Fast Fourier Transform:高速フーリエ変換)**によって解析し、振動に含まれる周波数成分を調べます。さらに、モータ等の回転速度から求めた回転周波数と、FFTで得られたピーク周波数を比較してみます。

本記事では、本格的な振動診断を行うことを目的としていません。**「時間波形を周波数の世界から見てみる」**ことを目的とします。


2.時間波形だけでは分かりにくいこと

振動を時間波形で表示すると、加速度が時間とともにどのように変化しているかを見ることができます。しかし、複数の周期的な振動が重なっている場合、時間波形だけからそれぞれの周期を読み取るのは簡単ではありません。

例えば、測定した振動に

  • 30 Hzの振動
  • 60 Hzの振動
  • 120 Hzの振動

が含まれている場合、時間波形では複雑な形に見えることがあります。FFTを使うと、この波形を周波数ごとの成分に分けて見ることができます。

3.FFTとは

FFTは、高速フーリエ変換と呼ばれる計算方法です。振動の時間波形にFFTを行うことで、「どの周波数の振動が、どの程度含まれているか」 を調べることができます。

結果は、一般に

  • 横軸:周波数[Hz]
  • 縦軸:振幅

のグラフで表します。このグラフを周波数スペクトル と呼びます。

image.png
図1 時間波形と周波数スペクトル

周波数スペクトルに大きな山(ピーク)が現れた場合、その周波数成分が振動に強く含まれていることを示します。

4.使用するライブラリのインストール

今回は、前回使用したADXL345の加速度データをFFT解析するため、FFT計算用のライブラリを追加します。

ライブラリ バージョン 用途
arduinoFFT 2.0.4 取得した加速度データのFFT解析

Arduino IDEの**「ライブラリマネージャ」**を開き、検索欄に arduinoFFT と入力します。検索結果から バージョン2.0.4 を選択して「インストール」をクリックします。ADXL345の読み取りには、前回インストールした ADXL345_WE 3.1.0 を引き続き使用します。インストールが完了したら、Arduino IDEに次のプログラムを入力します。

#include <M5Unified.h>
#include <Wire.h>
#include <ADXL345_WE.h>
#include <arduinoFFT.h>

#define ADXL345_ADDR 0x53

ADXL345_WE adxl = ADXL345_WE(&Wire, ADXL345_ADDR);

// FFT条件
const uint16_t N = 1024;
const double FS = 400.0;

// FFT用配列
double vReal[N];
double vImag[N];

ArduinoFFT<double> FFT(vReal, vImag, N, FS);

void setup() {

  auto cfg = M5.config();
  M5.begin(cfg);

  M5.Display.setTextColor(WHITE, BLACK);
  M5.Display.fillScreen(BLACK);

  // Core2 PORT.A
  // SDA = 32, SCL = 33
  Wire.begin(32, 33, 400000);

  // ADXL345初期化
  if (!adxl.init()) {

    M5.Display.println("ADXL345 error");

    while (true) {
      delay(1000);
    }
  }

  // 出力データレート 400 Hz
  adxl.setDataRate(ADXL345_DATA_RATE_400);

  // 測定レンジ ±4g
  adxl.setRange(ADXL345_RANGE_4G);
}

void loop() {

  // サンプリング周期
  const uint32_t periodUs =
      (uint32_t)(1000000.0 / FS);

  uint32_t next = micros();

  double mean = 0.0;

  // -----------------------------
  // 1024点の加速度データを取得c:\Users\saito\Desktop\Core2_ADXL345_vibration_analyzer_demo.ino
  // -----------------------------

  for (uint16_t i = 0; i < N; i++) {

    while ((int32_t)(micros() - next) < 0) {
    }

    next += periodUs;

    xyzFloat g;

    adxl.getGValues(&g);

    // Z軸加速度
    // g → m/s^2 に変換
    vReal[i] = g.z * 9.80665;

    vImag[i] = 0.0;

    mean += vReal[i];
  }

  // -----------------------------
  // 平均値を除去
  // -----------------------------

  mean /= N;

  for (uint16_t i = 0; i < N; i++) {
    vReal[i] -= mean;
  }

  // -----------------------------
  // FFT
  // -----------------------------

  // ハニング窓
  FFT.windowing(
      FFTWindow::Hann,
      FFTDirection::Forward
  );

  // FFT実行
  FFT.compute(
      FFTDirection::Forward
  );

  // 複素数 → 振幅
  FFT.complexToMagnitude();

  // 最大ピーク周波数
  double peakHz = FFT.majorPeak();

  // -----------------------------
  // 画面表示
  // -----------------------------

  M5.Display.fillScreen(BLACK);

  M5.Display.setTextSize(2);
  M5.Display.setCursor(5, 5);

  M5.Display.printf(
      "Peak: %.1f Hz",
      peakHz
  );

  M5.Display.setTextSize(1);
  M5.Display.setCursor(5, 28);

  M5.Display.printf(
      "Fs=%.0f Hz  N=%u  Range=0-%.0f Hz",
      FS,
      N,
      FS / 2.0
  );

  // -----------------------------
  // 周波数スペクトル表示
  // -----------------------------

  double maxMag = 1e-9;

  for (uint16_t i = 1; i < N / 2; i++) {

    if (vReal[i] > maxMag) {
      maxMag = vReal[i];
    }
  }

  int bottom = 230;
  int top = 45;

  // 0~200 Hzを画面幅320 pixelに表示
  for (int x = 0; x < 320; x++) {

    uint16_t bin =
        1 +
        (uint32_t)x *
        (N / 2 - 2) /
        319;

    int h =
        (int)(
            (vReal[bin] / maxMag) *
            (bottom - top)
        );

    M5.Display.drawFastVLine(
        x,
        bottom - h,
        h,
        WHITE
    );
  }

  // 周波数軸
  M5.Display.drawLine(
      0,
      bottom,
      319,
      bottom,
      DARKGREY
  );

  delay(500);
}

5.今回行うこと

今回は、前回と同じ速度センサー(ADXL345)を使います。

処理の流れは次のようになります。

モータ等の振動を測定

一定間隔で加速度データを取得

一定数のデータをまとめる

FFTを実行

周波数スペクトルを表示

ピーク周波数を求める

モータの回転周波数と比較

今回は例として、約400Hzのサンプリング周波数で1024点のデータを取得することを想定します。

6.サンプリング周波数と解析できる周波数

FFTを行う前に、サンプリング周波数について確認します。

原理上解析できる上限周波数はサンプリング周波数の半分です。例えば、サンプリング周波数が約400Hzの場合、解析対象となる周波数範囲はおおむね、 0~200 Hz となります。この上限をナイキスト周波数と呼びます。
したがって、測定したい振動周波数に応じて適切なサンプリング周波数を設定する必要があります。

7.周波数分解能

FFTでは、何Hz刻みで周波数を見ることができるかも重要です。周波数分解能は、おおよそ、 サンプリング周波数 ÷ データ点数 で決まります。

例えば

  • サンプリング周波数:約400 Hz
  • データ点数:1024点

の場合、周波数分解能は約0.39 Hzです。データ点数を増やすと細かく周波数を見ることができますが、その分だけデータ取得時間や計算量も増えます。

8.振動データの取得

モータ等に取り付けたADXL345から、一定時間間隔で加速度データを取得します。今回は1024点のデータを取得し、そのデータに対してFFTを行います。サンプリング周波数を400Hzとすると、1024点を取得するのに必要な時間は約2.56秒です。振動測定中にサンプリング間隔が大きく変動するとFFT結果にも影響するため、できるだけ一定間隔でデータを取得することが重要です。

9.平均値の差し引き

加速度センサーで取得した値には、センサーの向きによる重力成分などの直流成分が含まれる場合があります。そのままFFTすると、0 Hz付近の成分が非常に大きくなることがあります。そこで、取得したデータの平均値を求め、各データから平均値を差し引く 処理を行います。これにより、振動による変動成分を中心に解析しやすくなります。

10.窓関数

FFTでは、一定時間だけ切り出したデータを解析するため、波形の切り出し方によって周波数スペクトルが広がって見えることがあります。この影響を抑えるために窓関数 を使用することがあります。

代表的なものとして

  • ハニング(Hann)窓
  • ハミング窓

などがあります。

入門段階では、 「FFTの前に波形の端部の影響を小さくする処理を行うことがある」 程度を理解しておけばよいでしょう。

11.FFTによるスペクトル表示

取得した加速度データにFFTを行い、M5Stack Core2のLCDに周波数スペクトルを表示します。

PXL_20260829_061439488.jpg

図2 FFTによる周波数スペクトルの例(ガソリン自動車のアイドリング時のエンジンカバーを測定)

横軸は周波数、縦軸は振幅です。

例えば、30 Hz付近に大きなピークが現れた場合、 「測定した振動には約30 Hzの周期的な成分が強く含まれている」 と見ることができます。

プログラムでは、スペクトル中で最も大きなピークを探し、その周波数をLCDに表示することもできます。

Peak Frequency

25.4 Hz

12.回転速度から周波数への換算

モータなどの回転機械では、回転速度は一般にrpm(revolutions per minute:1分間当たりの回転数)で表します。

FFTの結果と比較するためには、rpmをHzに換算します。

換算は、回転周波数[Hz]= 回転速度[rpm]÷ 60 です。

先ほどのエンジンの測定については、アイドリング時のタコメータの回転数750 rpmより、750 ÷ 60 = 12.5 Hz となります。

ここで、4気筒4ストロークエンジンでは、クランクシャフト2回転の間に4回の燃焼が起こるため、燃焼に伴う振動は回転周波数の2倍となる25 Hz付近に現れると考えられます。今回のFFT解析で25 Hzに大きなピークが確認されたことは、エンジンの燃焼に対応した振動を捉えている可能性を示しています。

13.回転周波数とFFT結果の比較

例えば、モータの回転速度を変えて測定するとします。

回転速度 回転周波数 FFTのピーク
1200 rpm 20 Hz 約20 Hz
1800 rpm 30 Hz 約30 Hz
2400 rpm 40 Hz 約40 Hz

回転速度の変化に伴ってFFTのピークも移動すれば、回転に関係する振動を捉えている可能性が高くなります。

このように、単に「ピークが出た」というだけでなく、設備の回転速度など既知の情報と比較することが重要です。

14.回転周波数以外のピーク

実際の設備では、周波数スペクトルに回転周波数以外のピークが現れることがあります。

例えば

  • 回転周波数の2倍、3倍などの成分
  • ファンの羽根枚数に関係する成分
  • 歯車のかみ合いに関係する成分
  • 構造物の共振に関係する成分

などです。

ただし、スペクトルのピークだけを見て設備異常の原因を断定することはできません。設備構造、回転速度、負荷、測定位置、過去の測定結果などと合わせて評価する必要があります。

15.RMSとFFTの使い分け

前回扱ったRMSと今回のFFTは、見ているものが少し異なります。

方法 分かること
時間波形 振動が時間とともにどう変化しているか
RMS 振動全体の大きさ
FFT どの周波数成分が含まれているか

例えば、RMSが増加した場合、「振動が大きくなった」 ことは分かります。さらにFFTを行うことで、「30 Hz付近の振動が特に大きくなった」 といった見方ができるようになります。時間波形、RMS、FFTを組み合わせることで、振動データを異なる視点から見ることができます。

16.工場における活用方法

簡易的なFFT測定でも、例えば次のような確認に利用できます。

  • モータの回転周波数が振動に現れているか
  • 回転速度変更に伴ってピーク周波数が変化するか
  • 運転条件によってスペクトルがどう変わるか
  • 通常時と条件変更時で周波数成分がどう変わるか
  • 本格的な振動測定を行う前の予備調査

まず設備の振動データを取得し、どのような周波数成分が含まれているかを見てみることで、本格的な設備診断につながる気づきが得られる場合があります。

17.今回のまとめ

今回は、M5Stack Core2とADXL345を使って取得した振動データにFFTを行い、時間波形 → FFT → 周波数スペクトル → ピーク周波数 → 回転周波数との比較 という流れを試しました。FFTを使うことで、時間波形だけでは分かりにくかった振動の周期的な成分を周波数ごとに見ることができます。また、モータの回転速度をHzに換算してFFT結果と比較することで、測定されたピークが何に関係しているのかを考える手掛かりになります。

今回までの一連の記事では、M5Stackと各種センサーを使って、「測る → 表示する → 保存する → 判定する → 解析する」 という製造現場のデータ活用の基本的な流れを試しました。高価な計測システムをいきなり導入するのではなく、まず身近なセンサーを使って現場のデータを取ってみることが、データ活用の第一歩になりると考えます。

注意事項

今回製作する装置は、M5Stackと市販の加速度センサーを利用した学習・簡易検証用の装置です。サンプリング周波数、センサーの周波数特性、測定レンジ、取付け方法、窓関数、FFTの振幅処理などによって解析結果は変化します。本記事で得られるFFT結果を、そのまま設備の異常診断や振動規格に基づく評価値として使用することはできません。設備診断、品質保証、安全監視などには、用途に適した校正済みの振動計測機器と適切な評価方法を使用してください。

また、回転機械を測定する場合は、回転部・可動部にセンサー、ケーブル、身体などを近づけないよう、安全を十分に確保してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?