Daftar Isi:

Prototipe HUD Sepeda Motor Pintar (Navigasi belokan demi belokan dan Banyak Lagi): 9 Langkah
Prototipe HUD Sepeda Motor Pintar (Navigasi belokan demi belokan dan Banyak Lagi): 9 Langkah

Video: Prototipe HUD Sepeda Motor Pintar (Navigasi belokan demi belokan dan Banyak Lagi): 9 Langkah

Video: Prototipe HUD Sepeda Motor Pintar (Navigasi belokan demi belokan dan Banyak Lagi): 9 Langkah
Video: The Best Smart Helmets in The Market 2024, Juli
Anonim
Prototipe HUD Sepeda Motor Pintar (Navigasi belokan demi belokan dan Banyak Lagi)
Prototipe HUD Sepeda Motor Pintar (Navigasi belokan demi belokan dan Banyak Lagi)
Prototipe HUD Sepeda Motor Pintar (Navigasi belokan demi belokan dan Banyak Lagi)
Prototipe HUD Sepeda Motor Pintar (Navigasi belokan demi belokan dan Banyak Lagi)
Prototipe HUD Sepeda Motor Pintar (Navigasi belokan demi belokan dan Banyak Lagi)
Prototipe HUD Sepeda Motor Pintar (Navigasi belokan demi belokan dan Banyak Lagi)
Prototipe HUD Sepeda Motor Pintar (Navigasi belokan demi belokan dan Banyak Lagi)
Prototipe HUD Sepeda Motor Pintar (Navigasi belokan demi belokan dan Banyak Lagi)

Hai !

Instructables ini adalah kisah tentang bagaimana saya merancang dan membangun platform HUD (Heads-Up Display) yang dirancang untuk dipasang pada helm sepeda motor. Itu ditulis dalam konteks kontes "peta". Sayangnya, saya tidak dapat sepenuhnya menyelesaikan proyek ini tepat waktu untuk tenggat waktu kontes, tetapi saya masih ingin membagikan kemajuan saya di dalamnya, serta mendokumentasikan semua percobaan dan kesalahan yang saya dapatkan selama membuatnya.

Ide untuk proyek ini pertama kali muncul di benak saya beberapa tahun yang lalu, ketika saya mulai menggunakan sepeda motor, dan saya mulai mencari perlengkapan apa yang perlu saya beli untuk membuat perjalanan saya lebih menyenangkan. Pada saat itu, saya bingung bahwa cara terbaik untuk mendapatkan beberapa navigasi GPS dasar saat berkendara adalah dengan memasang smartphone Anda ke setang sepeda Anda. Saya berpikir sendiri bahwa pasti, mungkin ada cara yang lebih baik untuk mendapatkan info semacam itu dengan cepat.

Saat itulah saya mengerti: tampilan kepala bisa menjadi cara untuk mendapatkan navigasi saat berkendara, tanpa mengosongkan baterai ponsel Anda, dan memaparkannya ke elemen.

Seiring waktu, ide ini matang dalam pikiran saya, dan saya pikir memiliki HUD di depan saya setiap saat akan memungkinkan lebih banyak kegunaan daripada navigasi sederhana. Inilah sebabnya mengapa rencana saya adalah menjadikan platform publik dan modular, sehingga siapa pun dapat membuat modul yang menampilkan informasi yang mereka butuhkan di HUD mereka sendiri.

Meskipun ada produk yang tersedia secara komersial yang memenuhi tugas ini, tidak ada yang modular seperti platform saya, dan mereka juga cenderung sedikit mahal. Bagaimanapun, selamat datang di proyek ini.

Apa yang berfungsi sampai sekarang?

Seperti yang dinyatakan, proyek ini masih dalam tahap pengembangan, dan inilah yang saat ini sedang berjalan.

- Komunikasi antara smartphone dan papan berbasis ESP32 (telepon terjaga)

- Desain optik selesai (mungkin perlu sedikit penyesuaian dalam jangka panjang)

- Aplikasi navigasi Android menggunakan SDK navigasi Mapbox:

- Mampu menghitung dan menampilkan posisi pengguna di peta, serta rute darinya ke tujuan

- Mampu menghubungkan ke perangkat Bluetooth (alamat MAC perangkat di-hardcode seperti sekarang)

- Mampu navigasi waktu nyata, termasuk mengekstraksi dan mengirim informasi manuver yang akan datang melalui Bluetooth serial (hanya mendukung belokan untuk saat ini)

Apa yang perlu bekerja?

Daftar ini berisi item-item yang mutlak diperlukan untuk tujuan penggunaan HUD, tetapi belum siap untuk diimplementasikan.

- Desain keseluruhan (Lampiran helm, mekanisme penyesuaian sudut reflektor,..)

- Aplikasi Android:

- Terapkan deteksi dan koreksi di luar rute

- Kemampuan bagi pengguna untuk memasukkan alamat tujuan

- Titik jalan?

- Ergonomi / Estetika

Perlengkapan:

Penting

- Papan pengembangan berbasis esp32

- Setiap smartphone android yang agak baru (Bluetooth diaktifkan)

- Sebuah SSD1306 atau layar OLED 96" lain yang diaktifkan (milik saya adalah 128x64 piksel, lihat bagian "Otak: Mikrokontroler & Layar")

- Reflektor (setiap bagian dari akrilik/kaca/kaca plexiglass bisa digunakan)

- Lensa Fresnel (saya memiliki F.panjang sekitar 13cm, lihat bagian "Pilihan lensa")

Peralatan

- Besi Solder

- Papan tempat memotong roti

- Beberapa kabel jumper

- printer 3d / layanan pencetakan 3d

Langkah 1: Bagaimana Semuanya Bekerja: Pilihan Desain Dijelaskan

Bagaimana Semuanya Bekerja: Pilihan Desain Dijelaskan
Bagaimana Semuanya Bekerja: Pilihan Desain Dijelaskan
Bagaimana Semuanya Bekerja: Pilihan Desain Dijelaskan
Bagaimana Semuanya Bekerja: Pilihan Desain Dijelaskan
Bagaimana Semuanya Bekerja: Pilihan Desain Dijelaskan
Bagaimana Semuanya Bekerja: Pilihan Desain Dijelaskan

Ide dasar Heads Up Display adalah untuk menampilkan gambar di depan penglihatan seseorang, sehingga mereka tidak perlu memalingkan muka dari apa pun yang mereka lakukan (baik itu mengemudikan pesawat, atau mengendarai sepeda motor, yang akan kami contoh kasus).

Optik

Secara teknis, ini bisa dicapai dengan meletakkan layar di depan mata pengguna. Namun, layar tidak transparan, dan karena itu akan menghalangi penglihatan penggunanya. Anda kemudian dapat menempatkan layar di depan permukaan reflektif, yang akan mencerminkan konten layar sekaligus cukup tembus pandang sehingga pengguna dapat melihat apa yang ada di depannya.

Namun, pendekatan ini memiliki kelemahan besar: layar sebenarnya biasanya lebih dekat ke mata pengguna daripada apa yang sebenarnya harus difokuskan pengguna (mis. jalan di depannya). Ini berarti, untuk membaca apa yang ada di permukaan reflektif, mata pengguna perlu beradaptasi dengan jarak layar dari matanya (misalnya 20 cm), dan kemudian perlu beradaptasi lagi untuk fokus pada jalan di depan. (~2/5 meter). Waktu yang dibutuhkan seluruh operasi ini adalah waktu berharga yang harus dihabiskan untuk melihat jalan, dan sering beradaptasi mungkin tidak nyaman bagi pengguna setelah hanya beberapa menit.

Itulah mengapa saya memutuskan untuk menambahkan lensa antara layar dan reflektor. Lensa ini, jika dipilih dengan hati-hati, harus memungkinkan pembuatan gambar virtual layar (lihat skema di atas), yang kemudian akan tampak lebih jauh dari mata pengguna sebagaimana adanya, sehingga memerlukan adaptasi yang tidak terlalu mendadak (atau tidak ada sama sekali, dalam skenario yang sempurna). Desain ini memungkinkan pengguna untuk melihat reflektor dengan cepat, mendapatkan informasi yang dibutuhkan, dan langsung melihat kembali ke jalan.

Peran smartphone

Karena tidak realistis untuk mencoba dan mengimplementasikan seluruh aplikasi navigasi di ESP32 saja, saya memutuskan untuk membuat aplikasi android yang akan menangani hal ini. Aplikasi kemudian hanya perlu memberi tahu ESP32 apa yang harus dilakukan pengguna untuk mencapai tujuannya, dan ESP32 menyampaikan informasi itu melalui HUD (lihat gambar "Cara kerja modul").

Langkah 2: Bagian - Otak: Mikrokontroler & Layar

Bagian - Otak: Mikrokontroler & Layar
Bagian - Otak: Mikrokontroler & Layar
Bagian - Otak: Mikrokontroler & Layar
Bagian - Otak: Mikrokontroler & Layar

Seperti yang dinyatakan di atas, saya berencana agar modul saya menampilkan informasi navigasi, sementara tidak benar-benar menghitung posisi aktual, pelacakan, dan navigasi waktu nyata. telepon pengguna malah akan berkomunikasi dengan modul, dan mengirimkannya informasi untuk kemudian ditampilkan pada HUD.

Untuk memfasilitasi komunikasi antara telepon pengguna dan modul, saya memilih untuk menggunakan papan berbasis ESP32 untuk proyek ini. Pilihan ini karena modul khusus ini memiliki kemampuan Bluetooth terintegrasi, serta beberapa spesifikasi menarik lainnya (Penyimpanan Non-Volatile yang mudah digunakan, CPU dual-core, RAM yang cukup untuk benar-benar menggerakkan layar OLED melalui I2C, …). Relatif sederhana untuk mendesain PCB berbasis di sekitar ESP32, yang saya perhitungkan. Saya juga memiliki pengalaman profesional dalam menggunakan dan merancang sirkuit dengan ESP32, yang pasti mempengaruhi pilihan saya.

Pilihan layar pada dasarnya tergantung pada apa pun yang dapat saya temukan yang menurut saya cukup terang untuk Anda gunakan, sementara juga sekecil mungkin. Saya tidak terlalu khawatir dengan jumlah piksel layar, karena tujuan saya adalah memiliki UI yang sangat minimalis dan sederhana.

Perlu dicatat bahwa driver layar harus didukung oleh perpustakaan yang memungkinkan pencerminan gambar. Itu karena gambar yang ditampilkan akan dibalik saat melewati lensa dan muncul di reflektor, dan tidak harus membalik secara manual apa yang ditampilkan adalah beban yang sangat berat di pundak kita sebagai pembangun.

Langkah 3: Suku Cadang - Optik: Menemukan Kompromi

Suku Cadang - Optik: Menemukan Kompromi
Suku Cadang - Optik: Menemukan Kompromi
Suku Cadang - Optik: Menemukan Kompromi
Suku Cadang - Optik: Menemukan Kompromi
Suku Cadang - Optik: Menemukan Kompromi
Suku Cadang - Optik: Menemukan Kompromi

Optik untuk proyek ini cukup sulit untuk didekati, karena saya tidak tahu apa yang saya cari saat pertama kali memulai proyek ini. Setelah beberapa penelitian, saya mengerti bahwa apa yang ingin saya lakukan adalah membuat "gambar virtual" layar OLED saya, yang akan tampak lebih jauh dari mata daripada yang sebenarnya. Jarak ideal untuk pembentukan bayangan maya ini adalah sekitar 2-5 meter di depan pengemudi, a ini sepertinya jarak ke objek yang kita fokuskan saat mengemudi (mobil lain, gundukan di jalan, dll …).

Untuk mencapai tujuan itu, saya memilih untuk menggunakan lensa Fresnel, karena lensa ini cukup besar, murah, tampaknya menawarkan jarak fokus yang cukup baik untuk proyek saya, dan dapat dipotong dengan gunting sederhana (tidak demikian halnya untuk lensa kaca berbentuk bulat yang lebih halus). Lensa Fresnel dapat ditemukan dengan nama seperti "pembesar saku" atau "pembesar kartu baca", karena lensa ini sangat cocok untuk membantu orang dengan penglihatan buruk untuk membaca.

Pada dasarnya, trik di sini adalah tentang menemukan kompromi yang tepat antara:

- Memiliki jarak gambar virtual yang wajar (yaitu, seberapa jauh HUD akan terlihat bagi pengguna, atau seberapa jauh pengguna harus menyesuaikan matanya untuk melihat apa yang ada di HUD)

- Agar teks pada layar tidak terlalu diperbesar oleh lensa (yang pada dasarnya adalah kaca pembesar)

- Memiliki jarak yang wajar antara layar OLED dan lensa, yang sebaliknya akan menghasilkan modul yang sangat besar

Saya pribadi memesan beberapa lensa berbeda di amazon, dan menentukan panjang fokus masing-masing, sebelum memilih satu dengan F.length sekitar 13 cm. Saya menemukan F.length ini, dengan jarak OLED-Lens 9cm, memberi saya gambar yang memuaskan pada reflektor saya (lihat beberapa gambar terakhir di atas).

Seperti yang akan Anda lihat pada ilustrasi saya, agar dapat memfokuskan dengan benar pada teks yang ditampilkan, kamera yang digunakan untuk mengambil gambar ini harus menyesuaikan seolah-olah sedang memfokuskan pada objek yang jauh, yang membuat segala sesuatu pada bidang yang sama dengan reflektor tampak buram. Inilah yang kami inginkan untuk HUD kami.

Anda dapat menemukan file 3d untuk dudukan lensa di sini.

Langkah 4: Suku Cadang - Wadah untuk Menampung Semuanya

Suku Cadang - Wadah untuk Menampung Semuanya
Suku Cadang - Wadah untuk Menampung Semuanya
Suku Cadang - Wadah untuk Menampung Semuanya
Suku Cadang - Wadah untuk Menampung Semuanya

Saat saya menulis Instructables ini, wadah sebenarnya yang akan menampung setiap bagian dari head-up display tidak cukup dirancang. Namun saya memiliki beberapa ide tentang bentuk umumnya dan tentang cara mengatasi masalah tertentu (seperti cara menahan reflektor, dan membuatnya tahan terhadap angin 100+ km/jam). Ini masih sangat banyak pekerjaan yang sedang berjalan.

Langkah 5: Membuat Protokol untuk Modul Kami

Untuk mengirim instruksi navigasi dari telepon ke papan pengembangan, saya harus membuat protokol komunikasi saya sendiri yang memungkinkan saya untuk dengan mudah mengirim data yang diperlukan dari telepon, sementara juga memfasilitasi pemrosesannya setelah diterima.

Pada saat penulisan Instruksi ini, informasi yang perlu dikirimkan dari telepon untuk bernavigasi dengan modul adalah:

- Jenis manuver yang akan datang (belok sederhana, bundaran, bergabung ke jalan lain, …)

- Instruksi tepat manuver yang akan datang (tergantung dari jenis manuver: kanan/kiri untuk belokan; keluar mana untuk mengambil bundaran, …)

- Jarak yang tersisa sebelum manuver yang akan datang (dalam meter untuk saat ini)

Saya memutuskan untuk mengatur data ini menggunakan struktur bingkai berikut:

:type.instructions, jarak;

Meskipun bukan solusi yang bagus, solusi ini memungkinkan kami untuk dengan mudah memisahkan dan membedakan setiap bidang protokol kami, yang memfasilitasi pengkodean di sisi ESP32.

Penting untuk diingat bahwa, untuk fitur di masa mendatang, informasi lain mungkin perlu ditambahkan ke protokol ini (seperti hari dan waktu yang tepat, atau musik yang diputar di ponsel pengguna), yang dapat dengan mudah dilakukan dengan menggunakan protokol yang sama. membangun logika seperti sekarang.

Langkah 6: Kode: Sisi ESP32

Kode: Sisi ESP32
Kode: Sisi ESP32
Kode: Sisi ESP32
Kode: Sisi ESP32

Kode untuk ESP32 saat ini cukup sederhana. Ini menggunakan perpustakaan U8g2lib, yang memungkinkan kontrol yang mudah dari layar OLED (sambil memungkinkan mirroring dari gambar yang ditampilkan).

Pada dasarnya, semua yang dilakukan ESP32 adalah menerima data serial melalui Bluetooth saat aplikasi mengirimkannya, menguraikannya, dan menampilkan data atau gambar ini berdasarkan data ini (mis. menampilkan panah alih-alih kalimat " belok kiri/kanan"). Berikut kodenya:

/*Program untuk mengontrol HUD dari aplikasi android melalui serial bluetooth*/#include "BluetoothSerial.h" //File Header untuk Serial Bluetooth, akan ditambahkan secara default ke Arduino#include #include #ifdef U8X8_HAVE_HW_SPI#include #endif# ifdef U8X8_HAVE_HW_I2C#include #endif//OLED library constructor, perlu diubah sesuai dengan layar AndaU8G2_SSD1306_128X64_ALT0_F_HW_I2C u8g2(U8G2_MIRROR, /* reset=*/ U8X8_PIN_NONE); // Nyatakan nilai bidang yang terdeteksi mesin + variabel# tentukan manuverField 1# tentukan instruksiField 2# tentukan jarakField 3# tentukan endOfFrame 4intdetect_field = endOfFrame;BluetoothSerial serialBT; // Objek untuk Bluetoothchar incoming_char;char manuver[10];char instruction[10];char distance[10];char tempManeuver[10];char tempInstructions[10];char tempDistance[10];int nbr_char_maneuver = 0;int nbr_char_instructions = 0;int nbr_char_distance = 0;kalimat penuh boolean = false;pengaturan batal() { Serial.begin(9600); // Mulai monitor Serial di 9600 baud u8g2.begin(); // Init kontrol OLED serialBT.begin("ESP32_BT"); // Nama penundaan Sinyal Bluetooth (20); Serial.println("Perangkat Bluetooth Siap Dipasangkan");}void loop() { if (serialBT.available() && !fullsentence) // Karakter yang diterima melalui serial Bluetooth { incoming_char = serialBT.read(); Serial.print("Diterima:"); Serial.println(char_masuk); } switch (detected_field) { case manuverField: Serial.println("Area yang terdeteksi: manuver"); if (incoming_char == '.') // Bidang berikutnya terdeteksi { bidang_terdeteksi = bidang instruksi; } else { // Isi tipe manuver info array manuver[nbr_char_maneuver] = incoming_char; nbr_char_maneuver++; } merusak; instruksi kasusField: Serial.println("Bidang yang terdeteksi: instruksi"); if (incoming_char == ', ') // Kolom berikutnya terdeteksi {detect_field = distanceField; } else { // Isi instruksi info array instruction[nbr_char_instructions] = incoming_char; nbr_char_instructions++; } merusak; case distanceField: Serial.println("Field yang terdeteksi: jarak"); if (incoming_char == ';') // Akhir Bingkai terdeteksi { terdeteksi_field = endOfFrame; Serial.print("manuver:"); Serial.println(manuver); Serial.print("petunjuk:"); Serial.println(petunjuk); Serial.print("jarak:"); Serial.println(jarak); kalimat penuh = benar; update_Display(); // Full frame diterima, parse dan tampilkan data recever } else { // Isi info jarak array distance[nbr_char_distance] = incoming_char; nbr_char_jarak ++; } merusak; case endOfFrame: if (incoming_char == ':')detect_field = manuverField; // Bingkai baru mendeteksi jeda; default: // Jangan lakukan apapun istirahat; } delay(20);}void update_Display(){ // Cache setiap array char untuk menghindari kemungkinan konflik memcpy(tempManeuver, manuver, nbr_char_maneuver); memcpy(tempInstructions, instruksi, nbr_char_instructions); memcpy(tempDistance, jarak, nbr_char_distance); parseCache(); // Mengurai dan memproses array char fullsentence = false; // Kalimat diproses, siap untuk kalimat berikutnya}void parseCache(){ u8g2.clearBuffer(); // kosongkan memori internal u8g2.setFont(u8g2_font_ncenB10_tr); // pilih font yang sesuai // array char -> string wajib untuk menggunakan substring() fungsi String manuverString = tempManeuver; String instruksiString = tempInstructions; // Menerapkan protokol di sini. Hanya mendukung belokan untuk saat ini. if (maneuverString.substring(0, 4) == "turn") { // Periksa jenis manuver Serial.print("TURN DETECTED"); if (instructionsString.substring(0, 5) == "right") { // Periksa instruksi spesifik dan tampilkan sesuai u8g2.drawStr(5, 15, "-"); } else if (instructionsString.substring(0, 4) == "left") { // Periksa instruksi spesifik dan tampilkan sesuai u8g2.drawStr(5, 15, "<---"); } else u8g2.drawStr(5, 15, "Err."); // Bidang instruksi tidak valid } /* Menerapkan jenis manuver lain (putaran, dll.) * else if (tempManeuver == "rdbt"){ * *] */ u8g2.drawStr(5, 30, tempDistance); // Menampilkan sisa jarak u8g2.sendBuffer(); // transfer memori internal ke tampilan // Reset semua array char sebelum membaca memset berikutnya (manuver, 0, 10); memset(petunjuk, 0, 10); memset(jarak, 0, 10); memset(tempManeuver, 0, 10); memset(tempInstructions, 0, 10); memset(tempDistance, 0, 10); // Reset jumlah elemen dalam array nbr_char_distance = 0; nbr_char_instructions = 0; nbr_char_maneuver = 0;}

Langkah 7: Kode: Sisi Android

Kode: Sisi Android
Kode: Sisi Android
Kode: Sisi Android
Kode: Sisi Android
Kode: Sisi Android
Kode: Sisi Android

Untuk aplikasi ponsel cerdas, saya memutuskan untuk menggunakan SDK navigasi Mapbox, karena ia menawarkan banyak fitur berguna saat membangun peta navigasi dari awal. Hal ini juga memungkinkan penggunaan banyak pendengar yang berguna, yang pasti membantu dalam membuat modul ini bekerja. Saya juga menggunakan perpustakaan serial android-bluetooth harry1453 untuk android, karena membuat komunikasi serial Bluetooth jauh lebih mudah untuk disatukan.

Jika Anda ingin membuat aplikasi ini di rumah, Anda harus mendapatkan token akses Mapbox, yang gratis hingga sejumlah permintaan tertentu per bulan. Anda harus memasukkan token ini ke dalam kode, dan membangun aplikasi di pihak Anda. Anda juga perlu membuat kode di alamat MAC Bluetooth ESP32 Anda sendiri.

Seperti berdiri, aplikasi dapat memandu Anda dari lokasi Anda saat ini ke lokasi mana pun yang dapat Anda klik di peta. Seperti yang disebutkan dalam intro, bagaimanapun, itu tidak mendukung manuver lain selain belokan, dan belum menangani off-rute.

Anda dapat menemukan seluruh kode sumber di github saya.

Langkah 8: Apa Selanjutnya?

Sekarang aplikasi cukup fungsional untuk benar-benar memandu penggunanya pada rute yang ditetapkan (jika tidak ada penyimpangan dari rute yang ditetapkan), fokus utama saya adalah meningkatkan aplikasi ponsel cerdas, dan menerapkan beberapa kemampuan yang akan membuat modul menjadi perangkat navigasi yang layak. Ini termasuk mengaktifkan komunikasi Bluetooth dari telepon bahkan ketika layar mati, serta dukungan untuk jenis manuver lainnya (putaran, penggabungan, …). Saya juga akan menerapkan fitur rerouting jika pengguna menyimpang dari rute aslinya.

Ketika semua ini selesai, saya akan meningkatkan wadah dan mekanisme lampirannya, mencetaknya 3d, dan mencoba dan mengambil modul untuk dijalankan pertama kali.

Jika semuanya berjalan dengan baik, tujuan jangka panjang saya adalah merancang PCB khusus untuk elektronik tertanam dari proyek ini, yang akan menghemat banyak ruang pada produk akhir.

Saya mungkin juga menambahkan beberapa fitur lain ke modul ini di masa mendatang, termasuk tampilan waktu, serta alarm pemberitahuan telepon, yang dapat membuat ikon muncul saat pengguna menerima pesan teks atau panggilan. Akhirnya saya ingin menambahkan kemampuan Spotify ke modul ini, sebagai penggemar berat musik. Namun, pada saat ini, ini hanya bagus untuk dimiliki.

Langkah 9: Kesimpulan dan Terima Kasih Khusus

Kesimpulan dan Terima Kasih Khusus!
Kesimpulan dan Terima Kasih Khusus!

Seperti yang disebutkan di intro, meskipun proyek ini masih jauh dari selesai, saya sangat ingin membaginya dengan dunia, dengan harapan dapat menginspirasi orang lain. Saya juga ingin mendokumentasikan penelitian saya tentang hal ini, karena sebenarnya tidak banyak minat penggemar pada AR dan HUD, yang menurut saya memalukan.

Saya ingin mengucapkan terima kasih yang sebesar-besarnya kepada Awall99 dan Danel Quintana, yang masing-masing proyek augmented reality-nya sangat menginspirasi saya dalam pembuatan modul ini.

Terima kasih atas perhatian Anda, saya pasti akan memposting pembaruan ketika proyek ini diperbaiki dalam waktu dekat. Sementara itu, sampai jumpa lagi!

Direkomendasikan: