【第2回】10Hzでは見えなかった!ESP32で1000Hz振動測定してみた

加速度センサー

※当サイトは、アフィリエイト広告を利用しています

概要

加速度センサーシリーズの続編です。

マイコン(ESP32)と加速度センサー(MPU6050)を使って、加速度データを取得しました。

前回は、サンプリング周期10Hzでの測定でしたが、今回は洗濯機の脱水工程の振動を測定するために、1000Hzの設定にしています。

今後、周波数解析を行う元データになる測定ですので、ぜひ参考になればうれしいです。

詳しくは、以下のYouTube動画をご覧ください。

【第2回】10Hzでは見えなかった!ESP32で1000Hz振動測定してみた

配線

プログラムコード

マイコン(ESP32)

・MPU6050で、X・Y・Z方向の加速度を計測
・合成加速度 acc_total を計算
・1000Hz周期でデータ取得
・CSV形式でシリアル出力

#include <Wire.h>
#include <MPU6050_tockn.h>

MPU6050 mpu(Wire);

const unsigned long SAMPLE_US = 1000; // 1000us = 1000Hz
unsigned long last_us = 0;

void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22);
  Wire.setClock(400000); 

  mpu.begin();
  mpu.calcGyroOffsets(true);

  Serial.println("time_us,ax,ay,az,acc_total");
}

void loop() {
  unsigned long now = micros();
  if (now - last_us < SAMPLE_US) return;
  last_us = now;

  mpu.update();

  float ax = mpu.getAccX();
  float ay = mpu.getAccY();
  float az = mpu.getAccZ();
  float acc_total = sqrt(ax*ax + ay*ay + az*az);

  Serial.print(now);
  Serial.print(",");
  Serial.print(ax, 4);
  Serial.print(",");
  Serial.print(ay, 4);
  Serial.print(",");
  Serial.print(az, 4);
  Serial.print(",");
  Serial.println(acc_total, 4);
}

Python

・ESP32からシリアル通信で加速度データを取得
・X・Y・Z方向と合成加速度を読み込み
・CSV形式でデータを保存

import serial
import csv
import time

# ===============================
# ▼ここだけ設定すればOK
# ===============================

PORT = "COM5"
# ↑ お使いのPCに合わせて変更してください
# Arduino IDEの「ツール → ポート」で確認できます

BAUD = 115200
# 通信速度です
# ESP32側のSerial.begin(115200)と同じ値にします

CSV_FILE = "acc_usb_highrate.csv"
# 保存するCSVファイル名です
# 測定後、このファイルを使ってFFT解析を行います

COLS = ["time_us", "ax", "ay", "az", "acc_total"]
# ESP32から送られてくるデータの項目です
# time_us:ESP32側の時刻、単位はマイクロ秒です
# ax, ay, az:X・Y・Z方向の加速度です
# acc_total:3軸を合成した加速度です

# ===============================
# ▼ESP32と接続
# ===============================

ser = serial.Serial(PORT, BAUD, timeout=1)

time.sleep(2)
# 接続直後はESP32が自動でリセットされることがあります
# そのため、2秒待ってから測定を開始します

# ===============================
# ▼CSV保存の準備
# ===============================

with open(CSV_FILE, "w", newline="", encoding="utf-8") as f:

    writer = csv.writer(f)
    writer.writerow(COLS)

    print("Recording...")
    print("CTRL + C で停止します")

    # ===============================
    # ▼ESP32からデータを受信して保存
    # ===============================

    try:
        while True:

            # ESP32から1行分のデータを読み取ります
            line = ser.readline().decode(errors="ignore").strip()

            # 空行の場合はスキップします
            if not line:
                continue

            # ヘッダー行が送られてきた場合はスキップします
            if line.startswith("time"):
                continue

            # 動作確認用に、受信したデータを画面に表示します
            print(line)

            # カンマ区切りでデータを分割します
            data = line.split(",")

            # データ数が5個でない場合は、壊れたデータとしてスキップします
            if len(data) != 5:
                continue

            # 数値に変換できるか確認します
            # 途中で文字化けや不完全なデータが入った場合の対策です
            try:
                values = [float(v) for v in data]
            except ValueError:
                continue

            # CSVに1行ずつ保存します
            writer.writerow(values)

    except KeyboardInterrupt:
        print("Stopped")

# ===============================
# ▼終了処理
# ===============================

ser.close()
print(f"Saved: {CSV_FILE}")
スポンサーリンク
加速度センサー
Follow
この記事を書いた人

【経歴】
関東在住、40代、製造業(品質部門)。
これまで、研究開発、設計、生産技術、仕入先の品質管理を手掛ける。

【保有知識・技術分野】
統計学、信頼性工学、品質工学。
半導体、基板、有機材料、金属、セラミックスの材料、製造、加工技術。
部品加工(機械加工、化学処理)、組立・実装技術、分析・物理解析技術。
QC検定1級保有。

【当サイトについて】
品質・生産の基礎知識をテーマに、用語の解説、使い方(作り方)、メリット、考え方のポイントを分かりやすく解説しています。
某メーカ様の品質教育用の資料としてもご活用いただいております。
QC検定(品質管理検定)の試験対策、おすすめ勉強法も紹介しています。

Follow
QCとらのまき

コメント