Langsung ke konten utama

Arduino Self Balancing Robot controled by PID (Part 1)

Bismillah,

Beberapa hari yang lalu saya membuat sebuah Self Balancing Robot dengan menggunakan komponen yang beredar di toko online, dan saya jelaskan lengkap nya di chanel youtube saya dan disini saya hanya share source code nya saja.



#include <MPU6050_tockn.h>
#include <Wire.h>

MPU6050 mpu6050(Wire);

const int pwm_pin[2] = {9,10};
const int directA_pin[2] = {7,2};
const int directB_pin[2] = {5,4};   

float pid=0;

float kp=13,kd=120,ki=0.5;

float angleLimit=20;

float setPoint=3.5;

int timeSampling=1;

float speedMax=200;//max 255

float offsetValue=2;

float nowError=0;

float lastError=0;

float valueX=0;



int cek=0;

void mundur_all(int value){
  digitalWrite(directA_pin[0], LOW);//kanan
  digitalWrite(directA_pin[1], HIGH);

  digitalWrite(directB_pin[0], HIGH);//kiri
  digitalWrite(directB_pin[1], LOW);

  analogWrite(pwm_pin[0],value);//kanan
  analogWrite(pwm_pin[1],value);//kiri
}

void stop_all(){
  digitalWrite(directA_pin[0], HIGH);
  digitalWrite(directA_pin[1], HIGH);

  digitalWrite(directB_pin[0], HIGH);
  digitalWrite(directB_pin[1], HIGH);

  analogWrite(pwm_pin[0],0);
  analogWrite(pwm_pin[1],0);
}

void maju_all(int value){
  digitalWrite(directA_pin[0], HIGH);//kanan
  digitalWrite(directA_pin[1], LOW);

  digitalWrite(directB_pin[0], LOW);//kiri
  digitalWrite(directB_pin[1], HIGH);

  analogWrite(pwm_pin[0],value);//kanan
  analogWrite(pwm_pin[1],value);//kiri
}

void setup() {
  Serial.begin(9600);
  Wire.begin();
  mpu6050.begin();
  mpu6050.calcGyroOffsets(true);

  // initialize the LED pin as an output:
  pinMode(pwm_pin[0], OUTPUT);
  pinMode(pwm_pin[1], OUTPUT);
  pinMode(directA_pin[0], OUTPUT);
  pinMode(directA_pin[1], OUTPUT);
  pinMode(directB_pin[0], OUTPUT);
  pinMode(directB_pin[1], OUTPUT);
  stop_all();

  TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10);
  TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);
  TCNT1H=0x00;
  TCNT1L=0x00;
  ICR1H=0x00;
  ICR1L=0x00;
  OCR1AH=0x00;
  OCR1AL=0x00;
  OCR1BH=0x00;
  OCR1BL=0x00;

}

void loop() {
  mpu6050.update();

  valueX=mpu6050.getAngleX();
  //Serial.print("angleX : ");
  //Serial.println(valueX);
  /*Serial.print("\tangleY : ");
  Serial.print(mpu6050.getAngleY());
  Serial.print("\tangleZ : ");
  Serial.println(mpu6050.getAngleZ());
  */

  if(valueX<(setPoint+offsetValue) && valueX>(setPoint-offsetValue)){
    pid=0;
   
  }
  else{
    // PID kontroler


    nowError=setPoint-valueX;

    pid=(kp*nowError)+(kd*(nowError-lastError))+(ki*(nowError+lastError));
   
    lastError=nowError;
   
  }

  pid=abs(pid);
  if(pid>speedMax){
    pid=speedMax;
  }
 
 

  //Serial.print(" pid : ");
  //Serial.print(pid);
 
  if(nowError>0&&nowError<angleLimit){//maju
    //mundur_all(pid);
    maju_all(pid);
    //Serial.println(" maju");
  }

  else if(nowError<0&&nowError>-angleLimit){//mundur
    //maju_all(pid);
    mundur_all(pid);
    //Serial.println(" mundur");
  }

  else if(nowError<-angleLimit){//mundur
    //maju_all(speedMax);
    mundur_all(speedMax);
    //Serial.println(" mundur");
  }

  else if(nowError>angleLimit){//maju
    maju_all(speedMax);
    //mundur_all(speedMax);
    //Serial.println(" maju");
  }

  //time sampling

  delay(timeSampling);
   
}



Source code diatas silahkan di sesuaikan dengan hardware teman-teman, contoh maju dan mundur atau sumbu gyro mana yang di pakai. sebelum menggunakan gyro install dulu lib MPU6050_tockn, bisa di cari di arduino lib manager.

Semoga bermanfaat dan silahkan bertanya..

* link video di chanel youtube saya https://youtu.be/LjdkZc6ddlk


Komentar

Postingan populer dari blog ini

Menggunakan USART / UART di CodeVision AVR

Sudah lama saya tidak menulis di blog, dan kali ini saya akan berbagi sedikit pengalaman saya mengenai USART/UART di mikrokontroler AVR ATMEGA series. Kesempatan kali ini saya akan menggunakan Atmega8 dan mengaktifkan fitur USARTnya dengan CodeVision AVR versi 1.xx.x Jalankan aplikasi Codevision kemudian pada menu file pilih new, nanti akan muncul jendela create new file pilih project dan klik OK, akan muncul jendela confirm klik yes,

Menggunakan ADC Mikrokontroler ATmega 32 dengan CodeVision

Sebenarnya cara ini bisa dipakai untuk mikrokontroler Atmega seri lainnya juga. Saya kali ini akan menggunakan ADC Atmega32 dengan menggunakan CodeVision AVR. Langsung saja buka aplikasi CodeVision AVR kemudian buat project baru setelah itu akan muncul jendela CodeWizard AVR