Sitemap

Code Crane Terintegrasi Dengan Arduino dan PWM berbasis IoT

4 min readMay 11, 2026

--

Mata Kuliah: Sistem Tertanam
Jurusan: Informatika
TIM 1 :
1. DAF
2. Zero
3. 3MP

Bahan dan Alat:
1. Arduino
2. Servo motor SG-04
3. PWM Module
4. Kabel Jumper
5. 1 Set Kerangka Crane

Get Aidil Rasyd’s stories in your inbox

Join Medium for free to get updates from this writer.

Code Memindahkan objek jarak dekat ke kiri 45 derajat

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define SERVOMIN 150
#define SERVOMAX 600

// --- POSISI IDLE/AWAL ---
// Ch 1 = 40, sisanya 0 derajat.
int posisiSekarang[4] = {0, 40, 0, 0};

void setup() {
Serial.begin(9600);
pwm.begin();
pwm.setPWMFreq(50);
delay(100);

Serial.println("Koreografi Presisi Dimulai! Menuju Posisi Idle... 🌟");

// --- LANGKAH 0: Setel Posisi Idle ---
for (int i = 0; i < 4; i++) {
int pulse = map(posisiSekarang[i], 0, 180, SERVOMIN, SERVOMAX);
pwm.setPWM(i, 0, pulse);
}
delay(2000);

// --- RANGKAIAN AKSI UTAMA ---

// 1. Channel 2 ke 80 derajat (Bahu naik)
Serial.println("Aksi 1: Ch 2 -> 80");
gerakMulus(2, 80, 20);
delay(300);

// 2. Channel 1 ke 30 derajat (Siku menyesuaikan)
Serial.println("Aksi 2: Ch 1 -> 30");
gerakMulus(1, 30, 20);
delay(300);

// 3. Channel 0 ke 90 derajat (Lepas capit)
Serial.println("Aksi 3: Ch 0 -> 90");
gerakMulus(0, 90, 20);
delay(500);

// 4. Channel 2 kembali ke 0 derajat (Bahu turun)
Serial.println("Aksi 4: Ch 2 -> 0");
gerakMulus(2, 0, 20);
delay(200);

// 5. Channel 1 kembali ke 40 derajat (Siku kembali idle)
Serial.println("Aksi 5: Ch 1 -> 40");
gerakMulus(1, 40, 20);
delay(500);

// 6. Channel 3 berputar ke 45 derajat (Base putar)
Serial.println("Aksi 6: Ch 3 -> 45");
gerakMulus(3, 45, 20);
delay(500);

// 7. Channel 1 ke 30 derajat lagi
Serial.println("Aksi 7: Ch 1 -> 30");
gerakMulus(1, 30, 20);
delay(200);

// 8. Channel 2 ke 80 derajat lagi
Serial.println("Aksi 8: Ch 2 -> 80");
gerakMulus(2, 80, 20);
delay(500);

// 9. Channel 0 kembali ke 0 derajat (NYAPIT! ✊)
Serial.println("Aksi 9: Ch 0 -> 0");
gerakMulus(0, 0, 20);

Serial.println("Tirai Tertutup! Pertunjukan selesai dengan sangat indah! 🎭✨");
}

void loop() {
// Diam dalam pose terakhir...
}

// --- FUNGSI GERAK MULUS ---
void gerakMulus(uint8_t channel, int targetSudut, int kecepatan) {
int posisiAwal = posisiSekarang[channel];

if (posisiAwal < targetSudut) {
for (int sudut = posisiAwal; sudut <= targetSudut; sudut++) {
int pulse = map(sudut, 0, 180, SERVOMIN, SERVOMAX);
pwm.setPWM(channel, 0, pulse);
delay(kecepatan);
}
} else {
for (int sudut = posisiAwal; sudut >= targetSudut; sudut--) {
int pulse = map(sudut, 0, 180, SERVOMIN, SERVOMAX);
pwm.setPWM(channel, 0, pulse);
delay(kecepatan);
}
}
posisiSekarang[channel] = targetSudut;
}

Code Memindahkan objek jarak jauh ke kiri 45 derajat

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define SERVOMIN 150
#define SERVOMAX 600

// --- POSISI IDLE AWAL ---
// Ch 1 = 40, Ch 3 = 0, sisanya 0.
int posisiSekarang[4] = {0, 40, 0, 0};

void setup() {
Serial.begin(9600);
pwm.begin();
pwm.setPWMFreq(50);
delay(100);

Serial.println("Koreografi Final: Ch 1 turun penuh ke 0 derajat! ✨");

// --- LANGKAH AWAL: Setel Posisi Idle ---
for (int i = 0; i < 4; i++) {
int pulse = map(posisiSekarang[i], 0, 180, SERVOMIN, SERVOMAX);
pwm.setPWM(i, 0, pulse);
}
delay(2000);

// --- RANGKAIAN AKSI UTAMA (Hanya Jalan Sekali) ---

// 1. Channel 1 turun ke 0 derajat (Revisi Baru! ✨)
Serial.println("Aksi 1: Ch 1 -> 0");
gerakMulus(1, 0, 20);
delay(500);

// 2. Channel 0 ke 90 derajat (Lepas capit)
Serial.println("Aksi 2: Ch 0 -> 90");
gerakMulus(0, 90, 20);
delay(500);

// 3. Channel 1 naik kembali ke 40 derajat
Serial.println("Aksi 3: Ch 1 -> 40");
gerakMulus(1, 40, 20);
delay(500);

// 4. Channel 2 ke 20 derajat (Bahu naik)
Serial.println("Aksi 4: Ch 2 -> 20");
gerakMulus(2, 20, 20);
delay(500);

// 5. Channel 3 berputar ke 45 derajat
Serial.println("Aksi 5: Ch 3 -> 45");
gerakMulus(3, 45, 20);
delay(500);

// 6. Channel 2 kembali ke 0 derajat
Serial.println("Aksi 6: Ch 2 -> 0");
gerakMulus(2, 0, 20);
delay(500);

// 7. Channel 1 turun lagi ke 0 derajat (Revisi Baru! ✨)
Serial.println("Aksi 7: Ch 1 -> 0");
gerakMulus(1, 0, 20);
delay(500);

// 8. Channel 0 kembali ke 0 derajat (NYAPIT! ✊)
Serial.println("Aksi 8: Ch 0 -> 0");
gerakMulus(0, 0, 20);

Serial.println("Pertunjukan Selesai! Magnifique! 🎭✨");
}

void loop() {
// Tetap diam dalam pose kemenangan...
}

// --- FUNGSI GERAK MULUS ---
void gerakMulus(uint8_t channel, int targetSudut, int kecepatan) {
int posisiAwal = posisiSekarang[channel];

if (posisiAwal < targetSudut) {
for (int sudut = posisiAwal; sudut <= targetSudut; sudut++) {
int pulse = map(sudut, 0, 180, SERVOMIN, SERVOMAX);
pwm.setPWM(channel, 0, pulse);
delay(kecepatan);
}
} else {
for (int sudut = posisiAwal; sudut >= targetSudut; sudut--) {
int pulse = map(sudut, 0, 180, SERVOMIN, SERVOMAX);
pwm.setPWM(channel, 0, pulse);
delay(kecepatan);
}
}
posisiSekarang[channel] = targetSudut;
}

--

--