Halo semuanya, sudah ada beberapa artikel tentang Habré tentang otomatisasi permainan seperti "quest in reality" (
satu ,
dua ,
tiga ,
empat ,
lima ...), saya juga ingin berbagi pengalaman saya berpartisipasi dalam proyek semacam itu. Kembali pada tahun 2015, teman-teman saya memutuskan untuk mengatur pencarian "Escape Perampokan Bank" di kota
kami . Mereka tahu bahwa saya telah menyukai berbagai otomatisasi sejak lama, termasuk sistem seperti "rumah pintar" yang didasarkan pada solusi open source, jadi mereka meminta bantuan dalam mengatur permainan. Gagasan ini tampak menarik bagi saya dan saya setuju - saya ingin menerapkan pengalaman dan solusi saya untuk sesuatu yang lebih menarik daripada mengedipkan bola lampu di apartemen saya.
Saya mencoba untuk mengambil bagian dalam siklus penuh proyek - dari membuat perubahan pada skrip ke tugas berikutnya, mengidentifikasi dan memperbaiki bug, perbaikan selanjutnya. Saya mengunjungi beberapa pertandingan di kota kami (pada tahun 2015 itu dapat dihitung dengan jari satu tangan), bukan untuk penggemar, tetapi untuk mendapatkan pengalaman dan solusi rekayasa balik, dan ini terlihat jelas oleh reaksi penyelenggara. Tetapi setelah berpartisipasi dalam permainan di Moskow, saya memahami skala sebenarnya dari "bencana" dan saya benar-benar ingin melakukan pekerjaan saya tidak lebih buruk dari sisi teknis. Jadi, pencarian “Rob the Bank” di Tver, untuk detail bagaimana itu dibuat dan dikembangkan selama beberapa tahun, saya meminta kucing.
Deskripsi solusi teknis
Setelah kolega saya menjelaskan kepada saya dengan jari apa yang mereka inginkan dari saya dan bagaimana semuanya harus bekerja, di kepala saya secara harfiah dalam beberapa menit sebuah arsitektur terbentuk: server pusat dengan platform
ioBroker , pengendali lokal berdasarkan papan dan modul Arduino, pertukaran data dengan server dan antara pengontrol menggunakan protokol MQTT. Hasilnya, arsitekturnya kira-kira kira-kira sebagai berikut:
Selain interaksi pengontrol tugas dengan server pusat, perlu untuk membangun interaksi antara pengontrol tugas pencarian yang berbeda. Untuk ini, menurut pendapat saya, protokol MQTT dengan broker pada server pusat sangat cocok. Klien - pengontrol mempublikasikan statusnya ke server, berlangganan perintah dari server dan status pengontrol lain. Untuk mengimplementasikan solusi ini, adaptor
MQTT digunakan - itu juga merupakan broker MQTT dan memungkinkan Anda untuk membuat hierarki topik di pohon objek ioBroker untuk menggunakan data untuk visualisasi dan manajemen (tangkapan layar di bawah versi lama dari "panel admin").
Selanjutnya, saya tidak menyesal telah memilih solusi seperti itu:
- MQTT adalah protokol yang ringan, perpustakaan mengambil sedikit ruang dan lebih dari cukup bahkan untuk Arduino UNO dengan chip ATmega328
- Saat memulai ulang atau menyalakan pengendali untuk pertama kali, mereka menerima kondisi awal untuk mulai bekerja menggunakan MQTT - sangat nyaman
- Solusi ini ternyata yang paling dapat diandalkan dari yang diuji dan cukup sederhana bagi pemula untuk diimplementasikan dan dipelajari
Hanya beberapa opsi yang diperoleh dari aliran data, yang paling sederhana - aliran peristiwa terjadi di pengontrol tugas No. 1 (tombol ditekan), mempublikasikan status tombol dalam topik tertentu dan statusnya ditampilkan dengan mengubah warna elemen grafis pada bentuk visual operator.
Opsi yang sama sederhana dan berlawanan adalah bahwa Anda perlu mengaktifkan relai secara manual melalui pengontrol tugas No. 1, acara kontrol diberikan melalui adaptor VIS, yang mengubah status topik pengontrol ini, dan dengan ask = false. Adaptor MQTT menerima perubahan topik dengan ask = false, sehingga topik ini tidak datang dari controller, masing-masing, perubahan diterbitkan ke controller, yang pada gilirannya menerbitkan konfirmasi dengan ask = true sebagai respons.
Pertukaran Intercontroller terjadi pada suatu acara di salah satu pengendali. Misalnya, pengontrol pertama telah memenuhi tugasnya dan harus menghidupkan relai pada pengontrol kedua - ia mempublikasikan statusnya dalam topik umum, broker menampilkannya di pohon dan pada halaman visualisasi, karena pengontrol kedua berlangganan ke topik ini, broker menerbitkannya ke pengontrol kedua dan yang terakhir pada gilirannya menerbitkan respons konfirmasi.
Proyek masih harus menambahkan tugas berinteraksi dengan komputer. Antarmuka ditulis dalam php, halaman berputar pada server WEB dengan autorun dalam mode browser layar penuh. Integrasi dengan sistem utama dilakukan menggunakan driver
api-sederhana - permintaan php tertentu untuk ioBroker hanya bergerak-gerak melalui php. Unit sistem itu sendiri tersembunyi di perut meja kantor, antarmuka dikendalikan dengan mouse, dan operator pencarian memiliki keyboard nirkabel.
Visualisasi untuk operator dikembangkan dalam driver
VIS untuk satu resolusi - monitor operator, tetapi kemudian staf pencarian dapat menggunakan tablet seluler dengan antarmuka yang sama, ternyata nyaman untuk mengatur ulang dalam persiapan untuk permainan baru dan untuk mendiagnosis sistem. Antarmuka berubah menjadi sederhana, tanpa dashboard modis dan ryushek-switch, tetapi dapat dimengerti, sederhana dan cepat. Tidak perlu logika khusus, layer, grafik, atau apa pun di antarmuka, hanya ikon untuk menampilkan status peralatan, tombol untuk kontrol, dan beberapa bidang teks untuk menampilkan mode operasi pengendali dan log operasi sistem.
Pada saat pengembangan proyek, tidak ada pilihan lain untuk desain visualisasi. Kemudian, adaptor visualisasi muncul baik untuk perangkat seluler (saya menggunakan
bahan ) dan untuk tablet / komputer stasioner:
habpanel ,
lovelace ,
tileboard , dan lainnya.
Logika utama ditetapkan dalam kode pengendali, tetapi interaksi umum, inisialisasi parameter untuk memulai, fungsi layanan, dll., Diimplementasikan pada server utama menggunakan adaptor
javascript . Kode ini ditulis dalam JS menggunakan
fungsi ioBroker bawaan, diikuti oleh "pindah" ke
blok (fungsi ini muncul lebih lambat daripada dimulainya pekerjaan pada proyek).
Secara total, beberapa skrip terlibat:
- skrip untuk inisialisasi sistem awal (inklusi pertama)
- skrip untuk mengatur ulang semua pengontrol sebelum game berikutnya
- salah satu pengontrol tidak segera "pindah" ke MQTT, jadi untuk beberapa waktu skrip digunakan untuk bertukar dengan pengontrol melalui permintaan HTTP - GET
- skrip untuk mempertahankan log gameplay yang terpisah
Semua pengendali yang didasarkan pada papan Arduino UNO (kemudian beberapa pengendali harus dikonversi ke papan Arduino MEGA - tidak ada cukup memori) dilengkapi dengan kartu ekspansi Ethernet berdasarkan chip W5100. Pertukaran data antara pengontrol dan server (seperti yang tertulis di atas) menggunakan protokol MQTT. Pengembangan algoritma dalam IDE Arduino dilakukan dengan menggunakan perpustakaan standar. Di sisi besi, tidak ada yang supernatural - penggunaan maksimum modul yang sudah jadi dan kartu ekspansi dengan penyolderan minimum dan tanpa pembuatan papan khusus - semuanya pada papan papan tempat memotong roti. Manajemen beban melalui modul dengan relay keadaan konvensional dan solid, sakelar transistor untuk indikator LED dan beban daya rendah. Pada bagian mekanik, saya mencoba menggunakan elemen bergerak sesedikit mungkin: microswitches, pushers, kunci E / M dan menggunakan modul fotodioda LED siap pakai (optocoupler terbuka), relay keadaan padat, kunci magnetik konvensional, pembaca kartu proximity dan sensor buluh. Beberapa foto di bawah ini:




Pengontrol di tempat ditenagai melalui adaptor POE buatan sendiri - kabel twisted-pair menggunakan core idle untuk menyiarkan 12V DC. Konversi pada papan pengontrol melalui papan DC-DC siap pakai hingga 5V - darimana Arduino + papan Ethernet sendiri dan beban daya rendah dengan logika 5V diumpankan: LED saat ini rendah, relay, dll. Beban 12V lebih kuat: kunci magnetik, relay atau kontaktor kuat, berbagai peralatan pencahayaan - Saluran kabel terpisah digunakan dengan sekrup bola atau kawat PVA. Dua input AC 220V dimasukkan ke dalam kabinet otomatisasi utama dan sebuah UPS dihubungkan melalui kontaktor pada kontaktor, yang pada gilirannya dihubungkan melalui bypass, untuk kemudahan perawatan. Untuk memberi daya pada semua otomatisasi dan tegangan rendah, catu daya 2-volt yang kuat dipasang di kabinet, 2 kali 12V dan satu kali 5V. Dari kabinet otomasi mereka meluncurkan saluran kabel 220V untuk menyalakan komputer dan berbagai perangkat pencarian: dari puff-puff ke viu-viu))


Solusi yang tersisa cukup standar untuk proyek semacam itu. Sistem pengawasan video pada kamera IP kabel, selalu dengan penerangan IR dan mikrofon internal. Aliran video digunakan dalam salah satu tugas pencarian dan juga diproses di PC manajer pencarian; perangkat lunak sumber terbuka (ZoneMinder) digunakan. Jaringan lokal pengendali Arduino dipisahkan dari sisa jaringan sehingga aliran dari kamera tidak akan memuat chip W5100 yang sudah lemah dari ethernet-board.
Handsfree dengan peserta dalam permainan menggunakan amplifier Soviet konvensional dan speaker langit-langit bawaan.
Pada akhirnya saya ingin menggambarkan server pusat kecil. Platform ioBroker digunakan pada single-board BananaPi ARM, yang kekuatannya ternyata cukup untuk semua tugas. Lingkungan adalah sistem operasi Armbian, beberapa skrip bash untuk bekerja dengan GPIO dan untuk membuat cadangan ke cloud di Yandex.Disk. Beberapa GPIO digunakan untuk menunjukkan status pengoperasian masing-masing modul dan adaptor (LED) dan tombol untuk mematikan sistem dengan benar. Dalam foto kabinet 19 "di atas dapat dilihat bahwa papan tersebut dalam wadah plexiglass murah standar, kemudian dipasang dalam wadah 1U dengan catu daya normal dan periferal lainnya.
Bug, jebakan, kesulitan
Rekan-rekan saya dan saya memikirkan arsitektur dasar dengan cukup baik sebelumnya (saya mengerjakan proyek) dan banyak node yang dirangkai dan diuji "di atas meja", sehingga tidak ada perubahan mendasar. "Kekasaran" kecil diperbaiki di tempat. Masalah utama, solusinya butuh waktu cukup banyak:
- Kurangnya memori Arduino pada chip 328, pindah ke papan Arduino MEGA. Diprediksi bersandar pada beberapa kontroler di memori chip. Sebagian besar waktu dihabiskan untuk mengerjakan ulang kartu ekspansi.
- Gangguan dalam bekerja dengan driver MQTT agak cepat diselesaikan oleh penulis proyek ioBroker.
- Proses panjang dan sulit memilih browser untuk visualisasi normal pada driver VIS. Ternyata sulit untuk bekerja dengan adaptor ini. Akibatnya, pengeditan dilakukan di browser Chrome, dan operator runtime meluncurkan versi tertentu melalui browser Dragon. Ketika bug diperbaiki, mereka sepenuhnya pindah ke browser Chrome terbaru.
- Penciptaan bertahap solusi anti-perusak - microswitches yang ditinggalkan, tombol mekanis dan bius, keyboard film, dll.
- Kunci elektromekanis Sheriff ternyata berkualitas sangat rendah, harus diganti secara lokal dengan kunci elektromagnetik biasa.
- Pengoperasian Arduino yang tidak stabil saat bekerja dengan kamera IP, sebagai akibatnya, jaringan dibagi dan semuanya berfungsi sebagaimana mestinya.
Kesimpulan
Seluruh proyek, dari mempelajari dan menyetujui skenario hingga meluncurkan kelompok uji pertama, memakan waktu sekitar enam bulan - banyak, tetapi itu adalah pengalaman pertama dan, apalagi, saya hampir mengikuti pekerjaan utama membangun / memperbaiki tempat. Plus, ada banyak pekerjaan "di atas meja" - terutama ketika menggunakan modul Arduino yang terpisah, karena mereka tidak bekerja persis seperti yang saya harapkan. Saat melaksanakan proyek, kami berusaha semaksimal mungkin untuk mematuhi prinsip-prinsip berikut:
- Proyek ini melibatkan perbaikan dan perbaikan kecil oleh insinyur mana pun yang setidaknya pernah memegang besi solder di tangannya, tahu apa itu Arduino, dan akan dapat "mengedipkan" LED yang disolder di papan tulis.
- Pengembangan di Arduino IDE menggunakan perpustakaan standar untuk kesederhanaan maksimum.
- Maksimalkan penggunaan off-the-shelf, modul umum dalam proyek untuk kemudahan perawatan dan penggantian
- Gunakan protokol standar dan jaringan data
- Minimalkan jumlah suku cadang mekanik untuk ketahanan dan anti-perusakan.
Akibatnya, dalam beberapa minggu pertama ternyata menghilangkan semua kelemahan kecil dan sekarang sistem telah bekerja selama hampir 4 tahun sekarang di hampir lingkungan awal.