3 poin oleh GN⁺ 2023-12-03 | 1 komentar | Bagikan ke WhatsApp
  • 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 animation menghasilkan 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/24 agar berputar sedikit setiap satu putaran
    • Setiap frame data diusahakan tetap diskret agar kecepatan playback bisa disesuaikan dengan RPM motor

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 m di 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

 
GN⁺ 2023-12-03
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

    • Semuanya benar, tetapi saya juga suka solusi yang memakai sensor IR untuk sinkronisasi. Cara memutar display dengan mengubah posisi jari benar-benar keren, dan tidak perlu menebak-nebak
    • Ide yang cukup bagus. Brush sepertinya akan tahan lama. Untungnya sekarang pengisian daya ponsel nirkabel sudah umum, jadi kit seperti [1] atau [2] bisa didapatkan
      Saya jadi penasaran bagaimana perusahaan LIDAR menangani hal semacam ini
      1: https://www.adafruit.com/product/1407
      2: https://www.adafruit.com/product/2162
    • Ide lain, bagaimana kalau menaruh display TFT kecil di atas motor? Produk murahnya bisa didapat di aliexpress
    • Bagaimana kalau motor dibiarkan apa adanya, lalu motor kedua dipakai sebagai generator?
    • Jika motor penggeraknya adalah motor asinkron, mungkin daya untuk elektronik yang berputar bisa dipasok lewat lilitan induksi rotor, tetapi selisih fasenya bisa menjadi cukup ekstrem
  • 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

    • Ini bukan ide baru; sudah lama ada dan disebut swept-volume volumetric display [1]
      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/
    • Untuk display 32 inci, sepertinya motor harus berputar dengan kecepatan luar biasa pada area pi*32^2
  • 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

  • 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

    • Ini metode yang Tom 7 sebutkan di salah satu videonya: pertahankan daftar ide, dan apa pun pikiran yang muncul, tuliskan semuanya meski terlihat bodoh. Penyaringan bisa dilakukan belakangan
      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
    • Saya punya masalah yang berkebalikan. Ide-ide kreatif terus muncul, jadi ketika saya sedang membuat prototipe v1 atau v2 dari ide A, ide B muncul dan mengganggu saya untuk mendorong A sampai selesai
      Bahkan ketika sudah punya ketekunan dan disiplin, kali ini saya harus membayar tagihan, jadi gangguannya bukan ide B melainkan pekerjaan biasa
    • Kreativitas juga bisa dilatih seperti keterampilan lain :)
      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/

    • Menarik. Apakah di AS juga ada museum teknologi x seni?
  • 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

    • Atau cukup jangan selaraskan ke pusat, lalu ubah rumus matematikanya agar mencerminkan bahwa LED tidak berada di tengah
    • Pasti ada cara untuk mengganti struktur yang memutar deretan LED dengan sesuatu yang lebih ringan. Seperti cermin atau matriks light pipe akrilik?
  • 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