Translate

Membuat Servo Controller Menggunakan Arduino dan Driver Servo I2C Shield

Membuat Servo Controller Menggunakan Arduino dan Driver Servo I2C Shield


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah servo controller dengan menggunakan arduino dan servo driver i2c shield buatan adafruit industries. prinsip kerja alat ini adalah mengendalikan posisi horn servo sesuai dari nilai yang diinputkan melalui tombol. alat ini menggunakan lcd dan tombol untuk mengetahui nilai yang diset oleh user dan juga jika ingin mengembalikan posisi servo pada titik awal juga bisa. alat ini menggunakan arduino sebagai kontrollernya. untuk lebih jelasnya berikut adalah skema dan programnya.




a. Arduino Mega 





b. Driver Servo i2c Shield





c. Motor Servo





d. Program Arduino IDE

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 2, 7, 6, 5, 4);

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

//setting pin 47
//up pin 53
//down pin 51
//ok pin 49

int btset = 47;
int btup = 53;
int btdown = 51;
int btok = 49;
int xz = 0;
int setx = 0;
int upx = 0;
int downx = 0;
int okx = 0;

int posisi1 = 200;
int posisi2 = 200;

int posisi1x = 200;
int posisi2x = 200;


//#define SERVOMIN  200
//#define SERVOMAX  600

// our servo # counter
uint8_t servonum;

void setup() {
//  Serial.begin(9600);
//  Serial.println("16 channel Servo test!");
  pinMode(btset,INPUT);
  pinMode(btok,INPUT);
  pinMode(btup,INPUT);
  pinMode(btdown,INPUT);

  digitalWrite(btset,HIGH);
  digitalWrite(btok,HIGH);
  digitalWrite(btup,HIGH);
  digitalWrite(btdown,HIGH);
 
  lcd.begin(16, 2);
  lcd.clear();
  lcd.noCursor();
 
  pwm.begin();
 
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates

  yield();
}

// you can use this function if you'd like to set the pulse length in seconds
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise!
void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
 
  pulselength = 1000000;   // 1,000,000 us per second
  pulselength /= 60;   // 60 Hz
//  Serial.print(pulselength); Serial.println(" us per period");
  pulselength /= 4096;  // 12 bits of resolution
//  Serial.print(pulselength); Serial.println(" us per bit");
  pulse *= 1000;
  pulse /= pulselength;
//  Serial.println(pulse);
  pwm.setPWM(n, 0, pulse);
}

void loop() {

setx = digitalRead(btset);
okx = digitalRead(btok);
downx = digitalRead(btdown);

  lcd.setCursor(0, 0);
  lcd.print("PILIH MENU");
  lcd.setCursor(0, 1);
  lcd.print(posisi1x);
  lcd.print(" ");
  lcd.print(posisi2x);
 
if(setx == 0){
  lcd.clear();
  delay(200);
  pilih();
  delay(1000);
  pilih2();
  delay(1000);
  }

pwm.setPWM(0, 0, posisi1x);
delay(500);
pwm.setPWM(1, 0, posisi2x);
delay(500);


if(downx == 0){

posisi1x = 200;
posisi2x = 200;

  }



}



void pilih(){

upx = digitalRead(btup);
downx = digitalRead(btdown);
okx = digitalRead(btok);
setx = digitalRead(btset);
  
  lcd.setCursor(0, 0);
  lcd.print("SET SERVO 1  ");
  lcd.print(xz);
  lcd.setCursor(0, 1);
  lcd.print("Posisi= ");
  lcd.print(posisi1);


if(setx == 0){
delay(200);
xz++;
}


if(xz > 1){
xz = 0; 
}


if(upx == 0){
  delay(200);
  if(xz == 0){
  posisi1 = posisi1 + 1;
  }
  if(xz == 1){
  posisi1 = posisi1 + 10;
  }
}

if(downx == 0){
  delay(200);
  if(xz == 0){
  posisi1 = posisi1 - 1;
  }
  if(xz == 1){
  posisi1 = posisi1 - 10;
  }
 
}

if(okx == 0){
  delay(200);
  posisi1x = posisi1;
  lcd.clear();
  return;
}


  pilih(); 
}





void pilih2(){

upx = digitalRead(btup);
downx = digitalRead(btdown);
okx = digitalRead(btok);
setx = digitalRead(btset);
   
  lcd.setCursor(0, 0);
  lcd.print("SET SERVO 2  ");
  lcd.print(xz);
  lcd.setCursor(0, 1);
  lcd.print("Posisi= ");
  lcd.print(posisi2);


if(setx == 0){
delay(200);
xz++;
}


if(xz > 1){
xz = 0; 
}

if(upx == 0){
  delay(200);
  if(xz == 0){
  posisi2 = posisi2 + 1;
  }
  if(xz == 1){
  posisi2 = posisi2 + 10;
  }
}

if(downx == 0){
  delay(200);
  if(xz == 0){
  posisi2 = posisi2 - 1;
  }
  if(xz == 1){
  posisi2 = posisi2 - 10;
  }
 
}

if(okx == 0){
  delay(200);
  posisi2x = posisi2;
  lcd.clear();
  return;
}


  pilih2(); 
}





e. VIDEO HASILNYA











1 comment:

  1. mau tanya mas , nilai dari 200 itu yg dri servo min dri mana dapatnya yah mohon jawabanya ?

    ReplyDelete