#include <Servo.h>

// Deklarasi servo motor
Servo servo1;
Servo servo2;

// Panjang link
const float L1 = 10.0; // Panjang link 1 dalam cm
const float L2 = 10.0; // Panjang link 2 dalam cm

// Fungsi untuk menghitung sudut dari posisi (x, y) yang diinginkan
void calculateInverseKinematics(float x, float y, float &theta1, float &theta2) {
  // Menghitung cos(theta2) dan sin(theta2)
  float cosTheta2 = (x*x + y*y - L1*L1 - L2*L2) / (2 * L1 * L2);
  float sinTheta2 = sqrt(1 - cosTheta2*cosTheta2);
  
  // Menghitung theta2 dalam radian
  theta2 = atan2(sinTheta2, cosTheta2);
  
  // Menghitung theta1 dalam radian
  theta1 = atan2(y, x) - atan2(L2 * sinTheta2, L1 + L2 * cosTheta2);
  
  // Konversi dari radian ke derajat
  theta1 = theta1 * 180.0 / PI;
  theta2 = theta2 * 180.0 / PI;
}

void setup() {
  Serial.begin(9600);


  // Menetapkan pin servo
  servo1.attach(9);
  servo2.attach(10);
}

void loop() {
  // Posisi yang diinginkan untuk ujung efektor
  float x = 10.0; // cm
  float y = 00.0; // cm

  // Variabel untuk menyimpan sudut sendi
  float theta1, theta2;
  
  // Menghitung sudut sendi
  calculateInverseKinematics(x, y, theta1, theta2);

  // Cetak hasil
  Serial.println();
  Serial.println("Hasil Akhir");
  Serial.print("Theta1: ");
  Serial.println(theta1); // Konversi ke derajat
  Serial.print("Theta2: ");
  Serial.println(theta2); // Konversi ke derajat

  // Menggerakkan servo ke sudut yang dihitung
  servo1.write(theta1);
  servo2.write(theta2);
  
  // Menunggu sejenak untuk melihat pergerakan
  delay(2000);
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5