---
# System prepended metadata

title: Sistem Kendali Posisi dan Jarak pada Mobil dengan Metode PID Berbasis Arduino Uno

---

# Sistem Kendali Posisi dan Jarak pada Mobil dengan Metode PID Berbasis Arduino Uno


## Nama Kelompok
* Maulidiatama Akbar / 1103213090
* Angelica Sharon Amelia Simanjutak / 1103210032
* Kinanti Rahayu Az-Zahra / 1103210052
* Eva Fiorina Siahaan / 1103210101
* Nella Aprillia / 1103210185

## Daftar Isi

> [TOC]


> **[CLO 4]** Memiliki kemampuan untuk menganalisis sistem kendali loop tertutup pada kondisi transien dan steady state untuk melihat performansinya.
> **[CLO 5]** Memiliki kemampuan merancang sistem kendali motor DC.
<!--
> **Capaian CLO 4:**
> 1.Mahasiswa mampu menjelaskan konsep kendali umpan balik.
> 2.Mahasiswa mampu merancang sistem kendali PID.
> 3.Mahasiswa mampu mengevaluasi dan optimasi sistem kendali PID.
> **Capaian CLO 5:**
> 1.Mahasiswa mampu mendapatkan fungsi transfer sistem dari mekanisme transfer daya.
> 2.Mampu menjelaskan cara kerja dan karakteristik motor listrik, khususnya motor DC.
> 3.Mampu menganalisis hubungan antara torsi dan kecepatan motor.
> 4.Mahasiswa mampu mendemonstrasikan sistem mekanisme transfer daya sederhana menggunakan gear dan motor DC.
> 
-->


## Pendahuluan
<div style="text-align: justify;">
Laporan ini dibuat untuk menyelesaikan tugas CLO 4 dan CLO 5 pada mata kuliah Sistem Kendali dan Mekanika. Pada tugas ini, kami memilih untuk membuat projek Sistem Kendali Posisi dan Jarak pada Mobil dengan Metode PID Berbasis Arduino Uno. Arduino Uno, sebuah platform mikrokontroler yang terkenal karena kemudahannya dalam penggunaan dan fleksibilitasnya, telah menjadi pilihan populer dalam pengembangan prototipe dan sistem otomatisasi. Kombinasi antara metode PID dan Arduino Uno menawarkan solusi yang cost-effective dan dapat diimplementasikan dalam berbagai aplikasi otomotif. Dalam konteks ini, proyek ini bertujuan untuk merancang dan mengimplementasikan sistem kendali posisi dan jarak pada mobil menggunakan metode PID berbasis Arduino Uno. Dengan memanfaatkan sensor jarak dan aktuator yang sesuai, sistem ini diharapkan dapat mengendalikan posisi mobil secara akurat dan menjaga jarak aman dari kendaraan atau objek di sekitarnya. Pengembangan proyek ini akan melibatkan berbagai tahap, mulai dari perancangan sistem, pemrograman, hingga pengujian dan evaluasi kinerja.
</div>

## Rancangan Sistem Kendali Loop Tertutup PID
<div style="text-align: justify;">
PID adalah singkatan dari Proportional, Integral, dan Derivative, yang merupakan jenis kontrol feedback pada sistem kontrol. Metode PID adalah salah satu metode yang efektif untuk mengontrol posisi dan jarak pada mobil. Di mana keluaran sensor diumpankan kembali ke pengontrol untuk memperbaiki kesalahan. Pada alat ini, sensor jarak dan posisi memberikan feedback untuk menyesuaikan gerakan mobil.

Pada alat yang kami buat, nilai P, I, dan D memiliki pengaruh masing-masing pada respon sistem. Berikut merupakan penjelasan pengaruh setiap nilai di alat ini:

* Fungsi nilai P
Nilai P dari alat ini memiliki fungsi sebagai nilai untuk menentukan seberapa besar respons terhadap kesalahan saat ini (jarak yang diukur dari target jarak).
* Fungsi Nilai I 
Nilai I dari alat ini dapat mengakumulasi kesalahan dari waktu ke waktu dan mengoreksi kesalahan steady-state.
* Fungsi nilai D
Nilai D dari alat ini dapat merespons terhadap laju perubahan kesalahan.
</div>
![DIAGRAMSKM.drawio](https://hackmd.io/_uploads/ByijijFrR.png)
Dari gambar Diagram Close Loop diatas berikut merupakan beberapa penjelasan dari setiap bagian:
1. Setpoint: Sensor pada mobil akan berhenti pada jarak lebih dari 5 himgga kurang dari sama dengan 9 cm.
2. Mikrokontroller: Berdasarkan algoritma kontrol PID, Arduino menerima nilai error dan menghitung sinyal kontrol yang diperlukan untuk menggerakkan motor DC melalui driver motor. Selanjutnya, Arduino mengirimkan sinyal ke driver motor.
3. Driver (Driver L298N): Setelah menerima sinyal kontrol dari Arduino, driver motor mengatur arus masuk ke motor DC untuk mengontrol kecepatan.
4. Motor DC: Motor DC bergerak menggunakan daya yang dikelola oleh driver motor untuk mencapai posisi atau jarak yang diinginkan.
5. Sensor (Sensor Ultrasonik): Sensor ini mengukur jarak yang sebenarnya dan mengirimkan data ini ke Arduino sebagai feedback untuk memastikan bahwa jarak yang diukur sesuai dengan setpoint.
6. Process Variable: Sensor ini mengukur jarak yang sebenarnya dan mengirimkan data ini ke Arduino sebagai feedback untuk memastikan jarak yang diukur sesuai dengan setpoint.Untuk menemukan error, proses variable dibandingkan dengan setpoint.


## Mekanik Motor DC/Aktuator
<div style="text-align: justify;">
Teori fungsi transfer sangat penting untuk menganalisis dan merancang sistem kendali PID dalam proyek Sistem Kendali Posisi dan Jarak pada Mobil dengan Metode PID Berbasis Arduino Uno. Fungsi transfer adalah representasi matematis yang menunjukkan hubungan antara input dan output suatu sistem dalam domain frekuensi. Fungsi ini membantu kita memahami bagaimana sistem bereaksi terhadap berbagai input dan memungkinkan kita merancang pengendali yang sesuai. Pengendali PID (Proportional-Integral-Derivative) dirancang untuk mengurangi kesalahan antara titik set dan nilai proses variabel (PV) yang diukur oleh sensor. 

Mekanisme Daya yang Digunakan pada Proyek Sistem Kendali Posisi dan Jarak pada Mobil dengan Metode PID Berbasis Arduino Uno, melibatkan beberapa bagian penting yang bekerja sama untuk menggerakkan dan mengontrol mobil. Berikut adalah penjelasan tentang mekanisme daya dan jenis mekanik yang digunakan dalam proyek ini:
1. Arduino Uno R3: Arduino biasanya diberi daya melalui port USB atau adaptor internal sebesar (5V, 6V, dan 9V).
2. Driver Motor L298N: Driver L298N biasanya diberi daya dari sumber daya eksternal sebesar (9V), mampu mengendalikan dua motor DC secara terpisah.
3. Motor DC: Driver motor memberikan daya ke motor DC, yang kemudian mengontrol tegangan dan arus untuk mencapai gerakan yang diinginkan.
4. Sensor Ultrasonik (HC-SR04): Sensor ultrasonik biasanya diberi daya dari Arduino (5V).
</div>



## Analisis Transient Respon
Kodingan Arduino

```
#include <PID_v1.h>

// Define pins for motor control
const int LeftMotorForward = 5;
const int LeftMotorBackward = 4;
const int RightMotorForward = 3;
const int RightMotorBackward = 2;

// Define pins for ultrasonic sensor
const int trigPin = A3;
const int echoPin = A2;

// Variables to store duration and distance
long duration;
int distance;

// PID variables
double Setpoint = 5; // Set point distance (5 cm)
double Input, Output;
double Kp = 2.25, Ki = 0.0015, Kd = 2; // Initial PID gains (adjust as needed)

// Deadband
double deadband = 1; // Deadband value in cm

// Velocity limiting
int maxSpeedChange = 50; // Velocity limit in cm/s

// Initialize the PID controller
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

double prevOutput = 0; // Store previous output for velocity limiting

void setup() {
    // Initialize serial communication
    Serial.begin(9600);

    // Set the trigger pin as output
    pinMode(trigPin, OUTPUT);

    // Set the echo pin as input
    pinMode(echoPin, INPUT);

    // Set motor control pins as outputs
    pinMode(LeftMotorForward, OUTPUT);
    pinMode(LeftMotorBackward, OUTPUT);
    pinMode(RightMotorForward, OUTPUT);
    pinMode(RightMotorBackward, OUTPUT);

    // Set enable pins as outputs
    pinMode(ENA, OUTPUT);
    pinMode(ENB, OUTPUT);

    // Initialize the PID controller
    myPID.SetMode(AUTOMATIC);
    myPID.SetOutputLimits(-255, 255); // Output range to control motor speed
}

void moveForward(int speed) {
    // Move the robot forward
    digitalWrite(LeftMotorForward, HIGH);
    digitalWrite(LeftMotorBackward, LOW);
    digitalWrite(RightMotorForward, HIGH);
    digitalWrite(RightMotorBackward, LOW);
}

void moveBackward(int speed) {
    // Move the robot backward
    digitalWrite(LeftMotorForward, LOW);
    digitalWrite(LeftMotorBackward, HIGH);
    digitalWrite(RightMotorForward, LOW);
    digitalWrite(RightMotorBackward, HIGH);
}

void stopMoving() {
    // Stop the robot
    digitalWrite(LeftMotorForward, LOW);
    digitalWrite(LeftMotorBackward, LOW);
    digitalWrite(RightMotorForward, LOW);
    digitalWrite(RightMotorBackward, LOW);
}

void loop() {
    // Clear the trigPin by setting it LOW
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);

    // Set the trigPin HIGH for 10 microseconds to send the ultrasound wave
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    duration = pulseIn(echoPin, HIGH);
    distance = duration * 0.034 / 2;

    // Calculate error based on set point and actual distance with deadband
    double error = Setpoint - distance;
    if (abs(error) < deadband) {
        error = 0;
    }

    // Set the PID input to the measured distance
    Input = error;

    // Compute the PID output
    myPID.Compute();

    // Apply velocity limiting
    Output = constrain(Output, -maxSpeedChange + prevOutput, maxSpeedChange + prevOutput);
    prevOutput = Output; // Store previous output for limiting

    // Control logic with velocity limiting and deadband
    if (abs(Output) < 10) { // Deadband to avoid small oscillations around setpoint
        stopMoving();
    } else if (Output > 0) {
        moveForward(constrain(Output, 0, 255)); // Limit output for forward motion
    } else if (Output < 0) {
        moveBackward(constrain(abs(Output), 0, 255)); // Limit output for backward motion
    }

    // Print the distance and PID output on the serial monitor and for Serial Plotter
    Serial.print("Distance: ");
// Send data to Serial Plotter
    Serial.println(distance);
    Serial.println(Output);

    // Delay
    delay(50);
}
```
**Percobaan Nilai-Nilai PID:**
1. Percobaan ke-1, Kp = 14, Ki = 0.02, Kd = 20
![WhatsApp Image 2024-06-20 at 13.28.34](https://hackmd.io/_uploads/S10ikUWLA.jpg)
2. Percobaan ke-2, Kp = 2, Ki = 0.002, Kd = 4
![WhatsApp Image 2024-06-20 at 13.30.11](https://hackmd.io/_uploads/HJ3ulU-I0.jpg)
3. Percobaan ke-3, Kp = 2.5, Ki = 0.0015, Kd = 4
![WhatsApp Image 2024-06-20 at 13.30.35](https://hackmd.io/_uploads/B1eTlIb8A.jpg)
4. Percobaan terakhir, Kp = 2.25, Ki = 0.0015, Kd = 2
![WhatsApp Image 2024-06-20 at 13.31.31](https://hackmd.io/_uploads/H1KgZ8WUC.jpg)

<div style="text-align: justify;">
Setelah kami melakukan 4 kali percobaan, didapatkan 1 percobaan yang nilai osilasi nya paling kecil dibandingkan dengan percobaan lainnya. dapat dilihat berdasarkan grafik yang kami tampilkan diatas, bahwa sistem paling stabil pada saat nilai KP = 2.25, KI = 0,0015, dan KD = 2. terlihat bahwa pergerakan dari saat maju hingga berhenti memiliki penurunan dan penaikkan yang stabil. Set point yang kami tetapkan adalah 5 cm. Mobil akan berhenti ketika output PID yang dihasilkan kurang dari 10, jika ouput lebihdari 10 maka mobil akan maju, dan jika output kurang dari 0 maka mobil akan mundur

Sedangkan sistem memiliki nilai error paling besar pada saat semua nilai KP, KI, dan KD bernilai 0 pada saat belum dilakukan tuning. Jenis mekanik yang digunakan untuk proyek ini termasuk motor DC yang menggerakkan mobil, driver motor L298N yang mengatur daya yang dikirim ke motor, sensor ultrasonik untuk mengukur jarak, dan chassis mobil yang menampung semua komponen. Menggunakan kombinasi dari komponen-komponen ini dan metode kontrol PID berbasis Arduino Uno, sistem dapat mengukur jarak, menghitung error, dan menggerakkan mobil untuk mencapai posisi atau jarak yang diinginkan.
</div>

## Analisis Mekanika
<!--
Panduan Analisis Mekanika (CLO 5)
-->
### Pengukuran Mekanik Gear/Motor/Servo/Stepper
<div style="text-align: justify;">
Kami menggunakan motor DC dengan rasio gear 1:48 pada bagian depan kendaraan, sementara roda di bagian belakang tidak dilengkapi dengan motor. Motor ini juga memungkinkan kami untuk mengontrol kecepatan dan arah putaran dengan lebih presisi menggunakan driver motor yang sesuai. Motor diposisikan secara strategis untuk menggerakkan roda depan, sedangkan roda belakang dirancang tanpa motor untuk memungkinkan kendaraan bergerak dengan stabil dan efisien. Penempatan ini dirancang untuk memaksimalkan tenaga dari baterai dan memberikan kontrol yang baik terhadap kendaraan, terutama dalam manuver dan respons saat digunakan dalam proyek kami.
</div>
<!--
---------------
Jika menggunakan motor DC/servo/stepper saja
1. Lakukan pengukuran pada kecepatan/posisi motor terhadap input yang diberikan? 
table pengukuran |input motor(voltage/pwm/jumlah step)|pengukuran output motor (sudut, rpm)|Arus max|
2. Lakukan pengukuran yang sama tapi dengan tanpa load pada motor
3. Dari pengukuran yang didapatkan jelaskan karakteristik motor tersebut (torsi/diambil dari tegangan dan arus)
4. Plot hasil pengukuran dengan excel/tools lain, analysis hasil tersebut dengan teori EMF

---------------
Jika menggunakan Motor dan gear ukur pitch diameter (D) dan circular pitch (Pc) setiap gear yang digunakan dengan menggunakan penggaris.
Hitung jumlah gigi dari gear tersebut secara manual, kemudian buktikan dengan menggunakan rumus.
Hitung rasio gear dari dua ukuran berbeda. Jelaskan cara perhitungannya!
Hubungkan kedua gear tersebut dengan kondisi:
1.Posisikan gear yang kecil sebagai driver gear dan gear yang besar sebagai driven gear. Putar driver gear sebanyak 360. Berapa derajat driven gear berputar?
2.Posisikan gear yang besar sebagai driver gear dan gear yang kecil sebagai driven gear. Putar driver gear sebanyak 360. Berapa derajat driven gear berputar?
3.Menurut kelompok Anda, lebih baik gear yang kecil atau besar yang dijadikan sebagai driver gear? Mengapa?
-->
### Analisis Kecepatan Motor terhadap Beban
Analisis parameter-parameter yang mempengaruhi kecepatan motor(lihat komentar untuk panduan Analisis)
<!--
Nyalakan motor listrik tanpa beban.
1.Hubungkan beban dengan motor (sesuai kasus project). Apakah motor masih dapat berputar?
2.Tambahkan lagi beban secara bertahap hingga motor berhenti berputar. Lakukan analisis hubungan antara torsi dan kecepatan dari setiap beban yang ditambah hingga motor berhenti berputar.
3.Jika beban terus ditambahkan dan menyebabkan motor berhenti berputar, apakah beban tersebut tetap dapat diputar dengan menggunakan gear? Jelaskan! 
4.Bagaimana mengatur komposisi gear agar beban tersebut dapat berputar? Mengapa beban menjadi dapat berputar setelah ditambahkan rangkaian gear?

Jelaskan hal-hal apa saja yang terjadi saat beban motor meningkat, khususnya dilihat dari:
1.kecepatan, 
2.CEMF, 
3.arus (current), 
4.torsi.
-->
## Hasil dan Saran
<div style="text-align: justify;">
Hasil Projek Sistem Kendali Posisi dan Jarak pada Mobil dengan Metode PID Berbasis Arduino Uno berhasil mengimplementasikan sistem kendali yang akurat dan responsif. Hasil proyek menunjukkan bahwa mobil dapat mencapai setpoint jarak dan posisi dengan error minimal berkat algoritma PID yang diterapkan. Sensor ultrasonik untuk pengukuran jarak memberikan feedback real-time yang baik, sementara motor DC yang dikendalikan oleh driver L298N menanggapi sinyal kontrol dari Arduino dengan cepat, memungkinkan stabilisasi posisi yang cepat setelah mendeteksi objek atau perubahan titik setting. Saran temuan ini menunjukkan bahwa ada ruang untuk pengembangan lebih lanjut. Hal ini dapat mencakup meningkatkan presisi, keandalan, dan efisiensi sistem kendali di masa depan dengan mengoptimalkan parameter PID, meningkatkan resolusi sensor, dan menggabungkan fitur otonomi tambahan.
</div>
## Video dan Lampiran Kode 
{%youtube https://youtu.be/t4XJpid0r3w?si=5XFcfI84RFXrfnWB %}
<iframe width="560" height="315" src="https://www.youtube.com/embed/watch?v=t4XJpid0r3w" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

[Github Link](https://github.com/Krazahra/Sistem-Kendali-Mekanika/blob/main/kode_SKM.ino)
## Referensi
Berikut merupakan referensi yang kami gunakan, 
**Referensi Jurnal Perancangan Awal**
https://www.scribd.com/document/420205715/Sistem-Kendali-Jarak-Menggunakan-Metode-PID-Berbasis-Arduino-UNO-Driver-L298-dan-Sensor-Ultrasonic-HC-SR04
**Referensi Perancangan Awal**
https://www.youtube.com/watch?v=O5rcvnkMtEs&ab_channel=HIMACEPRODUCTION
**Referensi Pembuatan Alat**
https://youtu.be/BhrrNtihIe8?si=FOs-xtLZhLiHxaXo




## Rubrik Penilaian

| Penilaian Indikator Ketercapaian CLO | Bobot |
| -------- | -------- |
| Mahasiswa mampu mengevaluasi dan optimasi sistem kendali PID (soal CLO 4).     | 50 %     |
|Mahasiswa mampu mendemonstrasikan sistem mekanisme transfer daya sederhana menggunakan gear dan motor DC (soal CLO 5)|50%|

### Kriteria Nilai
| 4 | 3 | 2 | 1 | 0 |
| ----- | ----- | ------ | ----- | ---- |
|      CLO 4  |       |      | | |
Mampu menjelaskan konsep kendali umpan balik, merancang sistem kendali PID, hingga mengevaluasi dan optimasi sistem kendali PID.|	Mampu menjelaskan konsep kendali umpan balik, merancang, dan mengevaluasi sistem kendali PID.|Mampu menjelaskan konsep kendali umpan balik dan merancang sistem kendali PID.|Mampu menjelaskan konsep kendali umpan balik dan PID, tetapi kesulitan dalam merancang dan mengevaluasi sistem kendali PID.|	Kesulitan dalam menjelaskan konsep kendali umpan balik dan PID.|
| CLO 5 |     | |  |
Mampu mendapatkan fungsi transfer sistem dari mekanisme transfer daya, menganalisis hubungan antara torsi dan kecepatan motor, menjelaskan cara kerja dan karakteristik motor listrik, serta mendemonstrasikan sistem mekanisme transfer daya sederhana menggunakan gear dan motor DC.|	Mampu mendapatkan fungsi transfer sistem dari mekanisme transfer daya, menganalisis hubungan antara torsi dan kecepatan motor, menjelaskan cara kerja dan karakteristik motor listrik, tetapi kesulitan dalam mendemonstrasikan sistem mekanisme transfer daya sederhana menggunakan gear dan motor DC.	|Mampu mendapatkan fungsi transfer sistem dari mekanisme transfer daya, menganalisis hubungan antara torsi dan kecepatan motor, tetapi kesulitan dalam menjelaskan cara kerja dan karakteristik motor listrik.	| Mampu mendapatkan fungsi transfer sistem dari mekanisme transfer daya dan menganalisis hubungan antara torsi dan kecepatan motor.	|Tidak dapat menentukan satu langkah pun untuk menjelaskan mengenai mekanisme transfer daya.|

