4095 LED dan semuanyaAnehnya, pengontrol ATmega328, yang mendasari Arduino Uno, mengatasi output gambar pada tampilan seperti itu. Semuanya berubah menjadi konsol "saku" (dengan berat beberapa kilogram), di mana game yang didasarkan pada Space Invaders dijahit. Rencana untuk datang dengan sesuatu yang lain, karena ada banyak memori yang tersisa.
Di bawah potongan Anda dapat membaca tentang bagaimana tampilan seperti itu diatur dan bagaimana hal itu dapat dikontrol.
Terkadang, alih-alih menemukan
komputer lama dalam koleksi , saya membuatnya sendiri dari
bahan improvisasi .
Kali ini saya ingin melakukan sesuatu yang ringkas dengan resolusi di tingkat konsol dan komputer awal 80-an. Benar, layar 64x64-pixel tidak mencapai Atari 2600, tetapi sebanyak 64 piksel lebih dari layar Nokia 3310, di mana ada permainan juga. Jadi itu seharusnya sudah cukup dengan margin setidaknya untuk permainan tetris atau pong yang nyaman.
Selain layar, saya mendapat papan yang kompatibel dengan Arduino Uno, dan mulai berpikir tentang cara terbang dengan semua barang ini.
Adafruit menjual display semacam itu dan Anda dapat menemukan
contoh penggunaannya di situs webnya. Ada juga tautan ke
perpustakaan untuk bekerja dengan mereka. Perpustakaan mendukung Arduino Uno dan Arduino Mega.
Perpustakaan ini mengatur memori video, tempat ia menyimpan warna-warna piksel. Program pengguna mengecat ulang piksel-piksel ini, dan gambar ditampilkan di penangan interupsi timer. Dengan tampilan kecil, ini bekerja dengan baik, tetapi dalam kasus saya metode ini tidak baik. Bahkan jika setengah byte dialokasikan untuk setiap piksel (satu bit per R, G, B, dan satu tambahan), maka untuk matriks 64x64, diperlukan 2 kilobyte memori. Dan hanya itu yang dimiliki ATmega328P. Anda tentu saja dapat mengambil prosesor yang lebih kuat, tetapi ini bukan cara Jedi.
Lagi pula, siapa yang memaksa kita untuk menyimpan semua garis layar sekaligus? Anda dapat menghitung ulang setiap baris sebelum menampilkannya. Untuk grafik primitif dari beberapa sprite, perhitungan ini seharusnya tidak memakan waktu terlalu lama, jadi semuanya harus berfungsi.
Itu di
hutan sekolah komputer musim panas, terlalu malas untuk mencari dokumentasi di sirkuit mikro dan menelusuri papan untuk memahami apa yang terhubung. Karenanya, saya memilih algoritme untuk bekerja dengan tampilan dari pustaka yang diunduh sebelumnya:
- Tetapkan alamat jalur keluaran pada input tampilan
- Isi array dengan warna-warna piksel sprite yang bersinggungan dengan baris saat ini.
- Kami menggeser semua piksel dalam register geser, yang mengontrol LED
- Kami mengklik data yang diterima dan mengirimkannya ke output register
Hasilnya, sebuah array dengan ukuran hanya empat baris layar dipilih untuk memori video. Mengapa empat? Itu karena pada saat yang sama kami mendorong data dalam dua baris - karena matriks memiliki dua kelompok input: R1 / G1 / B1 dan R2 / G2 / B2. Mereka mengontrol dua garis dengan jarak 16 piksel.
Tapi mengapa tidak dua baris, tetapi empat? Ternyata matriks 64x64 terdiri dari dua matriks 32x64 independen. Mungkin untuk menghubungkan output prosesor yang terpisah untuk masing-masing, tetapi ATmega328 tidak memiliki cukup. Untungnya, pabrikan yang peduli menyediakan cascading dari matriks ini - output dari register geser dari satu dapat dihubungkan ke input yang lain. Kemudian kita mendapatkan matriks logis 32x128, yang secara fisik ditampilkan sebagai 64x64. Artinya, dalam setiap fase kita perlu mendorong dua baris 128 piksel ke dalam register - dan ini adalah 4 baris layar fisik.

Kami membuat prototipe konsol selama sekolah komputer musim panas. Game pertama adalah sesuatu yang menyerupai
Space Invaders .
Pada kenyataannya, LED benar-benar membakar mata mereka. Tidak mungkin Anda dapat menyesuaikan kecerahannya menggunakan PWM - ATmega tidak memiliki kecepatan yang cukup. Kita perlu mengambil semacam ARM atau FPGA.
Versi final yang saya rancang dalam case kayu. Layar dilindungi oleh kaca plexiglass. Karena hamburan cahaya, mata tidak lagi terbakar, tetapi sekarang lebih sulit untuk merekam karya konsol di video - seluruh gambar menjadi kabur.
Seluruh program menggunakan 1101 byte (53%) RAM dan 6432 (19%) byte ROM. Masih ada ruang untuk membuat beberapa permainan dan menu untuk pilihan mereka.
Referensi- Sumber proyek: github.com/Dovgalyuk/BackspaceInvaders
- Deskripsi matriks pada adafruit: learn.adafruit.com/32x16-32x32-rgb-led-matrix
- Pustaka manajemen matriks Adafruit: github.com/adafruit/RGB-matrix-Panel
- Perpustakaan AdWords untuk menggambar grafis primitif: github.com/adafruit/Adafruit-GFX-Library
- Proyek serupa pada prosesor yang lebih kuat: learn.adafruit.com/ledgames-beaglebone-black-64x64-led-game/overview
- Artikel ini tentang mengelola tampilan yang lebih kecil: geektimes.ru/post/275548