Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Ayo Migrasi TV Digital

    Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Kamis, 27 Juni 2013

Tutorial : Membuat RTC internal pada AVR


Real Time Clock mempunyai fungsi sebagai pewaktu stand-alone yang akan hidup walaupun rangkaian utama mati. Jadi pada intinya informasi waktu akan tersedia kapanpun diinginkan. Sadarkah kamu kalau RTC yg umum dipasaran seperti DS1307 (serial) atau 12C887 (parallel) memiliki note ini pada datasheet ?



Nah...untuk itu kita kembali review ke posting yang membahas mengenai timer/counter disini . Semua fungsi timer dapat dihasilkan oleh sebuah IC AVR. Tingkat akurasi? asal programmingnya tidak menggunakan delay manual dan proses interupt dijaga sesimple mungkin maka sesuai pengalaman penulis sangatlah akurat, apalagi menggunakan clock input yang berasal dari xtal dengan kualitas yang bagus.

Kalau power diputus bagaimana cara pewaktu tetap jalan ? Tenang saja, cukup menggunakan baterai 4.5v(3 x AA) seperti rangkaiana berikut :





Prinsip rangkaian diatas adalah sebagai berikut:


  1. Regulator 5v menghasilkan tegangan VCC 5v dan akan mencatu rangkaian selama terdapat tegangan Vin (input regulator).
  2. Baterai 4.5v dan dioda akan menghasilkan tegangan 4.5v dikurangi 0.7v  = 3.8 volt yang sesuai dengan hukum khircof maka tegangan yang muncul di ujung dioda (ketika ada input di regulator) adalah 5 volt. Baterai akan aman dari tegangan balik karena ada dioda.
  3. Ketika tegangan input (Vin) hilang alias mati lampu, maka otomatis baterai akan mencatu rangkaian walaupun hanya menggunakan 3.8 volt. Microcontroller sekelas AVR menggunakan tegangan dengan range yang lebar (2.7 - 5.5  volt) terutama pada seri yang ada embel2nya "L" atau "LV", dengan catatan tidak ada proses yang sensitif terhadap penurunan catu daya seperti ADC. Ini dapat diakali dengan berbagai cara salah satunya melakukan pengukuran Vref atau menghentikan perhitungan ADC dan sebagainya.


Kita akan lanjut pada contoh pemakaiannya dengan memperhatikan script menulis tanggal dan jam di LCD dibawah ini, siapkan rangkaian seperti pada penjelasan menulis lcd disini :



Untuk lebih akurat, kaki 4 & 5 dihubungkan ke xtal (sesuai script 4Mhz) 
dan tiap kaki xtal dihubungkan dengan capasitor 22pF ke ground
Untuk Baterai backup dan tegangan 5v digunakan seperti contoh sebelumnya



/*=============================
JAM AKURAT dengan RTC INTERNAL
ATTINY 2313 , 4Mhz Xtal Clock
by: ahocool@gmail.com    
www.aisi555.com
=============================*/
#define F_CPU 4000000UL //sesuaikan dengan clock yang dipakai
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "lcd.h" //silahkan baca pembahasan menulis di LCD
#include <string.h>

uint8_t jam,menit,detik,bulan,tanggal,tahun; 
char bul_max[13]={0,31,28,31,30,31,30,31,31,30,31,30,31} ;
const char bul_name[13][4] PROGMEM={"xxx","Jan","Feb","Mar","Apr","Mei","Jun","Jul","Ags","Sep","Okt","Nov","Des"} ;
void reverse(char s[]) 
{ 
   int c, i, j; 
    
   for (i = 0, j = strlen(s)-1; i < j; i++, j--){ 
      c = s[i]; 
      s[i] = s[j]; 
      s[j] = c; 
   } 
} 
void itoa(int n, char s[]) 
{ 
   int i, sign; 
    
   if ((sign = n) < 0) // record sign 
      n = -n;         // make n positive 
   i = 0; 
   do {   // generate digits in reverse order 
      s[i++] = n % 10 + '0'; // get next digit 
   } while ((n /= 10) > 0); // delete it 
   if (sign < 0) 
      s[i++] = '-'; 
   s[i] = '\0'; // add null terminator for string 
   reverse(s); 
}
void init_jam(void)
{
   TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
   TIMSK |= (1 << OCIE1A); // Enable CTC interrupt 
   OCR1A  = 62499; //compare the CTC A 
   TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64
   TCNT1 = 0;
   sei();
} 



void tulis_lcd(void)
{
char dum;

lcd_clrscr();


lcd_gotoxy(3,0);
itoa(tanggal,&dum);
lcd_puts(&dum);
lcd_putc('-');
lcd_puts_p(bul_name[bulan]);
lcd_puts("-20");
itoa(tahun,&dum);
lcd_puts(&dum);

lcd_gotoxy(5,1);
itoa(jam,&dum);
lcd_puts(&dum);
lcd_putc(':')
if(menit<10) lcd_putc('0');
itoa(menit,&dum);
lcd_puts(&dum);
lcd_putc(':');
if(detik<10) lcd_putc('0');
itoa(detik,&dum);
lcd_puts(&dum);
}


ISR(TIMER1_COMPA_vect) //Interupt timer
{

detik++;
if(detik == 60)

{  detik=0;
   menit++;
}

if(menit == 60)
     {    jam++;
   menit=0;      
     }
if (jam == 24) 
     { tanggal++; 
       jam = 0 ; 
      }
if(tahun%4 == 0) bul_max[2]=29;  //kabisat
else bul_max[2]=28; 

if (tanggal > bul_max[bulan]) {bulan++; tanggal =1 ;}

if (bulan > 12) {tahun++;  bulan=1; }

tulis_lcd();

}


int main(void)
{

/*ini inisialisasi awal jam, untuk merubah jam saat program jalan dapat menggunakan tombol , cek di pembahasan lain untuk cara pembacaan tombol */ 
jam = 20;
menit=20;
detik=14;
tanggal=16;
bulan=6;
tahun=13;


init_jam();
lcd_init(LCD_DISP_ON);
lcd_clrscr();


while(1){ }

}
 

Mudah bukan? Selamat Mencoba ...
Share:

Sabtu, 22 Juni 2013

Project: Metal Detector Pulse Induction


courtesy of : Sascho Varna Bulgaria , www.thunting.com , www.geotech1.com


Metal detector yang dibahas kali ini adalah berbasis Pulse Induction. Apakah pulse induction ? Yang dimaksud adalah efek flyback dari rangkaian inductive / lilitan. Ketika suatu tegangan diberikan kepada lilitan dan kemudian tiba-tiba sumber tegangan ini dihilangkan maka mendadak muncul suatu tegangan terbalik yang nilainya tinggi dalam waktu yang sesaat. Effect flyback ini banyak digunakan pada pembangkitan tegangan tinggi pada tabung katoda untuk mempercepat larinya elektron. Tabung katoda ini lazimnya dinamakan televisi Tabung.

Bagaimana dengan metal detecting ? perhatikan gambar grafik dibawah ini :




Gambar diatas menunjukkan perbandingan waktu decay (menuju 0)  vs Tegangan yang dihasilkan oleh efek flyback. Level tegangan yang berbeda akan muncul ketika ada benda logam yang mempengaruhi induktansi lilitan. Karena ada perbedaan inilah maka pendeteksian logam dapat dilakukan dengan melakukan komparasi tegangan standar tanpa logam disekitar lilitan(tegangan referensi) dengan tegangan yang dihasilkan saat ada benda logam yang berada dekat induktor. Prinsipnya adalah sebagai berikut :

1. Rangkaian timer untuk menandakan pemutusan tegangan ke lilitan dan timer untuk melakukan pencuplikan sinyal decay/flyback (contoh pada grafik sinyal akan dibandingkan pada saat 30uS)
2. Transistor daya sebagai pengatur tegangan flyback yang tinggi
3. Voltage clipper sehingga tegangan flyback yang tinggi dapat dibaca opamp 
4. Komparator tegangan decay dan tegangan referensi/tanpa logam (low noise opamp)
5. Amplifier sinyal output komparator yang sangat kecil (high gain opamp)
6. Penanda / sound generator yang akan berbunyi ketika ada logam terdeteksi



skematik :
(klik buat memperbesar)


replacement (ga ada di ps. genteng surabaya 2N4393 => 2N3288 atau yg lain)
coil inductor 25 lilitan kawat enamel(dinamo) 0.5mm , diameter 20-30 cm



layout komponen :



Tantangan yang akan dihadapi pada perancangan berdasarkan rangkaian dari orang bulgaria ini adalah penggunaan voltage doubler menggunakan transistor untuk menghasilkan tegangan (+) , GND dan (-). Clock yang dibuat untuk mengerjakan fungsi timer dan fungsi voltage doubler sangatlah tidak stabil. Sehingga untuk menghasilkan kesatabilan, komponen yang digunakan , semisal resistor harus dipilih resistor film atau capacitor yang berkualitas setara tantalum atau MKV. 

Penentuan tegangan referensi , terlihat pada gambar yaitu trimpot multiturn warna biru, sangatlah menuntut kesabaran. Jauhkanlah benda logam ketika melakukan setting ! Penulis sampai dibuat pusing, ternyata ada kunci motor yang ada disaku celana yang menyebabkan referensi berubah-rubah terus (terdeteksi terus). 


Hasil dari project ini seperti pada video berikut :





Logam terdeteksi dengan jarak maksimum 50 cm (jarak udara)


NB: Penulis menerima pembelian komponen dan layout PCB pun akan dikasikan, tapi jangan suruh untuk membuatnya karena kapok ...komponen yang dijual di pasaran membuat frustasi...dari 3 buah detector yang dibuat, hanya 1 yang berhasil jalan...cape dehh...
Share:

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:

Kamis, 20 Juni 2013

Tutorial: Menghemat memory Statis dengan PROGMEM dan EEPROM



Anda mungkin akan terkejut ketika melihat kenyataan terbatasnya jumlah memory yang disediakan oleh ic avr yang tersedia di pasaran. Bayangkan saja ATTINY2313 hanya memiliky 128 byte memory (lebar 8 bit) sedangkan ATMega8535 memiliki 512 byte saja. Setiap data variabel statis, semisal data text yang akan dikirim menuju lcd kadang menyebabkan memory RAM menjadi habis, padahal harus ada space RAM yang cukup untuk menampung data-data dinamis yg berubah sesuai jalannya program. Untuk itu data statis ini dapat disimpan ke dalam FLASH (PROGMEM) atau EEPROM.


PROGMEM

Progmem merupakan pemanfaatan memory flash / program sebagai penyimpan data statis. Pada mode scripting GCC inisialisasi awal yang harus di deklarasikan adalah #include <avr/pgmspace.h>. Pemanfaatan progmem cukup membantu menghemat RAM akan tetapi sebelum menuangkannnya ke dalam perhitungan atau penulisan ke lcd / UART, isi dari memory flash perlu dipindahkan ke memory RAM. Perhatikan contoh berikut ini.

contoh 1

char angka = 30;
char angka2;

Variable angka diatas berada di RAM, jika ingin memanfaatkan variabel diatas cukup gampang.

angka2 = angka * 2;

Jika variabel angka dirubah dirubah berada di FLASH , maka perubahannya seperti berikut:

contoh 2

const char angka PROGMEM= 30;
char angka2,angka3;

untuk mendapatkan hasil perhitungan yang sama maka harus ada variabel angka3 yang akan memindahkan data dari variabel angka (yang berada di flash) menuju RAM.

angka3 = pgm_read_byte(&angka);  //yg dimaksud &angka adalah alamat memory
angka2= angka3 * 2;


Tentunya contoh diatas tidak menggambarkan penghematan memory, tapi perhatikanlah contoh penulisan variabel array tulisan yang panjang ke UART berikut ini:

const char tulisan[] PROGMEM= "ahocool hebat sekali lo broo";


void USART_Tx(unsigned char data)
{   
    
   while (!(UCSRA & (1<<UDRE)));{} 
   UDR = data; 
}

void kirim_text(const char *data)
{
   while (pgm_read_byte(data) != 0x00)
     USART_Tx(pgm_read_byte(data++));


Dari fungsi diatas , routine kirim_text akan mengirimkan isi dari memory flash satu persatu ke UART, sehingga tidak perlu memindahkan semua data tulisan  ke RAM cukup hanya dipindahkan secara berurutan. Perintah untuk mengirim text ascii ke UART seperti berikut ini :


kirim_text(tulisan);


Apabila pembaca sering memperhatikan script yang ditulis diblog ini, terutama yang berhubungan dengan LCD maka penulisan teks variable tulisan seperti contoh diatas, cukup menuliskan seperti ini:


lcd_puts_P(tulisan)


untuk lebih lengkapnya dapat membaca penjelasan mengenai library pgmspace.h disini


EEPROM

Salah satu keunggulan dari microcontroller AVR adalah adanya memory non volatile (tidak akan hilang saat tidak ada power) yang berupa EEPROM. Biasanya penggunaanya adalah sebagai penyimpan data statis seperti halnya PROGMEM dan yang paling penting adalah variabel dinamis yang akan berubah nilainya dan kemudian nilainya akan disimpan seterusnya walau saat microcontroller dimatikan. Inisialisasi librarynya dilakukan dengan menuliskan #include <avr/eeprom.h>

Beberapa perintah script EEPROM yang paling penting adalah :

  • uint8_t eeprom_read_byte (const uint8_t *addr) 
  • void eeprom_write_byte (uint8_t *addr, uint8_t value) 
  • uint16_t eeprom_read_word (const uint16_t *addr) 
  • void eeprom_write_word (uint16_t *addr, uint16_t value) 
  • void eeprom_read_block (void *pointer_ram, const void *pointer_eeprom, size_t n) 
  • void eeprom_write_block (const void *pointer_ram, void *pointer_eeprom, size_t n)



Contoh paling sederhana adalah pembacaan dan penyimpanan data kalibrasi seperti contoh berikut:


uint8_t EEMEM kalibrasi=100;
char berubah;


untuk membaca nilai EEPROM dan memindahkan ke RAM seperti ini :


berubah=eeprom_read_byte(&kalibrasi);


semisal nilai variabel "berubah" memang berubah karena perjalanan dari aplikasi, maka ketika ingin menyimpannya ke EEPROM tuliskan script seperti berikut:


eeprom_write_byte(&kalibrasi,berubah);


cukup mudah bukan? Bagaimana jika ingin menuliskan data EEPROM ke LCD atau UART ? contohnya seperti berikut ini :


uint8_t EEMEM edit_tgl[]=  " *EDIT KALENDER*$";

void tulis_ee(uint8_t *eem)
{

uint8_t a=0;


while(eeprom_read_byte(eem + a) != '$')
{
lcd_putc(eeprom_read_byte(eem + a));
a++;
}

}

contoh diatas sering digunakan oleh penulis untuk menyimpan data-data teks yg akan ditulis ke LCD, dengan sebuah trick menempatkan tanda $ sebagai penanda akhir kalimat (tentunya karakter lain bisa saja, asal karakternya jarang digunakan). untuk menulis ke LCD cukup menuliskan script berikut:


tulis_ee(edit_tgl);


Bagaimana dengan mengirim UART ? Perhatikan contoh berikut:


uint8_t EEMEM tulisan[]= "ahocool memang ganteng banget broo !!";

void USART_Tx(unsigned char data)
{   
    
   while (!(UCSRA & (1<<UDRE)));{} 
    UDR = data; 
}

void kirim_text_ee(const char *data)
{
   while (eeprom_read_byte(data) != 0x00)
     USART_Tx(eeprom_read_byte(data++));


Dan selanjutnya sangat mudah hanya cukup menuliskan :

kirim_text_ee(tulisan);




SELAMAT MENCOBA 
Share:

Rabu, 19 Juni 2013

Tutorial: RFID ID-12 Trainer Modul dan Aplikasi Pintu Berbasis RFID




Penulis mendapat modul starter kit RFID innovative dari pembaca blog yg kebingungan setelah membeli nya. Modul ini dapat diperoleh dengan harga sekitar 350 ribu dengan packing yang sudah terdapat komunikasi serial UART atau Rs232 serta beberapa rangkaian tambahan sehingga dapat dikatakan siap pakai. Modul Utama RFID adalah ID-12 yang bekerja pada frekuensi 125Khz dan hanya berfungsi sebagai reader. Terdapat antenna internal sehingga tinggal menempatkan kartu RFID di atasnya. Unutk model yang bisa write/menulis ke kartu RFID maka dibutuhkan jenis yang lebih advance yaitu ID-20


jaycon_systems_white_rfid_card_125khz.jpg (800×600)

Ternyata tidaklah sesusah yg dikira..bisa langsung dihubungkan menuju serial port atau usb to serial converter dan melalui software hyperterminal / putty  (9600 bps) ketika kartu RFID dideketkan ke modul akan muncul kode ascii seperti contoh ini :




4D00D584B1AD

Dari datasheet didapatkan penjelasan byte yg dikirim ketika kartu didekatkan berupa :




1. STX (0x02) , start transmission
2. 10 DATA ASCII
3. 2 byte checksum (ascii) 
4. <cr><lf> ETX , kalo hexanya 0x0D , 0x0A, 0x03


Ke 16 byte ini bisa dibaca langsung melalui serial port (tentunya ketika kartu yg sesuai ditempelkan dekan ID-12) akan tetapi checksumnya mubazir jika hanya kecepatan membaca kartu tidak tinggi, sehingga lebih baik hanya di compare semua byte ascii (10 + 2) jika ingin melakukan suatu proses pengecekan kartu.



Untuk rangkaian dari datasheet produk RFID Innovations, seperti berikut:








Perbedaan antara ID-0/ID-2 dan ID-12 hanya di antenna , dimana ID0/2 tidak memiliki antena internal seperti ID12. Tapi ID12 dapat juga dipasangkan antena external yg dapat digunakan bersamaan. Antenna dapat dibuat dengan lilitan kawat enamel diameter 0.5 mm yang dililit melingkar sekitar 100 putaran  dengan diameter lingkaran 10cm (kira2 menghasilkan 640uh, gunakan google untuk mencari kalkulator lilitan), dan kemudian jangan lupa memasangkan tunning capacitor yang bernilai sekitar 1,5nF. Untuk koneksinya dapat dilihat pada gambar diatas.


Jika modul trainner dihubungkan dengan Microcontroller maka cukup gunakan  mode UART TTL , dan hanya digunakan pin RX saja , karena tujuannya hanya membaca data serial yg diberikan oleh modul ketika membaca kartu.

jadi....kodenya kira2 begini , output ke LCD 16x2 (baca tutorial mengenai penulisan lcd disini):



#define F_CPU 4000000UL //sesuaikan dengan clock micro
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "lcd.h"  //silahkan baca pembahasan menulis LCD

#define USART_BAUDRATE 9600 //baudrate 
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) 



void init_usart(void)
{



   UCSRB |= (1 << RXEN) | (1 << TXEN);   
   UCSRC |= (1 << UCSZ0) | (1 << UCSZ1); 
   UBRRL = BAUD_PRESCALE; 
   UBRRH = (BAUD_PRESCALE >> 8);
   UCSRB |= (1 << RXCIE);  //interupt serial usart

    sei(); //enable interupt
  }




ISR(USART_RX_vect) //interupt ketika ada data yg diterima
{ 
 char databyte;
 
  
  databyte = UDR;  // isi data 



    if(databyte == 2) {  //deteksi STX (0x02h)
     
      lcd_gotoxy(0,1);
   }                     
    //tampilkan data kecuali data status  ke LCD
    else if((databyte != 0x0D)&&(databyte != 0x0A)&&(databyte != 0x03)) 
 {lcd_putc(databyte); 
    }



}


int main(void)
{


//inisialisasi port I/O

DDRC=0b1111111; //port LCD


ADCSRA &= ~_BV(ADEN); //matiin ADC biar irit

//inisialisasi LCD

lcd_init(LCD_DISP_ON);
lcd_clrscr();


lcd_puts("   BACA RF ID");

init_usart();

while(1) 
{




}



return 0;

}

Script diatas hanya berfungsi untuk mendapatkan pembacaan dari kartu RFID yang didekatkan ke modul. Untuk lebih ke aplikasi selanjutnya kita dapat memanfaatkan nomer kartu yang unique yang kemudian akan dipakai sebagai pembuka suatu slot kunci dari selenoid. Slot kuncinya seperti ini nih :



Jadi ntar salah satu pin dari microcontroller akan meng ON dan OFF selenoid sebagai proses Kunci dan Buka dari pintu. Ketika tombol kunci ditekan maka selenoid akan OFF sehingga ujung slot akan mengunci pintu. Ketika kartu yang kodenya sesuai dengan yang diijinkan membuka (atau memakai daftar database pun bisa) maka Micro akan meng ON kan selenoid sehingga slot akan tertarik oleh magnet selenoid dan pintu akan terbuka. Selenoid ini harus di drive oleh relay atau transistor agar tidak merusak microcontroller dan rata-rata tegangan selenoid tidak bisa di drive langsung oleh microcontroller. contohnya seperti gambar berikut:




Script komparasi dari kartu RFID seperti berikut ini :


/*=============================
RF ID trainner modul IE version
connected to IE MINSYS 8535  
For DOOR LOCK via SELENOID
by: ahocool@gmail.com    www.aisi555.com
=============================*/
#define F_CPU 4000000UL //sesuaikan clock xtal yg dipakai
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "lcd.h"  //untuk LCD

#define USART_BAUDRATE 9600  //baudrate komunikasi serial
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) 

uint8_t dataindex,detik;

char data[12];
char pass[12]="4D00D584B1AD" ;  
//sesuaikan dengan pembacaan kartu via PC & hyperterminal/putty , kartu yg digunakan yg dapat membuka pintu



void init_usart(void)  //inisialisasi usart
{



   UCSRB |= (1 << RXEN) | (1 << TXEN);   
   UCSRC |= (1 << UCSZ0) | (1 << UCSZ1); 
   UBRRL = BAUD_PRESCALE; 
   UBRRH = (BAUD_PRESCALE >> 8);
   UCSRB |= (1 << RXCIE);  //interupt serial usart
sei();
  }


void init_jam(void) //timer 8 detik tanpa aktivitas, LCD mati
{
   TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
   TIMSK |= (1 << OCIE1A); // Enable CTC interrupt 
   OCR1A  = 62499; //compare the CTC A 
   TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64
   TCNT1 = 0;
   
   PORTC |= (1<<PC7); //hidupkan LCD
   detik=0;

}


ISR(TIMER1_COMPA_vect) //interrupt detik

{ 


detik ++;

if(detik == 2)
{
   lcd_gotoxy(0,1);  
   lcd_puts("Tempelkan Kartu!");

}

if(detik >=8) { //8 detik layar lcd mati

PORTC &= ~(1<<PC7); // lcd mati
TCCR1B=0;
}



}



ISR(USART_RX_vect) //interupt data serial dari RFID
{ 
 char databyte;
 uint8_t a;
 
  
  databyte = UDR;   



    if(databyte == 2) {  //Start transmission
     
      dataindex=0;
   }                     
     //byte status di skip aja  
    else if((databyte != 0x0D)&&(databyte != 0x0A)&&(databyte != 0x03)) 
 { 
   data[dataindex - 1]=databyte; //simpan ke memory hasil pembacaan
 }

 
    if(dataindex > 14 ) //jika sudah baca semua data
     {

       for(a=0 ;a<12 ; a++) { 

       if(data[a] != pass[a]) break; //komparasi nilai pembacaan RFID

    }


    if( a == 12) { //jika kartu benar

       lcd_gotoxy(0,1);  
          lcd_puts("                ");
          lcd_gotoxy(0,1);  
          lcd_puts("  PINTU DIBUKA  ");
    PORTA |=(1<<PA0);
          init_jam();

          }
        else{
    lcd_gotoxy(0,1); //jika kartu salah  
          lcd_puts("                ");
          lcd_gotoxy(0,1);  
          lcd_puts("  Kartu Salah ! ");

          init_jam();
    
    }  
  }
   
   
    dataindex++;



}

void tombol(void) //routine pembacaan tombol
{


if(bit_is_clear(PINA, PINA1)) 
   { 
    
   lcd_gotoxy(0,1);  
   lcd_puts("                ");
   lcd_gotoxy(0,1);  
   lcd_puts("  PINTU DIKUNCI ");
     
   PORTA &= ~(1<<PA0);

   init_jam();
   

   
   }

}



int main(void)
{


//inisialisasi port I/O, sesuaikan dengan IC AVR yg dipakai

DDRC=0b11111111; //port LCD dan PC7 terhubung ke VCC dari LCD (kalau tidak kuat di drive transistor) untuk mematikan layar jika melebihi waktu (biar hemat listrik)

DDRA |= (1<<PA0); //output ke relay/transistor driver selenoid kunci & led status pintu 
DDRA &= ~(1<<PA1); //tombol kunci pintu ,tombol lepas= pull up 10k ke vcc, tombol ditekan = nyambung ke GND


ADCSRA &= ~_BV(ADEN); //matiin ADC biar irit

//inisialisasi LCD

init_jam();

lcd_init(LCD_DISP_ON);
lcd_clrscr();


lcd_puts(" RFID DOOR LOCK\n");
lcd_puts("Tempelkan Kartu!");
init_usart();

while(1) 
{

tombol();


}



return 0;

}




Hasilnya seperti ini nih...




Selamat Mencoba
Share:

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 (26) 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 (7) 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 (24) 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