Sabtu, 26 September 2026

Deteksi Jari Tangan Real-Time Menggunakan MediaPipe, JavaScript & Tailwind CSS

Deteksi Jari Tangan Real-Time Menggunakan MediaPipe, JavaScript & Tailwind CSS

By. Iyon Manakarra // Mekatronika Manakarra


Perkembangan teknologi Artificial Intelligence (AI) dan Computer Vision saat ini sudah semakin pesat. Menariknya, kita tidak lagi harus selalu bergantung pada bahasa pemrograman Python atau server berdaya tinggi hanya untuk menjalankan model AI.



Lewat artikel ini, kita akan belajar cara membuat aplikasi Pendeteksi Jari Tangan Real-Time yang modern, interaktif, dan berjalan langsung di browser web hanya dengan modal HTML, Tailwind CSS, JavaScript, dan pustaka AI buatan Google bernama MediaPipe.



Fitur Utama Aplikasi

  1. Deteksi Real-Time Berbasis AI: Menggunakan pustaka MediaPipe Hands buatan Google.

  2. Detail Status Per Jari: Menampilkan status spesifik (Ibu Jari, Telunjuk, Tengah, Manis, Kelingking) apakah sedang Terangkat atau Tertutup.

  3. Deteksi Sisi Tangan: Otomatis mengenali apakah tangan yang tampil adalah tangan Kanan atau Kiri.

  4. Indikator FPS & Toggle Kamera: Dilengkapi penghitung FPS real-time dan tombol ON/OFF kamera.

  5. Tampilan Modern & Responsif: Menggunakan antarmuka tema gelap (dark mode) berbasi Tailwind CSS.



Apa itu MediaPipe dan JavaScript?

Sebelum masuk ke teknis pembuatan, mari kita pahami dua komponen utama yang membuat proyek ini bekerja:

  • MediaPipe (Google): Framework pembelajaran mesin (machine learning) buatan Google yang dirancang khusus untuk memproses data visual secara cepat (real-time). Pustaka ini mampu memetakan 21 titik koordinat landmark pada tangan manusia.

  • JavaScript & HTML: Kombinasi bahasa pemrograman web yang bertugas mengakses kamera pengguna, mengirimkan cuplikan video ke MediaPipe, menghitung logika jari mana yang terbuka, dan memperbarui tampilan UI secara dinamis.


Bagaimanakah Sistem Menghitung Jari?

MediaPipe membaca tangan dan memberinya 21 titik koordinat (X, Y, Z).

Logika perhitungan pada kode ini bekerja sebagai berikut:

  • 4 Jari Utama (Telunjuk, Tengah, Manis, Kelingking): Membandingkan koordinat Y antara ujung jari (tip) dengan sendi di bawahnya (PIP). Jika koordinat Y ujung jari lebih kecil (posisi di layar lebih tinggi), maka jari dianggap Terangkat.

  • Ibu Jari (Thumb): Menggunakan perbandingan horizontal (koordinat X) yang disesuaikan dengan posisi Tangan Kanan atau Tangan Kiri (Handedness).


Kode Program Lengkap

Kamu bisa membuat satu berkas bernama index.html dan memasukkan seluruh kode di bawah ini:

== Link Download "Klik disini" ==

Cara Menjalankan Proyek

  1. Simpan File: Buat berkas baru di komputer kamu, beri nama index.html, lalu tempelkan kode di atas.

  2. Buka di Browser: Klik dua kali berkas index.html tersebut untuk membukanya di browser (Chrome, Edge, atau Firefox).

  3. Izinkan Akses Kamera: Ketika muncul jendela pop-up pemberitahuan dari browser, pilih Allow / Izinkan untuk memberi akses kamera web.



  4. Uji Coba: Arahkan tangan kamu ke kamera dan cobalah menekuk atau membuka jari-jarimu!

Kesimpulan

Dengan mengombinasikan MediaPipe dan JavaScript, kita bisa membangun aplikasi Hand Tracking interaktif langsung di browser tanpa perlu instalasi perangkat lunak atau server backend yang rumit. Proyek ini sangat cocok dijadikan dasar untuk pengembangan aplikasi lain, seperti game berbasis gestur tangan, navigasi web bebas sentuhan (touchless interface), atau pengenal bahasa isyarat.




Sabtu, 24 Januari 2026

Desiminate Media Ajar Embedded System Programming Menggunakan Trainer dan E-Jobsheet Berbasis Arduino Nano di SMK

Media Ajar Embedded System Programming Menggunakan Trainer dan E-Jobsheet Berbasis Arduino Nano di SMK
By. Wiyono (Iyon Manakarra)


Pengembangan media pembelajaran merupakan salah satu upaya strategis untuk meningkatkan kualitas pembelajaran kejuruan, khususnya pada mata pelajaran Embedded System Programming di SMK Jurusan Teknik Elektronika Industri. Berdasarkan hasil penelitian pengembangan dengan model 4-D (Define, Design, Develop, dan Disseminate), pada Program Pascasarjana PPS-UNM Makassar Tahun 2026, telah dihasilkan Trainer Embedded System Programming berbasis Arduino Nano yang terintegrasi dengan E-Jobsheet digital. Media ini dirancang untuk menjawab permasalahan pembelajaran praktik, seperti keterbatasan trainer, penggunaan jobsheet konvensional, serta rendahnya keterlibatan siswa dalam praktik pemrograman mikrokontroler. Integrasi trainer fisik dan E-Jobsheet digital diharapkan mampu menjembatani kesenjangan antara teori dan praktik secara lebih kontekstual.


 
E-Jobsheet yang dikembangkan berbasis Google Sites sehingga mudah diakses melalui berbagai perangkat, baik laptop maupun smartphone. Di dalamnya tersedia materi ringkas, panduan praktik langkah demi langkah, gambar rangkaian, contoh kode program, serta evaluasi interaktif yang mendukung pembelajaran mandiri dan berbasis proyek. Hasil uji kelayakan menunjukkan bahwa media ini berada pada kategori Layak hingga Sangat Layak, sedangkan hasil uji kepraktisan pada siswa dan guru menunjukkan kategori Sangat Praktis. Temuan tersebut mengindikasikan bahwa E-Jobsheet dan Trainer tidak hanya mudah digunakan, tetapi juga efektif dalam mendukung pencapaian capaian pembelajaran pada elemen pemrograman sistem embedded, khususnya dalam penerapan input/output digital, analog, dan komunikasi serial.


Sebagai bagian dari tahap penyebaran (disseminate), E-Jobsheet ini dibagikan secara terbuka agar dapat dimanfaatkan oleh guru dan siswa SMK secara lebih luas sebagai referensi pembelajaran praktik pemrograman Arduino. Guru dapat mengadopsi media ini sebagai alternatif bahan ajar berbasis proyek, sementara siswa dapat menggunakannya untuk latihan mandiri di luar jam pelajaran. E-Jobsheet dapat diakses melalui tautan berikut:

👉 https://sites.google.com/guru.smk.belajar.id/e-jobsheet-arduino-programming


Diharapkan media pembelajaran ini dapat berkontribusi dalam meningkatkan kualitas pembelajaran vokasi, memperkuat keterampilan praktik siswa, serta mendukung implementasi Kurikulum Merdeka yang relevan dengan kebutuhan dunia industri.


LINK PRODUK


Salam:
Iyon Manakarra

Selasa, 18 November 2025

Membuat Robot Obstacle Avoider 4WD Menggunakan Arduino Uno dan Sensor Ultrasonik

Membuat Robot Obstacle Avoider 4WD Menggunakan Arduino Uno dan Sensor Ultrasonik

By. Iyon manakarra

 

Robot obstacle avoider atau robot penghindar halangan merupakan salah satu proyek paling populer di dunia robotika pemula. Robot ini mampu bergerak secara otomatis dan menghindari objek di depannya menggunakan sensor jarak. Pada artikel ini, kita akan membahas pembuatan Robot Obstacle Avoider 4-Wheel Drive (4WD) lengkap dengan penjelasan komponen, cara kerja, serta analisis program Arduino Uno yang digunakan.


 

1.     Konsep Dasar Robot Obstacle Avoider

Robot obstacle avoider bekerja dengan prinsip sederhana:

  1. Sensor ultrasonik HC-SR04 mendeteksi jarak objek di depan.
  2. Jika ada halangan yang jaraknya kurang dari ambang batas (misalnya < 25 cm), robot akan berhenti.
  3. Servo menggerakkan sensor ke kiri dan kanan untuk mengukur ruang yang lebih bebas.
  4. Robot memilih arah dengan jarak paling besar.
  5. Setelah menentukan arah, robot akan berbelok kemudian melanjutkan perjalanan.

Robot ini sangat cocok sebagai media pembelajaran elektronika, robotika dasar, pemrograman Arduino, dan pengontrolan motor DC.

 

2.     Komponen yang Digunakan

Berikut komponen utama pada proyek robot ini:

  • Arduino Uno sebagai otak utama pemrosesan.
  • Motor Driver L298N untuk mengatur putaran empat motor DC.
  • Motor DC 4 Buah (4WD) untuk sistem penggerak robot.
  • Sensor Ultrasonik HC-SR04 untuk mendeteksi jarak.
  • Servo SG90 untuk menggerakkan sensor ke kiri, depan, dan kanan.
  • Baterai 7.4V / 18650 sebagai sumber daya.
  • Kabel jumper, rangka robot 4WD, dan dudukan servo.

 

3.     Penjelasan Wiring / Koneksi Komponen

a.     HC-SR04 ke Arduino

  • trigPin → Pin 13
  • echoPin → Pin 12

 

b.     Motor Driver L298N

  • IN1 → Pin 6
  • IN2 → Pin 5
  • IN3 → Pin 3
  • IN4 → Pin 4
  • ENA → Pin 8 (PWM)
  • ENB → Pin 9 (PWM)

 

c.      Servo

  • Signal → Pin 11
  • Vcc → 5V
  • GND → GND

 

4.     Cara Kerja Program Arduino

Program ini ditulis untuk mengontrol seluruh sistem robot. Berikut penjelasan bagian utama:

a.     Mengukur Jarak dengan Ultrasonik

int getDistance() {

  digitalWrite(trigPin, LOW);

  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH);

  distance = duration * 0.034 / 2;

  return distance;

}

Fungsi getDistance() mengirimkan gelombang ultrasonik dan mengukur waktu pantulnya, kemudian dihitung menjadi jarak.

 

b.     Fungsi Kontrol Motor

Program menyediakan beberapa fungsi untuk mengontrol arah gerak robot:

  • moveForward() → maju
  • moveBackward() → mundur
  • turnLeft() → belok kiri
  • turnRight() → belok kanan
  • stopCar() → berhenti

Semua fungsi bekerja dengan mengatur logika HIGH/LOW pada pin motor driver L298N dan memberikan sinyal PWM ke pin ENA & ENB untuk mengatur kecepatan.

 

c.      Algoritma Penghindar Halangan

Logika utama berada di dalam fungsi loop():

  1. Servo diarahkan ke depan (myServo.write(90)).
  2. Robot mengukur jarak halangan di depan.
  3. Jika jarak < 25 cm, robot berhenti.
  4. Servo belok ke kiri → ukur jarak.
  5. Servo belok ke kanan → ukur jarak.
  6. Bandingkan leftDistance dan rightDistance.
  7. Belok ke arah yang lebih aman.
  8. Robot kembali maju.

Inilah inti dari kecerdasan dasar robot penghindar halangan.

 

5.     Kode Program Lengkap

Kode berikut adalah program robot obstacle avoider yang digunakan:

// Design Program by. Iyon Manakarra//Mekatronika Manakarra
#include <Servo.h>

// Pin Definitions
#define trigPin 13
#define echoPin 12
#define ENA 8
#define ENB 9
#define IN1 6
#define IN2 5
#define IN3 3
#define IN4 4
#define servoPin 11

Servo myServo;

// Variables for distance measurement
long duration;
int distance;
int rightDistance, leftDistance;

// Function to calculate distance
int getDistance() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.034 / 2;
  return distance;
}

// Motor control functions
void moveForward() {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENA, 250); // Adjust speed using PWM (0-255)
  analogWrite(ENB, 250); // Adjust speed using PWM (0-255)
}

void moveBackward() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  analogWrite(ENA, 250); // Adjust speed using PWM
  analogWrite(ENB, 250); // Adjust speed using PWM
}

void stopCar() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}

void turnLeft() {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  //analogWrite(ENA, 150); // Adjust speed for turning
  //analogWrite(ENB, 150); // Adjust speed for turning
}

void turnRight() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  //analogWrite(ENA, 150); // Adjust speed for turning
  //analogWrite(ENB, 150); // Adjust speed for turning
}

void setup() {
  // Setup pins
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);

  // Servo setup
  myServo.attach(servoPin);
  myServo.write(90); // Start servo at center position

  Serial.begin(9600);
}

void loop() {
  // Scan forward
  myServo.write(90); // Center position (looking straight ahead)
  delay(50);
  int frontDistance = getDistance();

  // If an obstacle is closer than 20 cm
  if (frontDistance < 25) {
    stopCar();
    delay(200); // Pause to make a decision

    // Scan left side
    myServo.write(0); // Turn servo to the left
    delay(500);
    leftDistance = getDistance();

    // Scan right side
    myServo.write(180); // Turn servo to the right
    delay(500);
    rightDistance = getDistance();

    // Decide direction based on the distances
    if (leftDistance > rightDistance) {
      turnLeft();
      delay(500); // Adjust the delay to control turning duration
    } else {
      turnRight();
      delay(500); // Adjust the delay to control turning duration
    }

    stopCar(); // Stop after turning
    delay(200); // Brief pause before moving forward again
  } else {
    moveForward(); // Continue moving forward if the path is clear
  }

  delay(50); // Short delay before next loop iteration
}

 

6.     Tips Pengembangan Lebih Lanjut

Setelah robot berjalan, Anda dapat meningkatkan performanya dengan:

  • Menambahkan sensor inframerah di samping untuk navigasi lebih tajam.
  • Menambahkan PID untuk gerakan motor lebih stabil.
  • Menggunakan baterai Li-ion agar robot lebih bertenaga.
  • Mengoptimalkan sudut servo (misalnya 60–120 derajat).
  • Menambahkan buzzer sebagai alarm tabrakan.

7.     Kesimpulan

Robot Obstacle Avoider 4WD adalah proyek yang sangat ideal bagi siswa dan hobiis robotika. Dengan kombinasi Arduino Uno, sensor ultrasonik, motor driver, dan algoritma sederhana, robot ini bisa melakukan navigasi otomatis dengan cukup baik. Proyek ini tidak hanya mengajarkan pemrograman tetapi juga konsep sensor, aktuator, dan pengendalian motor.

 

8.     Dokumen Proses Pembuatan

a.     Link Youtube


b.     Galery Design

-  Komponen Robot Avoider

MekatronikaManakarra_KomponenAvoider
Komponen Robot

- Hasil Rakitan Mekanik Robot dan Kontrol Elektronika

 

Tampak Bawah

Tampak samping Kiri

Tampak Samping Kanan





Minggu, 08 Juni 2025

PERCOBAAN INTERUPSI EKSTERNAL PADA ARDUINO UNO : PENANGANAN SENSOR YANG SANGAT SENSITIF (SENSOR PIR ATAU HALL EFFECT)

PERCOBAAN INTERUPSI EKSTERNAL PADA ARDUINO UNO

PENANGANAN SENSOR YANG SANGAT SENSITIF (SENSOR PIR ATAU HALL EFFECT)

a.     Deskripsi:

Program ini menghitung putaran roda menggunakan rotary encoder. Dengan mendeteksi pulsa dari encoder, Arduino dapat menentukan kecepatan atau jarak tempuh roda berdasarkan jumlah pulsa yang terdeteksi. Rotary encoder adalah sensor elektromekanis yang mengubah gerakan rotasi menjadi sinyal digital. Sinyal ini dapat diolah oleh Arduino untuk menghitung jumlah putaran roda dan menentukan arah putaran.

Dasar teori yang digunakan dalam program ini adalah prinsip kerja rotary encoder yang menghasilkan sinyal pulsa saat porosnya berputar. Dengan menggunakan dua jalur sinyal (A dan B), Arduino dapat membedakan arah putaran berdasarkan urutan pulsa yang diterima. Dengan menerapkan interupsi, sistem dapat membaca perubahan sinyal secara cepat dan akurat tanpa harus terus-menerus memeriksa status encoder dalam loop utama.

b.     Bahan:

·        Rotary encoder (1 Buah)

·        Arduino Uno (1 Buah)

c.      Gambar Schematich.

d.     Kode Sketch Program:

volatile bool motionDetected = false;

 

void setup() {

  pinMode(13, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(2), detectMotion, RISING);

}

 

void loop() {

  if (motionDetected) {

    digitalWrite(13, HIGH);

    delay(5000);

    digitalWrite(13, LOW);

    motionDetected = false;

  }

}

 

void detectMotion() {

  motionDetected = true;

}

e.     Penjelasan Program :

·        Menggunakan interupsi eksternal untuk menangani sinyal dari sensor PIR atau Hall Effect.

·        Variabel volatile bool motionDetected = false;

o   Menyimpan status deteksi gerakan atau perubahan medan magnet.

o   volatile digunakan agar nilai ini dapat berubah kapan saja akibat interupsi.

·        Fungsi setup()

o   pinMode(13, OUTPUT); → Mengatur pin 13 sebagai output untuk mengendalikan LED.

o   attachInterrupt(digitalPinToInterrupt(2), detectMotion, RISING);

§  Menghubungkan interupsi ke pin 2 untuk mendeteksi perubahan sinyal sensor.

§  Memanggil fungsi detectMotion() saat terjadi transisi dari LOW ke HIGH.

·        Fungsi loop()

o   Jika motionDetected bernilai true, LED pada pin 13 akan menyala selama 5 detik.

o   digitalWrite(13, HIGH); → Menyalakan LED sebagai indikasi deteksi gerakan.

o   delay(5000); → Menahan LED menyala selama 5 detik.

o   digitalWrite(13, LOW); → Mematikan LED setelah jeda waktu selesai.

o   motionDetected = false; → Mengembalikan status deteksi ke kondisi awal setelah LED mati.

·        Fungsi detectMotion()

o   motionDetected = true; → Mengubah status deteksi menjadi true saat interupsi dipicu.