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.

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.
| Fitur | Nilai |
|---|---|
| Sensor | Akselerometer 3 sumbu + giroskop 3 sumbu + suhu |
| Rentang akselerometer | ±2, ±4, ±8, ±16 g |
| Rentang giroskop | ±250, ±500, ±1000, ±2000 °/s |
| Resolusi | 16-bit (dari -32768 sampai 32767 per sumbu) |
| Antarmuka | I2C, sampai 400 kHz |
| Alamat I2C | 0x68 (AD0 ke GND) atau 0x69 (AD0 ke 3,3 V) |
| Tegangan chip | 2,375–3,46 V (board GY-521 menerima 3,3–5 V) |
| Arus | Sekitar 3,9 mA (5 µA ketika sleep) |
| Tambahan | DMP, 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.
| Pengaturan | Rentang akselerometer | LSB/g | Rentang giroskop | LSB/(°/s) |
|---|---|---|---|---|
| 0 | ±2 g | 16384 | ±250 °/s | 131 |
| 1 | ±4 g | 8192 | ±500 °/s | 65,5 |
| 2 | ±8 g | 4096 | ±1000 °/s | 32,8 |
| 3 | ±16 g | 2048 | ±2000 °/s | 16,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 MPU6050 | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | 5V | 3V3 | 3V3(OUT) |
| GND | GND | GND | GND |
| SCL | A5 | GPIO 22 | GP5 |
| SDA | A4 | GPIO 21 | GP4 |
| AD0 | Dibiarkan lepas (alamat 0x68) | Dibiarkan lepas (alamat 0x68) | Dibiarkan lepas (alamat 0x68) |
| INT | D2 (opsional) | GPIO mana saja (opsional) | Pin GP mana saja (opsional) |
| XDA, XCL | Tidak disambung | Tidak disambung | Tidak 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.
Mulai cepat dengan library: Adafruit MPU6050
- Buka Library Manager di Arduino IDE dan cari Adafruit MPU6050.
- Ketika ditanya soal dependensi selama instalasi, pilih Install all supaya Adafruit Unified Sensor dan Adafruit BusIO ikut terinstal.
- Hubungkan sensor sesuai tabel, upload sketch di bawah, lalu buka Serial Monitor di 115200 baud.
- 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.
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:
| Register | Alamat | Fungsi |
|---|---|---|
| SMPLRT_DIV | 0x19 | Pembagi laju sampel |
| CONFIG | 0x1A | Filter low-pass internal (DLPF) |
| GYRO_CONFIG | 0x1B | Rentang giroskop (±250 … ±2000 °/s) |
| ACCEL_CONFIG | 0x1C | Rentang akselerometer (±2 … ±16 g) |
| ACCEL_XOUT_H | 0x3B | Alamat awal data pengukuran (14 byte) |
| PWR_MGMT_1 | 0x6B | Sleep dan sumber clock; menulis 0 membangunkannya |
| WHO_AM_I | 0x75 | Identitas; 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.
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 kode | Kegunaannya |
|---|---|
| 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_DEG | Menghitung sudut roll dalam derajat dari akselerometer |
| ALPHA * (...) + (1 - ALPHA) * ... | Filter komplementer: menggabungkan giroskop dan akselerometer |
| yaw += gzRate * dt | Menghitung yaw hanya dari giroskop, sehingga kamu bisa melihatnya bergeser dari waktu ke waktu |
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²).
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.
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
| Gejala | Kemungkinan penyebab | Solusi |
|---|---|---|
| begin() mengembalikan false (“MPU6050 not found”) | Pengkabelan salah, alamat salah, atau chip tiruan | Cari alamatnya dengan I2C scanner; kalau WHO_AM_I bukan 0x68 (misalnya 0x70), pakai kode tanpa library |
| Semua nilai 0 | Sensor sedang dalam mode sleep | Tulis 0 ke register 0x6B |
| Nilai -1 atau macet | Kabel longgar, bus I2C terlalu panjang | Perpendek kabel, solder pin-pinnya |
| Sudut bergeser walaupun diam | Offset giroskop belum dikoreksi | Kalibrasi ketika mulai, dalam keadaan diam |
| Sudut melompat ketika bergerak | Hanya akselerometer yang dipakai | Tambahkan filter komplementer |
| Yaw terus bergeser | MPU6050 tidak punya kompas | Tambahkan magnetometer seperti QMC5883L atau pakai sensor 9 sumbu |
| Roll jadi kacau ketika pitch mendekati ±90° | Singularitas sudut Euler | Hindari daerah itu atau pakai output quaternion dari DMP |
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.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
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

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

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.

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

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

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).

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
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

