Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Data Science

    Mengulik Digitalisasi data statistik dengan bantuan python untuk pemanfaatan di bidang transportasi, kesehatan, keuangan dan masih banyak lagi

  • Artificial Intelligence - Pengenalan Object

    Menghadirkan pemanfaatan AI dengan praktek-praktek yang mudah diikuti - cocok untuk mahasiswa yang mencari ide tugas akhir

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Tampilkan postingan dengan label project. Tampilkan semua postingan
Tampilkan postingan dengan label project. Tampilkan semua postingan

Sabtu, 28 Juni 2025

AGV - Tahap 1 : Membuat Mobil RC Mengikuti Pergerakan Kode ArUco

 


Dalam beberapa tahun terakhir, perkembangan teknologi otomasi di berbagai sektor industri semakin pesat. Salah satu inovasi yang mulai banyak diterapkan adalah penggunaan Autonomous Guided Vehicle atau AGV. Kendaraan tanpa awak ini hadir sebagai solusi cerdas untuk memindahkan barang secara otomatis dengan efisiensi tinggi dan minim intervensi manusia.

AGV bukan sekadar mobil robot yang bisa bergerak sendiri — ia merupakan bagian penting dari transformasi digital di bidang logistik, manufaktur, hingga gudang penyimpanan. Dengan kemampuan navigasi mandiri menggunakan sensor, laser, atau sistem visi komputer, AGV mampu menggantikan proses manual yang sebelumnya memakan banyak waktu dan tenaga kerja.

Kehadiran AGV juga semakin relevan di tengah tuntutan industri akan produktivitas, akurasi, serta keamanan kerja yang lebih baik. Selain itu, dengan adanya pandemi beberapa tahun belakangan, banyak perusahaan mulai beralih ke sistem otomatis untuk mengurangi ketergantungan pada tenaga kerja langsung — dan AGV menjadi salah satu jawaban utama.


Setelah saya berhasil mengubah mobil RC 27mhz menjadi ber - WiFi ( baca disini ), maka langkah awal yang saya lakukan untuk menjadikannya bisa mengikuti rute terpendek seperti gambar animasi diatas adalah dengan membuat marking kode di tiap koordinatnya menggunakan kode AruCo. Untuk itu saya menambahkan kamera CCTV IP diatas mobil-mobilan remote yang saya sudah modifikasi.



Saya pilihkan IP CCTV merek Ezviz H1C yang paling cocok karena bisa digunakan dalam mode offline (tanpa butuh internet), dibanding awalnya saya menggunakan merek bardi yang sejenis namun harus terhubung internet baru bisa di akses RTSP streamnya. Untuk mengakses stream CCTV ezviz cukup butuh password securitynya (6 buah huruf) yang biasanya terdapat di bawah dudukan kameranya (atau bisa diubah lewat aplikasi ezviz) serta IP yang didapatnya. Contoh nya alamat seperti ini :


rtsp://admin:XXXXXX@192.168.1.178:554/Streaming/Channels/101


Alamat paling belakang merupakan mode resolusi dimana 101 = HD 1080 dan jika 102 ber resolusi SD 480.



Logika yang saya gunakan untuk percobaan kali ini sebagai berikut :

1. CCTV ip diakses stream nya oleh python-opencv dan kemudian mencari  kode ArUco pada frame yang ditangkap yang sudah ditentukan kode ID nya

2. Layar gambar dibagi menjadi 3 bagian yaitu kanan tengah dan kiri. Apabila kodenya terdapat ditengah maka akan mengirmkan perintah maju ke RC melalui pengiriman pesan UDP, begitu pula untuk kanan dan kiri. 

3. Mobil RC kemudian akan bergerak sesuai dengan animasi paling atas tulisan ini. Jika tidak ada kode yang terdeteksi selama 10 detik maka mobil akan mundur untuk mencari kemungkinan kode terlewati

4. Langkah selanjutnya akan di desain pendeteksi urutan gerak RC sesuai ID marker yang sudah disusun berdasarkan rute terpendek






Koding pythonnya seperti berikut :



import cv2
import socket
import time

# Konfigurasi UDP sesuaikan dengan koding mobil RC wifi
UDP_IP = "192.168.1.177"
UDP_PORT = 4210
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

def send_udp(data):
    sock.sendto(data.encode(), (UDP_IP, UDP_PORT))
    print(f"[UDP] Terkirim: {data}")

# URL RTSP dari kamera IP
rtsp_url = "rtsp://admin:XXXXXX@192.168.1.178:554/Streaming/Channels/102"

# Inisialisasi detector ArUco
aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_APRILTAG_36H11)
parameters = cv2.aruco.DetectorParameters()
detector = cv2.aruco.ArucoDetector(aruco_dict, parameters)

target_id = 32
last_send_time = time.time()
last_detection_time = time.time()  # Untuk hitung mundur mundur
send_data = "0"
action_text = "Tidak Ada Deteksi"
has_sent_stop = False  # Hanya kirim "2" sekali per siklus

# Fungsi untuk menulis teks dan kotak
def draw_overlay(frame, text):
    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(frame, f"Aksi: {text}", (10, 60), font, 1, (0, 255, 255), 2, cv2.LINE_AA)

cap = cv2.VideoCapture(rtsp_url)

while True:
    ret, frame = cap.read()
    if not ret:
        print("Tidak dapat menerima frame. Keluar...")
        break

    current_time = time.time()
    detected = False

    # --- DETEKSI APRILTAG ---
    corners, ids, rejected = detector.detectMarkers(frame)

    if ids is not None:
        for i in range(len(ids)):
            if ids[i][0] == target_id:
                corner = corners[i][0]

                # Gambar kotak di sekitar tag
                cv2.polylines(frame, [corner.astype(int)], True, (0, 255, 0), 2)

                # Hitung titik tengah
                cX = int((corner[0][0] + corner[2][0]) / 2)
                width = frame.shape[1]
                zona_kiri = width // 3
                zona_tengah = 2 * width // 3

                # Tentukan zona dan aksi
                if cX < zona_kiri:
                    action_text = "Kiri"
                    send_data = "3"
                elif cX < zona_tengah:
                    action_text = "Maju"
                    send_data = "1"
                else:
                    action_text = "Kanan"
                    send_data = "4"

                # Reset timer mundur
                last_detection_time = current_time
                has_sent_stop = False
                detected = True

                # Titik tengah
                cY = int((corner[0][1] + corner[2][1]) / 2)
                cv2.circle(frame, (cX, cY), 5, (0, 0, 255), -1)

                # Garis pembatas zona
                cv2.line(frame, (zona_kiri, 0), (zona_kiri, frame.shape[0]), (255, 0, 0), 1)
                cv2.line(frame, (zona_tengah, 0), (zona_tengah, frame.shape[0]), (255, 0, 0), 1)
                break

    # --- LOGIKA TIMER MUNDUR ---
    if not detected:
        elapsed_no_detection = current_time - last_detection_time
        if elapsed_no_detection >= 10 and not has_sent_stop:
            send_data = "2"
            action_text = "Mundur"
            send_udp(send_data)
            print("[INFO] Mengirim '2' (mundur)")
            has_sent_stop = True  # Tandai bahwa sudah dikirim
        else:
            action_text = "Tidak Ada Deteksi"
            send_data = "0"
    else:
        last_detection_time = current_time  # Reset timer jika ada deteksi
        has_sent_stop = False  # Reset agar bisa kirim ulang "2" di masa depan

    # --- KIRIM DATA SETIAP 2 DETIK ---
    if current_time - last_send_time >= 2:
        send_udp(send_data)
        last_send_time = current_time

    # --- TAMPILKAN DI LAYAR ---
    draw_overlay(frame, action_text)
    cv2.imshow('AprilTag Detection', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# --- BERSIHKAN ---
cap.release()
cv2.destroyAllWindows()





SELAMAT MENCOBA !




Share:

Modifikasi Mobil - Mobilan RC 27Mhz Menjadi Berbasis WiFi

 



Tulisan kali ini sebenarnya masih ada hubungannya dengan kerjasama saya Bersama Fakultas Vokasi Unesa dalam hal penelitian dibidang Transportasi. Gaya nya sih pengen membuat robot AGV seperti di gudang nya amazon sana yang banyak bertebaran videonya di medsos, namun seperti biasa kita mainan yang kecil-kecilan dulu. Yuk kita utak-atik mobil-mobilan RC Truk seharga 100ribuan dulu. Sekalian mau melihat bagaimana sih kontrol yang didalamnya ?



Truk mainan Remote diatas sangat umum di toko mainan bahkan mungkin hampir dimiliki oleh semua anak kecil (cowok) karena hemat saya lebih mengajarkan kegiatan outdoor ke anak daripada berkutat dengan smartphone melulu. Namun setelah saya perhatikan jangkauan kendali remotenya cukup pendek sehingga otomatis ketika diatas 5 meter gak akan nyampai tuh kendalinya. Menjadi keheranan saya kenapa sependek itu? Apakah agar anak ikutan berlari dibelakang mobil-mobilan? Namun secara teknis ini terjadi karena ketika saya bongkar antena di dalam kontroler disisi mobil-mobilannya hanya berupa kabel saja. Harus dikasi tambahan apa ya agar jauh?



Gambar diatas merupakan modul kontroler yang dapat dibeli di berbagai onlineshop (bahkan sepaket dengan motor DC nya) hanya 25 ribu saja (dapet untung dari mana coba produsennya ...ckckckckc). Dari berbagai tulisan dan video di internet rata-rata yang dilakukan adalah menambahkan antena dan jangkauannya gak jauh juga. Nah bagaimana dengan memanfaatkan wifi dirumah yang lumayan jauh jangkauannya ? Kita bisa gunakan bantuan mikrokontrolelr ber wifi macam ESP8266/ESP32.

Prinsipnya sebagai berikut:

1. Gunakan relay 5V atau transistor sebagai penyambung tombol yang ada pada modul remote, kemudian di kontrol oleh pin dari ESP32. Saya lebih memilih transistor kebetulan ada banyak transistor PNP 2N3906 di gudang sehingga hanya butuh tambahan resistor 1K ke basis dan kontrol logika aktif LOW untuk menyambungkan tombol switch. Ilustrasinya seperti berikut : 




2. ESP32 terhubung dengan wifi rumah dan menggunakan komunikasi UDP / TCP sebagai protokol pengiriman data. Perintah yg dikirim berupa teks "1" untuk maju, "2" untuk mundur, "3" belok kiri, "4" belok kanan dan "0" untuk stop.
3. Untuk kontrol jarak jauh (kanan kiri maju mundur) bisa menggunakan aplikasi smartphone android UDP terminal, seperti pada gambar paling atas. Saya ada juga koding APK sendiri namun saya bahas lain waktu. 
4. Remote dapat di bongkar menyisakan PCB nya saja dan taruh  bersama ESP32 diatas / didalam back truk. Jangan lupa menambahkan Power suply berupa powerbank agar dapat mensuply ESP32 dan juga modul remote. 
5. Saya menyambungkan pin 3.3 Volt dari ESP32 ke pin baterai + dari modul remote. 










Koding di ESP32 :


#include <WiFi.h>
#include <WiFiUdp.h>

// Konfigurasi WiFi sesuaikan
const char* ssid = "nama wifi";
const char* password = "paswordnya";

// IP statis sesuaikan, agar tidak berubah ubah
IPAddress ip(192, 168, 1, 177);
IPAddress gateway(192, 168, 1, 1);     // samakan IP router yg digunakan
IPAddress subnet(255, 255, 255, 0);

// Port UDP nya bebas
unsigned int udpPort = 4210;
WiFiUDP udp;

// Pin kendali sesuaikan dengan pin di ESP32 yg kamu pakai
#define MAJU_PIN    15
#define MUNDUR_PIN   2
#define KANAN_PIN    4
#define KIRI_PIN     5

void setup() {
  // Inisialisasi pin sebagai output
  pinMode(MAJU_PIN, OUTPUT);
  pinMode(MUNDUR_PIN, OUTPUT);
  pinMode(KANAN_PIN, OUTPUT);
  pinMode(KIRI_PIN, OUTPUT);

  // Set awal semua pin HIGH (non-aktif karena aktif LOW)
  digitalWrite(MAJU_PIN, HIGH);
  digitalWrite(MUNDUR_PIN, HIGH);
  digitalWrite(KANAN_PIN, HIGH);
  digitalWrite(KIRI_PIN, HIGH);

  // Mulai koneksi WiFi dengan IP statis
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);

  Serial.begin(115200);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("\nKoneksi WiFi berhasil");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  // Mulai UDP
  udp.begin(udpPort);
  Serial.printf("Listening on UDP port %d\n", udpPort);
}

void maju()
{

    digitalWrite(MAJU_PIN, LOW );
    digitalWrite(MUNDUR_PIN, HIGH);
    digitalWrite(KANAN_PIN, HIGH);
    digitalWrite(KIRI_PIN, HIGH);

  Serial.println("ini maju ...");
}

void mundur()
{

    digitalWrite(MAJU_PIN, HIGH );
    digitalWrite(MUNDUR_PIN, LOW);
    digitalWrite(KANAN_PIN, HIGH);
    digitalWrite(KIRI_PIN, HIGH);

    Serial.println("ini mundur ...");

}

void kiri()
{

    digitalWrite(MAJU_PIN, LOW);
    digitalWrite(MUNDUR_PIN, HIGH);
    digitalWrite(KANAN_PIN, HIGH);
    digitalWrite(KIRI_PIN, LOW);


    Serial.println("ini ngiri ...");
  
}

void kanan()
{

    digitalWrite(MAJU_PIN, LOW );
    digitalWrite(MUNDUR_PIN, HIGH);
    digitalWrite(KANAN_PIN, LOW);
    digitalWrite(KIRI_PIN, HIGH);

    Serial.println("ini nganan ...");
}

void mandek()
{

    digitalWrite(MAJU_PIN, HIGH);
    digitalWrite(MUNDUR_PIN, HIGH);
    digitalWrite(KANAN_PIN, HIGH);
    digitalWrite(KIRI_PIN, HIGH);

    Serial.println("ini mandek ...");
}

void loop() {


  char packetBuffer[255]; // Buffer untuk menerima data UDP

  // Cek apakah ada paket UDP masuk
  int packetSize = udp.parsePacket();
  if (packetSize) {
    int len = udp.read(packetBuffer, 255);
    if (len > 0) {
      packetBuffer[len] = '\0'; // Null-terminate string
    }

    Serial.printf("Pesan diterima: %s\n", packetBuffer);

    // Proses perintah 1=maju 2=mundur 3=kiri 4=kanan 0=stop
    if (strcmp(packetBuffer, "1") == 0) {
      maju();
      delay(600);
      mundur();
      delay(200);
      mandek();
      
    } else if (strcmp(packetBuffer, "2") == 0) {
      mundur();
      delay(600);
      maju();
      delay(200);
      mandek();
    } else if (strcmp(packetBuffer, "3") == 0) {
      kiri();
      delay(700);
      mundur();
      delay(150);   
      mandek();
    } else if (strcmp(packetBuffer, "4") == 0) {
      kanan();
      delay(700);
      mundur();
      delay(150);   
      mandek();
    } else if (strcmp(packetBuffer, "0") == 0) {
      // Semua tetap HIGH → berhenti total
      mandek();
      Serial.println("Perintah BERHENTI diterima");
    }

    
  }
  
}





SELAMAT MENCOBA !

Share:

Penghitung Lari Otomatis Berbasis Kamera - ArUco

 



Olahraga merupakan salah satu kegiatan penting dalam menjaga kesehatan jasmani serta meningkatkan disiplin dan semangat juang bagi para siswa. Salah satu bentuk latihan yang umum dilakukan di sekolah adalah lari, baik secara santai maupun sebagai bagian dari penilaian kebugaran jasmani. Dalam pelaksanaannya, pencatatan waktu tempuh biasanya dilakukan secara manual dengan bantuan stopwatch dan pengawasan langsung oleh guru olahraga.

Namun, metode pencatatan manual tersebut memiliki beberapa kelemahan, seperti potensi kesalahan penghitungan waktu, kurangnya objektivitas, serta ketidaknyamanan saat harus mengelola data hasil lari dari banyak siswa. Oleh karena itu, diperlukan suatu sistem yang dapat mencatat waktu lari secara otomatis, akurat, dan efisien.

Dengan memanfaatkan teknologi pengolahan citra digital melalui python dengan library OpenCV, serta marker visual seperti Aruco Tag atau AprilTag , telah berhasil dirancang sebuah sistem penghitung waktu lari berbasis kamera. Sistem ini mampu mendeteksi pergerakan siswa saat melewati garis start dan finish serta cek point secara real-time, sehingga waktu tempuh dapat dicatat secara otomatis tanpa campur tangan manusia.


PERLENGKAPAN – HARDWARE

1. Kamera CCTV dengan koneksi Wifi



Spesifikasi :
- Merek EZVIZ H1C
- Resolusi HD 1080p
- Konektivitas wifi
- Menggunakan power USB type C – DC 5 volt dan di supply menggunakan power bank (tahan hingga 5 jam)
- Memiliki dasar bawah ber-magnet
- Kebutuhan minimal 2 buah untuk start dan finish


2. Tripod kamera 1.7 meter


Spesifikasi :
- Tinggi max 1.7 meter
- Holder atas bisa ditempelkan base plat dari kamera H1C
- Kebutuhan disesuaikan dengan jumlah kamera


3. Access Point Outdoor 


Spesifikasi :
- Merek TP LINK – Pharos CPE 220
- Frekuensi 2.4 Ghz 
- Jangkauan ideal 1 km
- Memerlukan power berupa listrik AC 220volt / PLN


4. PC / Laptop



5. Topi / Rompi dengan Kode ArUco



ArUco Tag adalah jenis fiducial marker (penanda yang mudah dikenali) yang dikembangkan sebagai bagian dari library OpenCV. Bentuknya mirip dengan matriks persegi berwarna hitam dan putih, yang di dalamnya tersimpan informasi unik berupa kode biner. Setiap tag memiliki ID yang berbeda-beda, sehingga mudah dikenali dan dibedakan oleh sistem.

Silahkan baca terlebih dahulu penjelasan koding ArUco disini : https://www.aisi555.com/2025/06/pengenalan-aruco-april-tag-sebagai.html

AprilTag adalah alternatif lain dari ArUco yang dikembangkan oleh University of Michigan. Sama seperti ArUco, bentuknya juga berupa persegi dengan pola biner di dalamnya. Namun, AprilTag memiliki algoritma deteksi yang lebih presisi dan tahan terhadap gangguan lingkungan seperti perubahan cahaya, sudut pengambilan gambar, dan gerakan cepat.

AprilTag juga dilengkapi dengan kemampuan error correction , sehingga meskipun sebagian dari tag tertutup atau rusak, sistem masih bisa mengenali ID-nya.

Keunggulan AprilTag:

- Deteksi lebih akurat dan stabil.
- Lebih tahan terhadap noise dan variasi lingkungan.
- Cocok untuk aplikasi robotika, augmented reality, dan tracking objek real-time.
Untuk membuat kode ini bisa menggunakan layanan online : https://chaitanyantr.github.io/apriltag.html dengan contoh seting seperti gambar berikut:


Denah pemasangan kamera pada lapangan ideal :




Proses Pencatatan Putaran Lari : 

  1. Tiap pelari akan dicatat oleh sistem kapan waktu mulai start oleh kamera 1 sehingga wajib melalui pendeteksian kamera 1, dengan kata lain tiap pelari boleh bergantian startnya. 
  2. Kamera 2 hanya sebagai pendeteksi apakah si pelari benar benar mengikuti kegiatan terutama ketika lapangannya tidak ideal semisal di lingkungan atau jalan seputaran sekolah. 
  3. Kamera 3 dan 4 merupakan kamera finish yang akan mendeteksi kode Aruco secara “dobel cek” sehingga kamera mana yang terlebih dahulu mendeteksi kode ID pelari, maka pelari tersebut akan dianggap telah melewati garis finish. 
  4. Selanjutnya sistem mencatat waktu lap dan menambahkan jumlah putaran dari  deteksi masing-masing ID  pelari   ketika  terdeteksi melewati kamera 3 atau 4 hingga jumlah lap / putaran terpenuhi.
  5. Selanjutnya apabila kegiatan berakhir maka dapat dibuatkan pelaporannya dengan melakukan validasi data di excel dan hasilnya akan berformat seperti ilustrasi berikut:

Data kemudian dapat dipergunakan sebagai laporan pada mata pelajaran olahraga atau di upload ke database sesuai kebutuhan dari dinas pendidikan. Salah satu pemanfaatan  dari alat ini adalah sebagai tolak ukur kebugaran siswa dalam kaitannya dengan program Makan Bergisi Gratis (MBG) yang sedang berlangsung.




Share:

Jumat, 27 Juni 2025

Pengenalan ARUCO - APRIL TAG sebagai deteksi marker yang cepat

 


Menepati janji saya beberapa bulan yang lalu dimana saya akan membagi hasil proyek bersama profesor atletik di unesa, maka beberapa episode tulisan saya akan membahas mengenai pemanfaatan pendeteksi marker yang bernama Aruco-AprilTag. Gambar animasi diatas terlihat mahasiswa yang berlari menggunakan topi lucu dengan code kotak disamping. Apakah itu ?

Dalam dunia computer vision, kemampuan untuk mendeteksi dan melokalisasi objek secara akurat merupakan hal yang sangat penting, terutama dalam aplikasi robotika, augmented reality, drone, dan sistem navigasi otomatis. Salah satu teknologi yang populer digunakan untuk kebutuhan ini adalah ArUco dan AprilTag — dua jenis penanda (fiducial marker) yang memungkinkan mesin mengenali posisi dan orientasi suatu objek dengan presisi tinggi dan latensi rendah.

Meskipun memiliki tujuan serupa, kedua teknologi ini memiliki perbedaan mendasar dalam pendekatan algoritma, struktur marker, serta performa deteksi. Dalam artikel ini, kita akan menjelajahi bagaimana kedua sistem bekerja, lalu fokus pada implementasi penggunaannya menggunakan Python dan OpenCV, lengkap dengan contoh kode sederhana yang bisa langsung Anda coba sendiri.

Apakah Anda seorang penggemar robotika, developer AR/VR, atau sekadar tertarik dengan teknologi visi komputer? Artikel ini akan memberikan dasar yang kuat untuk memahami dan mulai memanfaatkan ArUco dan AprilTag dalam proyek-proyek Anda berikutnya.



Perhatikan gambar diatas yang saya generate melalui website ( https://chev.me/arucogen/) untuk mencetak gambar aruco DICT 5x5. Kita ubah menjadi kotak hitam dan putih dan binarynya seperti berikut:


[0, 1, 1, 1, 0]

[1, 0, 0, 0, 1]

[1, 0, 1, 0, 1]

[1, 0, 0, 0, 1]

[0, 1, 1, 1, 0]


Langkah konversi:

1. Flattening matriks : semua baris disusun menjadi satu dimensi.

misal: [1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1]

2. Menghitung nilai hash/biner unik : ini dilakukan oleh library OpenCV secara internal menggunakan algoritma tertentu (tergantung dictionary).

3. Pencarian ID : Hash tersebut dibandingkan dengan semua marker yang ada di dictionary untuk menemukan ID uniknya.

Misalnya, jika cocok dengan marker ID 23 dalam dictionary, maka sistem akan mengembalikan nilai id = 23. 


🔄 Visualisasi Proses (secara logis):


Gambar Asli → Thresholding → Crop & Warp → Matriks Biner → Flattening → Hash/ID → Cocokkan dengan Dictionary → Dapatkan ID Marker

💡 Catatan Penting:

  • Tidak semua pola biner bisa jadi ID valid — hanya pola-pola yang sudah ditentukan dalam dictionary ArUco yang dikenali.
  • Jika pola tidak cocok, sistem akan mengabaikannya atau menandainya sebagai marker tidak dikenal.
  • AprilTag bekerja dengan prinsip serupa, tapi menggunakan pendekatan deteksi dan encoding yang sedikit berbeda (lebih toleran terhadap noise dan rotasi).

Kita langsung aja daripada mumet bertele-tele di teori dengan contoh coding sederhana menggunakan web kamera PC/laptop, dan kita gunakan bahasa python serta opencv untuk pengolahan gambarnya. Jangan lupa kode aruco yang saya gunakan adalah april tag jadi sesuaikan dengan  yang kamu pergunakan.




  1. import cv2
  2. import numpy as np
  3. import winsound
  4. import time
  5.  
  6.  
  7.  
  8. # Initialize the AprilTag detector with the 36h11 dictionary
  9. aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_APRILTAG_36H11)
  10. parameters = cv2.aruco.DetectorParameters()
  11.  
  12. # Create the detector
  13. detector = cv2.aruco.ArucoDetector(aruco_dict, parameters)
  14.  
  15.  
  16. # Beep function (runs in a separate thread)
  17. def beep():
  18.     winsound.Beep(1000, 200)  # Frequency: 1000 Hz, Duration: 200 ms
  19.     #winsound.PlaySound('beep.wav', winsound.SND_FILENAME)
  20.  
  21.  
  22. # Open webcam
  23.  
  24. cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
  25. cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
  26. cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
  27.  
  28. if not cap.isOpened():
  29.     print("Failed to open webcam.")
  30.     exit()
  31.  
  32. frame_count = 0
  33. try:
  34.     while True:
  35.         ret, frame = cap.read()
  36.         if not ret:
  37.             print("Failed to grab frame. Reconnecting...")
  38.             cap.release()
  39.             e
  40.  
  41.         # Only process every 15th frame to save computational effort
  42.         frame_count += 1
  43.         if frame_count % 5 != 0:
  44.             continue
  45.  
  46.         # Convert the frame to grayscale (required for detection)
  47.         gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  48.  
  49.         # Detect AprilTags
  50.         corners, ids, _ = detector.detectMarkers(gray)
  51.        
  52.         # If any tags are detected
  53.         if ids is not None:
  54.             for corner, tag_id in zip(corners, ids.flatten()):
  55.                 # Draw the bounding box
  56.                 int_corners = corner.astype(np.intp)
  57.                 cv2.polylines(frame, [int_corners], isClosed=True, color=(0, 255, 0), thickness=2)
  58.  
  59.                 # Display the tag ID
  60.                 tag_id_str = f"ID: {tag_id}"
  61.                 cv2.putText(frame, tag_id_str, (int_corners[0][0][0], int_corners[0][0][1] - 10),
  62.                             cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
  63.  
  64.             #beep sound
  65.             beep()
  66.             print(f"Detected IDs: {ids.flatten()}")
  67.         frame_resized = cv2.resize(frame, (800,600))
  68.         # Show the resized video feed
  69.         cv2.imshow("IP Camera apriltag Code Detection - press q to quit", frame_resized)
  70.         # Quit if 'q' is pressed
  71.         if cv2.waitKey(1) & 0xFF == ord('q'):
  72.             break
  73.  
  74. except KeyboardInterrupt:
  75.     print("Program interrupted.")
  76.  
  77. finally:
  78.     # Release the resources
  79.     cap.release()
  80.     cv2.destroyAllWindows()



Dan ini salah satu dokumentasi pemanfaatannya dalam project pendeteksi lari :







Share:

Kontak Penulis



12179018.png (60×60)
+6281331339072

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (14) antares (11) arduino (29) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (27) euro2020 (13) gcc (1) gis (3) gsm (1) iklan (1) infrared (2) Input Output (3) iot (78) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (11) lorawan (2) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (2) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (37) proyek (1) python (11) radio (31) raspberry pi (9) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) SDR (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) statistik (5) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) telkomiot (5) transistor (2) troubleshoot (3) tulisan (96) tutorial (108) tv digital (6) tvri (2) unesa (8) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3) yolo (9)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika