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.
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 Nano | Matriks 8x8 |
PIN 12 | PIN DIN |
PIN 11 | PIN CLK |
PIN 10 | PIN CS |
PIN 5V | PIN 5V |
PIN GND | PIN 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:
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.
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.
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.