Ponsel dan gadget

Ponsel dan gadget

» Kontrol matriks 8x8

Kontrol matriks 8x8


Cina menyediakan dengan harga kecil sejumlah besar tidak hanya perangkat elektronik, tetapi juga komponennya. Sejumlah kecil dioda pemancar cahaya dapat menampilkan informasi yang Anda butuhkan, mungkin angka, karena resolusinya tidak terlalu tinggi, 8 kali 8 LED, setiap diameter 3 mm. Matriks ini bersinar dalam warna merah, karena ini adalah yang paling terlihat dan menarik perhatian lebih dari warna lain.


Paling mudah menggunakan matriks ini untuk mengontrol Arduino karena bersifat digital. Jika Anda menulis program sederhana, Anda dapat menampilkan informasi yang diperlukan pada "layar" LED ini. Ada matriks tiga warna yang lebih mahal yang dijual, di mana dengan menggabungkan tiga warna utama Anda dapat membuat hampir semua warna.


Matriks ini memiliki 16 pin, diagram disediakan di atas, yang dengan jelas menunjukkan bagaimana komponen dasar matriks terhubung - LED, dipandu olehnya, Anda dapat menghubungkan modul dengan benar untuk mereproduksi informasi oleh perangkat digital dan analog. Jangan lupa tentang resistor pembatas saat ini, akan menyedihkan jika ada piksel yang terbakar. Nilai arus kontinu satu titik sama dengan 20 mA, arus maju puncak 100 mA, tegangan suplai 2.1-2.1V, panjang gelombang 625-630 nm, disipasi daya maksimum adalah 40 mW, anoda umum di sini, yaitu plus. Dimensi keseluruhan dari matriks LED 37 di 37 di 8 mm. Anda perlu menyolder dengan hati-hati, jangan menyentuh besi solder dengan suhu 260 derajat selama lebih dari 5 detik, suhu operasi yang disarankan adalah -40 - +70 Celcius.

Jika Anda memiliki beberapa matriks seperti itu pada LED, Anda dapat menghubungkannya untuk membuat papan informasi besar.

Tampilan matriks - perangkat yang terdiri dari matriks LED 8x8 dan papan kontrol berdasarkan chip MAX7219 dengan perpipaan minimum yang diperlukan. Dalam foto Anda sudah dapat melihat perangkat yang sudah jadi, tetapi itu datang kepada saya melalui surat dalam formulir ini, jadi saya harus mengambil besi solder dan menyolder semuanya dengan cara yang benar.

Koneksi dasar ke papan Arduino Nano ditunjukkan pada diagram sirkuit.

Seperti yang Anda lihat dari diagram, semuanya sederhana, Anda hanya perlu menghubungkan kontak kedua papan dengan kabel dalam urutan berikut:

Arduino NanoMatriks 8x8
PIN 12PIN DIN
PIN 11PIN CLK
PIN 10PIN CS
PIN 5VPIN 5V
PIN GNDPIN GND

Jadi, akhirnya saatnya bekerja dengan kode, dan untuk menjalankan matriks LED, Anda perlu mengunduh dan menginstal pustaka LedControl. Perpustakaan mendukung sirkuit mikro MAXIM 7221 dan 7219. Matriks LED menggunakan MAX7219 sebagai driver, inilah yang kami butuhkan. Saya pikir kita harus mulai dengan sketsa kecil yang menunjukkan fungsi dasar perpustakaan ini. Dalam sketsa, fungsi setRow() digunakan untuk menghidupkan/mematikan LED. Sintaks untuk memanggil fungsi setRow() adalah:

matrix.setRow(0, baris, col, set);

Di mana matriks- objek kelas Kontrol LED

0 - alamat perangkat pada bus SPI, dalam hal ini hanya ada satu perangkat, dan penomoran dimulai dari alamat nol

baris- baris(Nilai yang mungkin dari 0 hingga 7)

col- kolom (Nilai yang mungkin adalah dari 0 hingga 7)

mengatur- nilai pengaturan ( BENAR- nyalakan, Salah- mematikan)

matrix.setRow(0, 1, 4, benar)

Nyalakan LED pada matriks yang terletak di baris ke-1 dan di kolom ke-4.

Contoh lain:

int x = 1;

int y = 4;

matrix.setRow(0, x, y, benar);

matrix.setRow(0, x, y, salah);

Hal yang sama hanya dengan penggunaan variabel, dan selanjutnya mematikan LED yang menyala pada koordinat yang diberikan. Jadi, dalam sketsa, beberapa animasi dimainkan menggunakan fungsi setRow().

#include "LedControl.h" //Sintaks untuk membuat kelas LedControl(dataPin,clockPin,csPin,numDevices) //Di mana LedControl adalah objek kelas //dataPin adalah pin pada papan Arduino yang akan digunakan oleh pin DIN terhubung //clockPin adalah pin pada board Arduino yang akan dihubungkan dengan pin CLK //csPin - pin pada board Arduino yang akan dihubungkan dengan pin CS //numDevices - jumlah perangkat pada bus / /Buat objek kelas matriks dalam kasus kami dengan satu perangkat yang terhubung matriks LedControl = LedControl(12, 11 , 10, 1); //Waktu tunda untuk menyalakan/mematikan LED pada matriks const int delayValue = 100; //Prototipe fungsi // Hidup/mati berurutan void PointSerialSet(); //Snake dari kanan ke kiri void PointRigthToLeft(); //Ular dari bawah ke atas kosong PointDownToUp(); //Ular dari kiri ke kanan batal PointLeftToRigth(); //Ular dari atas ke bawah void PointUpToDown(); //Efek - pulsa yang memudar void PointFading(); //Efek - pulsa kosong PointPulse(); //Effect - impuls yang tumbuh void PointClimbing(); //Efek memutar spiral di dalam void PointToSpiralIn(); //Efek memutar spiral ke luar void PointToSpiralOut(); void setup() ( // Perangkat dengan alamat 0 bangun secara default matrix.shutdown(0, false); //Mengatur kecerahan matriks Led ke 8 //Nilai yang mungkin adalah dari 0 hingga 15 matrix.setIntensity( 0, 8) ; //Hapus tampilan matrix.clearDisplay(0); ) void loop() ( //Memanggil fungsi satu per satu PointSerialSet(); PointRigthToLeft(); PointDownToUp(); PointLeftToRigth(); PointUpToDown(); PointFading (); PointPulse() ; PointClimbing(); PointToSpiralIn(); PointToSpiralOut(); ) //Badan fungsi void PointSerialSet() ( //Gunakan fungsi setLed(alamat, baris, kolom, set) //Pengaktifan berurutan oleh baris untuk(int i = 0; i< 8; i ++) { for(int j = 0; j < 8; j ++) { //Включить светодиод matrix.setLed(0, i, j, true); delay(delayValue); //Выключить светодиод matrix.setLed(0, i, j, false); } } } void PointRigthToLeft() { //Используем функцию setLed(address, row, col, set) //Змейка справа - налево for(int i = 7; i >= 0; i --) ( for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); ) else ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) ) ) ) void PointDownToUp() ( //Gunakan fungsi setLed(address, row, col, set) //Snake dari bawah ke atas untuk (int i = 7; i >= 0; i --) ( for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, i, n, true); delay(delayValue); matrix.setLed(0, i, n, false); ) else ( matrix.setLed(0, i, j, true); delay(delayValue); matrix.setLed(0, i, j, false); ) ) ) ) void PointLeftToRigth() ( //Gunakan fungsi setLed(alamat, baris, col, set) //Snake dari kiri ke kanan untuk (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); ) else ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) ) ) ) void PointUpToDown() ( //Gunakan fungsi setLed(address, row, col, set) //Snake dari atas ke bawah untuk (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, i, n, true); delay(delayValue); matrix.setLed(0, i, n, false); ) else ( matrix.setLed(0, i, j, true); delay(delayValue); matrix.setLed(0, i, j, false); ) ) ) ) void PointFading() ( //Gunakan fungsi setLed(address, row, col, set) //Fading effect int upValue = 0 ; int downValue = 7; untuk(int i = 0; i< 8; i ++) { if(i % 2) { for(int n = downValue; n >= nilai naik; n --) ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) downValue --; ) else ( for(int j = upValue; j< downValue + 1; j ++) { matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); } upValue ++; } } } void PointClimbing() { //Используем функцию setLed(address, row, col, set) //Эффект затухания int upValue = 4; int downValue = 4; for(int i = 0; i < 8; i ++) { if(i % 2) { for(int n = downValue; n >= nilai naik; n --) ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) downValue ++; ) else ( for(int j = upValue; j< downValue + 1; j ++) { matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); } upValue --; } } } void PointPulse() { //Используем функцию setLed(address, row, col, set) //Эффект пульса for(int i = 0; i < 8; i ++) { if(i == 4) { for(int climb = i; climb >= 0; memanjat --) ( matrix.setLed(0, climb, i, true); delay(delayValue / 4); matrix.setLed(0, climb, i, false); ) for(int fade = 1; fade< 8; fade ++) { matrix.setLed(0, fade, i, true); delay(delayValue / 4); matrix.setLed(0, fade, i, false); } } else { matrix.setLed(0, 4, i, true); delay(delayValue); matrix.setLed(0, 4, i, false); } } } void PointToSpiralIn() { //Используем функцию setLed(address, row, col, set) //Эффект спирали внутрь int lengthX = 8; // Ширина матрицы int lengthY = 8; // Высота матрицы int pointX = 0; int pointY = 0; int dir = 0; // Направление (0 - вправо, 1 - вниз, 2 - влево, 3 - вверх) int offset = 0; // Смещение // Перебираем всю матрицу for (int i = 0; i < lengthX * lengthY; i++) { matrix.setLed(0, pointY, pointX, true); delay(delayValue); matrix.setLed(0, pointY, pointX, false); if(dir == 0) { pointX ++; if(pointX >= panjangX - 1 - offset) ( dir = 1; ) lanjutkan; ) if(dir == 1) ( pointY ++; if(pointY ><= offset) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset + 1) { dir = 0; offset ++; pointY = offset; } continue; } } } void PointToSpiralOut() { //Используем функцию setLed(address, row, col, set) //Эффект спирали внаружу int lengthX = 8; // Ширина матрицы int lengthY = 8; // Высота матрицы int pointX = 3; //начать с этих координат int pointY = 3; //начать с этих координат int dir = 0; // Направление (0 - вправо, 1 - вниз, 2 - влево, 3 - вверх) int offset = 3; // Смещение // Перебираем всю матрицу for (int i = 0; i < lengthX * lengthY; i++) { matrix.setLed(0, pointY, pointX, true); delay(delayValue); matrix.setLed(0, pointY, pointX, false); if(dir == 0) { pointX ++; if(pointX >= panjangX - 1 - offset) ( dir = 1; ) lanjutkan; ) if(dir == 1) ( pointY ++; if(pointY >= lengthY - 1 - offset) ( dir = 2; ) lanjutkan; ) if(dir == 2) ( pointX --; if(pointX<= offset - 1) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset - 1) { dir = 0; offset --; pointY = offset; } continue; } } }

Video sketsanya:


Harap aktifkan javascript agar komentar berfungsi.

Artikel ini dibuat untuk mereka yang membeli matriks 8x8 telanjang dan register geser 74hc595 dan tidak tahu bagaimana menghubungkan semuanya.

Saya mencari di Internet untuk waktu yang lama untuk instruksi tentang cara menghubungkan komponen-komponen di atas, tetapi saya menemukan bukan untuk register saya atau dengan sketsa yang tidak berfungsi, jadi saya memutuskan bahwa saya masih harus bekerja dengan tangan dan kepala untuk menyenangkan diri sendiri. dengan 8*8 gambar.

Setelah menemukan lembar data untuk matriks dan register geser di Internet, saya menggambar diagram berikut:

Kaki ke-12 dari kedua sirkuit mikro (pin kait), untuk menyimpan port adalah umum, karena tidak masuk akal untuk mengunci register pada waktu yang berbeda. Beberapa pin matriks (anoda) dihubungkan melalui resistor pembatas arus dengan nilai nominal 220 ohm. Segala sesuatu yang lain sesuai dengan skema sangat sederhana. Untuk jaga-jaga, gambar dengan pinout dari matriks.

Gambar harus ditampilkan baris demi baris (jika tidak dengan matriks serupa tidak mungkin), dengan penundaan kecil (mata manusia praktis tidak membedakan antara penundaan 1 ms).

Saya mencoba menjelaskan semuanya dalam sketsa. Saat mengupload ke board, tampilan akan menunjukkan angka yang akan kita kirim ke monitor port arduino (lihat video)

Foto perangkat yang sudah jadi (zigzag di layar, dalam sketsa gambarnya disimpan dalam array pic)

Kedepannya saya akan mencoba melakukan sesuatu yang menarik pada tampilan ini.

Akhirnya, modul matriks tiba dari China. Setiap modul terdiri dari chip MAX7219 (), matriks LED, satu kapasitor, dan satu resistor berada di harness.


Dikendalikan oleh MAX7219 melalui antarmuka SPI.


Sirkuit mikro dalam sebuah cluster dihubungkan secara seri. Saya membaca di Internet bahwa koneksi serial maksimum yang memungkinkan hanya memungkinkan 8 buah MAX7219. Jangan percaya. 16 modul terhubung, dan semuanya berfungsi dengan baik.

Modul yang disajikan pada Ali datang dalam beberapa versi. Yang paling populer adalah 2 jenis: dengan sirkuit mikro dalam DIP dan dalam paket SOIC. Modul chip DIP lebih besar dan tidak nyaman saat terhubung dalam sebuah cluster. Anda harus menghubungkan banyak kabel.


Modul dengan chip dalam paket SOIC berukuran matriks LED dan dihubungkan dengan solder atau jumper. Ternyata bagus dan rapi.


Library yang paling terkenal untuk bekerja dengan matriks dan cluster adalah MAX72xx Panel oleh Mark Rice dan Parola oleh MajicDesigns: Pustaka pertama lebih mudah digunakan, yang kedua lebih kompleks dengan lebih banyak fitur. Saya akan menuliskannya lebih detail.

MAX72xx Panel

Instalasi perpustakaan diperlukan saat menggunakan Panel MAX72xx Adafruit GFX.

Untuk Russify teks, Anda harus mengunduh FILE INI dan ganti file glcdfont.c default di direktori Arduino/Libraries/Adafruit-GFX-Library-master. Juga dalam file ini, selain huruf dan angka yang diperlukan, banyak jenis karakter dijelaskan. Tidak semuanya mungkin berguna. Gambar di bawah ini menjelaskan bagaimana simbol terbentuk.

Jika perlu, Anda dapat membuat simbol Anda sendiri dan menggantinya dengan simbol yang tidak digunakan dalam file. Hampir semua font bitmap yang digunakan di berbagai perpustakaan dibentuk dengan cara ini.

Jadi, MAX72xx Panel dan Adafruit GFX library diinstal, file glcdfont.c diganti. Luncurkan Arduino IDE, buka MENGAJUKAN. Ada fungsi utf8rus dalam sketsa. Ini menyediakan pengodean ulang tabel karakter untuk bahasa Rusia. Ini hanya diperlukan untuk output normal dari program, yaitu, dalam program, teks yang diinginkan ditulis dalam bahasa Rusia. Jika teks dimasukkan melalui port COM, maka kode karakter diperbaiki dalam fungsi Serial_Read. Di IDE dan di konsol, pengembang menggunakan pengkodean yang berbeda.

Di awal file ada baris yang diperlukan agar perpustakaan berfungsi.

int numberOfHorizontalDisplays = 1;

int numberOfVerticalDisplays = 16;

Saya memiliki modul dengan chip dalam paket SOIC. Mereka memiliki fitur kecil. Matriks modul dipasang diputar 90 derajat. Ini adalah biaya kenyamanan. Jika Anda menjalankan sketsa yang disertakan dengan perpustakaan, mereka akan menampilkan teks dari bawah ke atas di setiap modul. Teks akan ditampilkan dalam zigzag. Untuk mengobati penyakit ini, perpustakaan perlu "diberitahu" bahwa ada 16 tampilan vertikal (secara fisik terletak secara horizontal). Dan kemudian di void Setup tentukan baris untuk perpustakaan

matrix.setRotation(matrix.getRotation() + 1);

Ini secara terprogram akan membalik setiap matriks. Dan semuanya akan ditampilkan secara normal.

Modul dengan paket chip DIP tidak memiliki ini. Semuanya indah, kecuali seikat kabel.

Pustaka Panel MAX72xx agak sederhana. Tidak ada efek keluaran visual. Cluster dianggap sebagai satu kesatuan. Segalanya jauh lebih baik dengan MD Parola.

Parola oleh MajicDesigns.

Pemilik modul dengan chip dalam paket SOIC juga akan menghadapi masalah orientasi modul dalam sebuah cluster. Hanya saja tampilannya sedikit berbeda dengan di MAX72xx. Di sini, modul akan muncul, seolah-olah, tidak pada tempatnya.


Sketsa HelloWorld dari sampel yang disertakan dengan perpustakaan.

Secara terprogram dalam sketsa, saya tidak dapat menyembuhkan penyakit ini. Aku memperlakukannya berbeda. Dalam file Adruino/libraries/MD_MAX72xx_lib.h di akhir Anda perlu menemukan garis seperti pada gambar.


Dan perbaiki baris yang dipilih terpilih 1 ke 0. Simpan file. Arduino IDE tidak perlu direstart. Kami menuangkan, kami melihat.


Sekarang Anda dapat menggunakan 24 efek animasi. Animasi dimulai dengan perintah P.displayText(“Text to display”, “text alignment”, speed, display delay, fade-in effect, fade-out effect). Seperti yang Anda lihat, ada banyak pengaturan.

Dan yang paling disenangi adalah pembagian cluster menjadi zona virtual. Bekerja dengan zona tidak terlalu sulit. Saya tidak memposting sketsa, itu ada dalam sampel yang disertakan dengan perpustakaan. Sekarang Anda dapat menampilkan jam di awal cluster dan ticker berita pada modul yang tersisa tanpa masalah, hampir.

Seperti yang mungkin sudah Anda tebak, masalahnya ada pada huruf Cyrillic. Dia juga bisa dipecahkan. Di sebelah file sebelumnya di direktori yang sama adalah file MD_MAX72xx_font.cpp. Ini adalah file font. Karakter di dalamnya dibentuk mirip dengan file font GFX perpustakaan. Ada sedikit perbedaan. Di sini ukuran karakter bisa kurang dari 5 poin. Di perpustakaan Adafruit GFX, tanda seru, misalnya, mengambil 5 titik yang sama dengan lebar simbol lainnya, hanya satu baris titik yang digunakan. Sisanya tidak bersinar, tetapi digunakan sebagai simbol. Di Parola, tanda seru yang sama juga menempati satu baris titik, hanya saja tidak ada titik kosong di dekatnya, tetapi karakter yang berdekatan bisa. Akan lebih jelas untuk memahami gambar.


Tidak ada waktu untuk melengkapi file dengan karakter Cyrillic yang mirip dengan file dari perpustakaan yang dipertimbangkan pertama. Jika seseorang melakukan ini dan mengirimi saya file, saya akan menambahkannya ke artikel ini, dan saya dan tamu situs saya akan berterima kasih kepada Anda.

Hasil. Pustaka Panel MAX72xx oleh Mark Rice mudah digunakan dan dipahami, tetapi dengan fungsionalitas yang buruk.

Pustaka Parola dari MajicDesigns lebih kompleks dan memiliki kemampuan yang cukup untuk hampir semua aplikasi.

Dalam pelajaran sebelumnya, kita belajar dengan bantuan register geser. Ini ternyata sedikit lebih sulit daripada langsung dari pin tujuan umum. Masalah yang kemudian harus kami pecahkan adalah terbatasnya jumlah output terkontrol pada pengontrol Arduino. Puncak penelitian kami adalah penggunaan indikasi dinamis untuk. Sekarang saatnya untuk sedikit memperumit tugas: kita belajar bekerja dengan matriks LED.

1. Indikator matriks

Seperti yang telah kita ketahui, indikator segmen, apakah itu skala atau angka, terdiri dari masing-masing LED yang terhubung bersama. Misalnya, sekelompok LED mungkin memiliki semua katoda yang terhubung. Indikator semacam itu memiliki catatan tambahan "dengan katoda umum", jika tidak - "dengan anoda umum". Dan apa yang akan terjadi jika kita menempatkan LED tidak dalam bentuk angka atau skala, tetapi dalam bentuk kotak? Ini akan menjadi indikator yang cukup grafis. Artinya, di mana Anda tidak hanya dapat menampilkan angka, tetapi juga beberapa jenis gambar. Kisi seperti itu disebut indikator matriks, dan dalam kasus LED, matriks LED. Resolusi indikator matriks adalah jumlah titik horizontal dan vertikal. Misalnya, indikator yang paling umum memiliki resolusi 8x8 piksel. Jika matriks LED resolusi lebih tinggi diperlukan, maka matriks itu hanya terdiri dari beberapa indikator 8x8. Bagaimana melakukan ini, kita akan lihat nanti. Sementara itu, mari kita cari tahu bagaimana semua 64 LED di dalam matriks terhubung. Tentu saja, akan mungkin, seperti dalam kasus indikator tujuh segmen, untuk menghubungkan semua LED dengan katoda atau anoda umum. Dalam hal ini, kita membutuhkan 64 pin pengontrol atau 8 register geser. Kedua opsi ini sangat boros. Pilihan yang lebih tepat adalah menggabungkan LED menjadi kelompok 8 buah dengan katoda umum. Biarkan ini menjadi kolom dari matriks. Kemudian, LED paralel di kolom ini digabungkan lagi menjadi kelompok 8 buah yang sudah dengan anoda umum. Anda mendapatkan skema berikut:
Misalkan tugasnya adalah menyalakan LED R6C3. Untuk melakukan ini, kita perlu menerapkan level sinyal tinggi ke pin R6, dan menghubungkan pin C3 ke ground. Tanpa mematikan titik ini, mari kita coba menyalakan yang lain - R3C7. Hubungkan pin daya positif ke R3 dan ground ke C7. Tetapi dalam kasus ini, baris R6 dan R3 akan berpotongan dengan kolom C3 dan C7 bukan di dua tempat, tetapi di empat tempat! Akibatnya, bukan dua, tetapi empat poin akan menyala. Masalah! Jelas, hal yang sama dapat membantu. Jika kita mengaktifkan titik R6C3 dan R3C7 secara bergantian dengan sangat cepat, kita dapat menggunakan kegigihan penglihatan - kemampuan untuk menafsirkan gambar yang berubah dengan cepat secara keseluruhan.

2. Matriks LED dan register geser

Dalam pelajaran kita, kita akan menghubungkan matriks LED merah 8 × 8 paling sederhana ke Arduino Uno. Penomoran pin dimulai dari pojok kiri bawah. Pada saat yang sama, penomoran kaki 1-16 tidak dihubungkan oleh logika apa pun dengan penomoran kolom dan baris C dan R.
Berfokus pada pelajaran tentang indikasi dinamis, mari kita coba menggunakan register geser 8-bit dalam skema kontrol indikator matriks. Kami menghubungkan satu register ke output indikator yang bertanggung jawab untuk kolom, dan yang kedua ke output baris. diagram sirkuit
Catatan penting #1. Resistor dalam rangkaian ini harus berada pada jalur yang berasal dari register geser pertama. Register geser ini bertanggung jawab atas kolom. Dengan koneksi ini, setiap resistor akan mengatur arus hanya untuk satu LED pada setiap langkah dari algoritma dinamis. Oleh karena itu, semua LED akan menyala secara merata. Catatan penting #2. Diagram di atas hanya untuk tujuan informasi. Akan lebih tepat untuk memasukkan sirkuit mikro daya tambahan di celah antara register kedua dan matriks, misalnya, rakitan transistor ULN2003.

3. Program

Biar lebih seru, coba sorot smiley di indikator. Seperti yang telah disebutkan, untuk menampilkan gambar pada matriks, kami akan menggunakan indikasi dinamis. Yaitu, kita akan menyorot gambar kita baris demi baris. Pertama, kami menyalakan kolom yang diperlukan di baris paling atas, lalu di baris kedua, ketiga, dan seterusnya untuk semua 8 baris. Register geser pertama akan bertanggung jawab untuk kolom, dan yang kedua untuk baris. Oleh karena itu, output dari sebuah string akan terdiri dari dua penulisan berturut-turut ke register: pertama kita melewati kode string, lalu kode titik-titik dalam string ini. Dalam program ini, kami juga akan menggunakan versi akselerasi dari fungsi digitalWrite. Hal ini diperlukan agar proses indikasi dinamis dapat berjalan dengan sangat cepat. Jika tidak, kita akan melihat kedipan matriks yang nyata. Sumber const byte data_pin = PD2; const byte st_pin = PD3; const byte sh_pin = PD4; tm panjang yang tidak ditandatangani, next_flick; const unsigned int to_flick = 500; baris byte = 0; const byte data = ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b00111100 ); void latchOn()( digitalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(byte d)( for(char i=0; i<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<next_flick)( next_flick = tm + to_flick; baris++; if(baris == 8) baris = 0; // berikan kode baris fill(~(1<<(7-line))); // зажигаем точки в строке № line fill(data); // открываем защелку latchOn(); } } Основная часть этой программы, включая переменные data_pin, sh_pin, st_pin, next_flick, to_flick dan fungsi mengisi sudah kita ketahui dari pelajaran tentang dan tentang. Himpunan data menyimpan delapan baris gambar kita. Untuk menghemat memori, kami mencatat setiap kombinasi titik dalam bentuk biner. Fungsi latchOn membuka kunci register. Ini hanya boleh dilakukan setelah kedua register geser telah diisi. Setelah memuat program di Arduino, smiley akan muncul di indikator.

4. Animasi pada matriks LED

Dan sekarang kita akan menyelesaikan program sedemikian rupa sehingga gambar pada indikator berubah setiap setengah detik. Untuk melakukan ini, mari kita ingat lagi. const byte data_pin = PD2; const byte st_pin = PD3; const byte sh_pin = PD4; unsigned long tm, next_flick, next_switch; const unsigned int to_flick = 500; const unsigned long to_switch = 500000; baris byte = 0; bingkai byte = 0; konstanta byte data = ( ( 0b001111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b001111100 ), ( 0b001111100, 0b01000010, 0b10100101, 0b10000001, 0b10000001, 0b10111101, 0b00111000010 )); void latchOn()( digitalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(byte d)( for(char i=0; i<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<next_flick)( next_flick = tm + to_flick; baris++; if(baris == 8) baris = 0; isi(~(1<<(7-line))); fill(data); latchOn(); } tm = micros(); if(tm >next_switch)( next_switch = tm + to_switch; frame = !frame; ) ) Kami memuat program Arduino dan mengamati hasilnya.

5. Penskalaan matriks LED

Matriks LED 8x8 cocok untuk menampilkan dua angka atau karakter sederhana. Jika Anda ingin menampilkan beberapa gambar yang kurang lebih berguna pada indikator, Anda perlu menggabungkan matriks. Hal ini dilakukan dengan menambahkan register geser baru baik secara vertikal maupun horizontal. Perlu dicatat bahwa kecepatan pengontrol Arduino Uno dalam hubungannya dengan register geser hanya cukup untuk tampilan 16 × 16. Meningkatkan ukuran tampilan LED lebih jauh akan menghasilkan kedipan yang nyata.

Tugas

  • Hipnose. Program pengontrol sedemikian rupa sehingga lingkaran konsentris dengan radius yang terus meningkat muncul pada matriks LED dengan periode 1 detik.
  • Permainan ular. Terapkan permainan terkenal seperti ular pada matriks LED 8x8. Perlu menambahkan empat tombol ke sirkuit untuk mengontrol arah gerakan, serta bel untuk memberi sinyal acara makan apel (atau apa pun yang dimakan ular di sana ...).
  • Tingkat elektronik. Tambahkan akselerometer ke sirkuit. Tulis program yang akan menampilkan titik pada matriks LED, yang koordinatnya bergantung pada kemiringan seluruh perangkat. Misalnya, ketika perangkat dipasang sejajar dengan tanah (tegak lurus terhadap vektor gravitasi), maka titiknya berada di tengah. Ketika level elektronik dimiringkan ke kiri, titik secara proporsional bergeser ke kanan.

Kesimpulan

Setelah merakit sirkuit kontrol matriks, banyak yang mungkin memiliki pertanyaan: "Tidak adakah yang menemukan cara yang lebih sederhana untuk bekerja dengan matriks dalam 30 tahun?" Sebenarnya, mereka sudah mengetahuinya. Ada sirkuit mikro khusus untuk bekerja dengan berbagai jenis tampilan, termasuk untuk bekerja dengan matriks LED. Dalam salah satu pelajaran berikut, kita akan mempelajari cara mengontrol indikator menggunakan chip MAX7219. Metode ini akan memungkinkan kita untuk dengan mudah menggabungkan beberapa matriks dengan satu layar besar, tanpa perlu terlalu memperumit rangkaian listrik.