Hii, I'm currently working on a self-balancing robot project following a YouTube tutorial, with the following components: Arduino Uno, MPU6050, L298N, and yellow DC motors. The programming code is like this:
#include "I2Cdev.h"
#include <PID_v1.h>
#include "MPU6050_6Axis_MotionApps20.h"
#include <Wire.h>
MPU6050 mpu;
bool dmpReady = false;
uint8_t mpuIntStatus, devStatus;
uint16_t packetSize, fifoCount;
uint8_t fifoBuffer[64];
Quaternion q;
VectorFloat gravity;
float ypr[3];
double setpoint = -2.5;
double input, output;
double Kp = 40, Ki = 1, Kd = 5;
PID pid(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);
volatile bool mpuInterrupt = false;
void dmpDataReady() { mpuInterrupt = true; }
void setup() {
if (devStatus == 0) {
Serial.println("MPU6050 siap, DMP aktif.");
// ...
} else {
Serial.print("DMP gagal. Kode: ");
Serial.println(devStatus);
}
Serial.begin(115200);
mpu.initialize();
devStatus = mpu.dmpInitialize();
// Sesuaikan offset dengan kalibrasi kamu
mpu.setXGyroOffset(-479);
mpu.setYGyroOffset(84);
mpu.setZGyroOffset(15);
mpu.setZAccelOffset(1638);
if (devStatus == 0) {
mpu.setDMPEnabled(true);
attachInterrupt(2, dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus();
dmpReady = true;
packetSize = mpu.dmpGetFIFOPacketSize();
pid.SetMode(AUTOMATIC);
pid.SetSampleTime(10);
pid.SetOutputLimits(-127, 127);
} else {
Serial.println("DMP failed.");
}
pinMode(6, OUTPUT); pinMode(9, OUTPUT); // Motor kiri
pinMode(10, OUTPUT); pinMode(11, OUTPUT); // Motor kanan
pinMode(5, OUTPUT); pinMode(3, OUTPUT); // ENA & ENB
}
void loop() {
if (!dmpReady) return;
if (!mpuInterrupt && fifoCount < packetSize) return;
mpuInterrupt = false;
mpuIntStatus = mpu.getIntStatus();
fifoCount = mpu.getFIFOCount();
if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
mpu.resetFIFO();
Serial.println("FIFO overflow!");
return;
}
if (mpuIntStatus & 0x02) {
while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
mpu.getFIFOBytes(fifoBuffer, packetSize);
fifoCount -= packetSize;
// Ambil orientasi
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
input = ypr[1] * 180 / M_PI; // Ambil pitch dalam derajat
// Deteksi jatuh
if (abs(input - setpoint) > 45) {
Stop();
Serial.println("Robot jatuh! Emergency Stop.");
return;
}
pid.Compute();
Serial.print("Pitch: "); Serial.print(input);
Serial.print(" | Output: "); Serial.println(output);
// Kendali motor
if (abs(output) < 5) {
Stop();
} else if (output > 0) {
Forward(abs(output));
} else {
Reverse(abs(output));
}
}
}
void Forward(int speed) {
digitalWrite(6, HIGH); digitalWrite(9, LOW); // Kiri maju
digitalWrite(10, HIGH); digitalWrite(11, LOW); // Kanan maju
analogWrite(5, speed); analogWrite(3, speed);
Serial.println("Forward");
}
void Reverse(int speed) {
digitalWrite(6, LOW); digitalWrite(9, HIGH); // Kiri mundur
digitalWrite(10, LOW); digitalWrite(11, HIGH); // Kanan mundur
analogWrite(5, speed); analogWrite(3, speed);
Serial.println("Reverse");
}
void Stop() {
analogWrite(5, 0); analogWrite(3, 0);
Serial.println("Stop");
}
The problem is that my robot won't balance and seems disconnected from the gyro. And uhh can someone solve this but translate it into indonesia language so i can understand it better ![]()