Kami memompa Ikea: bagaimana mengubah musik ringan menjadi Big Brother


pengantar


Ikea adalah toko yang penasaran. Bahkan jika Anda datang ke dalamnya dengan tujuan membeli satu hal tertentu dan tidak terganggu oleh semua sampah, maka Anda akan keluar dengan membeli tiga kali lebih banyak dari yang diperlukan. Bagi kami peretas, efek ini sangat jelas di departemen Ikea dengan kabel daya atau baterai.

Bagi saya, kasus terakhir kegilaan semacam itu terjadi di Belanda. Saya sedang dalam perjalanan yang direncanakan, berencana untuk menghabiskan hanya beberapa minggu di negara ini. Namun, ini adalah awal dari 2020 dan bencana dengan COVID-19 ... Saya harus tinggal jauh dari laboratorium saya lebih lama.

Dan ketika saya melihat lini produk elektronik Frekevens di Ikea , saya tidak dapat menahannya dan membeli semuanya.

Bagi mereka yang tidak tahu: garis Ikea Frekvens harus menjadi analog modern dari perangkat HiFi lama-sekolah ditambah dengan set musik ringan heksagonal, yang tampaknya berada di rumah-rumah setengah dari remaja 90-an. Dalam hal ini, garis perangkat yang terhubung satu sama lain terdiri dari speaker Bluetooth untuk output suara dan proyektor LED (dilengkapi dengan berbagai nozel) yang berkedip-kedip mengikuti irama musik, serta tampilan kubus LED yang dapat menampilkan animasi yang juga bergerak ke musik. Ikea membanggakan bahwa jalur ini dikembangkan bersama dengan Teenage Engineering, yang dikenal dengan seri Pocket Operator synthesizer "mainan" portabel.


Seperti yang diperlihatkan dalam video promosi Ikea, pembelian selesai dari puluhan perangkat akan terlihat seperti karnaval berkelip yang tak tertahankan, yang tidak akan diatur oleh remaja saya yang berusia 15 tahun di kamarnya.

Saya sangat tertarik dengan tampilan kubus LED: ini adalah perangkat terintegrasi berkualitas tinggi yang berfungsi pada listrik. Pada panel depan adalah matriks 16 baris dan 16 kolom LED putih yang sangat terang, yaitu total 256 LED. Animasi yang dibangun ke dalam perangkat itu cukup sederhana, tetapi mereka membawa saya pada gagasan bahwa besi dapat benar-benar mengontrol setiap LED secara terpisah. Namun, karena ini, kotak kecil itu cukup mahal: sakuku kosong sekitar 40 euro. Untuk jumlah ini, Anda mendapatkan kotak dengan LED dan kabel daya. Karena diasumsikan bahwa Anda harus membeli produk ini bersama dengan produk Frekvens lainnya, Anda juga menerima elemen penghubung tambahan: kabel daya ekstensi untuk pasokan daya ujung ke ujung dari listrik ke kotak lain,serta satu set sekrup dan bantalan plastik yang Anda dapat secara mekanis mengencangkan perumahan satu sama lain.

Begitu saya sampai di rumah, saya menghubungkan perangkat dan ... jujur, saya sedikit kecewa dengan apa yang mereka lakukan dengan setrika. Perangkat memiliki beberapa animasi yang dapat dipilih dengan menekan tombol di bagian belakang case; mikrofon kecil dipasang di kasing - setiap kali mengenali suara, bingkai animasi berubah. Animasi tidak terlalu menarik: mereka hanya terdiri dari empat hingga lima bingkai, dan bingkai itu sendiri hanya hitam dan putih, tanpa nuansa abu-abu. Jika Anda penasaran, saya merekam video pendek dengan semua animasinya.

Jelas, ini tidak cocok untukku. Mari hack perangkat - mari kita lihat apa yang membuatnya bekerja, dan apakah mungkin untuk membuat perilakunya sedikit lebih menarik.

Autopsi


Untuk membongkar Frekvens, obeng untuk slot berbentuk silang dan, mungkin, pisau sudah cukup. Anda juga akan membutuhkan kegigihan yang kuat, karena perangkat ini tidak mudah untuk dibongkar: desainnya rumit dan beberapa elemen diisi dengan silikon, mungkin untuk menghilangkan getaran dan menyederhanakan pembuatan.


Pembongkaran kasus Frekvens dimulai dari belakang. Rumah memiliki lubang sekrup di semua sisi, kecuali bagian depan; berkat set sekrup dan penutup dari kit perangkat, itu dapat dihubungkan ke gadget Frekvens lainnya. Namun, lubang belakang untuk sekrup sedikit lebih dalam dan di bawahnya ada sekrup yang menahan casing.


Setelah melepas penutup belakang, kami melihat bahwa semua lubang sekrup telah memasang sisipan logam di mana sekrup dapat disekrup. Wow! Ini harus memberikan lubang dengan margin keselamatan yang memadai. Ada kemungkinan bahwa ini sangat mempersulit produksi atau pembongkaran; yang terakhir diperumit oleh fakta bahwa pertama-tama kita perlu memotong tetesan senyawa silikon yang mengeras.


Sisipan sebenarnya diikat dengan sisipan plastik lainnya; mereka harus dihapus terlebih dahulu.

Saya tidak punya foto lain dari proses pembongkaran, tetapi setelah tahap ini Anda akan melihat empat sekrup yang perlu dibuka, dan kemudian proses berlanjut seperti sebelumnya. Pahami bagian plastik mana yang menyatukan semuanya, potong senyawa silikon, lepaskan pengencang plastik. Lanjutkan sampai Anda dapat menarik keluar papan sirkuit.


Ini dia: sisi kebalikan dari papan sirkuit. Ternyata, itu dirakit dari dua papan sirkuit cetak: yang putih memiliki dua sisi - di belakang ada semua driver LED (dan papan lain terpasang padanya), dan di bagian depan ada LED sendiri.

Papan sirkuit putih dirancang dengan cukup baik: alih-alih matriks LED, ada 16 driver LED SCT2024bekerja dari arus searah. Driver LED ini memiliki 16 saluran, yaitu, setiap LED dikendalikan secara langsung. Driver LED hanya dapat sepenuhnya menghidupkan atau mematikan LED; driver sendiri tidak memiliki dukungan skala abu-abu. Bahkan, mereka melakukan register shift menggunakan output yang dikontrol saat ini, dan mereka semua berganti secara berurutan; Antarmuka koneksi PCB hijau terdiri dari bus sinkronisasi dan data, jalur snap memungkinkan, output, ground, dan saluran memungkinkan daya.

Di papan hijau ini adalah apa otak kecil perangkat: mikrokontroler, artikel yang tidak dapat ditemukan di Google, dan penguat operasional untuk mikrofon. Menariknya, ada petunjuk bahwa perangkat harus memiliki lebih banyak fitur: ada tempat untuk, mungkin, I2C EEPROM 24Cxx dan petunjuk bahwa dalam proyek asli ada penerima IR di panel depan. Mungkin seharusnya perangkat itu akan datang dengan remote control yang memungkinkan Anda membuat pola sendiri? Ini mungkin menjelaskan bahwa animasi yang ada terlihat sangat membosankan.


Di bagian depan papan tulis putih semua LED. Mikrofon datar kecil juga disolder untuk itu. Pada awalnya saya berpikir bahwa itu disolder ke papan hijau dan menonjol melalui lubang di papan putih, tetapi sebenarnya itu hanya datar.


Semua elektronik lainnya terletak di bagian belakang papan. Itu tidak cukup di sana: hanya catu daya di bawah merek Ikea, mengeluarkan 4 V. Di bawah catu daya ada papan sirkuit cetak kecil di mana ada dua sakelar taktil untuk tombol di bagian belakang kasing.

Jadi, jika kita ingin "mengoptimalkan" desain, maka kita memiliki kelemahan yang jelas: lebih baik mengganti kartu hijau kecil dengan prosesor dengan sesuatu yang lebih kuat.

Kami memodifikasi besi


Saya pikir mungkin saja untuk mengganti peralatan dengan ESP-Cam. Ini adalah papan yang sangat murah (10 euro atau lebih) dengan chip WiFi / BT ESP32, beberapa megabita PSRAM, dan modul kamera. Saya tidak terlalu tertarik dengan musik ringan, saya ingin perangkat merespons sesuatu yang visual. Karena sudah ada lubang di ujung depan untuk penerima, saya pikir saya bisa menggunakannya di bawah kamera. Saya juga perlu mengebor lubang di papan tulis di mana mikrofon berada; untungnya, selain trek mikrofon yang sekarang tidak berguna, ini hanya akan menghancurkan satu trek LED. Saya mengebor lubang dan mengembalikan trek. Untuk sementara menempatkan papan kembali pada tempatnya dan menyalakan kubus, saya memastikan bahwa semua LED masih berfungsi.


Sekarang saya memiliki papan dengan lubang bor, dan saya hanya bisa menghubungkan dan secara mekanis menghubungkan ESP-Cam. Para desainer dengan ramah menunjukkan tujuan semua bantalan pada layar silkscreen dari papan hijau, jadi saya hampir tidak bisa menebak apa pun. Karena catu daya hanya memasok 4 V, saya menghubungkannya langsung ke input 3,3 V dari chip ESP-CAM. Saya harus melakukan ini, karena ketika saya menghubungkannya ke pin Vin 5V, chip tidak mau memulai ... Kemungkinan besar, regulator LDO memiliki drop tegangan yang agak tinggi. Kembali, saya sekarang berpikir bahwa ada baiknya mencoba menghubungkan dioda secara seri dengan sumber 4 V untuk mendapatkan 3.3-3.4 V, tetapi solusi saya berhasil; ESP32 cukup bersahaja.


Menyolder semua konektor, saya harus berurusan dengan mekanik. Itu adalah proyek "cepat dan kotor", dan saya sudah menyolder konektor ESP-Cam sebelumnya, jadi untuk menyelaraskan kamera dengan lubang, Anda bisa melakukannya dengan beberapa gasket dan banyak epoksi.


Setelah operasi ini, masalah terakhir tetap ada: LED di sebelah kamera bersinar pada bingkai jendela, menyebabkan semua jenis artefak aneh. Pertama-tama, untuk menghilangkannya, saya memotong bezel kecil dari selotip aluminium untuk melindungi kamera dari cahaya langsung.


Langkah kedua adalah aplikasi cat akrilik. Ini adalah sisipan plastik tempat semua difuser berada, di mana LED bersinar. Saya sudah memperbesar lubang yang ada untuk mikrofon di dalamnya untuk membuat bingkai jendela yang lebih lebar untuk kamera, tetapi ini menyebabkan masalah lain - lubang itu terlalu mencolok dan terlalu banyak cahaya yang tersebar jatuh di kamera. Noda cat akrilik hitam cukup baik pada kedua masalah; kamera masih menerima cukup banyak cahaya dari LED, tetapi sekarang tidak membanjiri sepenuhnya.

Jadi, transplantasi otak sudah selesai dan tubuh siap untuk berkumpul. Anda dapat memulai perangkat lunak.

Perangkat lunak


Mari beralih ke perangkat lunak. Pertama-tama, kita perlu mengendalikan driver LED. Ini tidak sulit: sinyal driver hampir secara langsung konsisten dengan antarmuka periferal SPI chip ESP32: bantalan CLK pada papan terhubung ke antarmuka CLK periferal SPI, pad DA pada papan terhubung ke MOSI sinyal SPI. Ini akan memungkinkan Anda untuk menyinkronkan 256 bit dengan rantai driver LED: masing-masing bit yang disinkronkan mengaktifkan atau menonaktifkan LED yang sesuai. Selain itu, ada pintu masuk LAK. Jika sinyalnya rendah, maka LED mempertahankan nilainya sebelumnya, terlepas dari apa yang ditransfer ke register shift; jika sinyalnya tinggi, maka semuanya secara bersamaan beralih ke nilai-nilai yang saat ini ada dalam register geser. Akhirnya, ada input EN yang menghidupkan atau mematikan semua LED;Saya tidak menghubungkannya ke GPIO dan selalu menyalakan LED secara terprogram.

Dengan demikian, saya sekarang dapat menghidupkan dan mematikan LED individu, mendapatkan tampilan hitam dan putih. Namun, saya butuh sesuatu yang lain. Dengan daya komputasi yang memadai, layar juga harus mampu menampilkan nuansa abu-abu - untuk ini, Anda hanya perlu menghidupkan / mematikan LED lebih cepat daripada yang dilihat mata.

Untuk mengimplementasikan ini dengan satu LED, saya biasanya menggunakan PWM, tetapi dalam kasus 256 LED, ini akan mengambil bagian yang signifikan dari kekuatan prosesor ESP32. Jadi sebagai gantinya, saya memutuskan untuk menggunakan Modulasi Kode Biner (juga disebut Bit Angle Modulation). Ini adalah teknik yang memungkinkan Anda untuk mendapatkan nuansa abu-abu dengan daya CPU lebih sedikit. Saya sudah berhasil menggunakannya di proyek lain , jadi saya yakin itu akan berhasil.


Dan itu berhasil. Saya juga menambahkan tabel pencarian untuk mengubah cahaya CIE ke PWM , karena mata pada dasarnya merespons kecerahan LED non-linear; tabel pencarian memperbaiki masalah ini. Pada akhirnya, saya berhasil mencapai jumlah yang cukup dari skala abu-abu dan skala linear dari kecerahan optik sesuai dengan nilai piksel yang saya tetapkan.

Tidak sulit untuk mengimplementasikan proyek kamera: ada komponen ESP-IDF yang dapat ditambahkan ke proyek; dia akan mengatur kamera dan bertukar data dengannya, Anda hanya perlu menentukan parameter yang Anda butuhkan, dan kemudian meminta bitmap yang dilihat kamera. Satu-satunya hal yang tidak dapat saya gunakan dalam pengaturan standar adalah bahwa penyelarasan otomatis dan eksposur otomatis diaktifkan secara default, dan ini cukup mengganggu cara saya mengendalikan LED: tergantung pada bagian mana dari urutan Modulasi Kode Biner gambar diciptakan, kamera agak meningkatkan atau mengurangi perataan dan eksposur secara acak. Saya memperbaiki masalah dengan mengalihkan kamera ke penyelarasan manual dan kecepatan rana; kode itu sendiri memeriksa gambar dan menentukan apakah parameter ini perlu kompensasi.Berkat pemrosesan manual seperti itu, saya juga berhasil mengecualikan piksel yang melihat langsung ke LED untuk benar-benar menghapusnya dari persamaan. Ini juga sangat membantu dalam mendapatkan gambar yang stabil.

Sekarang saya punya kamera dan kanvas 16x16 dalam nuansa abu-abu. Apa yang harus saya lakukan dengan mereka? Saya mendapat ide: pada saat komputer Macintosh pertama, ada ekstensi populer yang hanya menambahkan beberapa mata kartun ke menu bar. Mata ini hanya mengikuti kursor. (Variasi tema ini untuk Linux / Unix yang disebut "xeyes" masih ada.) Bagaimana jika saya mencoba mengulanginya di kehidupan nyata?


Sebagai permulaan, saya perlu beberapa gambar mata. Saya tidak berpikir bahwa saya bisa menggambar sesuatu yang berharga, jadi saya memutuskan untuk menggunakan mata saya sendiri sebagai gambar dasar; menonton video pendek tempat saya menonton dan berkedip ke segala arah. Perlu dipertimbangkan bahwa karena situasi saat ini saya memiliki sedikit alat profesional: Saya berbaring di lantai untuk memaksimalkan pencahayaan yang jatuh dari langit-langit lampu neon dan mendapatkan gambar yang dapat dibaca; Semua video diambil di smartphone yang saya pegang.

Karena data awal agak ceroboh, saya harus bekerja keras pada pasca-pemrosesan. Saya mulai dengan memotong sebuah fragmen yang kira-kira ada di sekitar mata kanan saya. Lalu saya mengubah setiap frame video menjadi gambar dan menghapus semua gambar yang berlebihan; pada akhirnya saya memiliki pilihan gambar yang bagus dari saya melihat ke arah yang berbeda, serta beberapa bingkai dengan berkedip. Namun, karena saya menggunakan ponsel untuk merekam, video itu ternyata agak goyah dan gambarnya dilewati. Untuk mengatasinya, saya melewati serangkaian gambar melalui program lem gambar Huginyang biasanya digunakan untuk panorama dan gambar HDR; di pintu keluar, saya mendapat gambar yang berpusat di bagian wajah saya. Sekarang saya hanya bisa menandai ke arah mana saya melihat, dan apakah saya berkedip. Saya melakukan ini dengan terlebih dahulu mengonversi semua gambar ke nuansa abu-abu dan kemudian mengunggahnya ke Gimp . Dalam setiap gambar, saya menggunakan titik merah untuk menunjukkan lokasi pusat murid, ditambah titik merah di sudut kiri atau kanan untuk menunjukkan jika saya berkedip, dan jika saya berkedip, maka mata saya setengah terbuka, atau tertutup.


Setelah menandai setiap gambar dengan cara ini, menjadi sangat mudah untuk menulis skrip untuk mendapatkan lokasi murid, serta keadaan berkedip. Script juga meningkatkan gambar ke 16x16 dan menyimpannya sebagai data biner mentah, siap ditulis ke firmware modul ESP-CAM. Pada akhirnya, saya mendapat satu set gambar dan indeks di mana murid berada dan dalam keadaan apa mata berkedip itu.

ESP-Cam memiliki komponen perpustakaan kamera yang cukup mudah digunakan untuk ESP-IDF, jadi mendapatkan gambar itu mudah. Saya mengatur pengambilan 120x160 gambar dalam nuansa abu-abu, karena mereka adalah yang termudah untuk diproses, dan saya tidak perlu banyak resolusi, karena hasil akhirnya harus ditampilkan pada layar 16x16. Namun, saya masih memiliki masalah perangkat keras: kamera masih terlalu dekat dengan LED.


Pada awalnya, saya mencoba menyelesaikannya dengan kalibrasi: ketika perangkat dinyalakan, dibutuhkan dua gambar: satu dengan LED dekat dengan lensa kamera, dan satu hanya dengan LED yang terletak jauh dari kamera. Mengurangi satu gambar dari yang lain, Anda dapat memahami piksel mana yang dipengaruhi oleh LED. Pixel ini disimpan dalam mask; piksel yang ditandai dalam topeng kemudian diabaikan. Gambar di atas menunjukkan dua pemotretan dan topeng.

Dengan gambar yang lebih bersih, saya bisa beralih ke pengenalan gerakan. Saya menerapkannya dengan mendapatkan bingkai dari kamera dan mengurangi bingkai sebelumnya dari itu. Kemudian saya bisa menghitung jumlah gerakan dengan menambahkan semua piksel yang dihasilkan. Lebih lanjut, adalah mungkin untuk menghitung lokasi konsentrasi gerak dengan mengambil rata-rata koordinat semua piksel yang tertimbang oleh perbedaan bingkai dalam piksel ini. Pada akhirnya, sihir penyaringan dilakukan agar perangkat tidak terlihat tersentak seperti jack Russell Terrier dengan ADHD: untuk menarik perhatiannya, objek harus bergerak lebih seragam atau bergerak cukup jauh.

Hanya ada satu masalah: ketika hari sangat gelap, algoritme pengenalan gerakan kadang-kadang bekerja pada pantulan LED pada benda mengkilap di ruangan: jika mata berkedip, maka perhatikan pantulannya sendiri. Ini bukan yang saya inginkan, jadi saya menghindari masalah ini dengan membuat algoritma pengenalan gerakan "buta" ketika mengubah gambar pada LED; jadi saya menghentikan perilaku ini. Selain itu, ini juga sedikit lebih realistis: ketika Anda berkedip, Anda tidak dapat melihat.

Firmware memiliki beberapa mode debugging yang menunjukkan seluruh proses. Berikut adalah video singkat yang menggambarkan hal ini:


Kesimpulan


Jadi sekarang saya memiliki perangkat yang mengikuti saya ... tidak terlalu berguna, saya setuju. Tapi itu menarik bagi saya untuk membuatnya, dan jika saya menemukan sesuatu yang lebih bermanfaat yang dapat diimplementasikan pada layar LED 16x16, maka saya dapat melakukannya, karena saya sudah memiliki kode kontrol. Berbicara tentang kode: Anda dapat dengan bebas mengunduh hasil mentah saya dari sini . Semoga Anda menikmatinya dan berhati-hati.


All Articles