RC CAR DENGAN GESTURE TANGAN
KELAS RE-3D KELOMPOK D1 LABORATORIUM SISTEM TERBENAM
Agil Rifky Ramandhani1, Dzaky Abdurrahman Mubarok2, Muhammad Alfi Kirom3, Rakha Ramiro4, Yonanda Andriawan5
Program Studi Teknologi Rekayasa Elektronika
Jurusan Teknik Elektro Politeknik Negeri Semarang 2025/2026
Jl. Prof. Soedarto,
Tembalang, Kec, Tembalang, Kota Semarang, Jawa Tengah, 50275
ABSTRAK - Perkembangan teknologi Computer Vision dan Artificial
Intelligence memungkinkan pengendalian perangkat elektronik dilakukan tanpa
kontak fisik. Salah satu penerapannya adalah pengendalian robot bergerak
menggunakan gestur tangan melalui kamera. Pada proyek ini dirancang sebuah RC
Car berbasis Raspberry Pi 4 yang dikendalikan menggunakan pengenalan gestur
tangan dengan bantuan pustaka MediaPipe dan OpenCV. Sistem terdiri atas dua
bagian, yaitu Raspberry Pi sebagai server yang mengendalikan motor DC, buzzer,
kamera, dan pengambilan foto melalui web server Flask, sedangkan komputer
bertugas melakukan pendeteksian gestur tangan menggunakan webcam. Hasil deteksi
dikirimkan melalui jaringan Wi-Fi menggunakan protokol HTTP menuju Raspberry
Pi. Robot mampu bergerak maju, mundur, belok kanan, belok kiri, membunyikan
klakson, berhenti, serta mengambil foto berdasarkan gestur tangan yang dikenali
secara real-time. Berdasarkan hasil pengujian, sistem mampu bekerja dengan baik
dan memberikan respons yang cepat terhadap perubahan gestur pengguna.
Kata Kunci: RC Car, Gesture Tangan, Raspberry Pi 4, MediaPipe, OpenCV,
Flask.
I. PENDAHULUAN
A. LATAR BELAKANG
B. RUMUSAN MASALAH
- Bagaimana merancang RC Car berbasis Raspberry Pi 4 yang dapat dikendalikan melalui jaringan Wi-Fi?
- Bagaimana mengimplementasikan pendeteksian gestur tangan menggunakan MediaPipe?
- Bagaimana menghubungkan hasil pendeteksian gestur dengan pergerakan robot secara real-time?
- Bagaimana mengimplementasikan fitur tambahan berupa klakson dan pengambilan foto pada robot?
C. TUJUAN
- Merancang RC Car berbasis Raspberry Pi 4.
- Mengimplementasikan pengenalan gestur tangan menggunakan MediaPipe.
- Mengendalikan robot menggunakan komunikasi HTTP melalui Flask.
- Mengimplementasikan fitur streaming kamera, klakson, dan pengambilan foto secara otomatis.
II. METODOLOGI
Pembuatan
prototype ini dilakukan melalui beberapa tahapan sebagai berikut:
1. Studi Literatur
- Mempelajari Raspberry Pi 4 sebagai pengendali robot.
- Mempelajari framework Flask sebagai web server.
- Mempelajari OpenCV untuk pengolahan citra digital.
- Mempelajari MediaPipe Hands sebagai pendeteksi gestur tangan.
- Mempelajari komunikasi HTTP menggunakan pustaka Requests.
2. Perancangan Sistem
Desain
Hardware
Merancang
rangkaian yang terdiri atas:
- Raspberry Pi 4
- Modul RTKA
- Driver Motor
- Motor DC kanan dan kiri
- Webcam
- Buzzer Aktif
- Battery
- Laptop
Desain Software
Perangkat lunak dibagi menjadi dua program utama.
Program
Raspberry Pi
Bertugas sebagai server
menggunakan Flask yang menerima perintah dari komputer kemudian mengendalikan:
- Motor DC
- Kamera
- Buzzer
- Penyimpanan foto
Menggunakan OpenCV dan MediaPipe untuk:
- Mengambil citra webcam.
- Mendeteksi posisi tangan.
- Menghitung jumlah jari.
- Mengenali gestur tertentu.
- Mengirimkan perintah ke Raspberry Pi melalui HTTP.
- Respon gerakan robot.
- Akurasi pengenalan gestur.
- Streaming video.
- Pengambilan foto.
- Klakson.
- Komunikasi jaringan Wi-Fi.
4. Penyusunan Laporan
Menyusun
laporan berdasarkan hasil perancangan, implementasi, dan pengujian sistem.
III. TINJAUAN PUSTAKA
A. ALAT DAN BAHAN
Peralatan
yang digunakan antara lain:
- Raspberry Pi 4
- Webcam USB
- Driver Motor
- Dua Motor DC
- Buzzer Aktif
- RC Car Chassis
- Laptop/PC
- Wi-Fi Hotspot
- OpenCV
- MediaPipe
- Flask
- Requests
B. DIAGRAM BLOK
C. GAMBAR RANGKAIAN
D. GAMBAR PENGAWATAN
E. DIAGRAM ALIR
1. Program Pada Laptop
2. Program Pada RTKA
F. KODE PROGRAM
1. Program pada Laptop
|
"""============================================================================ Pemrogram : Kelompok RE-3D/1 1. 01-Agil Rifky Ramandani NIM: 4.34.23.3.01 2. 07-Dzaky Abdurrahman Mubarok NIM: 4.34.23.3.07 3. 13-Muhammad Alfi Kirom NIM: 4.34.23.3.13 4. 19-Rakha Ramiro NIM: 4.34.23.3.19 5. 25-Yonanda Andriawan NIM: 4.34.23.3.25 Tgl. Praktikum : Rabu, 10 Juni 2026 =============================================================================== Proyek Akhir D1a-Request.py Program untuk mendeteksi gestur tangan
secara real-time menggunakan MediaPipe dan OpenCV. ------------------------------------------------------------------------------- Komponen: - Laptop/PC - Webcam USB/Internal Camera - Raspberry Pi 4 - Robot Mobile - Jaringan Wi-Fi - Pustaka OpenCV - Pustaka MediaPipe - Pustaka Requests
===========================================================================
""" import cv2 import mediapipe as mp import requests import time import math
IP_PI =
"192.168.137.125" URL =
f"http://{IP_PI}:5000/cmd"
mp_hands =
mp.solutions.hands hands = mp_hands.Hands( max_num_hands=1, min_detection_confidence=0.7, min_tracking_confidence=0.7 )
draw =
mp.solutions.drawing_utils
cap = cv2.VideoCapture(0)
last_action = "" last_time = 0
last_photo = 0 PHOTO_DELAY = 5
def send(action): global last_action, last_time
# anti spam if action == last_action and time.time()
- last_time < 0.3: return
try: requests.get(URL,
params={"action": action}, timeout=0.2) print("Kirim:", action)
last_action = action last_time = time.time()
except: pass
def distance(p1, p2): return math.sqrt( (p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2 )
def count_fingers(hand): lm = hand.landmark count = 0
# index, middle, ring, pinky tips = [8, 12, 16, 20]
for tip in tips: if lm[tip].y < lm[tip - 2].y: count += 1
# thumb if lm[4].x < lm[3].x: count += 1
return count
while True: ret, frame = cap.read()
if not ret: break
frame = cv2.flip(frame, 1)
rgb = cv2.cvtColor(frame,
cv2.COLOR_BGR2RGB) result = hands.process(rgb)
gesture = "stop"
if result.multi_hand_landmarks:
for handLms in
result.multi_hand_landmarks:
draw.draw_landmarks( frame, handLms, mp_hands.HAND_CONNECTIONS )
lm = handLms.landmark
jari = count_fingers(handLms)
# ===================== # FIST = STOP # =====================
is_fist = ( lm[8].y > lm[6].y and lm[12].y > lm[10].y and lm[16].y > lm[14].y and lm[20].y > lm[18].y )
# ===================== # AIR PINCH = PHOTO # =====================
pinch_distance = distance( lm[4], # thumb tip lm[8] # index tip )
is_pinch = pinch_distance <
0.07
if is_fist:
gesture = "stop"
elif is_pinch:
if time.time() - last_photo
> PHOTO_DELAY: gesture =
"photo" last_photo = time.time()
elif jari == 1: gesture = "forward"
elif jari == 2: gesture =
"backward"
elif jari == 3: gesture = "right"
elif jari == 4: gesture = "left"
elif jari == 5: gesture = "horn"
send(gesture)
# tampilkan nilai pinch cv2.putText( frame,
f"Pinch:{pinch_distance:.3f}", (20, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2 )
else: gesture = "stop" send("stop")
cv2.putText( frame, f"{gesture}", (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2 )
cv2.imshow("Robot Control",
frame)
if cv2.waitKey(1) & 0xFF == ord('q'): break
cap.release() cv2.destroyAllWindows() |
2. Program pada RTKA
|
"""============================================================================ Pemrogram : Kelompok RE-3D/1 1. 01-Agil Rifky Ramandani NIM: 4.34.23.3.01 2. 07-Dzaky Abdurrahman Mubarok NIM: 4.34.23.3.07 3. 13-Muhammad Alfi Kirom NIM: 4.34.23.3.13 4. 19-Rakha Ramiro NIM: 4.34.23.3.19 5. 25-Yonanda Andriawan NIM: 4.34.23.3.25 Tgl. Praktikum : Rabu, 10 Juni 2026 =============================================================================== Proyek Akhir Lab. Sistem Terbenam D1a-main.py ------------------------------------------------------------------------------- Deskripsi: Program untuk mengendalikan robot
bergerak menggunakan antarmuka web berbasis Flask. ------------------------------------------------------------------------------- Komponen: - Raspberry Pi 4 - Kamera USB / Webcam - Driver Motor - 2x Motor DC - Buzzer Aktif - Catu Daya Robot - Jaringan Wi-Fi
===========================================================================
""" from flask import Flask,
request, Response from gpiozero import Motor,
Buzzer import cv2 import time import os
app = Flask(__name__)
last_photo_time = 0 PHOTO_COOLDOWN = 5
# ===== GPIOZERO =====
motor_kanan = Motor( forward=13, backward=19 )
motor_kiri = Motor( forward=25, backward=26 )
buzzer = Buzzer(27)
# ===== MOTOR =====
def stop(): motor_kanan.stop() motor_kiri.stop()
def forward(): motor_kanan.forward() motor_kiri.forward()
def backward(): motor_kanan.backward() motor_kiri.backward()
def left(): motor_kanan.forward() motor_kiri.backward()
def right(): motor_kanan.backward() motor_kiri.forward()
# ===== BUZZER =====
def horn(): stop()
buzzer.on() time.sleep(0.2) buzzer.off()
# ===== CAMERA =====
camera =
cv2.VideoCapture(1, cv2.CAP_V4L2)
camera.set(cv2.CAP_PROP_FRAME_WIDTH,
320) camera.set(cv2.CAP_PROP_FRAME_HEIGHT,
240)
def generate():
while True:
ret, frame = camera.read()
if not ret: continue
ret, buffer = cv2.imencode( '.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY),
50] )
frame = buffer.tobytes()
yield ( b'--frame\r\n' b'Content-Type:
image/jpeg\r\n\r\n' + frame + b'\r\n' )
# ===== FOTO =====
def save_photo():
global last_photo_time
now = time.time()
if now - last_photo_time < PHOTO_COOLDOWN: print("Foto cooldown") return
ret, frame = camera.read()
if ret:
folder =
"/home/pi/RE23D-01/ProyekAkhir/photos" os.makedirs(folder, exist_ok=True)
filename = ( f"{folder}/photo_{int(now)}.jpg" )
cv2.imwrite(filename, frame)
print("Foto disimpan:",
filename)
last_photo_time = now
# ===== ROUTE =====
@app.route('/') def home(): return "Robot Ready"
@app.route('/cmd') def cmd():
aksi =
request.args.get("action")
print("CMD:", aksi)
if aksi == "forward": forward()
elif aksi == "backward": backward()
elif aksi == "left": left()
elif aksi == "right": right()
elif aksi == "horn": horn()
elif aksi == "photo": save_photo()
else: stop()
return "OK"
@app.route('/video') def video():
return Response( generate(), mimetype='multipart/x-mixed-replace;
boundary=frame' )
# ===== RUN =====
if __name__ ==
"__main__":
try:
app.run( host="0.0.0.0", port=5000, threaded=True )
except KeyboardInterrupt:
stop()
motor_kanan.close() motor_kiri.close() buzzer.close()
camera.release() |
IV. HASIL DAN PEMBAHASAN
A. CARA KERJA RANGKAIAN
Saat sistem
dijalankan, Raspberry Pi berfungsi sebagai web server menggunakan Flask dan
menunggu perintah yang dikirim dari komputer melalui jaringan Wi-Fi. Secara
bersamaan, program pada komputer mengaktifkan webcam dan melakukan proses
pendeteksian gestur tangan menggunakan MediaPipe.
Citra dari webcam diproses menggunakan OpenCV, kemudian MediaPipe mendeteksi posisi 21 titik landmark tangan. Berdasarkan posisi landmark tersebut, sistem menghitung jumlah jari yang terbuka dan menentukan jenis gestur yang dilakukan pengguna.
Apabila pengguna mengangkat satu jari, komputer mengirimkan perintah forward sehingga kedua motor DC bergerak maju. Dua jari akan menghasilkan perintah backward, tiga jari menghasilkan perintah right, sedangkan empat jari menghasilkan perintah left.
Ketika seluruh jari terbuka, sistem mengirimkan perintah horn sehingga buzzer aktif sebagai klakson. Sebaliknya, apabila tangan mengepal atau tidak ada tangan yang terdeteksi, sistem mengirimkan perintah stop sehingga kedua motor berhenti.
Selain itu, sistem juga mengenali gestur pinch, yaitu ketika ujung ibu jari dan telunjuk saling mendekat. Gestur ini digunakan untuk mengambil foto melalui kamera yang terpasang pada robot. Foto akan disimpan secara otomatis ke dalam folder penyimpanan Raspberry Pi dengan mekanisme cooldown selama lima detik agar tidak terjadi penyimpanan berulang.
Selama robot beroperasi, Raspberry Pi juga menyediakan layanan video streaming sehingga pengguna dapat memantau kondisi sekitar robot melalui browser secara real-time. Berdasarkan hasil pengujian, seluruh fitur seperti navigasi robot, streaming kamera, klakson, dan pengambilan foto berhasil bekerja sesuai dengan gestur tangan yang dikenali.
B. FOTO PROTOTYPE
V. SIMPULAN
Berdasarkan hasil perancangan dan pengujian, RC Car berbasis Raspberry Pi 4 berhasil dikendalikan menggunakan gestur tangan secara real-time. MediaPipe mampu mengenali berbagai gestur tangan dengan baik sehingga robot dapat bergerak maju, mundur, belok kanan, belok kiri, berhenti, membunyikan klakson, serta mengambil foto sesuai perintah pengguna. Komunikasi menggunakan protokol HTTP melalui Flask berjalan dengan baik pada jaringan Wi-Fi, sedangkan fitur video streaming mampu memberikan tampilan kondisi sekitar robot secara langsung. Sistem yang dikembangkan menunjukkan bahwa penerapan Computer Vision dapat menjadi alternatif antarmuka yang efektif dalam pengendalian robot bergerak.
VI. REFERENSI
Bradski, G. and Kaehler, A., 2008. Learning
OpenCV: Computer Vision with the OpenCV Library. Sebastopol: O'Reilly Media.
Google, 2025. MediaPipe Documentation.
Available at: https://ai.google.dev/edge/mediapipe [Diakses pada 30 June 2026].
OpenCV, 2025. OpenCV Documentation.
Available at: https://docs.opencv.org
Palachko, A., 2023. Flask Web Development.
Sebastopol: O'Reilly Media.
Raspberry Pi Ltd., 2025. Raspberry Pi
Documentation. Available at: https://www.raspberrypi.com/documentation/
VII. LAMPIRAN
A. LINK YOUTUBE :
B. LINK PPT :


.png)

Komentar
Posting Komentar