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

Senin, 29 Juli 2013

Tutorial: Jam 6 Digit + Kalender Dengan Attiny 2313




Siapkan bahan-bahan  seperti berikut:

Attiny 2313 + downloader isp
Bagian power supply

  •     Trafo AC atau Adaptor yang dapat diatur tegangannya
  •     Jika menggunakan Trafo AC, maka ubah-ubah terminal sekunder trafo untuk V Segmen
  •     7805 untuk menurunkan tegangan ke 5V
  •     Baterai backup 3v - 4.5 v

Dioda 1N4002 (4 + 1 )atau Dioda Bridge sebagai penyearah jika memakai Trafo AC
Capasitor 1000uF/25v , 100nF, 22pF (2buah) atau Varco 0-50pF
Resistor 10K (3 buah), 1K 2Buah
Led 4 buah sebagai pembatas digit
ULN 2003
OptoIsolator PC817 atau 4N25 atau yang sejenis (6 buah)
Xtal 4MHz atau sesuai keinginan
Push Buton tactile (2 buah)
7 segment common Anoda ukuran terserah (6 buah)


SKEMATIK




klik untuk memperjelas

Keterangan:


  1. Gunakan power supply berbeda (yang dapat diubah-ubah) untuk V SEGMEN sehingga dapat mengatur kecerahan dari 7 segmen
  2. Untuk mengkompensasi ketidak akuratan xtal, maka salah satu load cap dari xtal dibuat variabel
  3. Nilai Xtal yang digunakan disesuaikan dengan xtal yg tersedia dipasaran, jika berbeda maka silahkan baca pembahasan mengenai counter/timer disini.
  4. Baterai backup akan mencatu attiny jika listrik mati (tanpa display) sehingga time keeping tetap jalan.


SCRIPT


#define F_CPU 4000000UL //sesuaikan xtal yg dipakai
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <string.h>

uint8_t jam,menit,detik,bulan,tanggal,tahun,clock,menu,mode,blink; 
uint8_t a = 0;
char bul_max[12]={31,28,31,30,31,30,31,31,30,31,30,31} ;





//tampilan 7 digit 7 segmen dan animasi

void segmen(uint8_t digit)

{
    switch (digit)        
          {

  case 0 :  
     {

   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3)  & ~_BV(PB4) 
            & ~_BV(PB5)  & ~_BV(PB6);

            PORTB |= _BV(PB7);
   
   break;
           }
  case 1 :
     {
      
   PORTB &= ~_BV(PB2) & ~_BV(PB3);

            PORTB |= _BV(PB1)|  _BV(PB4)|  _BV(PB5)|  _BV(PB6)|  _BV(PB7);
   
   break;
           }
  case 2 : 
     {
   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB7) & ~_BV(PB5) & ~_BV(PB4);

            PORTB |= _BV(PB3)|  _BV(PB6) ;
   
      break;
           }  
  case 3 : 
      {

   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB7);

            PORTB |= _BV(PB5)|  _BV(PB6) ;
        
   break;
           }
  case 4 :
     {
      
   PORTB &= ~_BV(PB6) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB7) ;

            PORTB |= _BV(PB4)|  _BV(PB5) |  _BV(PB1);
   
   break;
           }
  case 5 : 
     {

   PORTB &= ~_BV(PB1) & ~_BV(PB3)  & ~_BV(PB4) & ~_BV(PB7)  & ~_BV(PB6);

            PORTB |= _BV(PB2) |  _BV(PB5);
   
   break;
           }
  case 6 : 
     {

   PORTB &= ~_BV(PB1) & ~_BV(PB3)  & ~_BV(PB4) & ~_BV(PB7)  & ~_BV(PB6) & ~_BV(PB5);

            PORTB |= _BV(PB2) ;
   
      break;
           }
  case 7 : 
     {

   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3);

            PORTB |=  _BV(PB4)|  _BV(PB5)|  _BV(PB6)|  _BV(PB7);
   
      break;
           }  
  case 8 : 
     {
   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3)  & ~_BV(PB4) 
            & ~_BV(PB5)  & ~_BV(PB6)  & ~_BV(PB7);

      break;
           }
  case 9 : 
     {

   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3)  & ~_BV(PB4) 
             & ~_BV(PB6)  & ~_BV(PB7);

   PORTB |= _BV(PB5); 

      break;
           }
  case 10 :
     {
         PORTB |= _BV(PB1) |  _BV(PB2) |  _BV(PB3) |  _BV(PB4)|
                _BV(PB5) | _BV(PB6) |  _BV(PB7) ;

      break;
           }
  case 11 :
     {
         PORTB &= ~_BV(PB1);

      PORTB |=  _BV(PB2) |  _BV(PB3) |  _BV(PB4)|
                _BV(PB5) | _BV(PB6) |  _BV(PB7) ;
                

      break;
           }
  case 12 :
     {
         PORTB &= ~_BV(PB4);

      PORTB |=  _BV(PB2) |  _BV(PB3) |  _BV(PB1)|
                _BV(PB5) | _BV(PB6) |  _BV(PB7) ;
                

      break;
           }

  case 13 :
     {
         PORTB &= ~_BV(PB2);

      PORTB |=  _BV(PB4) |  _BV(PB3) |  _BV(PB1)|
                _BV(PB5) | _BV(PB6) |  _BV(PB7) ;
                

      break;
           }

  case 14 :
     {
         PORTB &= ~_BV(PB3);

      PORTB |=  _BV(PB2) |  _BV(PB4) |  _BV(PB1)|
                _BV(PB5) | _BV(PB6) |  _BV(PB7) ;
                

      break;
           }
  case 15 :
     {
         PORTB &= ~_BV(PB5);

      PORTB |=  _BV(PB2) |  _BV(PB3) |  _BV(PB1)|
                _BV(PB4) | _BV(PB6) |  _BV(PB7) ;
                

      break;
           }
  case 16 :
     {
         PORTB &= ~_BV(PB6);

      PORTB |=  _BV(PB2) |  _BV(PB3) |  _BV(PB1)|
                _BV(PB5) | _BV(PB4) |  _BV(PB7) ;
                

      break;
           }

      }

         PORTB =  _BV(PB0) | ~PORTB; //khusus memakai uln2003


}


//posisi scan digit

void posisi(uint8_t pos)

{
    switch (pos)   
    {
    case 0 :  
     {

            PORTD &=  ~_BV(PD0) & ~_BV(PD1) & ~_BV(PD4) & ~_BV(PD5)  & ~_BV(PD6) ;
   
   PORTB &= ~_BV(PB0);
               
   break;
           }

    case 1 :  
     {

            PORTD |= _BV(PD0);

            PORTD &= ~_BV(PD1) & ~_BV(PD4) & ~_BV(PD5)  & ~_BV(PD6) ;
   
   PORTB &= ~_BV(PB0);
               
   break;
           }

    case 2 :  
     {

            PORTD |= _BV(PD1);

            PORTD &= ~_BV(PD0) & ~_BV(PD6) & ~_BV(PD4)  & ~_BV(PD5) ;
   
   PORTB &= ~_BV(PB0);
               
   break;
           }

    case 3 :  
     {

            PORTD |= _BV(PD4);

            PORTD &= ~_BV(PD1) & ~_BV(PD0) & ~_BV(PD5)  & ~_BV(PD6) ;
   
   PORTB &= ~_BV(PB0);
               
   break;
           }


    case 4 :  
     {

            PORTD |= _BV(PD5);

            PORTD &= ~_BV(PD0) & ~_BV(PD1) & ~_BV(PD4)  & ~_BV(PD6) ;
   
   PORTB &= ~_BV(PB0);
               
   break;
           }

    case 5 :  
     {

            PORTD |= _BV(PD6);

            PORTD &= ~_BV(PD0) & ~_BV(PD1) & ~_BV(PD4)  & ~_BV(PD5) ;
   
   PORTB &= ~_BV(PB0);
               
   break;
           }


    case 6 :  
     {

            PORTB |= _BV(PB0);

            PORTD &= ~_BV(PD0) & ~_BV(PD1) & ~_BV(PD4) & ~_BV(PD5)  & ~_BV(PD6) ;
   
               
   break;
           }
         }

}


void animasi(void) //animasi pindah jam-kalender

{
     posisi(1);
     segmen(11);
  _delay_ms(50);
     posisi(2);
     segmen(11);
  _delay_ms(50);
     posisi(3);
     segmen(11);
  _delay_ms(50);
     posisi(4);
     segmen(11);
  _delay_ms(50);
     posisi(5);
     segmen(11);
  _delay_ms(50);

     posisi(6);
     segmen(11);
  _delay_ms(50);
     segmen(13);
  _delay_ms(50);
     segmen(14);
  _delay_ms(50);

     posisi(5);
     segmen(12);
  _delay_ms(50);
     posisi(4);
     segmen(12);
  _delay_ms(50);
     posisi(3);
     segmen(12);
  _delay_ms(50);
     posisi(2);
     segmen(12);
  _delay_ms(50);

     posisi(1);
     segmen(15);
  _delay_ms(50);
     segmen(16);
  _delay_ms(50);

}


void tulis(void) //tulis ke 7 segmen

{

     posisi(1);
 
 if(menu == 1 && TCNT1 < 20000) segmen(10); //edit jam
 else    segmen((jam/10));
  _delay_ms(1);
     segmen(10);


     posisi(2);
 if(menu == 1 && TCNT1 < 20000) segmen(10); //edit jam
 else  segmen((jam%10));
  _delay_ms(1);
     segmen(10);

 
 
     posisi(3);
 if(menu == 2 && TCNT1 < 20000) segmen(10); //edit menit
 else    segmen((menit/10));
  _delay_ms(1);
     segmen(10);


     posisi(4);
 if(menu == 2 && TCNT1 < 20000) segmen(10); //edit menit
 else    segmen((menit%10));
     _delay_ms(1);
     segmen(10);

     
  posisi(5);
 if(menu == 3 && TCNT1 < 20000) segmen(10); //edit detik
 else     segmen((detik/10));
  _delay_ms(1);
     segmen(10);

    
  posisi(6);
 if(menu == 3 && TCNT1 < 20000) segmen(10); //edit detik
 else    segmen((detik%10));
  _delay_ms(1);
     segmen(10);


}

void tanggalan(void)

{

     posisi(1);
  if(menu == 4 && TCNT1 < 20000) segmen(10); //edit tgl
 else   segmen((tanggal/10));
  _delay_ms(1);
     segmen(10);


     posisi(2);
  if(menu == 4 && TCNT1 < 20000) segmen(10); //edit tgl
 else    segmen((tanggal%10));
  _delay_ms(1);
     segmen(10);

     posisi(3);
  if(menu == 5 && TCNT1 < 20000) segmen(10); //edit bulan
 else    segmen((bulan/10));
  _delay_ms(1);
     segmen(10);


     posisi(4);
  if(menu == 5 && TCNT1 < 20000) segmen(10); //edit bulan
 else    segmen((bulan%10));
     _delay_ms(1);
     segmen(10);

     
  posisi(5);
  if(menu == 6 && TCNT1 < 20000) segmen(10); //edit tahun
 else    segmen((tahun/10));
  _delay_ms(1);
     segmen(10);

    
  posisi(6);
 if(menu == 6 && TCNT1 < 20000) segmen(10); //edit tahun
 else     segmen((tahun%10));
  _delay_ms(1);
     segmen(10);


}


//INTERUPT 1 DETIK

ISR(TIMER1_COMPA_vect) 

{ 


detik++;
clock++;


if(detik == 60)

{  
   detik=0;
   menit++;

if(menit == 60)

     { menit=0; 
       jam++;
     }

if (jam == 24) 

{ tanggal++; jam = 0 ; }

       
    if(tahun%4 == 0) bul_max[1]=29;
       else bul_max[1]=28; 

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

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



}




}


void tombol(void)
{

if(bit_is_clear(PIND, PIND2)) 
   { 

if(menu == 0) menu =1;

else if (menu == 1) menu=2;

else if (menu == 2) menu=3; 

else if (menu == 3) menu=4; 

else if (menu == 4) menu=5; 

else if (menu == 5) menu=6; 

else if (menu == 6) menu=0; 

 
_delay_ms(200);

 }




else if(bit_is_clear(PIND, PIND3)) 
   { 

if(mode==0 && menu == 0)
{ animasi();  
  mode=1; 
  clock=0; }

else if(mode ==1 && menu ==0)
{mode=0;
clock=0;
}


if(menu == 1) 
{ jam ++;
  if (jam == 24) jam =0;
}

else if(menu == 2) 
{ menit ++;
  if (menit == 60) menit =0;
}

else if(menu == 3) detik = 0;

else if(menu == 4) 
{ tanggal++;
  if (tanggal == 32) tanggal =1;
}

else if(menu == 5) 
{ bulan++;
  if (bulan == 13) bulan =1;
}

else if(menu == 6) 
{ tahun++;
  if (tahun == 100) tahun=0;
}


_delay_ms(200);

}


}

int main(void)
{



 
 DDRD |= _BV(PD0) | _BV(PD1) | _BV(PD4) | _BV(PD5) | _BV(PD6) ; //scan digit
 DDRB |= _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) | _BV(PB4) | _BV(PB5) | _BV(PB6) | _BV(PB7) ; //segment
 DDRD &= ~_BV(PD2) & ~_BV(PD3); //tombol
  

// ------------ini untuk xtal 4Mhz----------------------
   TCCR1B |= (1 << WGM12); 
   TIMSK |= (1 << OCIE1A); 
   OCR1A  = 62499;
   TCCR1B |= (1 << CS11)|(1 << CS10); 
//------------------------------------------------------

 

jam = 0;
menit= 0;
detik=0;
tanggal=1;
bulan=1;
tahun=11;
clock=0; //perpindahan animasi jam dan kalender
mode=0;
menu=0;

sei();



 while(1)
 {
     
     if(clock == 40 && mode == 1 && menu == 0)
    { animasi();}

  else if(clock > 40 && clock <50 && mode == 1 && menu == 0) 
       {
        
        tanggalan();
    }
     else if(clock == 50 && mode == 1 && menu == 0)

   { animasi(); clock =0; }
  
  else if(menu == 0)
  { tulis(); }

  else if(menu > 3)
  { tanggalan(); }

  else 
  { tulis(); }

         
tombol();   

    }
return 0;
}




ALTERNATIF UNTUK 7 SEGMEN LEBIH BESAR

Optoisolator PC817 mempunyai kekurangan yaitu dayanya kecil sehingga arus yg dapat dialirkan kecil saja. Hal ini akan menyebabkan 7 segmen besar menjadi redup sehingga perlu ditambahkan transistor yg memiliki daya lebih dan dengan rangkaian common Emiter menggunakan transistor PNP seperti BD140  dan PC817 sebagai control base nya (bisa juga transistor NPN 2N3906/2222)  dengan contoh rangkaian pengganti sebagai berikut:





HASIL




SELAMAT MENCOBA
Share:

Jumat, 26 Juli 2013

Kreasi Pembaca : Metal Detector MK-2 Untuk Skripsi



Beberapa pembaca blog ada yang sms atau mengkontak saya dan bertanya-tanya mengenai metal detektor yang saya bahas di blog ini. Ada yang pencari logam rongsokan, pencari emas dan ada juga yang meminta bantuan untuk merancang pendetektor logam di makanan ringan dan nasi kotak. Berapa pembaca saya tolak untuk pembahasan lebih lanjut karena alasan terlalu komersial dan menuntut realibilitas yang tinggi, dan saya lebih memilih ketika yang meminta bantuan adalah rekan-rekan pelajar smk atau mahasiswa.



Metal Detektor SBG-PI satu-satunya yang penah dibuat dan berfungsi !


Pada tulisan kali ini yang saya angkat adalah kreasi rekan dari aceh bernama mia, yang merupakan mahasiswi D3 jurusan fisika, dasar elektronikanya sedikit akan tetapi dia bersemangat untuk menyelesaikan skripsi yang judulnya dipilihkan oleh dosennya. Beberapa desain saya tawarkan seperti pulse induction dan BFO, akan tetapi yang paling reliable adalah MK-2 yang pernah dibahas disini . Kunci dari kesuksesan perancangan dan perakitan metal detektor MK-2 adalah pada penyusunan lilitan serta pada pemilihan potensiometer yang wajib menggunakan jenis muti turn sehingga ratio pemutaran knob dengan perubahan resistansi menjadi kecil.



 Mia dan teman-temannya

Dosen pembimbing dari rekan kita yang imut ini pada awalnya menuntut metal detektor yang lumayan canggih sehingga saya berpikiran mengajukan type metal detektor pulse induction yang saya dapat di forum thunting.com yaitu SBG-PI yang pernah dibahas disini. PCB yang lumayan besar saya rancang untuk memudahkan demo skripsi dan komponen pun telah dikirim,akan tetapi sang dosen pembimbing menolak dengan alasan yang kurang masuk diakal (padahal mungkin dia ga ngerti aja pulse induction itu apa). Dan bapak dosen memberikan rangkaiannya sendiri kemudian coba saya rangkai dan itupun tidak berfungsi dengan benar , mungkin karena ada komponen yang diganti sehingga respon frekuensinya tidak match.



Rangkaian BFO yang gagal total


Dan pada akhirnya kembali ke metal detector MK-2 yang menjadi penyelamat semuanya. Berikut ini hasil kreasi MK-2 yang telah di packing dan diberikan stick sehingga seperti alat penyapu ranjau. 






Dan beberapa waktu lalu saya dikontak oleh mia yang menyatakan dia lulus dengan nilai "A". Wahh...selamat yaaa....
Share:

Rabu, 17 Juli 2013

Trick: Solid State Relay dengan menggunakan Triac


Ketika kita menginginkan isolasi antar input dan output maka kita akan selalu teringat dengan Relay. Perangkat elektro magnet - mekanikal ini memanfaatkan isolasi dari suatu elektro magnet yang dihasilkan oleh suatu kumparan. Ketika suatu kumparan diberikan tegangan yang sesuai maka medan magnet yang dihasilkan dapat menarik suatu saklar mekanikal yang akan memutus atau menyambung arus listrik. Relay ini merupakan komponen yang penting dalam perkembangan awal komputer sebelum transistor diciptakan


Sifat mekanik dari kontaktor ini memiliki beberapa kekurangan yang dapat disebutkan antara lainnya kecepatan kontak, kelenturan mekanisme pir, keausan pergerakan kontaktor dan yang paling berbahaya disini adalah "spark" atau percikan yang dapat berbahaya dilingkungan yang combustible seperti pada tangki kendaraan bermotor atau kilang minyak bahkan percikan ini dapat menyebabkan kebakaran pada penyimpanan biji-bijian yang menghasilkan debu " grain dust " (silahkan baca di http://en.wikipedia.org/wiki/Dust_explosion).

Solusinya adalah menggunakan perangkat semikonduktor seperti halnya transistor. Secara sederhana transistor yang berfungsi sebagai switch tidak memiliki sifat isolasi seperti halnya relay, akan tetapi solusi yang ditawarkan oleh photodioda yang ditrigger oleh cahaya menjadikannya terisolasi penuh. Alat ini dinamakan sebagai "OPTOISOLATOR"

OptoIsolator jenis 4N25



Opto isolator memiliki prinsip trigger cahaya terhadap photodioda sehingga ketika tegangan setara untuk menghidupkan LED ( 5v + resistor 1K) diberikan ke pin input maka led didalam bungkus akan mengalirkan arus dari 5 ke 4 dengan kata lain jika ohm meter dipasang maka resistansinya akan kecil (seperti tersambung). Jenis OptoIsolator yang seperti ini hanya berlaku pada beban yang bersifat DC. Bagaimana dengan beban yang AC atau beban yang tidak tentu arah alirannya? Diciptakanlah OptoTriac.







Triac sebagai perangkat semikonduktor dengan 3 layer silikon berfungsi untuk mengalirkan arus AC saat trigger diberikan. Sifat arus AC yang sangat berbeda dengan DC dengan sinusnya menyebabkan ke kompleksan dalam pengaturan switchingnya. Pada gambar diatas terdapat OptoTriac dengan zerocrossing detector yang sangat membantu saat trigger mendekati tegangan sinus 0V. MOC3041 hanya memiliki rating dengan arus yang cukup kecil, sehingga diperlukan suatu Triac yang lebih tinggi ratingnya seperti BTAXX  (xx= rating arus). 



*)Watt dari Resistor di bagian power disesuaikan dengan watt / arus beban


Rangkaian diatas merupakan solid stater relay dengan optotriac MOC-3104 serta power triac BTA-12 (12 Ampere). Triac jenis BTA yang ada dipasaran umumnya adalah versi SNUBBERLES yang artinya sekali tertrigger maka triac akan menyala terus. Untuk itu deperlukan rangakaian tambahan berupa snubber R-C yang cukup akan memutus junction semikonduktor pada Triac. Ketika ON, C pada snubber akan full terisisi dan bersifat open, sedangkan ketika ada gangguan akibat optotriac yang "off" maka menyebabkan C ter discharge secara pelan (sesuai besarR) dan kemudian meng "short" power triac dan triac akan menjadi OFF.

Dengan menggunakan solidstate model ini  akan menghemat biaya pembelian solid state relay yang sudah dalam satu packing yang cukup mahal.



SELAMAT MENCOBA

Share:

Jumat, 05 Juli 2013

Trik : Membuat Komputer Server Langsung Menyala Setelah Listrik Mati menggunakan ic 555 + 4017


Sebuah komputer server yang handal umumnya memiliki perangkat tambahan berupa UPS yang dapat memberikan tenaga cadangan ketika listrik mati. Masalahnya UPS yang umum dijual memiliki baterai / aki yang kecil dan hanya bertahan beberapa menit saja. Setelah listrik kembali menyala siapakah yang akan menyalakan si server (kalau tidak ada orang yang menjaga) ? Apalagi servernya tidak tersedia fasilitas auto power on di motherboardnya seperti halnya server high end sekelas sun atau dell, dan biasanya server kelas rakyat (biasanya untuk server pulsa) ini menggunakan komputer "jangkrik" .

Di internet terdapat beberapa saran untuk menyambung / short beberapa pin, tapi ini hanya berlaku pada motherboard tertentu saja dengan power supply yang tentunya support juga. Jadi kali ini kita akan membuat rangkaian yang akan melakukan fungsi seperti penekanan ke tombol power pada motherboard PC sesaat setelah listrik menyala kembali.  Perhatikan rangkaian sederhana berikut yang menggunakan prinsip timer 555 dan counter 4017.

klik untuk memperjelas
optocoupler dapat diganti dengan relay 5V


Prinsip dari rangkaian diatas adalah membuat delay pulsa ONE SHOT (sekali hidup) yang akan mentriger switch si motherboard seperti halnya ketika terjadi penekanan pada tombol power. Pada umumnya komputer akan on jika pin (PW+) dari motherboard terhubung ke ground (kaki satunya itu adalah ground tetapi umumnya diberi nama PW-).





Bagaimana dengan power/catu ke rangkaian? Jangan khawatir, power standar ATX dilengkapi tegangan 5V standby, jadi manfaatkan saja kabel berwarna ungu sebagai +5V (catuan vcc ke rangkaian) dan kabel hitam sebagai GND. Pada motherboard terdapat konektor header dan kabel 2 buah yang akan menuju ke tombol power. Carilah header yang bertuliskan PW+ dan PW- (atau GND) dan kemudian buatlah connector dengan menggunakan blackhousing, atau jika ada sisa konektor yg memiliki 2 kabel dapat juga digunakan.

Konektor dihubungkan ke Header motherboard (PW+ ,  PW- /GND) dan ke header pada rangkaian yg terhubung dengan optocoupler/relay. Switch power diparalel dengan kabel ini melalui header yg terhubung  paralel atau disambung langsung. Pada rangkaian yang dicontohkan diatas menggunakan OPTOCOUPLER bukan memakai RELAY jadi tidak boleh kebalik antara (+) power on dengan (-) , sebab optocoupler prinsipnya Dioda/searah. Sedangkan jika menggunakan relay maka tidak perlu kawatir terbalik arahnya (bebas yang mana saja).

Dan hasilnya anda akan tidak khawatir server tidak menyala yang mungkin menyebabkan transaksi server pulsa anda terhambat. Kerugian dapat ditekan hanya dengan bermodalkan bahan-bahan sederhana yang tidak mahal ya kira-kira habis 30 ribu rupiah saja.


SELAMAT MENCOBA
Share:

Rabu, 03 Juli 2013

PROJECT: PIANO SEDERHANA DENGAN IC 555




Project IC timer 555 yang kita bahas kali ini saya dapatkan dari youtube dimana penulis tertarik dengan pemanfaatan 555 sebagai pembangkit sinyal suara dan frekuensi suaranya dapat dirubah hanya dengan menggunakan pensil. Pensil seperti 2B/HB dsb berbahan dasar graphite yang dapat menghantarkan dan menghambat arus listrik seperti halnya resistor sehingga dengan menebalkan pensil pada kertas akan menghasilkan hambatan yang akan merubah perumusan frekuensi dari pembangkitan suara ic 555.

Oke stop bertele-tele di teori..langsung saja menuju skematik dan bahan2 seperti gambar dibawah (klik untuk memperjelas)








Bahan-bahan : 

  • Breadboard
  • IC 555
  • Resistor 1K, 6K8 , 51 ohm (bila kesusahan bisa diganti dengan 1K, 4K7 , 47 ohm atau angka yang mendekati) , gunakan watt yang kecil saja (1/4 watt) agar lebih murah
  • Kapasitor 100 nano Farad (0.1 micro Farad), Elco 100 micro farad
  • Buzzer (umum nya 12v atau pilih yang range nya gede 3v - 24v )
  • Baterai 6v (sebenernya 555 kuat sampai 12v) serta tempatnya 
  • Kabel jumper dari kabel tunggal (ukuran bebas asal gampang nancep di breadboard)
  • Kabel dengan jepit buaya (untuk menghubungkan ke graphite pensil)
  • Pensil 2B/4B dan kertas



Penyusunan diatas breadboard seperti dibawah ini:






Untuk menyusun "tuts keyboard" dilakukan dengan mengarsir pensil 2B diatas kertas kemudian salah satu ujung klip buaya (ke resistor 6K8) dan kabel merah (ke pin 7) akan ditempelkan pada arsiran. Semakin jauh jaraknya akan menghasilkan resistansi lebih tinggi sehingga nada yang dihasilkan lebih rendah frekuensinya. Untuk itu perlu sebuah alat musik lainnya untuk melakukan tuning/penyamaan nada yang lebih bagus semisal dengan pianika/piano atau gitar.

Tandai letak nada-nada yang sesuai pada kertas, dan kemudian kamu bisa memainkan musik sesuai keinginan. Jangan lupa mengambil buku notasi lagu-lagu dan coba memainkannya. Ingat, frekuensi dari rangkaian ini sangat dipengaruhi tegangan, jadi jika baterai agak soak mungkin saja suara akan lebih rendah.



SELAMAT MENCOBA
Share:

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:

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