Display volumetrik kecil
(mitxela.com)- Ini adalah prototipe perangkat tampilan 3D seukuran telapak tangan berbasis efek persistence of vision (POV), dibuat dengan memutar seluruh matriks LED kecil, board RP2040, baterai LIR2450, dan motor
- Matriks LED 8x10 diputar dan sensor IR membaca periodenya, lalu buffer volumetrik ditampilkan sesuai kecepatan yang terukur
- Dengan memanfaatkan dual-core RP2040 dan kontrol GPIO simultan, satu core mengukur interval rotasi, sementara core lain mengirim data LED dalam satuan siklus
- Keterbatasan utama meliputi rangkaian proteksi baterai, metode pengisian daya, ketahanan holder cetak 3D, dan tidak adanya pembatas arus LED; pada prototipe, peringatan muncul saat tegangan turun di bawah sekitar 3,6V
- Data slice koordinat polar 3D serta simulasi fluida dan api dibuat dengan Blender, tetapi kamera menangkap kesan kedalaman yang lebih lemah daripada aslinya, dan versi berikutnya perlu meningkatkan alignment serta resolusi
Ide lilin elektronik berputar
- Tujuannya adalah membuat lilin elektronik yang terlihat seperti nyala lilin yang berkedip dari sudut mana pun
- Display persistence of vision biasa memerlukan struktur penopang seperti bearing dan slip ring, jadi dipilih pendekatan membuat motor dan baterai cukup kecil agar seluruh perangkat ikut berputar
- Board matriks LED dibuat cepat dengan menyertakannya dalam pesanan PCB lain
- Di Tiongkok, PCB kecil pada dasarnya murah, dan pengiriman cepat menjadi faktor yang lebih penting
- Mesin pick-and-place Charmhigh CHM-T36VA digunakan
- Memasang reel komponen memang memakan waktu, tetapi matriks LED ini hanya memiliki satu jenis komponen, sehingga perakitan board bisa diulang dengan cepat
- Stensil tidak dibuat secara resmi, melainkan digunakan setelah di-etching laser pada asetat
- Matriks LED dibuat masing-masing dengan komponen 0603 dan 0805, dan untuk versi berikutnya direncanakan PCB berbentuk lingkaran sebagai penopang sudut siku-siku
Konfigurasi hardware
- Untuk mikrokontroler, Waveshare RP2040-tiny dipilih dengan mempertimbangkan ukuran kecil dan kapasitas flash
- Raspberry Pi Pico unggul karena dual-core 125MHz, flash hingga 16MB, dan harga rendah, tetapi board-nya sendiri terlalu besar
- bare RP2040 memerlukan flash QSPI eksternal, kristal, kapasitor pendukung, dan lain-lain, sehingga merepotkan untuk dipakai mandiri
- RP2040-tiny pada dasarnya adalah Pico yang diperkecil menjadi setengahnya, sedangkan port USB dan tombol reset/boot berada pada board tambahan yang terhubung lewat kabel flat flex
- Baterai yang digunakan adalah LIR2450
- Ini adalah lithium-ion isi ulang dan mampu memasok lebih dari 100mA
- Baterai Li-ion yang lebih kecil memiliki kapasitas dan kemampuan suplai arus yang lebih rendah
- Karena diagonal board RP2040 sekitar 29mm, memakai baterai yang lebih kecil pun tidak membuat hasil akhirnya lebih kecil
- Holder baterai dicetak 3D dengan PETG
- Versi pertama memiliki struktur dua bagian yang direkatkan dengan ketebalan dinding 0,5mm, sehingga garis lem mudah pecah setiap kali terjatuh
- Setelah itu, dicoba ketebalan dinding 1mm dan struktur cetak dengan arah berbeda
- Deteksi rotasi ditangani dengan sensor IR TCRT5000
- Output-nya analog, tetapi diberi pull-up dan langsung dihubungkan ke GPIO
- Input RP2040 memiliki Schmitt trigger yang bisa dinonaktifkan lewat software, sehingga praktis dapat digunakan seperti komparator
- Motor yang dipilih adalah RF-410CA
- Motor sejenis dari drive CD/DVD memiliki diameter dan panjang poros yang sedikit berbeda-beda
- Untuk 30FPS diperlukan sekitar 1800RPM, dan kecepatan tanpa beban 5000–10000RPM pada banyak motor kecil terlalu cepat
- Pendekatannya adalah menurunkan kecepatan dengan PWM
Rangkaian dan perakitan prototipe
- Matriks LED memiliki struktur 8x10 sehingga menggunakan 18 GPIO
- Selain itu, dipertimbangkan tambahan 1 input sensor, 1 kontrol motor, dan 1 pemantauan tegangan baterai
- LED WS2812 yang ada di board terhubung ke GPIO16, dan untuk mendapatkan GPIO bagi matriks, LED itu dilepas lalu kawat enamel disolder
- Untuk kontrol motor, MOSFET SOT-23 kecil dan dioda flyback dipasang dengan metode dead bug
- LED IR dihubungkan langsung ke jalur daya
- Idealnya dikontrol lewat software untuk menghemat daya saat tidak berputar, tetapi pada prototipe ini dihilangkan demi menghemat GPIO
- Matriks LED dihubungkan langsung ke GPIO tanpa resistor pembatas arus atau transistor driver
- Total arus source/sink GPIO RP2040 sekitar 50mA
- Metode ini mengandalkan on-resistance GPIO dan pembatasan duty cycle PWM, dan jika chip berhenti sehingga matriks menyala tetap, LED berpotensi overdrive
- Kutub positif baterai dihubungkan langsung ke VBUS board
- Pada struktur ini, jika kabel USB disambungkan, terminal baterai bisa terkena 5V, sehingga lebih menyerupai hack sementara pada tahap prototipe
- Sebuah lubang kecil dibuat di bagian belakang untuk melepas baterai, dan setelah plastiknya pecah, baterai ditahan dengan karet gelang
Software kontrol tampilan
- Software memantau sensor IR dan menentukan kecepatan tampilan matriks menggunakan waktu antar-trigger
- Keunggulan RP2040 yang dimanfaatkan adalah kemampuannya mengatur atau membaca semua pin GPIO pada siklus clock yang sama
- Pada STM32, meski prosesornya 32-bit, IO dikelompokkan dalam register 16-bit, dan ada masalah kontensi bus saat mencoba mengubahnya secara bersamaan
- Data output GPIO yang diperlukan dipraproses lebih dulu, lalu dikeluarkan secara berurutan sebanding dengan kecepatan rotasi yang terukur
- Dual-core ARM Cortex-M0 digunakan dengan busy-wait loop, bukan interrupt
- Core pertama memantau sensor IR dan mengukur jumlah siklus antar-trigger dengan SysTick
- Core kedua menunggu sinyal pencahayaan, lalu dengan SysTick miliknya sendiri menelusuri buffer volumetrik secara presisi siklus
- Kontrol motor dimulai dengan logika sederhana
- Jika RPM di bawah 1200, motor digerakkan pada output 90%
- Jika tidak, output diturunkan ke 60%
- Berkat inersia dan hambatan udara, kontrol sederhana ini bekerja cukup baik pada prototipe saat ini
- Matriks dipindai per kolom
- Jika dilihat dari atas, tiap garis radial menjadi sedikit spiral, tetapi ini lebih mudah dikoreksi daripada seluruhnya menjadi heliks
- Duty cycle LED di bagian tengah dikurangi secara proporsional dibanding bagian tepi
Pemantauan tegangan dan pengisian baterai
- Bare cell LIR2450 tidak memiliki rangkaian proteksi, sehingga dapat rusak permanen jika tegangannya terlalu rendah
- Jika turun jauh di bawah 3V akan bermasalah, dan batas sebenarnya sekitar 2,7V bergantung pada sel
- Pemantauan tegangan dilakukan dengan pembagi tegangan memakai dua resistor 100K yang terhubung ke GPIO terakhir yang masih tersedia
- Pada RP2040-tiny, tegangan referensi ADC menjadi variabel
- Jika referensi ADC adalah tegangan suplai, penurunan tegangan baterai sulit dideteksi saat tegangan suplai ikut turun
- LDO RT9193-33 3,3V memiliki dropout 220mV pada 300mA, sehingga saat baterai mencapai 3,52V, tegangan suplai RP2040 juga mulai turun
- Pada prototipe, peringatan diatur agar tampil di bawah sekitar 3,6V
- Versi berikutnya direncanakan menambahkan tegangan referensi
- Awalnya baterai dilepas dan dimasukkan ke charger terpisah, tetapi charger baru rusak pada pemakaian pertama
- Setelah itu, bench power supply diatur ke batas arus 50mA dan tegangan konstan 4,2V untuk mengisi satu sel lithium-ion
- Karena tidak pasti apakah kapasitas baterai 120mAh atau 60mAh, dipilih arus pengisian yang lebih konservatif daripada 1C
- Demi kemudahan pengembangan, dibuat board intersep USB yang dipasang di antara PC dan board pemrograman RP2040-tiny
- Jalur 5V dipisahkan dan pin baterai diekspos, sehingga power supply bisa disambungkan tanpa melepas baterai
- Jalur data tetap tersambung, sehingga pemrograman bisa dilakukan dengan baterai terpasang
- Belakangan IC charger lithium-ion BQ21040DBVR dipasang di tengah board intersep USB
- Baterai dapat diisi saat kabel pemrograman tetap tersambung
- Prototipe tidak benar-benar mati dan LED IR terus mengonsumsi sekitar 9mA; arus standby total juga sekitar 15mA, sehingga kondisi terminasi pengisian penuh tidak tercapai
- Karena penurunan tegangan pada kabel, tegangan baterai juga mungkin tidak naik di atas 4,1V
Membuat data volumetrik dengan Blender
- Data tampilan harus dibuat dalam bentuk koordinat polar 3D r, theta, z
- Pengujian pertama dilakukan dengan kubus wireframe
- Modifier wireframe diterapkan pada kubus default Blender
- Kubus diputar 45 derajat pada sumbu x dan sebesar
atan(1/sqrt(2))pada sumbu y agar sudut kubus mengarah ke atas
- Untuk membuat slice, kubus lain diubah menjadi penampang tipis dan digunakan boolean modifier
- Kamera dan slice dijadikan parent ke Empty, lalu rotasi Z Empty dianimasikan
- Kamera diatur ke orthographic dan resolusi disesuaikan menjadi 8x10
- Latar belakang dibuat hitam, material kubus dibuat emissive, dan ambang batas ditentukan dengan colour ramp pada compositor
- Display saat ini hanya menggunakan voxel 1-bit
- Setiap voxel hanya menyala atau mati
- Di Blender, threshold disesuaikan untuk memilih cutoff yang sesuai secara visual
Render animationmenghasilkan 24 gambar slice dari kubus wireframe, lalu script Python mengubahnya menjadi file header untuk disertakan ke dalam kode- Blender driver digunakan untuk mengontrol rotasi kamera dan rotasi kubus dengan rumus berbasis frame
- Rotasi kamera menggunakan
(frame/24)*2*pi - Rotasi y kubus menggunakan
floor(frame/24)*pi/24agar berputar sedikit setiap satu putaran - Setiap frame data diusahakan tetap diskret agar kecepatan playback bisa disesuaikan dengan RPM motor
- Rotasi kamera menggunakan
Simulasi fluida dan api
- Simulasi fluida Blender mudah dimulai, tetapi sulit mendapatkan hasil yang diinginkan karena banyaknya parameter
- Simulasi cairan relatif mudah dipindahkan ke display volumetrik karena partikel fluida mudah diubah menjadi mesh
- Setelah mensimulasikan pada kecepatan 1/24, upaya dilakukan untuk mengekstrak data volumetrik polar dengan cara yang sama, tetapi skala waktu yang sangat lambat menimbulkan instabilitas dan tidak ditemukan cara sederhana untuk memperlambat kecepatan playback
- Fitur Multi-view atau Stereoscopy juga dipertimbangkan
- Beberapa kamera dapat ditambahkan untuk rendering simultan dari berbagai sudut pandang
- Namun tidak jelas cara cepat untuk memutar 24 kamera secara merata, dan ada masalah bahwa boolean modifier untuk slice juga harus ikut dirender
- Jalan memutar dengan merender potongan adegan tipis memakai clipping distance kamera juga dicoba
- Ada masalah objek yang terpotong tidak terisi di bagian dalamnya dan hanya permukaannya yang tergambar
- Dicoba apakah bisa diisi sebagian dengan volumetric material, tetapi tidak berhasil
- Pada akhirnya, rendering dilakukan 24 kali dengan script Python Blender
- Rotasi Z Empty diubah ke 24 sudut, dan pada tiap sudut seluruh animasi dirender ulang
- Dengan begitu, slice dari tiap arah rotasi diperoleh sambil mempertahankan simulasi fluida real-time
- Simulasi api di-bake sebagai OpenVDB lalu diimpor kembali ke Blender untuk diproses
- Data volume diberi threshold dengan modifier Volume to Mesh
- Setelah itu, slice kamera dan boolean modifier diterapkan, lalu script yang sama dijalankan kembali
Kualitas tampilan dan versi berikutnya
- Perangkat aslinya terlihat memiliki kesan kedalaman yang lebih kuat daripada di foto atau video
- Kesalahan alignment LED juga dapat dikoreksi lewat software
- Posisi boolean slice bisa sedikit digeser dari pusat agar sesuai dengan pusat rotasi sebenarnya
- Untuk mengoreksi pola pemindaian matriks, bisa digunakan bentuk yang sedikit melengkung alih-alih kubus yang diperpanjang
- Pada resolusi saat ini, perbaikan seperti ini mungkin tidak terlihat jelas
- Syarat terpenting adalah setiap voxel individual di bagian tepi harus tampak seperti satu titik dari sudut mana pun
- Jika alignment meleset, satu voxel bisa terlihat memanjang seperti menyala dua kali
- Huruf
mdi tengah dirender dengan cara terpisah agar bisa dibaca dari semua arah- Teks dibuat bergulir dalam arah yang tetap terbaca baik dilihat dari depan maupun belakang
- Prototipe berikutnya direncanakan meningkatkan alignment dan resolusi
- Karena tidak ada slide switch kecil, fungsi mematikan daya tanpa melepas baterai tidak dapat ditambahkan, tetapi ini diatasi dengan menyelipkan potongan asetat kecil di antara baterai dan kontak
- Karena sensor IR sudah ada, menambahkan remote control tampaknya juga memungkinkan, tetapi sensor saat ini bukan tipe demodulasi
- Source code tersedia di GitHub: source code on github
1 komentar
Komentar Hacker News
Ada beberapa ide perbaikan. Kalau ada motor yang sama sebagai cadangan, bongkar dua buah, lalu buat perangkat penyalur daya putar dengan brush dari kedua rakitan itu
Memang harus mengorbankan dua motor untuk tiap perangkat, tetapi ukurannya pas dan sangat stabil; jika ditambahkan kapasitor dan penyearah, baterai tidak perlu lagi dipikirkan
Penyearah juga memberi sinyal bahwa rakitan telah berputar satu putaran, sehingga stabilisasi gambar bisa dipertahankan berdasarkan posisi aktual, bukan menebak periodenya
Mengirim daya lewat induksi mungkin juga bisa, tetapi dayanya tidak bisa ditransfer cukup efisien sehingga tegangan input harus dinaikkan terlalu tinggi, dan ada kekhawatiran soal kebakaran
Saran ini berasal dari proyek seni Burning Man tahun 2001. Foto prototipe awal yang sangat menyedihkan ada di sini: https://github.com/sowbug/tqw/blob/master/photos/side.jpg. Instalasi akhirnya bekerja dengan sangat baik
Saya jadi penasaran bagaimana perusahaan LIDAR menangani hal semacam ini
1: https://www.adafruit.com/product/1407
2: https://www.adafruit.com/product/2162
Ini salah satu ide cemerlang yang terlihat jelas setelah dipikir belakangan
Kalau hasilnya bisa seyakinkan ini meski dibuat dengan merangkai komponen diskrit yang relatif primitif secara manual, rasanya tidak ada alasan mengapa menjelang Natal berikutnya tidak akan muncul versi full-color beresolusi tinggi dari salah satu merek dropshipping 7 huruf acak di Amazon
Namun kebanyakan pada dasarnya hanya seperti mainan. Kalau yang bisa dilakukan hanya permukaan bercahaya transparan dan tidak bisa disentuh, tidak banyak hal nyata yang bisa dilakukan
Ada juga versi jauh lebih besar yang tidak berputar, dibuat dari LED yang digantung pada kabel [2], dan itu sangat keren, tetapi faktor kebaruannya cepat hilang dan kita sadar bahwa itu bukan display untuk penggunaan produktif
Jika yang diinginkan adalah visualisasi 3D sungguhan yang bisa merender apa pun dengan kualitas tinggi dan bisa diinteraksikan, headset VR/AR tampaknya pilihan yang tepat. Ada juga monitor 3D baru yang tidak memerlukan kacamata, tetapi belum banyak orang yang melihatnya langsung
Mungkin mainan yang layak dijual di Amazon bisa dibuat, tetapi saya tidak yakin ada killer app untuk benda seperti ini
[1] https://en.wikipedia.org/wiki/Volumetric_display#Swept-volum...
[2] https://www.ledpulse.com/
Ini proyek kecil yang sangat keren. Proyek-proyek lainnya juga wajib dilihat. Beberapa pernah muncul di HN sebelumnya
https://mitxela.com/projects/hardware
Secara pribadi, saya paling suka MIDI slide whistle
[0] https://mitxela.com/projects/headphone_amps
Kreatif. Saya mungkin punya ketekunan dan minat untuk menuntaskan hal seperti ini sampai akhir, tetapi kurang imajinasi untuk memikirkan proyek sekeren ini
Untungnya ada internet, jadi kita bisa melihat hal-hal mengesankan yang dibuat orang
Dengan begitu, saat punya energi untuk mengerjakan proyek, kita tidak perlu membuang energi untuk memikirkan ide
Ini sangat mengubah seberapa banyak side project yang benar-benar bisa diselesaikan. Kemungkinan besar kita punya lebih banyak ide menarik daripada yang kita kira. Hanya saja, jika momen ketika ide muncul tidak cocok dengan momen ketika kita punya waktu dan energi untuk menjalankan atau mengembangkannya, ide itu akan hilang
Bahkan ketika sudah punya ketekunan dan disiplin, kali ini saya harus membayar tagihan, jadi gangguannya bukan ide B melainkan pekerjaan biasa
Saya setuju soal mencatat sesuatu. Seperti kebanyakan hal, kalau dilatih dengan serius, kita akan menjadi lebih baik
Yang sering terlewat adalah (1) pengetahuan teknis, (2) invensi sistematis, (3) motivasi
Pengetahuan teknis membantu kita mengetahui proyek apa yang mungkin, atau layak secara ekonomi, serta memetakan hambatan di sepanjang jalan. Invensi yang mustahil tidak terlalu berguna
Invensi sistematis berarti melihat sesuatu secara terstruktur, bukan sekadar menunggu ide muncul secara acak. Misalnya dengan menganalisis (a) saya ingin membuat display volumetrik, (b) saya ingin menghidupkan objek 3D virtual. Ada perbedaan halus di antara keduanya
Display volumetrik (a) mencakup berbagai hal, dari light field display dengan landasan teoretis yang elegan hingga display volumetrik berbasis persistence of vision yang terlihat di sini. Jika meneliti ranah masalahnya secara mendalam, besar kemungkinan kita akhirnya sampai pada solusi-solusi yang mungkin
Menghidupkan objek 3D (b) bisa berarti ranah masalah yang jauh lebih luas, seperti fabrikasi digital, kacamata VR, interaksi haptik, robot, dan sebagainya
Motivasi juga sangat penting. Memahami mengapa kita mencipta, dan apa yang ingin kita wujudkan, juga sangat bermakna. Misalnya apakah tujuannya memberi kegembiraan kepada orang lain, sekadar karena sangat keren, atau perangkat medis berguna yang bisa menyelamatkan nyawa
Cara berfokus pada topik yang bernilai juga bisa dipelajari, dan itu sangat meningkatkan kemampuan mencipta. Tentu saja, membuat sesuatu hanya karena kita menyukainya juga penting dan sah :)
Bagi saya pribadi, bagian terpenting adalah menikmati prosesnya
Ini sangat mirip dengan cara kerja kipas hologram. Semua perangkat elektronik berada di dalam bagian yang berputar
Kipas seperti itu sering memakai transfer daya nirkabel untuk menggerakkan papan di bagian atas
https://youtu.be/bT716nyK0AY
Kalau berada di London atau sedang berkunjung, pameran di 180 Studios [1] sering memakai teknologi semacam ini dalam art show
Layak dikunjungi jika tertarik pada seni dan teknologi
[1] https://www.180studios.com/
Ini channel YouTube yang bagus kalau menyukai hal semacam ini
Saya penasaran apakah display OLED murah bisa di-refresh cukup cepat untuk menghasilkan resolusi yang jauh lebih tinggi. Mungkin saja bisa, tetapi kemungkinan besar ruang di antara irisan radial akan jauh lebih besar daripada jarak antarpiksel, sehingga malah bisa terlihat lebih buruk
Masalah penyelarasan pusat sepertinya bisa diselesaikan dengan menaruh dua papan LED di atas secara saling membelakangi
Satu papan bisa menggeser LED setengah jarak untuk membuat efek interlace, sekaligus menggandakan resolusi
Kalau ada versi RGB yang kokoh dan lebih besar, sekitar 50x50, serta bisa menampilkan gambar lain tanpa coding, saya bersedia membayar lebih dari 200 dolar
Ada juga proyek display volumetrik keren lainnya yang baru-baru ini diposting tetapi tidak banyak mendapat perhatian
https://news.ycombinator.com/item?id=38406824