Langkah yang paling awal mungkin untuk membuat sebuah karya
ilmiyah dan mengaplikasinya menjadi nyata atau fisik. diartikel yang sederhana
admin akan menulas tentang robot
self dancing,
dimana dalam perakitanya banyak menemukan lika-liku pemrograman, algorithma dan
jalur daya arus listrik yang harus banyak di plajari terutama bagi pemula
Termasuk admin sendiri.. hhee..
dengan pemrograman robot Arduino
uno.
Media fisik yang admin gunakan melibatkan :
1. Arduini uno
3. MPU6050
dipersilahkan teman-teman juga persiapkan pendukunya seperti
mendonload sotware arduino beserta lengkap dengan driver yang dibutuhkannya.
Mengunakan Algoritma atau
langkah-langkah pemrogeraman robot yang nantinya Bagimana Robot akan
menyelesaikan permasalahan.
admin berfokus mengandalkan MPU6050 Agar Robot Self dancing
dapat berdiri dengan sempurna dengan gerakan yang halus.
untuk mengupas tuntas karya ini admin tuangkan dalam
artikel https://defenselocal.blogspot.com/
dimana pembahasanya admin perjelas dan detil. dengan biaya yang cukup merogo
kantong dalam-dalam teman-teman dapat mendapatkan informasi atau ilmu yang amat
berguna di era perkembangan indonesia yang akan mencapai Industri
teknologi 5.0
Example scure code :
Downloade code : https://drive.google.com/drive/folders/1tqgj-j8tvbbxaVzWnai1gVme0wBW68QV
###########################################
#include <Wire.h>
#include <MPU6050.h>
MPU6050 mpu;
// --- Variabel MPU6050 ---
float roll = 0; // Sudut roll
(sumbu Y)
float accAngle = 0;
float gyroRate = 0;
float alpha = 0.98;
unsigned long lastTime;
float gyroOffsetY = 0; // Offset untuk gyro Y
// --- PID ---
float Kp = 7.5;
float Ki = 1.10;
float Kd = 1.0;
float setpoint = 0.0;
float error, lastError = 0, integral = 0, derivative;
float pidOutput;
// --- Pin Motor Kiri (BTS7960) ---
const int L_RPWM = 6;
const int L_LPWM = 9;
const int L_REN = 8;
const int L_LEN = 7;
// --- Pin Motor Kanan (BTS7960) ---
const int R_RPWM = 10;
const int R_LPWM = 11;
const int R_REN = 13;
const int R_LEN = 12;
// --- Base Speed ---
const int baseSpeed = 16; // PWM minimal agar motor
berputar
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.initialize();
if (!mpu.testConnection()) {
Serial.println("MPU6050 tidak
terhubung!");
while (1);
}
Serial.println("Kalibrasi gyro Y... diamkan
sensor!");
calibrateGyroY();
Serial.println("Kalibrasi selesai.");
pinMode(L_RPWM, OUTPUT);
pinMode(L_LPWM, OUTPUT);
pinMode(L_REN, OUTPUT);
pinMode(L_LEN, OUTPUT);
pinMode(R_RPWM, OUTPUT);
pinMode(R_LPWM, OUTPUT);
pinMode(R_REN, OUTPUT);
pinMode(R_LEN, OUTPUT);
digitalWrite(L_REN, HIGH);
digitalWrite(L_LEN, HIGH);
digitalWrite(R_REN, HIGH);
digitalWrite(R_LEN, HIGH);
lastTime = millis();
}
void loop() {
unsigned long now = millis();
float dt = (now - lastTime) / 1000.0;
if (dt <= 0 || dt > 1) dt = 0.01;
lastTime = now;
int16_t ax, ay, az, gx, gy, gz;
mpu.getMotion6(&ax, &ay, &az, &gx,
&gy, &gz);
// Gunakan sumbu Roll (Y)
accAngle = atan2((float) - ax, (float)az) * 180.0 /
PI;
gyroRate = ((float)gy - gyroOffsetY) / 131.0;
// Filter complementary
roll = alpha * (roll + gyroRate * dt) + (1 - alpha) *
accAngle;
// --- PID ---
error = setpoint - roll;
integral += error * dt;
derivative = (error - lastError) / dt;
pidOutput = Kp * error + Ki * integral + Kd *
derivative;
lastError = error;
// Batasi output
if (pidOutput > 135) pidOutput = 135;
if (pidOutput < -135) pidOutput = -135;
int pwm = abs(pidOutput);
if (pwm > 0) pwm = max(pwm, baseSpeed); //
Pastikan minimal baseSpeed
// --- Safety cutoff jika miring lebih dari ±6
derajat ---
// Kontrol motor
if (pidOutput > 1) {
gerakMaju(pwm);
} else if (pidOutput < -1) {
gerakMundur(pwm);
} else {
motorStop();
}
// Debug
Serial.print("Roll: ");
Serial.print(roll);
Serial.print(" err: ");
Serial.print(error);
Serial.print(" PID: ");
Serial.print(pidOutput);
Serial.print(" pwm: ");
Serial.println(pwm);
}
void calibrateGyroY() {
long gySum = 0;
int16_t ax, ay, az, gx, gy, gz;
const int n = 500;
for (int i = 0; i < n; i++) {
mpu.getMotion6(&ax, &ay, &az,
&gx, &gy, &gz);
gySum += gy;
delay(2);
}
gyroOffsetY = (float)gySum / n;
}
// --- Fungsi Kontrol Motor ---
// Motor kiri maju, motor kanan mundur (berlawanan arah)
void gerakMaju(int speed) {
speed = constrain(speed, 0, 255);
analogWrite(L_RPWM, speed);
analogWrite(L_LPWM, 0);
analogWrite(R_RPWM, speed);
analogWrite(R_LPWM, 0);
}
// Motor kiri mundur, motor kanan maju (berlawanan arah)
void gerakMundur(int speed) {
speed = constrain(speed, 0, 255);
analogWrite(L_RPWM, 0);
analogWrite(L_LPWM, speed);
analogWrite(R_RPWM, 0);
analogWrite(R_LPWM, speed);
}
void motorStop() {
analogWrite(L_RPWM, 0);
analogWrite(L_LPWM, 0);
analogWrite(R_RPWM, 0);
analogWrite(R_LPWM, 0);
}
######################################
diartikel lain, admin mencari refrensi banyak juga yang
membahas tentang Robot self dancing dimana dari 99% mungkin kota-kota besar di
indonesia terutama Universitas atau perguruan tingi Mekanik
Robotik, sudah mengembangkan dan mengkolaborasikanya.
tidak jauh juga sekarang lembaga pendidik entah itu tingkat
SD,SMP dan SMK ada juga yang memanfaatkan Ektrakulikuler menjadi
Pemrograman/Perancangan Robot, seperti robt
line, robot
sensor api, robot
alarem anti maling.
Sudah bertebaran di dunia maya (Internet) Media sosial, Youtobe dan Website yang membuka pemblajaran tersebut, mdia online pun tersedia banyak. kadang diberikan secara percuma kalau kita rajin Searching di Googel. Tidak bukan jika teman-teman mengetikan (ROBOT SELF DANCING) teman-teman akan mendapatkan informasi yang diperlukan.
Teman-teman bisa melihat di chenel https://studio.youtube.com/video/5jtPQUbtXf8 diatas,
untuk melihat profilnya.
dan untuk vidio yang terbaru admin ada rencana akan pemperbarui perangkat
keras, yang akan di Mutahirkan dengan IA Insa
allah segera Rilis Akhir
Desember ini.
