#include <Servo.h>
#include <math.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

// Faktor skala
const float alpha = 0.1;

// Fungsi untuk menghitung Jacobian Transpose
void calculateJacobianTranspose(float theta1, float theta2, float &j11, float &j12, float &j21, float &j22) {
  j11 = -L1 * sin(theta1) - L2 * sin(theta1 + theta2);
  j12 = L1 * cos(theta1) + L2 * cos(theta1 + theta2);
  j21 = -L2 * sin(theta1 + theta2);
  j22 = L2 * cos(theta1 + theta2);
}

// Fungsi untuk menghitung kinematika maju
void forwardKinematics(float theta1, float theta2, float &x, float &y) {
  x = L1 * cos(theta1) + L2 * cos(theta1 + theta2);
  y = L1 * sin(theta1) + L2 * sin(theta1 + theta2);
}

// Fungsi untuk menghitung kinematika balik menggunakan Jacobian Transpose
void inverseKinematicsJacobianTranspose(float x_d, float y_d, float &theta1, float &theta2) {
  const int maxIter = 100;
  const float tol = 0.01;

  for (int i = 0; i < maxIter; i++) {
    float x, y;
    forwardKinematics(theta1, theta2, x, y);

    float ex = x_d - x;
    float ey = y_d - y;

    if (sqrt(ex * ex + ey * ey) < tol) break;

    float j11, j12, j21, j22;
    calculateJacobianTranspose(theta1, theta2, j11, j12, j21, j22);

    float dtheta1 = alpha * (j11 * ex + j12 * ey);
    float dtheta2 = alpha * (j21 * ex + j22 * ey);

    theta1 += dtheta1;
    theta2 += dtheta2;
  }

  theta1 = theta1 * 180.0 / PI;
  theta2 = theta2 * 180.0 / PI;
}

void setup() {
  servo1.attach(9);
  servo2.attach(10);
}

void loop() {
  float x_d = 10.0;
  float y_d = 10.0;

  float theta1 = 0;
  float theta2 = 0;

  inverseKinematicsJacobianTranspose(x_d, y_d, theta1, theta2);

  servo1.write(theta1);
  servo2.write(theta2);

  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