Lama banget gak utak-atik LED MATRIX padahal barang satu ini favorit saya sejak kuliah 20 tahun yang lalu. Kekaguman saya pada benda ini berawal saat tahun 90an saya sering diminta teman membuat LED susun menjadi tulisan tertentu dan kemudian digabung dengan IC 4017 agar menjadi efek gerak kedip kanan kiri, sayangnya karakter yg dibentuk gak bisa diubah. Dan saat saya kuliah ketemu dot matrix yang gak lain led disusun yang bisa diubah ubah tampilannya sesuai keinginan. Bahkan ingatan saya masih clink pada tahun 1998 di atas atap kampus Elektro ITS terpampang text berjalan dari Bohlam yg disusun menjadi seperti LED matrix berukuran super besar.
Tuh saya masih inget bikin generator susunan led ke bit / hex yang nantinya dimasukkan ke script atmel studio. Dulu saya pake IC legendaris ATTINY 2313 dan banyak yang belajar dari modul pembelajaran (yang saya jual paketan) dimana praktek terakhirnya bikin teks berjalan pada satu marix yang bisa dibaca disini atau versi excel disini . Kini sudah tahun 2020 saya ingin membagi ilmu nya kembali dengan format lebih jaman now menggunakan Arduino. Lanjut kumpulin bahan-bahannya yuk...
Bahan-bahan dapat disesuaikan dengan yang ada dirumah aja jangan kaku sampe harus beli (walau murah tinggal klik olshop). Rangkaian nya sangat simple karena akan menggunakan pin I/O nomer 2-8 sebagai BARIS dan pin 9-13 sebagai KOLOM dari led matrix. Sebaiknya jika bingung prinsip penyalaan LED MATRIX bisa dibaca dulu dasarnya disini.
Karena Arduino Pro Mini yg saya gunakan memakai header cowok maka sangat simple menyambungkannya ke Led Matrix dengan menggunakan kabel jumper cewek ke cewek. Tinggal colok seperti gambar dibawah. Kalau pake arduino jenis lain tinggal sesuaikan saja.
Mari kita bahas scriptnya secara mendalam..jangan sampe pusing ya ! Pegangan kalau kepala sudah muncul bintang nya..hehehe
- Penyusunan Karakter di Memori
const byte love1[5] = { 0b0011110, 0b0100001, 0b1000010, 0b0100001, 0b0011110 }; const byte love2[5] = { 0b0001100, 0b0010010, 0b0100100, 0b0010010, 0b0001100 };
Untuk menyusun karakter diatas anda butuh mengunduh software TextToBit yang saya kerasikan disini. Jadi saya ingin membuat animasi jantung berdenyut dengan 2 frame karakter yang dinyalakan bergantian (kalau mau banyak ya lebih keren juga). Jadi prinsipnya menyusun BIT sedemikian rupa agar karakter terwakili pada led dengan kombinasi 7 output BARIS (HIGH) vs 5 output KOLOM (LOW). Perhatikan gambar berikut ya ...
Dari gambar dapat dibayangkan bahwa BIT biner pada array (BARIS) diatas menunjukkan nilai 1 berarti LED NYALA dan sebaliknya. Selanjutnya akan di scanning KOLOM nya satu persatu secara cepat dan mata melihat sebagai satu gambar utuh. Karena Matrix yg kita gunakan 7x5 maka cukup menggunakan 7 bit saja per baris.
- Inisialisasi PIN I/O
#define BARIS1 2 #define BARIS2 3 #define BARIS3 4 #define BARIS4 5 #define BARIS5 6 #define BARIS6 7 #define BARIS7 8 #define KOLOM1 9 #define KOLOM2 10 #define KOLOM3 11 #define KOLOM4 12 #define KOLOM5 13 byte kolomnya[5]= {KOLOM1,KOLOM2,KOLOM3,KOLOM4,KOLOM5} ; byte barisnya[7] = {BARIS1,BARIS2,BARIS3,BARIS4,BARIS5,BARIS6,BARIS7} ; void setup() { //BARIS pinMode(BARIS1, OUTPUT); pinMode(BARIS2, OUTPUT); pinMode(BARIS3, OUTPUT); pinMode(BARIS4, OUTPUT); pinMode(BARIS5, OUTPUT); pinMode(BARIS6, OUTPUT); pinMode(BARIS7, OUTPUT); //KOLOM pinMode(KOLOM1, OUTPUT); pinMode(KOLOM2, OUTPUT); pinMode(KOLOM3, OUTPUT); pinMode(KOLOM4, OUTPUT); pinMode(KOLOM5, OUTPUT); }
Tujuan membuat array yang isinya PIN I/O untuk kolom dan baris adalah memudahkan proses geser BIT saat scanning dan penyalaan LED. Ini karena arduino menggunakan penamaan PIN sebagai Port I/O tersendiri bukan seperti Attiny dan microcontroler AVR lainnya yg PORT disesuaikan dengan register portnya masing-masing selebar 8 bit sehingga mudah melakukan operasi geser bit. Ini bedanya tukang solder yg pernah belajar microcontroller menggunakan bahasa assembly dengan yang langsung lompat menggunakan arduino. Kalau anda langsung menggunakan Arduino mungkin akan kebingungan memahaminya.
- Function Untuk Menulis Karakter
void tulis(int lama, byte *dot) { for(int a=0 ; a<lama ; a++) { for(int b=0 ; b<5 ; b++) { for( int c=0;c<5 ; c++){ if( c == b) digitalWrite(kolomnya[c],LOW ); else digitalWrite(kolomnya[c],HIGH ); } for(int d=0;d<7;d++) { digitalWrite(barisnya[d], ((1<<d) & dot[b]) >> d ); } delay(2); blank(); delay(1); } } }
Kita akan bahas baris per baris fungsi diatas agar gampang memahaminya.
void tulis(int lama, byte *dot)
Lama = waktu lama for loop dijalankan agar menunjukan lama tampilnya sebuah karakter.
*dot = Pointer ke array yang akan melewatkan 7 bit baris karakter
Terdapat 4 buah FOR LOOP yaitu :
a = Loop lama tampil sebuah karakter
b = Scanning KOLOM
c = Geser kolom (LOW)
d = Geser baris (HIGH)
Kita akan breakdown for loop C dan D :
for( int c=0;c<5 ; c++){
if( c == b) digitalWrite(kolomnya[c],LOW );
else digitalWrite(kolomnya[c],HIGH );
}
Ketika scanning kolom satu persatu maka yg bergerak adalah memberikan pin i/o sebagai LOW / 0, jadi kalau diberikan perintah secara manual akan menjadi :
if ( b == 0 ) { digitalWrite(KOLOM1, LOW); digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, HIGH); } else if ( b == 1 ) { digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, LOW); digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, HIGH); } else if ( b == 2 ) { digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, LOW); digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, HIGH); } else if ( b == 3 ) { digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, LOW); digitalWrite(KOLOM1, HIGH); } else if ( b == 4 ) { digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, HIGH); digitalWrite(KOLOM1, LOW); }
Terlalu panjang, namun mudah dimengerti dan merupakan terjemahan isi dari FOR LOOP C yang hanya 4 baris saja.
for(int d=0;d<7;d++) {
digitalWrite(barisnya[d], ((1<<d) & dot[b]) >> d );
}
For Loop D memiliki keunggulan geser bit dengan hanya sebaris script, tapi untuk memahaminya butuh penjabaran yaitu :
GESER BIT 1 : (1<<d) & dot[b]
GESER BIT 2 : >> d
Semisal nih..7 BIT baris yg akan dinyalakan adalah 0b0001100 , dimana 0 = mati , 1 = nyala. Sehingga kita perlu mengetahui bit yg sesuai dengan PIN i/o yg bersesuaian juga. Inilah hubungan kita membuat ARRAY yg berisikan nomer PIN.
Jadi dengan 7 kali loop maka kita akan tau PIN BARIS ke X itu mati atau nyala. Penejelasannya seperti berikut :
saat d=0 , maka angka 1 geser kiri sebanyak 0 kali = 0000001 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 0 kali hasilnya PIN BARIS1 = 0 /MATI
saat d=1 , maka angka 1 geser kiri sebanyak 1 kali = 0000010 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 1 kali hasilnya PIN BARIS2 = 0 /MATI
saat d=2 , maka angka 1 geser kiri sebanyak 2 kali = 0000100 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00000100, kemudian geser kanan semuanya sebanyak 2 kali hasilnya PIN BARIS3 = 1 /NYALA
saat d=3 , maka angka 1 geser kiri sebanyak 3 kali = 0001000 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00001000, kemudian geser kanan semuanya sebanyak 3 kali hasilnya PIN BARIS4 = 1 /NYALA
saat d=4 , maka angka 1 geser kiri sebanyak 4 kali = 0010000 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 4 kali hasilnya PIN BARIS5 = 0 /MATI
saat d=5 , maka angka 1 geser kiri sebanyak 5 kali = 0100000 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 5 kali hasilnya PIN BARIS6 = 0 /MATI
saat d=6 , maka angka 1 geser kiri sebanyak 6 kali = 1000000 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 6 kali hasilnya PIN BARIS7 = 0 /MATI
Seperti itulah proses geser BIT sehingga tiap LED dapat ditentukan mati dan nyalanya .
delay(2);
blank();
delay(1);
Fungsi blank mengatasi kelembaman mata yg menyebabkan efek LED berbayang (saking cepetnya ) dengan cara mematikan semua LED saat akan pindah 7 bit Baris selanjutnya
void blank ()
{
digitalWrite(BARIS1,LOW);
digitalWrite(BARIS2,LOW);
digitalWrite(BARIS3,LOW);
digitalWrite(BARIS4,LOW);
digitalWrite(BARIS5,LOW);
digitalWrite(BARIS6,LOW);
digitalWrite(BARIS7,LOW);
}
- Sedangkan untuk LOOP utama cukup singkat aja
void loop() {
tulis(10,love1);
tulis(10,love2);
}
- Hasilnya :
Selanjutnya ada fasilitas text geser kanan dan naik
Tinggal mengolah sedikit script pada tulisan sebelumnya di 2011 di link disini.
Bagaimana ? SELAMAT MENCOBA !
Terima kasih. Akhirnya ada versi. 2020. Dulu aku bikin pake avrstudio4. Ijin sedot dan berbagi buat pembelajaran ...
BalasHapus