Menggunakan Sensor KOMPAS CMPS10 ! Kontrol dengan PID Method

Kali ini saya akan membagikan source code, yang biasa saya gunakan untuk mengendalikan suatu alat untuk mencapai / kembali ke kondisi optimal bagaimana pun caranya.

Langsung saja cek kapan kita harus menggunakan PID secara optimal berikut ini.

Jadi begini apabila sobat memiliki sebuah projek yang mengharuskan sobat memiliki suatu kondisi yang optimal, sobat bisa gunakan PID , Logika Fuzzy , ELM (Extreme Learning Machine), NN (Neural Network) dll.

Sebagai contoh :
Suatu ruangan memiliki kondisi optimal 28 Celcius. Akan tetapi karena faktor cuaca panas atau banyaknya orang diruangan tersebut menyebabkan suhu ruangan meningkat. Maka AC / kipas digunakan untuk menurunkan kembali menuju suhu optimal, sehingga salah satu metode diatas misal PID, bisa digunakan untuk mengatur kecepatan kipas agar suhu selalu berada pada kondisi optimal tidak lebih tidak kurang.

Pada Artikel ini saya akan menjelaskan penggunaan sensor Compass menggunakan metode PID karena contoh diatas sudah banyak dibahas di web web lainnya.

Kompas merupakan salah satu sensor yang digunakan untuk mengetahui suatu arah (utara, barat, timur, selatan) yang dibaca oleh mikrokontroller dalam nilai 0 – 360. Jadi apabila kalian menggunakan sensor kompas, maka mikrokontroller akan membaca data 0 – 360 yang kurang lebih merepresentasikan gambar dibawah ini.

Kompasroos.png

wikiwand.com

Apabila sobat hanya ingin membaca berapa nilai sudut yang dihasilkan oleh sensor kompas maka sobat cukup mengambil data bearing sensor kompas tersebut. Berikut ini wiring diagram untuk sensor kompas CMPS10.

cmps10I2C_wire.png

https://www.robot-electronics.co.uk/htm/cmps10i2c.htm

Untuk sensor kompas tipe lainnya, wiring diagramnya pun juga hampir sama. Akan tetapi beda merk biasanya memiliki library yang berbeda.

PID (Proporsional – Integral – Derivative) adalah kontroler mekanisme umpan balik yang biasanya dipakai pada sistem kontrol industri. Sebuah kontroler PID secara kontinyu menghitung nilai kesalahan sebagai beda antara setpoint yang diinginkan dan variabel terukur. Kontroler mencoba untuk meminimalkan nilai kesalahan setiap waktu dengan penyetelan variabel kontrol, seperti posisi keran kontrol, damper atau daya pada elemen pemanas, ke nilai baru yang ditentukan oleh jumlahan (wikipedia.org):

pwm-pid-diskrit.jpg

https://fahmizaleeits.wordpress.com

Ada banyak sekali artikel apabila anda menginginkan belajar PID lebih mendalam, tapi sesuai dengan judul saya akan membagikan source code yang biasa saya gunakan untuk implementasi PID dengan compass :

Jadi dalam project saya kali ini bertujuan menggunakan kompas (project kapal) untuk menuju kearah tertentu bedasarkan set point contoh set point (90 – arah timur), agar kapal bergerak baik menuju ke arah tersebut maka PID saya gunakan untuk menggerakkan rudder kapal. Posisi awal, kalian harus tau berapa sudut rudder berada pada posisi lurus, kanan dan kiri yang nantinya berefek pada set-point.

Pertama kita harus melakukan setting kp , ki dan kd yang akan kita gunakan. Nilai konstanta tersebut bisa kita ambil melalui rumus diatas ataupun trial and error. Dalam program ini untuk setting saya gunakan lcd dan push button.

-pin yang digunakan untuk lcd secara berurutan adalah 53, 51, 49, 47, 45, 43.
-pin button adalah
reset = A12,
yes = A11,
no = A10,
up = A9,
down = A8

Program dibawah ini menggunakan Ardunio Mega dan  library ekternal (tidak ada dalam arduino default) yaitu LiquidCrystal (LCD) dan CMPS10. Jadi kalian harus mendownloadnya terlebih dahulu.

#include <Wire.h>
#include <Servo.h>
#include <EEPROM.h>
#include <LiquidCrystal.h>
#include <CMPS10.h>

CMPS10 compass;
int datakompas ;
int scaleDataKompas;

Servo servoAtasBawah;
Servo servoKananKiri;
Servo servoPutar;
Servo servoRadar;
Servo servoTrottle;

//=========pin LCD=======================
LiquidCrystal lcd(53, 51, 49, 47, 45, 43);

//========BUZZER=================
int buzzer = 7;

//========Posisi Awal Servo========================
int posisiTengah = 70; //Untuk ServoKananKiri
int posisiLurus = 110; //Untuk ServoAtasBawah
int posisiCenter = 0; //Untuk ServoPutar
int posisiRadar = 90; // 30Kanan 90 Center 150Kiri
int kecepatanTrottle = 54; //Untuk kecepatan trottle 55 Mati 56 Min 126 Max

// 70 adalah posisi tengah servoPutar
// 0 adalah posisi tembak berada disebelah kanan kapal
// 150 adalah posisi tembak berada disebelah kiri kapal

// 70 adalah posisi Radar Lurus Tengah
// 0 adalah posisi kanar bergerak ke kanan

//=====TOMBOL==========
int reset = A12;
int yes = A11;
int no = A10;
int up = A9;
int down = A8;

int bacaReset;
int bacaYes;
int bacaNo;
int bacaUp;
int bacaDown;
int flagyes=0;
float sudut=80;
byte Speed=50;

//==========variable remote================
unsigned long transmitterThrottlee=0;
unsigned long transmitterLeftRight=0;
unsigned long transmitterForwardBack=0;
unsigned long trotle=0;
unsigned long rudder=0;
unsigned long mode=0;
byte trotlee;
byte ruddere;
byte modee;

//=============Data PID=======================
float error,errorLama;
byte setpoint = 80;
byte kp,ki,kd;
float kps, kis, kds;
float P,in,PIn,PID,d,de;

//========alamat EEPROM==================
const byte akp = 0;
const byte aki = 1;
const byte akd = 2;
const byte aKonter = 9;
const byte akecepatan=10;
const byte akps = 11;
const byte akis = 12;
const byte akds = 13;
const byte akecepatan_kapal = 14;
int eeprom_rudder = 30;
const byte aspkapal=15;

byte kecepatan_kapal = 53;
byte kecepatan;

void setup() {
// put your setup code here, to run once:
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print(“—BISMILLAH—“);
lcd.setCursor(0, 1);
lcd.print(“—Tugas Akhir—“);

//===pin servo===
servoPutar.attach(24);
servoAtasBawah.attach(26);
servoKananKiri.attach(28);
servoRadar.attach(22);
servoTrottle.attach(50);

//=========posisi awal servo====================
servoAtasBawah.write(posisiLurus);
servoKananKiri.write(posisiTengah);
servoPutar.write(posisiCenter);
servoRadar.write(posisiRadar); // 0 70 140
servoTrottle.write(kecepatanTrottle);

//=====Komunikasi Serial==============
Serial.begin(115200);

//==Deklarasi Tombol sebagai Input===
pinMode (buzzer, OUTPUT);
pinMode(reset,INPUT_PULLUP);
pinMode(yes,INPUT_PULLUP);
pinMode(no,INPUT_PULLUP);
pinMode(up,INPUT_PULLUP);
pinMode(down,INPUT_PULLUP);

jalan();

}

void loop() {
// put your main code here, to run repeatedly:
//startkompas();
delay(200);
}

void kompas()
{
datakompas = compass.bearing();
scaleDataKompas = map (datakompas, 0, 360, 0, 255);

Serial.print(“Data Kompas = ” +String(datakompas) );
Serial.print(” Data PID= ” + String(sudut));
Serial.println( “Er= ” + String(error));
}

void pidkompas()
{

error = setpoint – scaleDataKompas;

if(error < -128)
{
error = 256 – scaleDataKompas;
error = error + setpoint;
}

if(error > 128)
{
error = setpoint – 256;
error = error – scaleDataKompas;
}

P = kp * error ;
in = error + errorLama ;
in /= 2;
in = ki * in;
PIn = P + in;

de = error – errorLama;
d = kd * 10;
d *= de;

errorLama = error;
PID = PIn + d;

sudut = 80 + PID;
if(sudut < 0) {sudut = 0;}
if(sudut > 140) {sudut = 140;};

//servoRadar.write(sudut); //Ini adalah data hasil perhitungan PID kompas, saya gunakan untuk mengendalikan Rudder Kapal
}

void startkompas()
{
kompas();
pidkompas();
}

//========Baca Tombol===================
void bacaTombol(){
bacaReset = digitalRead(reset);
bacaYes = digitalRead(yes);
bacaNo = digitalRead(no);
bacaUp = digitalRead(up);
bacaDown = digitalRead(down);
}

//========Baca EEPROM===================
void eeprom(){
kp = EEPROM.read(akp);
ki = EEPROM.read(aki);
kd = EEPROM.read(akd);
kps=EEPROM.read(akps);
kds=EEPROM.read(akds);
kis=EEPROM.read(akis);
kecepatan = EEPROM.read(akecepatan);
kecepatan_kapal = EEPROM.read(akecepatan_kapal);
}

//=======Menu Utama===============================
void pilihmode(){
lcd.clear();
flagyes = 0;
while (flagyes == 0) {
bacaTombol();
if (bacaYes == LOW) {
delay(200);
//setingdrag();
flagyes = 1;
return;
}
if (bacaReset == LOW) {
delay(200);
//mode_kamera();
flagyes = 1;
}

lcd.setCursor(0, 0);
lcd.print(“Y = Set_Kompas”);
lcd.setCursor(0, 1);
lcd.print(“N = Set_Kamera”);
}
}

//========Setting PID Kompas=======================
void setting_pid(){
lcd.clear();
flagyes = 0;
while (flagyes == 0) {
bacaTombol();
if (bacaYes == LOW) {
delay(200);
setkps();
flagyes = 1;
}

if (bacaReset == LOW) {
delay(200);
pilihmode();
flagyes = 1;
}

lcd.setCursor(0, 0);
lcd.print(“N=pilih Mode”);
lcd.setCursor(0, 1);
lcd.print(“Y = setting kps”);

}
}

void setkps(){
lcd.clear();
flagyes = 0;
kps = EEPROM.read(akps);
while (flagyes == 0) {

bacaTombol();
if (bacaUp == LOW) {
delay(200);
kps = kps + 1;}

if (bacaDown == LOW) {
delay(200);
kps = kps – 1;}

if (bacaYes == LOW) {
delay(200);
EEPROM.write(akps, kps);
flagyes = 1;
setkis();}

if (bacaReset == LOW) {
delay(200);
kps = EEPROM.read(akps);
flagyes = 1;
setkis();}
lcd.setCursor(0, 0);
lcd.print(“kps=”); lcd.print(kps); lcd.print(” “);
lcd.setCursor(0, 1);
lcd.print(“y=save”);
}}

void setkis() {
lcd.clear();
flagyes = 0;
kis = EEPROM.read(akis);
while (flagyes == 0) {
bacaTombol();
if (bacaUp == LOW) {
delay(200);
kis = kis + 1;
}

if (bacaDown == LOW) {
delay(200);
kis = kis – 1 ;
}

if (bacaYes == LOW) {
delay(200);
EEPROM.write(akis, kis);
flagyes = 1;
setkds();
}
if (bacaReset == LOW) {
delay(200);
kis = EEPROM.read(akis);
flagyes = 1;
setkds();
}
lcd.setCursor(0, 0);
lcd.print(“kis=”); lcd.print(kis); lcd.print(” “);
lcd.setCursor(0, 1);
lcd.print(“y=save”);

}
}
void setkds() {
lcd.clear();
flagyes = 0;
kds = EEPROM.read(akds);
kds = kds;
while (flagyes == 0) {
bacaTombol();
if (bacaUp == LOW) {
delay(200);
kds = kds + 1;}

if (bacaDown == LOW) {
delay(200);
kds = kds – 1;}

if (bacaYes == LOW) {
delay(200);
kds = kds;
EEPROM.write(akds, kds);
flagyes = 1;
//set_kecepatan_kapal();
}

if (bacaReset == LOW) {
delay(200);
kds = EEPROM.read(akds);
kds = kds;
flagyes = 1;
//set_kecepatan_kapal();
}

lcd.setCursor(0, 0);
lcd.print(“kds=”); lcd.print(kds); lcd.print(” “);
lcd.setCursor(0, 1);
lcd.print(“y=save”);

}
}

Berikut ini adalah referensi untuk belajar lebih lanjut tentang PID. Selamat Mencoba dan semoga berhasil.

Referensi :
https://fahmizaleeits.wordpress.com/category/kuliah-kontrol/pid-kontrol/
https://id.wikipedia.org/wiki/PID

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Foto Google

You are commenting using your Google account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s