Komponen · 8 mnt baca

Panduan MPU6050 Arduino: Akselerometer, Giroskop, dan Sudut Kemiringan

MPU6050 dengan Arduino: pengkabelan, alamat I2C, nilai mentah, kalibrasi, sudut kemiringan dengan atan2 dan filter komplementer, plus kode library Adafruit, ESP32, dan Pico.

MPU6050 menggabungkan akselerometer 3 sumbu dan giroskop 3 sumbu dalam satu chip mungil dan merupakan sensor gerak yang paling banyak dipakai di proyek Arduino. Sensor ini mengukur seberapa jauh board dimiringkan, ke arah mana dan seberapa cepat board berputar, serta apakah board sedang diguncang atau jatuh. Robot penyeimbang diri, drone, stabilizer kamera (gimbal), penghitung langkah, dan game yang dikendalikan gerakan dibuat dengan sensor ini. MPU6050 terhubung ke Arduino hanya dengan empat kabel lewat I2C.

Di artikel ini kamu akan mempelajari langkah demi langkah cara kerja MPU6050, sumbu dan nilai mentahnya, pengkabelan I2C, membaca sensor dengan dan tanpa library, kalibrasi, menghitung sudut kemiringan dengan atan2, dan filter komplementer yang menggabungkan kekuatan kedua sensor. Setelah itu kita membuat alarm pendeteksi jatuh dengan ESP32 dan menulis kode MicroPython untuk Raspberry Pi Pico.

Modul akselerometer dan giroskop MPU6050 GY-521
MPU6050 di board GY-521: pin VCC, GND, SCL, SDA, XDA, XCL, AD0, dan INT; arah sumbu X dan Y tercetak di board.

Apa itu MPU6050 dan bagaimana cara kerjanya?

MPU6050 buatan InvenSense (sekarang TDK) adalah sebuah IMU, unit pengukuran inersia. Di dalamnya ada struktur mekanis mungil dari silikon (MEMS). Akselerometer mengukur seberapa jauh sebuah massa kecil yang dipasang pada pegas bergeser karena percepatan; karena sensor ini merasakan gravitasi bahkan ketika diam, sensor yang tergeletak rata di meja menunjukkan sekitar 1 g (9,81 m/s²) di sumbu Z, sehingga kemiringannya terhadap tanah bisa dihitung. Giroskop mengukur kecepatan sudut, yaitu berapa derajat per detik sensor berputar, dari gaya Coriolis yang bekerja pada struktur yang bergetar. Hasil pengukuran diubah menjadi angka oleh ADC 16-bit di dalam chip dan dibaca lewat I2C. Chip ini juga berisi sensor suhu dan prosesor gerak digital (DMP) yang bisa mengambil alih perhitungan gerak.

FiturNilai
SensorAkselerometer 3 sumbu + giroskop 3 sumbu + suhu
Rentang akselerometer±2, ±4, ±8, ±16 g
Rentang giroskop±250, ±500, ±1000, ±2000 °/s
Resolusi16-bit (dari -32768 sampai 32767 per sumbu)
AntarmukaI2C, sampai 400 kHz
Alamat I2C0x68 (AD0 ke GND) atau 0x69 (AD0 ke 3,3 V)
Tegangan chip2,375–3,46 V (board GY-521 menerima 3,3–5 V)
ArusSekitar 3,9 mA (5 µA ketika sleep)
TambahanDMP, FIFO 1024 byte, interupsi gerak, I2C tambahan untuk sensor eksternal

Sumbu, nilai mentah, dan sensitivitas

Panah di board menunjukkan sumbu X dan Y; sumbu Z tegak lurus terhadap board dan mengarah ke atas. Sensor memberikan angka 16-bit bertanda untuk setiap sumbu. Untuk mengubah angka mentah ini menjadi satuan fisik, bagi dengan sensitivitas untuk rentang yang kamu pilih. Misalnya, di rentang bawaan ±2 g, nilai mentah 16384 berarti 1 g; dari sensor yang tergeletak di meja kamu akan membaca az ≈ 16384 dan ax, ay ≈ 0. Untuk giroskop di rentang ±250 °/s, nilai mentah 131 sama dengan putaran 1 derajat per detik. Rentang yang lebih lebar bisa mengukur gerakan yang lebih keras, tetapi menampilkan perubahan kecil dengan lebih kasar, jadi pilih rentang tersempit yang cukup untuk proyekmu.

PengaturanRentang akselerometerLSB/gRentang giroskopLSB/(°/s)
0±2 g16384±250 °/s131
1±4 g8192±500 °/s65,5
2±8 g4096±1000 °/s32,8
3±16 g2048±2000 °/s16,4

Chip ini juga mengukur suhu: °C = nilai mentah / 340 + 36,53. Nilai ini menunjukkan suhu chip itu sendiri, bukan suhu ruangan, tetapi karena titik nol giroskop bergeser mengikuti suhu, nilai ini berguna untuk koreksi tingkat lanjut.

Pengkabelan MPU6050: Arduino Uno, ESP32, dan Pico

Pin MPU6050Arduino UnoESP32Raspberry Pi Pico
VCC5V3V33V3(OUT)
GNDGNDGNDGND
SCLA5GPIO 22GP5
SDAA4GPIO 21GP4
AD0Dibiarkan lepas (alamat 0x68)Dibiarkan lepas (alamat 0x68)Dibiarkan lepas (alamat 0x68)
INTD2 (opsional)GPIO mana saja (opsional)Pin GP mana saja (opsional)
XDA, XCLTidak disambungTidak disambungTidak disambung

Karena board GY-521 punya regulator 3,3 V, VCC bisa kamu hubungkan ke pin 5V di Uno. Pin AD0 ditarik ke GND di board lewat resistor 4,7 kΩ, jadi alamatnya 0x68 kalau dibiarkan lepas; kalau ingin dua MPU6050 di bus yang sama, hubungkan pin AD0 salah satunya ke 3,3 V untuk mengubah alamatnya menjadi 0x69. Pin INT memberi sinyal ketika data baru siap atau gerakan terdeteksi; untuk proyek sederhana, pin ini tidak perlu disambung. Setelah pengkabelan, biasakan memeriksa apakah sensornya muncul dengan sketch I2C scanner; caranya ada di Layar LCD I2C.

Jangan tertukar antara SDA dan SCL dengan XDA dan XCL. XDA dan XCL adalah bus I2C tambahan yang dipakai MPU6050 untuk menghubungkan sensor kompas eksternal ke dirinya sendiri; kalau Arduino kamu sambungkan ke sana, sensornya tidak akan pernah ditemukan. Selain itu, beberapa board MPU6050 polos tidak punya regulator dan hanya boleh diberi daya 3,3 V; kalau kamu tidak melihat chip regulator kecil di board-mu, jangan beri 5 V.

Mulai cepat dengan library: Adafruit MPU6050

  1. Buka Library Manager di Arduino IDE dan cari Adafruit MPU6050.
  2. Ketika ditanya soal dependensi selama instalasi, pilih Install all supaya Adafruit Unified Sensor dan Adafruit BusIO ikut terinstal.
  3. Hubungkan sensor sesuai tabel, upload sketch di bawah, lalu buka Serial Monitor di 115200 baud.
  4. Buka Serial Plotter dari menu Tools untuk melihat keenam sumbu sebagai grafik langsung; kurva percepatan berubah ketika board dimiringkan, dan kurva giroskop berubah ketika board diputar.
C++ (Arduino IDE)
1#include <Wire.h>
2#include <Adafruit_MPU6050.h>
3#include <Adafruit_Sensor.h>
4
5Adafruit_MPU6050 mpu;
6
7void setup() {
8  Serial.begin(115200);
9  if (!mpu.begin()) {                             // varsayılan adres 0x68 / default address 0x68
10    Serial.println("MPU6050 bulunamadi / not found");
11    while (true) delay(10);
12  }
13  mpu.setAccelerometerRange(MPU6050_RANGE_4_G);   // ±4 g
14  mpu.setGyroRange(MPU6050_RANGE_500_DEG);        // ±500 °/s
15  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);     // titreşimi süz / filter out vibration
16}
17
18void loop() {
19  sensors_event_t a, g, t;
20  mpu.getEvent(&a, &g, &t);
21  Serial.print("ax:");  Serial.print(a.acceleration.x);   // m/s²
22  Serial.print(" ay:"); Serial.print(a.acceleration.y);
23  Serial.print(" az:"); Serial.print(a.acceleration.z);
24  Serial.print(" gx:"); Serial.print(g.gyro.x);           // rad/s
25  Serial.print(" gy:"); Serial.print(g.gyro.y);
26  Serial.print(" gz:"); Serial.print(g.gyro.z);
27  Serial.print(" T:");  Serial.println(t.temperature);    // °C
28  delay(100);
29}

Library Adafruit memberikan hasil langsung dalam satuan fisik: percepatan dalam m/s², kecepatan sudut dalam rad/s, dan suhu dalam °C. Untuk mengubah nilai giroskop ke derajat per detik, cukup kalikan dengan 57,3. Filter low-pass internal yang dipilih dengan setFilterBandwidth mengurangi gangguan getaran: 21 Hz adalah titik awal yang bagus untuk gerakan tangan, dan kalau ingin menangkap benturan singkat, pilih 94 atau 260 Hz. Ketika mulai, library membaca register identitas chip (WHO_AM_I), dan begin() mengembalikan false kalau nilainya bukan 0x68.

Membaca tanpa library, kalibrasi, dan sudut kemiringan

Library memang memudahkan, tetapi membaca register secara langsung adalah cara yang bagus untuk memahami apa yang terjadi di dalam sensor. MPU6050 menyala dalam mode sleep; pertama kamu harus membangunkannya dengan menulis 0 ke register 0x6B (PWR_MGMT_1). Lalu baca 14 byte mulai dari alamat 0x3B: 6 byte percepatan, 2 byte suhu, dan 6 byte data giroskop. Setiap nilai terdiri dari dua byte, byte tinggi lebih dulu. Inilah register utama yang dipakai di kode dan layak kamu kenal:

RegisterAlamatFungsi
SMPLRT_DIV0x19Pembagi laju sampel
CONFIG0x1AFilter low-pass internal (DLPF)
GYRO_CONFIG0x1BRentang giroskop (±250 … ±2000 °/s)
ACCEL_CONFIG0x1CRentang akselerometer (±2 … ±16 g)
ACCEL_XOUT_H0x3BAlamat awal data pengukuran (14 byte)
PWR_MGMT_10x6BSleep dan sumber clock; menulis 0 membangunkannya
WHO_AM_I0x75Identitas; mengembalikan 0x68 di MPU6050 asli

Pada sensor yang diam, satu-satunya gaya yang dilihat akselerometer adalah gravitasi. Dengan melihat bagaimana gravitasi terbagi di antara sumbu-sumbunya, kamu mendapat dua sudut: sudut roll di sekitar sumbu X adalah roll = atan2(ay, az), dan sudut pitch di sekitar sumbu Y adalah pitch = atan2(−ax, √(ay² + az²)). Berbeda dengan arctangen biasa, atan2 memberikan tanda yang benar di keempat kuadran dan tidak membagi dengan nol ketika az mendekati nol. Misalnya, kalau kamu membaca ay = 8192 dan az = 14189, roll = atan2(8192, 14189) ≈ 30°. Namun putaran di sekitar sumbu Z (yaw) tidak terlihat oleh akselerometer, karena tidak mengubah cara gravitasi terbagi di antara sumbu-sumbunya.

Kedua sensor punya titik lemah. Akselerometer akurat dalam jangka panjang tetapi sangat berisik selama bergerak dan bergetar, karena selain gravitasi ia juga mengukur percepatan gerakan itu sendiri. Giroskop mulus dalam jangka pendek, tetapi untuk mendapat sudut kamu menjumlahkan kecepatan sudut dari waktu ke waktu (angle += rate × dt), dan offset kecil pun menumpuk lalu pelan-pelan menyeret sudutnya menjauh. Filter komplementer menggabungkan keduanya: angle = 0.98 × (angle + gyro × dt) + 0.02 × sudut akselerometer. Filter ini memercayai giroskop dalam jangka pendek dan akselerometer dalam jangka panjang. Di 100 Hz (dt = 0,01 s), koefisien ini memberikan konstanta waktu sekitar setengah detik: τ = 0.98 × 0.01 / 0.02 = 0,49 s.

Kalibrasi sama pentingnya dengan filter, bahkan lebih. Giroskop yang sama sekali tidak bergerak pun bisa menunjukkan offset tetap beberapa °/s; kalau tidak dikoreksi, sudut hasil hitunganmu bergeser puluhan derajat dalam hitungan detik. Sketch di bawah merata-rata 500 bacaan ketika mulai, selama sensor diam, lalu mengurangkannya dari setiap bacaan berikutnya. Taruh board di permukaan datar dan jangan disentuh selama kalibrasi; setelah itu amati kurva roll, pitch, dan yaw di Serial Plotter.

C++ (Arduino IDE)
1#include <Wire.h>
2
3const int MPU_ADDR = 0x68;           // AD0 GND'de ya da boşta / AD0 to GND or floating
4const float GYRO_LSB = 131.0;        // ±250 °/s aralığında 1 °/s / 1 °/s at the ±250 °/s range
5const float ALPHA = 0.98;            // tamamlayıcı filtre katsayısı / complementary filter weight
6
7int16_t ax, ay, az, tempRaw, gx, gy, gz;
8float gxOff = 0, gyOff = 0, gzOff = 0;   // jiroskop sapmaları / gyro offsets
9float roll = 0, pitch = 0, yaw = 0;
10unsigned long lastMicros;
11
12void writeReg(uint8_t reg, uint8_t val) {
13  Wire.beginTransmission(MPU_ADDR);
14  Wire.write(reg);
15  Wire.write(val);
16  Wire.endTransmission();
17}
18
19int16_t read16() {
20  uint8_t hi = Wire.read();          // önce yüksek bayt / high byte first
21  uint8_t lo = Wire.read();
22  return (int16_t)(((uint16_t)hi << 8) | lo);
23}
24
25void readMPU() {
26  Wire.beginTransmission(MPU_ADDR);
27  Wire.write(0x3B);                  // ACCEL_XOUT_H
28  Wire.endTransmission(false);       // hattı bırakma, tekrar başlat / repeated start
29  Wire.requestFrom(MPU_ADDR, 14);    // ivme 6 + sıcaklık 2 + jiroskop 6 bayt / accel 6 + temp 2 + gyro 6 bytes
30  ax = read16(); ay = read16(); az = read16();
31  tempRaw = read16();
32  gx = read16(); gy = read16(); gz = read16();
33}
34
35void calibrateGyro() {
36  const int N = 500;
37  long sx = 0, sy = 0, sz = 0;
38  for (int i = 0; i < N; i++) {
39    readMPU();
40    sx += gx; sy += gy; sz += gz;
41    delay(3);
42  }
43  gxOff = sx / (float)N;
44  gyOff = sy / (float)N;
45  gzOff = sz / (float)N;
46}
47
48void setup() {
49  Serial.begin(115200);
50  Wire.begin();
51  Wire.setClock(400000);             // 400 kHz hızlı mod / 400 kHz fast mode
52  writeReg(0x6B, 0x00);              // PWR_MGMT_1: uykudan uyandır / wake up
53  writeReg(0x1A, 0x03);              // CONFIG: alçak geçiren filtre ~44 Hz / low-pass ~44 Hz
54  writeReg(0x1B, 0x00);              // GYRO_CONFIG: ±250 °/s
55  writeReg(0x1C, 0x00);              // ACCEL_CONFIG: ±2 g
56  delay(100);
57  Serial.println("Kalibrasyon: sensoru oynatma / calibrating: keep still");
58  calibrateGyro();
59  readMPU();
60  roll  = atan2(ay, az) * RAD_TO_DEG;                                    // başlangıç açıları / initial angles
61  pitch = atan2(-ax, sqrt((float)ay * ay + (float)az * az)) * RAD_TO_DEG;
62  lastMicros = micros();
63}
64
65void loop() {
66  readMPU();
67  unsigned long now = micros();
68  float dt = (now - lastMicros) / 1000000.0;   // saniye / seconds
69  lastMicros = now;
70
71  float accRoll  = atan2(ay, az) * RAD_TO_DEG;                           // ivmeölçerden açı / angle from accelerometer
72  float accPitch = atan2(-ax, sqrt((float)ay * ay + (float)az * az)) * RAD_TO_DEG;
73  float gxRate = (gx - gxOff) / GYRO_LSB;      // °/s
74  float gyRate = (gy - gyOff) / GYRO_LSB;
75  float gzRate = (gz - gzOff) / GYRO_LSB;
76
77  roll  = ALPHA * (roll  + gxRate * dt) + (1 - ALPHA) * accRoll;        // tamamlayıcı filtre / complementary filter
78  pitch = ALPHA * (pitch + gyRate * dt) + (1 - ALPHA) * accPitch;
79  yaw  += gzRate * dt;                         // yalnız jiroskop: zamanla kayar / gyro only: drifts over time
80
81  Serial.print("roll:");   Serial.print(roll, 1);
82  Serial.print(" pitch:"); Serial.print(pitch, 1);
83  Serial.print(" yaw:");   Serial.println(yaw, 1);
84  delay(10);                                   // yaklaşık 100 Hz / about 100 Hz
85}
Baris kodeKegunaannya
writeReg(0x6B, 0x00)Membangunkan sensor dari mode sleep
writeReg(0x1A, 0x03)Mengaktifkan filter internal di sekitar 44 Hz
Wire.requestFrom(MPU_ADDR, 14)Membaca data percepatan, suhu, dan giroskop sekaligus
calibrateGyro()Mencari offset giroskop dengan merata-rata 500 bacaan
atan2(ay, az) * RAD_TO_DEGMenghitung sudut roll dalam derajat dari akselerometer
ALPHA * (...) + (1 - ALPHA) * ...Filter komplementer: menggabungkan giroskop dan akselerometer
yaw += gzRate * dtMenghitung yaw hanya dari giroskop, sehingga kamu bisa melihatnya bergeser dari waktu ke waktu
Guncang board pelan-pelan sambil mengamati Serial Plotter: sudut akselerometer mentah melompat-lompat, sedangkan sudut yang sudah difilter tetap tenang. Untuk respons yang lebih cepat, turunkan ALPHA ke 0.95; untuk getaran yang lebih sedikit, naikkan ke 0.99. Untuk hasil yang lebih stabil lagi, contoh DMP di library MPU6050 buatan Electronic Cats menghitung sudut dari data quaternion yang diolah di prosesor sensor itu sendiri.

MPU6050 dengan ESP32: alarm pendeteksi jatuh

Di ESP32, pengkabelannya sama dengan di Uno, hanya saja pin I2C-nya adalah GPIO 21 (SDA) dan GPIO 22 (SCL), dan modulnya diberi daya dari 3V3. Semua sketch di atas berjalan tanpa perubahan di ESP32; kalau mau, kamu bisa menentukan pinnya secara eksplisit dengan Wire.begin(21, 22). Contoh di bawah adalah pendeteksi jatuh. Pada benda yang jatuh bebas, akselerometer membaca hampir 0 g, karena badan sensor dan massa di dalamnya jatuh bersamaan; benturan sesudahnya menghasilkan puncak beberapa g. Kalau sketch melihat jatuh bebas selama minimal 100 ms yang diikuti benturan di atas 2,5 g dalam setengah detik, buzzer aktif di GPIO 25 berbunyi selama satu detik. Jatuh bebas 100 ms setara dengan jatuh dari ketinggian sekitar 5 cm (h = ½ × g × t²).

C++ (Arduino IDE)
1#include <Wire.h>
2#include <Adafruit_MPU6050.h>
3#include <Adafruit_Sensor.h>
4
5Adafruit_MPU6050 mpu;
6const int BUZZER_PIN = 25;           // aktif buzzer / active buzzer
7const float FREE_FALL_G = 0.4;       // serbest düşüş eşiği / free-fall threshold
8const float IMPACT_G = 2.5;          // darbe eşiği / impact threshold
9unsigned long fallStart = 0, fallEnd = 0;
10
11void setup() {
12  Serial.begin(115200);
13  pinMode(BUZZER_PIN, OUTPUT);
14  Wire.begin(21, 22);                // SDA, SCL
15  if (!mpu.begin(0x68, &Wire)) {
16    Serial.println("MPU6050 bulunamadi / not found");
17    while (true) delay(10);
18  }
19  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);   // darbeler için geniş aralık / wide range for impacts
20  mpu.setFilterBandwidth(MPU6050_BAND_94_HZ);     // kısa darbeleri kaçırma / keep short peaks
21}
22
23void loop() {
24  sensors_event_t a, g, t;
25  mpu.getEvent(&a, &g, &t);
26  float x = a.acceleration.x, y = a.acceleration.y, z = a.acceleration.z;
27  float total = sqrt(x * x + y * y + z * z) / SENSORS_GRAVITY_STANDARD;   // toplam ivme, g / total acceleration in g
28  unsigned long now = millis();
29
30  if (total < FREE_FALL_G) {
31    if (fallStart == 0) fallStart = now;             // düşüş başladı / fall started
32  } else if (fallStart != 0) {
33    if (now - fallStart > 100) fallEnd = now;        // en az 100 ms süren düşüş / fall of at least 100 ms
34    fallStart = 0;
35  }
36
37  if (fallEnd != 0 && now - fallEnd < 500 && total > IMPACT_G) {   // düşüşten sonra 0,5 s içinde darbe / impact within 0.5 s
38    Serial.println("DUSME ALGILANDI / FALL DETECTED");
39    digitalWrite(BUZZER_PIN, HIGH);
40    delay(1000);
41    digitalWrite(BUZZER_PIN, LOW);
42    fallEnd = 0;
43  }
44  if (fallEnd != 0 && now - fallEnd >= 500) fallEnd = 0;   // darbe gelmedi, sıfırla / no impact, reset
45  delay(5);
46}

Dari sini, kamu bisa menambahkan Wi-Fi ESP32, misalnya untuk mengirim notifikasi Telegram ke ponselmu kalau kerabat lansia terjatuh, atau menampilkan sudutnya secara langsung di halaman web. Sesuaikan ambangnya lewat uji cobamu sendiri: kotak yang jatuh dari meja dan sensor yang dipakai di pergelangan tangan menghasilkan puncak yang berbeda. Untuk memilih dan menghubungkan buzzer, baca Apa Itu Buzzer?.

MPU6050 dengan Raspberry Pi Pico (MicroPython)

Di Pico tidak perlu library tambahan; kelas I2C bawaan MicroPython bisa membaca register secara langsung. Hubungkan sensor ke bus I2C0, dengan SDA di GP4 dan SCL di GP5. Kita memakai struct.unpack untuk mengubah 14 byte menjadi tujuh angka 16-bit bertanda; “>” berarti big-endian (byte tinggi lebih dulu) dan “h” berarti 16-bit bertanda. Kode ini pertama-tama mencetak alamat I2C yang ditemukannya; kalau 0x68 tidak ada di daftar, periksa pengkabelannya. Agar sederhana, kami tidak menambahkan kalibrasi; kalau perlu, metode merata-rata dari sketch Arduino bisa kamu terapkan dengan cara yang persis sama.

MicroPython
1from machine import Pin, I2C
2import math, struct, time
3
4MPU = 0x68
5i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
6print("Bulunan adresler / found addresses:", [hex(a) for a in i2c.scan()])
7
8i2c.writeto_mem(MPU, 0x6B, b"\x00")     # uykudan uyandır / wake up
9i2c.writeto_mem(MPU, 0x1A, b"\x03")     # alçak geçiren filtre ~44 Hz / low-pass ~44 Hz
10i2c.writeto_mem(MPU, 0x1B, b"\x00")     # jiroskop ±250 °/s / gyro ±250 °/s
11i2c.writeto_mem(MPU, 0x1C, b"\x00")     # ivmeölçer ±2 g / accelerometer ±2 g
12roll = pitch = 0.0
13last = time.ticks_us()
14
15while True:
16    data = i2c.readfrom_mem(MPU, 0x3B, 14)
17    ax, ay, az, t, gx, gy, gz = struct.unpack(">hhhhhhh", data)   # büyük endian, işaretli / big-endian, signed
18    now = time.ticks_us()
19    dt = time.ticks_diff(now, last) / 1000000
20    last = now
21    acc_roll = math.degrees(math.atan2(ay, az))
22    acc_pitch = math.degrees(math.atan2(-ax, math.sqrt(ay * ay + az * az)))
23    roll = 0.98 * (roll + gx / 131 * dt) + 0.02 * acc_roll        # tamamlayıcı filtre / complementary filter
24    pitch = 0.98 * (pitch + gy / 131 * dt) + 0.02 * acc_pitch
25    temp = t / 340 + 36.53                                        # °C
26    print("roll {:.1f}  pitch {:.1f}  T {:.1f}".format(roll, pitch, temp))
27    time.sleep_ms(10)

Ide proyek MPU6050

  • Waterpass digital: tampilkan sudut roll dan pitch di layar OLED dengan gelembung yang bergerak.
  • Servo yang dikendalikan gerakan: ketika kamu memiringkan sensor di tangan, motor servo berputar ke sudut yang sama; ideal untuk lengan robot atau kepala kamera.
  • Game yang dikendalikan kemiringan: mainkan Pong atau game labirin dengan memiringkan board, bukan dengan joystick.
  • Robot penyeimbang diri: olah sudut pitch dengan loop PID dan jaga robot tetap tegak dengan motor DC yang dikendalikan L298N.
  • Penghitung langkah: ukur aktivitas berjalan dengan menghitung puncak teratur pada percepatan total.
  • Pencatat getaran: ukur guncangan mesin atau mesin cuci dan beri peringatan ketika melewati ambang.

Kesalahan umum dan cara mengatasinya

GejalaKemungkinan penyebabSolusi
begin() mengembalikan false (“MPU6050 not found”)Pengkabelan salah, alamat salah, atau chip tiruanCari alamatnya dengan I2C scanner; kalau WHO_AM_I bukan 0x68 (misalnya 0x70), pakai kode tanpa library
Semua nilai 0Sensor sedang dalam mode sleepTulis 0 ke register 0x6B
Nilai -1 atau macetKabel longgar, bus I2C terlalu panjangPerpendek kabel, solder pin-pinnya
Sudut bergeser walaupun diamOffset giroskop belum dikoreksiKalibrasi ketika mulai, dalam keadaan diam
Sudut melompat ketika bergerakHanya akselerometer yang dipakaiTambahkan filter komplementer
Yaw terus bergeserMPU6050 tidak punya kompasTambahkan magnetometer seperti QMC5883L atau pakai sensor 9 sumbu
Roll jadi kacau ketika pitch mendekati ±90°Singularitas sudut EulerHindari daerah itu atau pakai output quaternion dari DMP
Ketika memasang sensor di proyekmu, kencangkan board dengan sekrup atau selotip dua sisi; board yang longgar akan mengukur getarannya sendiri. Mengalibrasi di suhu tempat sensor akan bekerja juga mengurangi pergeseran.

Walaupun harganya murah, MPU6050 membuka pintu untuk mengukur gerakan: kenali dulu nilai mentahnya, lalu hitung sudutnya, dan terakhir haluskan dengan filter. Untuk melihat sensor I2C lain dan kegunaannya, lihat Panduan Sensor Arduino. Di aplikasi BlueGrays ada proyek kontrol servo, layar I2C, joystick, dan robot dengan skema rangkaian dan kode langkah demi langkah yang bisa kamu gabungkan dengan MPU6050.

Pertanyaan umum

MPU6050 dipakai untuk apa?

MPU6050 mengukur kemiringan, kecepatan putar, dan percepatan sebuah benda. Sensor ini dipakai di robot penyeimbang diri, drone dan gimbal, penghitung langkah, pendeteksi jatuh dan benturan, serta game yang dikendalikan gerakan.

Alamat MPU6050 itu 0x68 atau 0x69?

Alamatnya 0x68 ketika pin AD0 dibiarkan lepas atau disambung ke GND, dan 0x69 ketika disambung ke 3,3 V. Di board GY-521, AD0 ditarik ke GND lewat resistor, jadi alamat bawaannya 0x68. Supaya yakin, jalankan sketch I2C scanner.

Apakah MPU6050 bisa bekerja dengan 5 V?

Chip MPU6050 sendiri bekerja di maksimal 3,46 V, tetapi berkat regulator di board GY-521, pin VCC bisa diberi 5 V. Jalur I2C tetap di level 3,3 V, yang bisa dibaca Arduino Uno tanpa masalah. Board polos tanpa regulator tidak boleh diberi 5 V.

Bagaimana cara menghitung sudut dengan MPU6050?

Ketika sensor diam, sudut didapat dari akselerometer dengan roll = atan2(ay, az) dan pitch = atan2(−ax, √(ay² + az²)). Untuk hasil yang akurat selama bergerak, kecepatan sudut dari giroskop diintegrasikan terhadap waktu dan digabung dengan sudut akselerometer memakai filter komplementer atau filter Kalman.

Bisakah MPU6050 mengukur yaw?

Untuk waktu singkat, bisa: yaw dapat dihitung dengan mengintegrasikan kecepatan sudut di sumbu Z. Tetapi karena MPU6050 tidak punya magnetometer, yaw bergeser seiring waktu dan tidak bisa mengetahui arah mutlak (utara). Untuk arah yang stabil, kamu butuh sensor kompas seperti QMC5883L atau IMU 9 sumbu.

Apa perbedaan MPU6050 dan MPU9250?

MPU6050 adalah sensor 6 sumbu dengan akselerometer dan giroskop. MPU9250 menambahkan magnetometer 3 sumbu sehingga menjadi 9 sumbu, jadi bisa mengukur yaw tanpa pergeseran; sensor ini juga mendukung SPI. Karena MPU9250 sudah tidak diproduksi lagi, penerusnya seperti ICM-20948 lebih dipilih untuk proyek baru.

Lihat semua proyek
Menggunakan Motor Servo
#35Pemula
Premium

Menggunakan Motor Servo

Lengan motor servo kecil berputar ke tiga posisi bergantian: penuh ke awal, tepat ke tengah, dan penuh ke akhir, menunggu dua detik di setiap perhentian. Arduino memberi tahu motor sudut mana yang har

4.7(48)
67
Kendali Servo dengan Joystick
#60Menengah
Premium

Kendali Servo dengan Joystick

Arahkan dua motor dengan joystick, persis seperti memutar kamera keamanan. Dorong tuas ke kiri atau kanan dan servo bawah berputar perlahan, dorong ke atas atau bawah dan servo atas mendongak dan menu

4.7(42)
58
Motor Servo ESP32 (Kendali Potensiometer)
#118Menengah
Premium

Motor Servo ESP32 (Kendali Potensiometer)

Di proyek ini, kita mengendalikan motor servo SG90 memakai potensiometer. Kita mengatur sudut servo dengan memetakan nilai analog yang dibaca dari potensiometer ke rentang 0–180 derajat. Library ESP32Servo menghasilkan sinyal servo di pin GPIO ESP32 yang sesuai dan bisa menjadi output; proyek ini memakai GPIO 18. Ini metode kendali dasar untuk lengan robot, gimbal kamera, dan mekanisme pintu otomatis.

4.3(29)
42
Game Bola Pemukul - SSD1306
#86Menengah
Premium

Game Bola Pemukul - SSD1306

Satu bola, dua pemukul, dan kamu: kamu bermain tenis meja, salah satu video game paling awal, di layar OLED kecil. Dua tombol menggerakkan pemukulmu di kanan ke atas dan ke bawah, sementara komputer m

4.5(47)
65
Menggunakan Layar LCD dengan I2C
#32Pemula
Premium

Menggunakan Layar LCD dengan I2C

Beri Arduino-mu layar sendiri dan buat ia menulis pesan pertamanya. Layar LCD dua baris tersambung hanya dengan beberapa kabel; sapaan muncul di baris atas, lalu pesan kedua di baris bawah, layar dibe

4.8(53)
70
Layar LCD I2C ESP32 (16x2)
#119Menengah
Premium

Layar LCD I2C ESP32 (16x2)

Di proyek ini, kita menampilkan teks dengan menyambungkan layar LCD karakter 16x2 ke ESP32 lewat protokol I2C. Berkat I2C, kita bisa mengendalikan layar hanya dengan dua pin data (SDA dan SCL), sehingga tidak perlu memboroskan 6+ pin seperti pada sambungan paralel klasik. Kode mencetak pesan tetap di baris pertama dan penghitung yang naik setiap detik di baris kedua. Selain itu, kita menjalankan pemindai I2C di awal untuk mencetak alamat layar ke Serial Monitor (biasanya 0x27).

4.9(23)
40
Robot Penghindar Rintangan
#81Mahir
Premium

Robot Penghindar Rintangan

Bagaimana kalau membuat kendaraan pintar yang mencari jalannya sendiri? Robot Penghindar Rintangan terus memindai sekelilingnya berkat sensor ultrasonik di depannya. Ketika menemui rintangan, robot be

5.0(38)
49