Translate

Lux Meter PID Control Motor Stepper Sensor BH1750 dan Driver TB6600

Lux Meter PID Control Motor Stepper Sensor BH1750 dan Driver TB6600


          Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengukur LUX dan putaran motor stepper dengan menggunakan metode PID control. alat ini menggunakan sensor BH1750 dan driver stepper TB6600. untuk lebih jelasnya berikut adalah komponen dan kodingnya.


a. Komponen




b. Program Arduino IDE

/* BH1750 wiring
  VCC >>> 3.3V
  SDA >>> A4 
  SCL >>> A5
  addr >> A3
  Gnd >>>Gnd
 */
 
#include <Wire.h>
#include <BH1750FVI.h>
#include <LiquidCrystal_I2C.h> 

LiquidCrystal_I2C lcd(0x27, 16, 2); 
BH1750FVI LightSensor;
uint16_t lux;
#define dirPin 2
#define stepPin 3
int langkah;

float kp = 0.15;
float ki = 1.67;
float kd = 1.15;

float p,i,d,suhu;
float error,errorx,sumerr;
int sp = 60;
int pid;

void setup() {   
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  pinMode(stepPin,OUTPUT);
  pinMode(dirPin,OUTPUT);
  LightSensor.begin();
  LightSensor.SetAddress(Device_Address_H);//Address 0x5C
  LightSensor.SetMode(Continuous_H_resolution_Mode);
}

void loop() {

  error = sp - lux;
  p = error * kp;
  sumerr = error + errorx;
  i = ki * sumerr;
  d = kd * (error - errorx) ;
  pid = p + i + d;

  if(pid <= 0){
  pid = 0;
  }

  if(pid > 1000){
  pid = 500;
  }

  Serial.println(pid);
   
  lux = LightSensor.GetLightIntensity();

  if(lux < 55){
  if(langkah <= 150){  
  kanan();  
  }
  }

  if(lux > 65){
  if(langkah >= 0){  
  kiri();  
  }
  }

  lcd.setCursor(0,0);
  lcd.print("Lux: ");
  lcd.print(lux);
  lcd.print("   ");

  lcd.setCursor(0,1);
  lcd.print("ST: ");
  lcd.print(langkah);
  lcd.print(" ");
  lcd.print(pid);
  lcd.print("   ");
  
errorx = error;
}

void kiri(){
  digitalWrite(dirPin, LOW); // putar CCW jarum jam
  digitalWrite(stepPin, HIGH);
  delayMicroseconds(pid); // ganti delay untuk mempercepat motor
  digitalWrite(stepPin, LOW);
  delayMicroseconds(pid); // ganti delay untuk mempercepat motor 
  langkah--; 
}

void kanan(){
  digitalWrite(dirPin, HIGH); // putar CW jarum jam
  digitalWrite(stepPin, HIGH);
  delayMicroseconds(pid); // ganti delay untuk mempercepat motor
  digitalWrite(stepPin, LOW);
  delayMicroseconds(pid); // ganti delay untuk mempercepat motor 
  langkah++; 
}


c. VIDEO HASILNYA



No comments:

Post a Comment