概要
加速度センサーシリーズの続編です。
マイコン(ESP32)と加速度センサー(MPU6050)を使って、加速度データを取得しました。
前回は、サンプリング周期10Hzでの測定でしたが、今回は洗濯機の脱水工程の振動を測定するために、1000Hzの設定にしています。
今後、周波数解析を行う元データになる測定ですので、ぜひ参考になればうれしいです。
詳しくは、以下のYouTube動画をご覧ください。
配線

プログラムコード
マイコン(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}")

コメント