IMU و Data Logger یعنی چه؟ (برای مبتدی)
IMU (Inertial Measurement Unit) یک واحد اندازهگیری اینرسی است. ماژول MPU6050 یک IMU ۶-محوره محبوب است که شامل یک ژیروسکوپ ۳ محوره (اندازهگیری سرعت چرخش) و یک شتابسنج ۳ محوره (اندازهگیری شتاب خطی) است. از این دو داده میتوان زاویههای Roll (کج شدن)، Pitch (خم شدن) و Yaw (چرخش) را محاسبه کرد.
یک Data Logger (لاگر داده) دستگاهی است که دادهها را با زمانبندی دقیق روی حافظه ذخیره میکند. با لاگ کردن IMU پهپاد یا UGV، میتوانید ارتعاشات موتور، کیفیت PID، و رفتار مکانیکی شاسی را تحلیل کنید.
محصولی که میسازید
یک لاگر IMU کوچک که روی پهپاد یا UGV نصب میشود، دادههای Roll/Pitch/Yaw/Acc را با ۱۰۰Hz روی SD Card ثبت میکند.
- زمان ساخت: ۲ تا ۳ ساعت
- هزینه: ۳۰۰ تا ۵۰۰ هزار تومان
- نرخ نمونهبرداری: تا ۱۰۰Hz
قطعات لازم (BOM)
| قطعه | نقش |
|---|---|
| Arduino Nano | پردازشگر اصلی |
| MPU6050 GY-521 | ژیرو + شتابسنج I2C |
| ماژول SD Card SPI | ذخیره CSV |
| RTC DS3231 (اختیاری) | تایماستمپ دقیق |
| کارت microSD 4GB+ | FAT32 Format |
کد Arduino Data Logger
#include <Wire.h>
#include <MPU6050_light.h>
#include <SD.h>
#include <SPI.h>
MPU6050 mpu(Wire);
File logFile;
const int CS_PIN = 10;
unsigned long lastLog = 0;
const int LOG_INTERVAL = 10; // هر ۱۰ms = ۱۰۰Hz
void setup() {
Wire.begin();
Serial.begin(115200);
mpu.begin();
mpu.calcOffsets(); // کالیبراسیون خودکار (روی سطح صاف قرار دهید)
SD.begin(CS_PIN);
logFile = SD.open("imu_log.csv", FILE_WRITE);
if (logFile) {
logFile.println("time_ms,roll,pitch,yaw,ax,ay,az,gx,gy,gz");
logFile.flush();
}
Serial.println("Logger started");
}
void loop() {
mpu.update();
if (millis() - lastLog >= LOG_INTERVAL) {
lastLog = millis();
String row = String(millis()) + "," +
String(mpu.getAngleX(),2) + "," +
String(mpu.getAngleY(),2) + "," +
String(mpu.getAngleZ(),2) + "," +
String(mpu.getAccX(),3) + "," +
String(mpu.getAccY(),3) + "," +
String(mpu.getAccZ(),3) + "," +
String(mpu.getGyroX(),2) + "," +
String(mpu.getGyroY(),2) + "," +
String(mpu.getGyroZ(),2);
logFile.println(row);
if (millis() % 1000 < LOG_INTERVAL) logFile.flush(); // flush هر ثانیه
}
}
تحلیل ارتعاش با Python
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('imu_log.csv')
df['time_s'] = df['time_ms'] / 1000.0
# رسم FFT ارتعاش محور Z
from numpy.fft import fft, fftfreq
import numpy as np
fs = 100 # Hz
N = len(df)
freq = fftfreq(N, 1/fs)
fft_az = np.abs(fft(df['az'] - df['az'].mean()))
plt.figure(figsize=(12,4))
plt.subplot(1,2,1)
plt.plot(df['time_s'], df['roll'], label='Roll')
plt.plot(df['time_s'], df['pitch'], label='Pitch')
plt.legend(); plt.xlabel('زمان (s)'); plt.title('Roll & Pitch')
plt.subplot(1,2,2)
plt.plot(freq[:N//2], fft_az[:N//2])
plt.xlabel('فرکانس (Hz)'); plt.title('FFT ارتعاش محور Z')
plt.tight_layout(); plt.show()
چکلیست تست
| تست | نتیجه |
|---|---|
| فایل CSV روی SD ایجاد میشود؟ | بله |
| در حالت ثابت Roll=Pitch=0? | بله (بعد از calcOffsets) |
| نرخ لاگ ۱۰۰Hz محقق شده؟ | بررسی با diff(time_ms) |
| گراف Python داده بامعنی نشان میدهد؟ | بله |