
Beberapa minggu yang lalu, kami melakukan pencarian online untuk peretas : kami membangun ruangan yang diisi dengan perangkat pintar dan meluncurkan siaran YouTube darinya. Pemain dapat mengontrol perangkat IoT dari situs game; tujuannya adalah untuk menemukan senjata yang tersembunyi di dalam ruangan (penunjuk laser yang kuat), meretasnya, dan membuat arus pendek ruangan.
Untuk menambahkan plot yang mendebarkan, kami meletakkan mesin penghancur di ruangan, di mana kami memuat 200.000 rubel: mesin penghancur memakan tagihan per jam. Setelah memenangkan permainan, Anda dapat menghentikan mesin penghancur dan mengambil semua uang yang tersisa.
Kami telah menjelaskan jalannya permainan , serta bagaimana backend proyek itu dibuat . Saatnya memberi tahu Anda tentang perangkat keras dan bagaimana perkembangannya.
Ada banyak permintaan untuk menunjukkan saat membersihkan kamar - kami menunjukkan bagaimana kami membongkarnya
Arsitektur besi: kontrol kamar
Kami mulai merancang solusi perangkat keras ketika skenario sudah kurang lebih jelas, backend sudah siap dan kami memiliki ruang kosong yang siap untuk pemasangan peralatan.
Mengingat lelucon lama "S dalam IoT adalah singkatan dari Keamanan" ("Huruf S dalam singkatan IoT adalah singkatan dari Keamanan"), kami memutuskan bahwa kali ini pemain dalam skenario game hanya berinteraksi dengan front-end dan back-end situs, tetapi tidak mendapatkan kesempatan untuk mendapatkan secara langsung ke kelenjar.
Ini dilakukan untuk alasan keamanan dan hiburan tentang apa yang terjadi di layar: dengan akses langsung pemain ke perangkat keras, akan jauh lebih sulit untuk mengisolasi tindakan yang aman dan berpotensi berbahaya, misalnya, mempercepat mesin penghancur atau mengendalikan kembang api.
Sebelum memulai desain, kami merumuskan beberapa prinsip untuk mengontrol perangkat game, yang menjadi dasar desain:
Jangan gunakan solusi nirkabel
Seluruh ruang bermain ada dalam satu bingkai, yang setiap sudutnya bisa Anda jangkau. Tidak ada kebutuhan nyata untuk koneksi nirkabel dan mereka hanya akan menjadi titik kegagalan lainnya.
Jangan gunakan perangkat khusus apa pun dari rumah pintar
Sebagian besar demi fleksibilitas kustomisasi. Jelas bahwa dimungkinkan untuk menyesuaikan banyak versi kotak dari sistem rumah pintar dengan panel admin siap pakai dan manajemen untuk tugas kita, tetapi biaya tenaga kerja akan sebanding dengan membuat solusi sederhana Anda sendiri.
Selain itu, perlu untuk menghadirkan perangkat yang secara jelas akan menunjukkan apa yang sebenarnya para pemain ubah statusnya: mereka menyalakan / mematikan atau memberi lampu khusus pada huruf FALCON.
Kami mengumpulkan semua elemen dari besi yang tersedia untuk umum, yang dapat dibeli di toko suku cadang radio biasa: antara pengiriman pizza dan diet cola, kurir Chip dan Deep dan Leroy terus-menerus datang ke situs tersebut.
Pilihan untuk merakit semuanya sendiri yang disederhanakan debugging, skalabilitas, bagaimanapun, membutuhkan akurasi lebih selama instalasi.
Semua relai dan arudino tidak boleh terlihat di bingkai
Kami memutuskan untuk membawa semua elemen yang dapat dikontrol ke satu tempat dan menyembunyikannya di belakang layar agar dapat memantau kinerja dan, jika perlu, dengan rapi keluar dari bidang pandang kamera dan mengganti unit yang gagal.
Akibatnya, semuanya disembunyikan di bawah meja, dan kamera dipasang sehingga tidak ada yang terlihat di bawah tabel. Ini adalah "
titik buta" kami untuk perayapan insinyur. Dari sudut pandang perangkat keras, perangkat ini mengontrol 6 elemen:
- Beberapa lampu meja, memiliki kondisi on / off dan dikendalikan oleh pemain
- Huruf di dinding, mereka dapat mengubah warna mereka atas perintah para pemain
- Kipas yang berputar dan membuka flipchart saat server sedang dimuat
- Laser terkontrol PWM
- Mesin penghancur yang makan uang sesuai jadwal
- Mesin asap yang terpicu sebelum setiap tembakan laser
Kami menguji mesin asap bersama dengan laser.
Kemudian, lampu panggung ditambahkan, yang berdiri di belakang bingkai dan dikontrol persis seperti lampu dari titik 1. Lampu panggung dipicu dalam dua kasus: itu menerangi laser ketika daya diterapkan padanya dan menerangi beban sebelum laser diluncurkan dalam pertempuran mode.
Perangkat pintar apa ini?
Kami benar-benar berakhir dengan satu perangkat pintar: ia menerima status masing-masing bagiannya dari backend dan mengubahnya dengan perintah yang sesuai.
Diasumsikan bahwa skrip sederhana akan berjalan di komputer yang menerima json dengan status perangkat dan mengirimkannya ke arduinka yang terhubung melalui usb. Kemudian komputer ini diganti dengan rasberry, itu terhubung ke backend karena nat.
Terhubung ke port:
- 16 relai konvensional (merekalah yang membuat suara klik yang terdengar di video. Kami memilihnya terutama karena suara ini)
- 4 solid state relay untuk mengontrol saluran PWM seperti kipas,
- pisahkan keluaran PWM untuk laser
- keluaran membentuk sinyal ke strip LED
Berikut adalah contoh perintah json yang masuk ke relai dari server
{"power":false,"speed":0,"period":null,"deviceIdentifier":"FAN"}
Dan ini adalah contoh fungsi yang dimiliki tim untuk Arudino
def callback(ch, method, properties, body):
request = json.loads(body.decode("utf-8"))
print(request, end="\n")
send_to_serial(body)
Untuk melacak momen ketika laser akhirnya membakar tali dan beban akan terbang ke akuarium, kami membuat tombol kecil yang memicu penurunan beban dan memberi sinyal ke sistem.
Tombol pemantauan gerakan kettlebell
Pada sinyal ini, bom asap yang terbuat dari bola ping-pong seharusnya sudah menyala. Kami menempatkan 4 saluran asap langsung ke dalam kotak server dan membawa benang nichrome ke sana, yang seharusnya memanas dan bekerja seperti sekring.
Tubuh dengan bom asap dan karangan bunga Cina
Arduino
Di arduinka, menurut rencana awal, terjadi dua tindakan.
Pertama, saat permintaan baru diterima, permintaan tersebut diurai menggunakan library ArduinoJson. Selanjutnya, setiap perangkat yang dikendalikan dikaitkan dengan beberapa propertinya:
- «» «» ( )
- , ( JSON , , )
- PWM ,
- , . 587 . , , , . .
Terakhir kali disetel saat parameter terkait diterima di JSON, tetapi tidak dapat dikirim, maka nilai disetel ke 0 dan zeroing tidak terjadi.
Tindakan kedua yang dilakukan arduinka setiap siklus adalah aktualisasi status, yaitu memeriksa apakah perlu menyalakan sesuatu atau apakah sudah waktunya untuk mematikan perangkat.
Penunjuk laser - Megatron 3000 yang sama
Ini adalah modul laser konvensional untuk memotong dan menandai fokus manual LSMVR450-3000MF 3000mW 450nm.
Surat Falcon
Dibuat sangat sederhana - kami hanya menyalin huruf-huruf dari logo, memotongnya dari karton, dan kemudian menempelkannya dengan selotip led. Dalam hal ini, perlu menyolder potongan-potongan pita bersama-sama, 4 kontak di setiap jahitan, tetapi hasilnya sepadan. Backend kami, Pasha, menunjukkan keajaiban keterampilan, melakukannya dalam waktu kurang dari beberapa jam.
Tes pertama dari perangkat iot dan penyelesaiannya
Kami melakukan tes pertama dan pada saat yang sama kami mendapat masalah baru. Faktanya adalah di tengah proses, produser film dan juru kamera sungguhan dari VGIK, Ilya Serov, bergabung dengan tim - dia membangun bingkai, menambahkan pencahayaan sinematik tambahan dan sedikit mengubah skenario permainan sehingga plotnya lebih emosional, dan gambarnya lebih dramatis dan teatrikal.
Ini secara signifikan meningkatkan kualitas, tetapi ada elemen yang juga perlu dihubungkan ke relai dan algoritme operasi ditentukan.
Laser ternyata menjadi masalah lain: kami melakukan beberapa eksperimen dengan berbagai jenis tali dan laser dengan kekuatan berbeda. Untuk pengujian, kami cukup menggantungkan beban secara vertikal pada tali.
Saat diluncurkan dengan token uji, daya yang dapat disesuaikan melalui PWM kurang dari 10% dan tali tidak rusak bahkan setelah eksposur lama.
Untuk mode pertempuran, laser didefokus ke kira-kira titik dengan diameter 10 mm dan dengan percaya diri membakar tali dengan beban dari jarak sekitar satu meter.
Jadi, laser bekerja dengan sempurna pada pengujian.
Saat kami sudah mulai menguji semuanya dengan benar di ruangan pada beban yang ditangguhkan, ternyata tidak mudah untuk memperbaiki laser dengan aman. Kemudian, saat tali terbakar, tali meleleh, meregang, dan bergeser dari bawah fokus aslinya.
Tapi begini cara kerjanya tidak lagi: tali itu dipindahkan
Ilya memindahkan laser ke ujung ruangan yang berlawanan dengan tali sehingga sinar laser akan melintasi seluruh pemandangan dan terlihat indah dalam bingkai, yang melipatgandakan jarak.
Setelah melakukan beberapa percobaan lagi dengan pembakaran tali yang sudah ada dalam pertempuran, kami memutuskan untuk tidak menyiksa nasib dan mengasuransikan pemotongan tali dengan kawat nichrome. Dia menghancurkan utas 120 detik setelah menyalakan laser dalam mode pertempuran. Ini, serta pemutusan sambungan kabel dan sekering bom asap ketika kontak putus dipicu, kami memutuskan untuk membuat kode keras langsung di perangkat keras mikrokontroler.
Utas, yang akhirnya membakar tali dari layar.
Dengan demikian, tugas ketiga muncul yang dipecahkan arduinka - untuk menyusun urutan yang terkait dengan pelaksanaan perintah ini.
Kami juga memutuskan untuk memberikan raspberry, yang biasanya hanya mengirim JSON ad-hoc yang diterima dari backend, dan kebutuhan untuk melacak uang di TV dan menjalankan shredder. Awalnya, diasumsikan bahwa backend akan melakukan ini dan saldo saat ini akan terlihat di situs, dan di TV kami akan menampilkan komentar dari YouTube sebagai elemen interaktif tambahan yang mendorong pemirsa bahwa acara di ruangan itu terjadi secara real time.
Tetapi selama uji coba, Ilya menonton adegan itu dan menyarankan untuk menunjukkan saldo permainan di layar terbesar: berapa banyak uang yang tersisa, berapa banyak yang dimakan, dan hitung mundur hingga mesin penghancur kertas berikutnya.
Kami mengikat Raspberry ke waktu saat ini: setiap jam penuh mesin penghancur dimulai. Gambar itu ditampilkan di TV dengan bantuan raspberry, yang pada saat itu sudah menerima permintaan dari server dan mengirimkannya untuk dieksekusi ke arduinka. Gambar dengan indikator moneter digambar menggunakan panggilan utilitas konsol fim seperti ini
image = subprocess.Popen(["fim", "-q", "-r", "1920Γ1080", fim_str]), fim_str
Dan itu dibentuk berdasarkan jumlah atau waktu yang dibutuhkan.
Kami membuat gambar sebelumnya: kami baru saja mengambil video yang sudah jadi dengan timer dan mengekspor 200 gambar.
Ini adalah mekanik yang diprogram dalam pencarian. Pada saat penghitungan mundur terakhir dimulai, kami semua pergi ke lokasi, mempersenjatai diri dengan alat pemadam kebakaran dan duduk menunggu api (yang menyala dengan kekuatan dan hanya dalam perselisihan)
Cara membuat siaran yang berfungsi selama seminggu: pemilihan kamera
Untuk misi, kami membutuhkan siaran terus-menerus di YouTube selama 7 hari - itulah yang kami berikan sebagai durasi maksimum permainan. Ada dua hal yang bisa menghalangi kita:
- Ruang terlalu panas dari operasi berkelanjutan
- Pemotongan internet
Kamera harus memberikan setidaknya gambar Full HD agar dapat memutar dan mengamati ruangan dengan nyaman.
Awalnya, kami melihat ke arah webcam yang dirilis untuk streamer. Kami memotong anggaran, jadi kami tidak ingin membeli kamera, tetapi ternyata tidak tersedia untuk disewa. Pada saat yang sama, kami secara ajaib menemukan kamera Xbox Kinect tergeletak di rumah saya, menaruhnya di kamar dan memulai siaran uji coba selama seminggu.
Kamera mengatasi dengan baik dan tidak terlalu panas, tetapi Ilya segera menyadari bahwa itu tidak memiliki pengaturan, khususnya, tidak mungkin untuk mengatur eksposur.
Ilya berusaha mendekatkan jenis siaran dengan standar produksi film dan video: untuk menyampaikan pemandangan cahaya yang berubah secara dinamis dengan sumber cahaya terang, latar belakang yang digelapkan, dan objek dalam bingkai. Pada saat yang sama, saya ingin mempertahankan elaborasi gambar, baik dalam sorotan maupun bayangan, dengan gangguan digital minimal.
Oleh karena itu, meskipun kinect terbukti andal dalam pengujian dan tidak memerlukan kartu video capture (titik kegagalan lainnya), kami memutuskan untuk meninggalkannya. Setelah tiga hari menguji kamera yang berbeda, Ilya memilih Sony FDR-AX53 - camcorder kecil yang andal, terjangkau untuk disewa, tetapi pada saat yang sama dengan keandalan dan karakteristik visual yang memadai.
Kami menyewa kamera, menyalakannya selama seminggu bersama dengan kartu video capture, dan menyadari bahwa dengan itu kami dapat mengandalkan siaran terus menerus di seluruh pencarian.
:
Bekerja pada pencahayaan membutuhkan keanggunan tertentu, kami perlu membangun skor cahaya dengan cara minimal:
1. Penerangan objek saat ditemukan oleh pemain (laser, beban), serta cahaya konstan pada mesin penghancur. Di sini kami menggunakan dedolight 150 - perangkat penerangan bioskop yang andal dan ringkas dengan lampu halogen tegangan rendah, yang memungkinkan Anda memfokuskan sinar pada subjek tertentu, tanpa menyentuh latar belakang dan objek lain.
2. Lampu bermain praktis - lampu meja, lampu lantai, bintang, karangan bunga. Semua cahaya praktis didistribusikan secara harmonis dalam bingkai untuk menerangi area gambar, di dalamnya terdapat lampu led dengan suhu warna 3200K, lampu di lampu lantai ditutup dengan filter folium Rosco merah untuk menciptakan aksen petunjuk warna yang tidak biasa.
Saya seorang insinyur dengan ibu saya atau peluncuran besok
Bagaimana kami mendukung internet dan listrik
Masalah toleransi kesalahan didekati hampir seperti di pusat data: mereka memutuskan untuk tidak menyimpang dari prinsip dasar dan dicadangkan sesuai dengan skema N + 1 biasa.
Jika siaran di YouTube berhenti, berarti tidak mungkin untuk terhubung kembali menggunakan tautan yang sama dan melanjutkan streaming. Itu adalah saat yang kritis, dan ruangan itu berada di kantor biasa.
Untuk ini, kami menggunakan router berbasis OpenWRT dan paket mwan3. Secara otomatis menguji ketersediaan saluran setiap 5 detik dan, jika ada gangguan, beralih ke modem cadangan dari Yota. Akibatnya, beralih ke saluran cadangan membutuhkan waktu kurang dari satu menit.
Juga sama pentingnya untuk mengecualikan pemadaman listrik, karena bahkan lonjakan listrik jangka pendek akan menyebabkan restart semua komputer.
Oleh karena itu, kami mengambil catu daya tak terputus ippon innova g2 3000, yang akan mencadangkan semua perangkat game: total konsumsi daya sistem kami sekitar 300 watt. Cukup untuk 75 menit, cukup untuk tujuan kita.
Kami memutuskan untuk mengorbankan penerangan tambahan jika listrik padam di dalam ruangan - tidak terhubung ke catu daya yang tidak pernah terputus.
Ucapan Terima Kasih
- Kepada seluruh tim RUVDS yang menemukan dan mengimplementasikan game tersebut.
- Secara terpisah untuk admin RUVDS, untuk memantau pekerjaan server, beban dapat diterima dan semuanya berfungsi normal dalam mode normal.
- Untuk bos terbaik ntsaplin.dlluntuk fakta bahwa dalam menanggapi panggilan "ada ide: kami akan mengambil server, meletakkan akuarium di atasnya, dan menggantung beban di atasnya, boom, bang, semuanya dibanjiri air, korsleting, api!" dia selalu dengan percaya diri mengatakan "lakukan!"
- Tilda Publishing , - , .
- S_ILya , , , , , .
- zhovner , , , , .
- samat , , .
- daniemilk .
- delfphe .
- Dodo Pizza Engineering .
Dan terima kasih terbesar kepada para pemain untuk semua emosi yang kami alami saat Anda menyerbu pencarian tanpa tidur selama dua hari dan bahkan menunda pekerjaan.
Artikel lain tentang pencarian dengan penghancuran server
- Awal permainan
- Petunjuk pertama
- Siapa yang menghentikan shredder atau bagaimana itu diperlukan untuk menyelesaikan misi dengan penghancuran server
- Bagian belakang dari game peretas
