Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

Jumat, 21 Juni 2013

Tutorial: Text berjalan 3 Led Matrix




REVISI


Setelah beberapa pembaca mengeluh karena ga bisa jalan itu script...dan saya juga bingung dibuatnya, akhirnya terdeteksi bahwa saya menggunakan script dengan ARRAY yang melebihi RAM seperti gambar berikut ini :



JADI MOHON DIMAAFKAN !!



Atas permintaan seorang pembaca blog dengan id kaskus sn0bi, kali ini kita akan bahas perancangan 3 LED MATRIX yang menggunakan ATMega 8535. Sebenernya ini adalah perpanjangan dari project LOVE HURT yang hanya menggunakan 1 buat Led Matrix. Untuk mengurangi jumlah komponen yang dipakai, maka ukuran led matrix jangan melebihi dari 2" (inch) . Untuk dapat dirancang diatas breadboard / projectboard dipilihlah led matrix berukuran 1 inch.

Bahan-bahan dan skematiknya seperti berikut ini :

klik untuk memperjelas
*) catatan : perhatikan port ISP yg digunakan 6 pin..sesuaikan dengan yg kamu gunakan



Dari skematik diatas dapat dijelaskan bahwa ATMEGA8535 menggunakan clock internal / default 1MHz dan dot/led matrix diparalel dibagian baris. Untuk scanning kolom digunakan portD 0-7 dan portC 0-6. Sebenarnya kalo dilihat dari gambar diatas, kaki-kaki ATMega masih cukup untuk 1 buah led matrix (tinggal penyesuaian di script nya saja). Scanning cukup dilakukan dengan menggeser bit (active low) dari kiri ke kanan. Secara lengkap scriptnya seperti berikut :

#define F_CPU 1000000UL //ubah sesuai clock micro
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h> 
#include <string.h>

#define cepat 8  //ubah ini untuk mengatur kecepatan scroll

//UPDATED JUNE 9 2014 ...www.aisi555.com ....

const char textset[] PROGMEM  = 
{0x30, 0x4a, 0x4a, 0x4a, 0x7c,//a
0x7f, 0x28, 0x44, 0x44, 0x38,//b
0x80, 0x38, 0x44, 0x44, 0x44,//c
0x38, 0x44, 0x44, 0x28, 0x7f,//d
0x38, 0x54, 0x54, 0x54, 0x18,//e
0x08, 0x7e, 0x09, 0x09, 0x02,//f
0x08, 0x54, 0x54, 0x54, 0x3c,//g
0x7f, 0x08, 0x04, 0x04, 0x78,//h
0x80, 0x44, 0x7d, 0x40, 0x80,//i
0x20, 0x40, 0x44, 0x3d, 0x80,//j 
0x80, 0x7f, 0x18, 0x24, 0x42,//k
0x80, 0x41, 0x7f, 0x40, 0x80,//l
0x7c, 0x04, 0x78, 0x04, 0x78,//m
0x7c, 0x08, 0x04, 0x04, 0x78,//n
0x38, 0x44, 0x44, 0x44, 0x38,//o
0x7c, 0x14, 0x14, 0x14, 0x08,//p
0x08, 0x14, 0x14, 0x14, 0x7c,//q
0x7c, 0x08, 0x04, 0x04, 0x08,//r
0x48, 0x54, 0x54, 0x54, 0x24,//s
0x80, 0x04, 0x3f, 0x44, 0x44,//t
0x3c, 0x40, 0x40, 0x20, 0x7c,//u
0x1c, 0x20, 0x40, 0x20, 0x1c,//v
0x3c, 0x40, 0x30, 0x40, 0x3c,//w
0x44, 0x28, 0x10, 0x28, 0x44,//x
0x0c, 0x50, 0x50, 0x50, 0x3c,//y
0x44, 0x64, 0x54, 0x4c, 0x44,//z
0x3e, 0x51, 0x49, 0x45, 0x3e, //0
0x80, 0x42, 0x7f, 0x40, 0x80, //1
0x42, 0x61, 0x51, 0x49, 0x46, //2
0x41, 0x41, 0x45, 0x4b, 0x31, //3
0x18, 0x14, 0x12, 0x7f, 0x10, //4
0x27, 0x45, 0x45, 0x45, 0x39, //5
0x3c, 0x4a, 0x49, 0x49, 0x31, //6
0x01, 0x71, 0x09, 0x05, 0x03, //7
0x36, 0x49, 0x49, 0x49, 0x36, //8
0x06, 0x49, 0x49, 0x29, 0x1e, //9
0x7e, 0x11, 0x11, 0x11, 0x7e, //A
0x7f, 0x49, 0x49, 0x49, 0x36, //B
0x3e, 0x41, 0x41, 0x41, 0x22, //C
0x7f, 0x41, 0x41, 0x22, 0x1c, //D
0x7f, 0x49, 0x49, 0x49, 0x41, //E
0x7f, 0x09, 0x09, 0x09, 0x01, //F
0x3e, 0x41, 0x49, 0x49, 0x7a, //G
0x7f, 0x08, 0x08, 0x08, 0x7f, //H
0x80, 0x41, 0x7f, 0x41, 0x80,//I
0x20, 0x40, 0x41, 0x3f, 0x01, //J
0x7f, 0x08, 0x14, 0x22, 0x41, //K
0x7f, 0x40, 0x40, 0x40, 0x40, //L
0x7f, 0x02, 0x04, 0x02, 0x7f, //M
0x7f, 0x04, 0x08, 0x10, 0x7f, //N
0x3e, 0x41, 0x41, 0x41, 0x3e, //O
0x7f, 0x11, 0x11, 0x11, 0x0e, //P
0x3e, 0x41, 0x51, 0x21, 0x5e, //Q
0x7f, 0x09, 0x19, 0x29, 0x46, //R
0x46, 0x49, 0x49, 0x49, 0x31, //S
0x01, 0x01, 0x7f, 0x01, 0x01, //T
0x3f, 0x40, 0x40, 0x40, 0x3f, //U
0x1f, 0x20, 0x40, 0x20, 0x1f, //V
0x3f, 0x40, 0x38, 0x40, 0x3f, //W
0x63, 0x14, 0x08, 0x14, 0x63, //X
0x07, 0x08, 0x70, 0x08, 0x07, //Y
0x61, 0x51, 0x49, 0x45, 0x43, //Z
0x80, 0x80, 0x80};//""


const char textreal[] PROGMEM= { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',' ' } ;


char blk = 0x80;
char fulltext[17] ; 
char scrolltext[500];//panjang kalimat 300 dibagi 6 (5 kolom + 1pembatas)
//UBAH besar ARRAY scroltext[XXX] sesuaikan besar RAM IC yg dipakai..
char textnya[] = "3 Led Matrix ATMega8535 AHOCOOL SurabayA 2013";


void cleartext(void)  // MEMBERSIHKAN datanya menjadi kosong
{  uint8_t i;

      
   for(i=0 ; i <20 ; i++)
     { fulltext[i] = 0 ; }  

}


void convert_text(char *texte)
{

uint8_t a,b,max_text;
int c,d;

char dummy[1];

max_text=strlen(texte);

for(a=0 ; a<max_text; a++)

  {    
      for(b=0;b<65;b++)  // maximum jumlah definisi text di database array
     
   {
            strncpy_P(dummy,&textreal[b],1);
         
   if ( texte[a] == dummy[0]) break; 

   }
      
        d=b*5;          
      
      if(dummy[0] != ' ') for(c=d; c<d+5; c++) strncat_P(scrolltext,&textset[c],1); //spasi
      else  for(c=d; c<d+3; c++) strncat_P(scrolltext,&textset[c],1);
      
   strncat(scrolltext,&blk,1);
  }

}


void tulis_text(void)
{
uint8_t a;
int b,speed;

a=0;
speed=5;//UBAH NILAI speed sesuai keinginan dan kedip led


 
 while(a<16)

  {
 
 
for(b=0;b<speed;b++ ) 
{
    
 if(a<8 ) 
 
 {
    
 
 PORTD = ~(1<<a) ;
 PORTC =0b11111111;

 }
  
  else
 {
    
    PORTC = ~(1<<(a-8)) ;
 PORTD =0b11111111;
 
 }

 PORTA=fulltext[a];
 _delay_us(60);   

    PORTA=0x80;  //biar tidak berbayang


  }



 a++;
  } 


   
  }


void scrol(char *scrtxt)
{  uint8_t q,r,step =0;
   int maxstep;

    maxstep = (strlen(scrtxt) * 6) ;
   
    convert_text(scrtxt);
     

  while(step < ( maxstep + 30)   )
   {
  if(step < 15)
       {
        
     for(q=0; q <(16-step) ; q++ )       
               
  {   fulltext[q]= 0x80;      }
  
     for(q=(15-step); q <16 ; q++ )       
  {   fulltext[q]=scrolltext[q - 15 + step];    }
            
 for(r=0;r<cepat;r++) tulis_text(); 


  }  
       

  else if( step > (maxstep + 15 ) )
     {


     for(q=0; q <(maxstep + 30 - step) ; q++ )       
  {   fulltext[q]=scrolltext[step -15 + q];    }

  for(q=(maxstep + 30 - step); q <16 ; q++ )       
               
  {   fulltext[q]= 0x80;      }
          
        for(r=0;r<cepat;r++) tulis_text();   
        }


    else
 {

     for(q=0; q <16 ; q++ )       
  {   
  
  fulltext[q]=scrolltext[q + step -15];   
  
   }
            
  for(r=0;r<cepat;r++) tulis_text();  


  }  
      

 
 
  
      
   step++;
 
 
   }




}


int main(void)
{
 //bagian ini sesuaikan dengan port micro yg kamu gunakan
  DDRA = 0b11111111; // portA = data text dot matrix
  DDRC = 0b11111111; //scanning kolom
  DDRD = 0b11111111; //scanning kolom
  
  

 while(1)
  {
     scrol(textnya);  
     cleartext();


  }



 
 

 
return 0;
}

proses geser-geser yang terpenting adalah bagian berikut :

Scanning kolom  :

void tulis_text(void)
{
uint8_t a;
int b,speed;

a=0;
speed=20;//UBAH NILAI speed sesuai keinginan

while(a<16)
  {
  
for(b=0;b<speed;b++ ) 
{
if(a<8 ) 
{
PORTD = ~(1<<a) ;
PORTC =0b11111111;

}
  else
{  
 PORTC = ~(1<<(a-8)) ;
PORTD =0b11111111;
}
PORTA=fulltext[a];
_delay_us(300);   

    PORTA=0x80;  //biar tidak berbayang
  }

a++;

}


Dari script scanning  diatas dapat dilihat script   PORTD = ~(1<<a) ; yang berfungsi untuk menegasi pergeseran bit 1 menjadi active low. Jika menggunakan 4 buah matrix maka dialkukan penyesuaian kondisi if ketika port nya loncat ke seri port yg berbeda.


Geser Kiri :

void scrol(char *scrtxt)
{  int q,step =0;
   int maxstep;

  maxstep = (strlen(scrtxt) * 6) ;
convert_text(scrtxt); 

  while(step < ( maxstep + 30)   )  //30 = 15 awal + 15 akhir 
   {
if(step < 15)   //start awal
       {
    
   for(q=0; q <(16-step) ; q++ )   
               
{   fulltext[q]= 0x80;      }
   for(q=(15-step); q <16 ; q++ )   
{   fulltext[q]=scrolltext[q - 15 + step];  }
tulis_text(); 
}  
else if( step > (maxstep + 15 ) )    //akhir kalimat
   {
   for(q=0; q <(maxstep + 30 - step) ; q++ )   
{   fulltext[q]=scrolltext[step -15 + q];  }

for(q=(maxstep + 30 - step); q <16 ; q++ )   
               
{   fulltext[q]= 0x80;      }       
      tulis_text();
        }
    else
{

   for(q=0; q <16 ; q++ )   
{   
fulltext[q]=scrolltext[q + step -15]; // ditengah-tengah 
}         
tulis_text(); 
}  
 step++;

   }
}


Bagian terpenting adalah ketika memberikan efek kosong pada awal dan akhir dari urutan kalimat. Variable "maxstep" merupakanjumlah step scanning kolom maksimum dari kalimat, sedangkan variable "step" adalah langkah pergeseran. Untuk 3 buah matrix maka terdapat 15 step scanning kolom pada setiap kali penampilan huruf di matrix. Jadi jika menggunakan 4 matrix cukup merubah unsur penghitungan kolom yang ditampilkan saja (step = 20). Untuk geser atas atau animasi lainnya dapat dikreasikan dari project love hurt.

Hasil dari project ini yang dilakukan rekan sn0bi dari makasar seperti pada video berikut :




seperti biasa, jika ingin membeli bahan-bahannya bisa lewat aku, atau paket belajarnya di "custom" dengan 3 led matrix ? bisa...harga nego via contact aku ya...

SELAMAT MENCOBA
Share:

15 komentar:

  1. mas mau tanya untuk pin kolom dan barisnya dijadikan satu atau satu-satu untuk tiap pinnya?

    BalasHapus
  2. untuk baris yang berjumlah 7 buah di paralel, sedangkan untuk kolom coba perhatikan di skematik...kolomnya masing-masing mendapatkan satu kaki ke pin micro

    BalasHapus
  3. gan saya mau nanya masukin scriptnya dimana ya

    BalasHapus
  4. Baca tutorial dasar microcontroller dulu broo...di menu ata ada tuhh

    BalasHapus
  5. Mas Nyoman, kalo untuk Kursus membuat running teks seperti diatas bisa ga?
    aal_and@yahoo.co.id

    BalasHapus
  6. mas, kalo running text yang scanning kolomnya pake ic 74ls164 ada ngak

    BalasHapus
  7. mas, kok saya running di matrix nya ga jelas tampilannya ya

    BalasHapus
  8. Mas sya mw pesen gmn cr nya

    BalasHapus
  9. KOMPONENNYA apa aja sama jumlahnya brapa ? terus rangkaian LED nya gimana? yg di atas rangkaian running textnya kan ? mohon pencerahannya :)

    BalasHapus
  10. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  11. mas riza anda kurang beruntung ...

    BalasHapus
  12. Pakai bahasa C ++ ta gan??maaf,masih awl belajar....

    BalasHapus

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (8) arduino (25) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (58) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (5) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (17) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika