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

Tampilkan postingan dengan label tutorial. Tampilkan semua postingan
Tampilkan postingan dengan label tutorial. Tampilkan semua postingan

Selasa, 03 September 2013

Project: Digital Gear Indicator Untuk Suzuki Smash



Gear display di motor kamu masih jadul ? Hanya indikator lampu doang ? Kalau punya duit dan waktu lebih boleh nih dipraktekin. Ide ini muncul dari seorang pembaca blog yang ingin merubah dial digit Gear/Gigi motor Susuki Smash nya menjadi display 7 segmen. Sebenernya penulis agak merasa mubazir tapi bagi anak muda mungkin bisa membuat keren motornya...asal jangan ngawur aja perkabelannya ya ....


BAHAN-BAHAN :


  1. IC 4511 (CMOS BCD - 7 segmen decoder) 
  2. IC ULN2003 (Transistor array isi 7 transistor, bisa diganti dengan transistor NPN umum seperti 2N2222/BC337/9012 x 7pcs)
  3. 7Segmen Common Anoda
  4. Resistor 1K (7 pcs), 10K(3pcs), 100 ohm (3pcs)
  5. Dioda 1N4148 (10 pcs)
  6. PCB Lubang IC
  7. Solder, Timah, socket IC, Kabel wrapping dsb.




SKEMATIK




*)klik untuk memperjelas
**)Jika menggunakan transistor, tambahkan resistor 1K ohm pada tiap basis (biar awet)


PENJELASAN

Suzuki smash memiliki gear indicator berupa lampu kecil yang akan menyala sesuai sensor yg ada di dalam gearbox. Common atau simpul dari kesemua lampu indicator ini adalah 12v (+) dan sensor pada gear akan memberikan ground kepada lampu yang sesuai dan akan menyalakan lampu, sehingga untuk menterjemahkan ke dalam bentuk digital maka yang akan diteksi adalah perubahan dari 12v menuju 0v (ground). Jika lampu menyala atau sensor gear ON  maka tegangan 0 volt pada sisi (-) pada lampu harus diterjemahkan sebagai "AKTIF" oleh system, sedangkan ketika sensor gear mati dan lampu padam maka tegangan pada konektor lampu (-) akan mempunyai tegangan 12v dan system menterjemahkannya sebagai "MATI"

IC CMOS 4511 dipilih karena merupakan ic decoder biner ke 7 segment yang bekerja pada range tegangan 3-15 volt sehingga akan menghemat penggunaan regulator tegangan 5v apabila menggunakan IC TTL semaca 74LS47. Input dari ic ini berupa 4 bit binary coded decimal, dimana 4 bit ini mewakili angka 0-9 (9 = 1001). Karena gear yang diteksi hanya maksimum 4 + 1(netral) maka pemilihan binary cukup dengan memanfaatkan kombinasi dioda 1N4148 (dioda jenis lain pun ok). Dengan sifat dioda yang hanya satu arah maka kondisi biner yg dikehendaki dapat disusun.




Karena sifat output dari IC CMOS 4511 adalah active high , maka dibutuhkan 7 segmen Common Cathode. Akan tetapi Common Cathode memiliki kekurangan pada pengaturan keseragaman nyala segmen, jadi ketika banyak segmen maka dia nyala redup, sedangkan ketika sedikit segmen yg nyala maka led menyala terang sekali. Untuk itu kita memilih menggunakan 7 segmen Common  Anode dengan pertimbangan tiap segmen akan gampang diatur arus yang mengalir padanya menggunakan transistor. Kebetulan saja transistor yg dipakai NPN yang akan mendrive tiap segmen ke ground. Tambah klop lagi jika menggunakan ic transistor array ULN2003 sehingga urusan menyolder menjadi lebih simple.


HASIL

Dari percobaan diatas breadboard oleh pembaca yang memiliki ide awal, didapatkan hasil seperti berikut ini...







Saya tunggu hasil praktek dari pembaca lainnya dan dengan senang hati akan saya tampilkan pada blog ini.

SELAMAT MENCOBA


Share:

Rabu, 21 Agustus 2013

Papan Skor 2 Digit Dengan IC 4026

( post terdahulu terdeteksi malware ..jadi saya posting ulang )

Mau bikin papan skor sederhana ? gampang aja ..
kita manfaatkan project sederhana di posting terdahulu ,
yaitu memanfaatkan IC UP COUNTER CMOS 4026






IC CMOS ini sudah langsung bisa dihubungkan ke 7 segmen common katoda (negatif)

jika ingin membuat 2 digit lebih, maka kita cascade / hubung tingkat antar IC , jadi ketika IC pertama mencapai angka 5, maka output CO akan menjadi Low (0) dan ketika mencapai 0 akan menjadi High (1). perpindahan 0-1 akan mengakibatkan counter tambah 1 sehingga pin CO digit sebelumnya dapat menjadi input CLOCK ic dengan pembagian puluhan lebih lanjut

rangkaiannya seperti ini : 




hasilnya di PCB lobang kira2 seperti ini , dimana untuk menambah nilai counter dilakukan dengan pencet tombol



Untuk menjadi papan skor sederhana, maka dibuat 2 buah rangkaian yang serupa, dengan menambahkan tombol "reset" (PULL DOWN 4k7 ohm seperti rangkaian tombol UP tapi logikanya terbalik / reset saat high) dihubungkan ke pin nomer 15 tiap IC



jika memerlukan display yang lebih besar, dapat menggunakan 7 segment yg besar atau membuat sendiri dengan menyusun LED menjadi segmen yang ukurannya besar



selamat mencoba
Share:

Minggu, 18 Agustus 2013

Instalasi DT HiQ AVR-51 (AVRISP MK2) - AVRSTUDIO - Jungo untuk WIN 64 bit




Bagi kamu yang kebingungan setelah membeli downloader DT-Hiq AVR51 (versi AVRISP MK2) sedangkan komputer yang digunakan WIN 64 bit, berikut saya bagi langkah-langkah yang sebenarnya sudah banyak di share di internet. Tapi buat para pembaca setia yang belum bisa ga ada salahnya kita bahas lagi disini.

Berikan power ke programmer AVR ISP MK2 melalui baterai atau adaptor yg tidak melebihi 5v sehingga led power menyala. Bisa juga menyambung langsung ke rangkaian target sehingga bisa langsung melanjutkan ke proses pemrograman.


Jika tidak menggunakan rangkaian, maka cukup memberi tegangan (+) ke pin header no 2 dan tegangan (-) / Ground ke header pin no 4. Setelah Led hijau menyala maka port usb dapat dicolokkan ke PC/Laptop.



Jika menggunakan win32 biasanya saat instalasi avr studio maka otomatis diberi pilihan untuk menginstal jungo, sedangkan jika menggunakan win64 maka avrstudio versi lawas tidak menyediakan drivernya dan bisa di download disini lalu diextract ke hardisk. Jika menggunakan Atmel Studio 6 sebenernya driver jungo ada di instalasi hanya saja hardwarenya tidak akan kedetect sehingga perlu di "ADD LEGACY HARDWARE" seperti pada gambar di device manager berikut:




Lanjut klik next dan select "Install the hardware, that I manually select from a List (Advanced)" , lalu select "Show All Devices" dan click on "Have disc" dan arahkan ke  "C:\Program Files (x86)\Atmel\AVR Tools\usb64\windrvr6.inf" atau folder tempat extract hasil download sebelumnya.


Pilih "WIN DRIVER" dan kemudian tinggal melanjutkan klik next-next saja. Jika Instalasi benar akan muncul seperti gamabr dibawah serta LED merah (status) pada programmer akan menyala


Selanjutnya AVRSTUDIO dan programmer DT-HiQ yang kamu beli dapat digunakan seperti biasanya.

Untuk yang lebih suka menggunakan AVRDUDE untuk melakukan programming maka perlu menginstal libusb 64 bit yang bisa didownload disini. Selanjutnya tutorial menggunakan AVRDUDE bisa dibaca disini.


SELAMAT MENCOBA ...
Share:

Selasa, 06 Agustus 2013

Kreasi Pembaca: VU Meter Untuk Sound Level dengan ATMega8535 (Versi Digital)



Kreasi pembaca lanjutan dari tulisan sebelumnya merupakan penggabungan dari beberapa pembahasan mengenai penulisan ke lcd dan topik yang membahas tentang ADC (Analog To Digital Converter). Sinyal yang diterima oleh mic condenser kemudian dikuatkan dua kali oleh op-amp LM358 kemudian output yang berupa tegangan ini akan memberikan inputan menuju ADC port pada minimum system 8535. Sebelumnya alangkah baiknya kita ketahui dulu bagaimana response tegangan dengan suara yang tidaklah linear akan tetapi logaritmik.




Microcontroller 8 bit akan mengalami kesulitan jika dipaksakan berhitung di skala logarithmic (entah micronya yg bakal error atau kepala yg bikin script akan pusing hebat). Nah untuk itu kita akan mengambil sampling data sound level dari sebuah bunyi (tone generator) , kemudian kita ukur pada dbMeter yang difungsikan sebagai kalibrator. Pada saat yang bersamaan kita catat pula level pembacaan ADC yang keluar pada layar LCD minimum system. 

Karena sudah memakai minimum system maka rangkaian yg kita tampilkan hanya berupa penguat dari mic condenser.



Klik gambar untuk memperjelas gambar
*) VCC 5v tidak sebagai input, melainkan input dari supply 9-12v


Jika pembaca sudah terbiasa dengan pembahasan ADC ungkin akan sangat mudah tetapi tetap saja saya tempel scriptnya demi kemudahan bagi pembaca setia.


//Insisialisasi awal

#define F_CPU 4000000UL //frek minsys 8535 versi innovative
#include <string.h>
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"

// silahkan baca pembahasan menulis di lcd
//fungsi untuk menulis angka ke ASCII LCD
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); 
}  


//insisialisasi ADC

void initADC()
{
ADMUX=(1<<REFS0);// Aref=AVcc;
ADCSRA=(1<<ADEN)|(1<<ADIE)|(7<<ADPS0);
MCUCR |= _BV(SE);  // Sleep Enable, jadi abis ini processor diturunkan loadnya
MCUCR |=_BV(SM0);  // mode ADC NOISE REDUTION
}


//Baca ADC, pilih pin portA yg diinginkan

uint16_t ReadADC(uint8_t ch)
{

   //Select ADC Channel ch must be 0-7
   ch=ch&0b00000111;
   ADMUX|=ch;

   //Start Single conversion

   ADCSRA|=(1<<ADSC);

   //Wait for conversion to complete
   while(!(ADCSRA & (1<<ADIF)));

   //Clear ADIF by writing one to it
   ADCSRA|=(1<<ADIF);

   return(ADC);

}


int main(void)
{


uint16_t baca,decimal,pecahan;
uint8_t a;

//inisialisasi port I/O 

//PORTC menuju LCD & BUzzer
//PC0=buzzer, dapat tidak digunakan
DDRC  |= (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)|(1<<PC6)|(1<<PC7);
//PC1=Rs PC2=R/W PC3= E PC4-PC7 = data lcd 4 bit
//inisialisasi LCD
lcd_init(LCD_DISP_ON);
lcd_clrscr();


initADC();
char dum; //dum = variabel sementara penyimpan angka


   while(1)
   {

      baca=ReadADC(1); //baca tegangan output op-amp
      lcd_clrscr();
      lcd_gotoxy(0,0);

    // baca merupakan binner 10 bit, range 0-5V
    // jadi binnernya 0-1023  
    
  // berikut ini untuk buat animasi level VU
 for(a=0; a< (baca/64); a++) 
    {

     if(a<16) lcd_putc(0xFF); //tulis kotak ke LCD sesuai level

 }

// yang ini penentuan level buzzer, gunakan sesuai keinginan 
    if(a>13) PORTC|=(1<< PC0);
 else PORTC &= ~(1<< PC0);

//buzzer dapat tidak digunakan

      
   decimal= (baca * 5)/1000 ;

   pecahan= ( ((baca * 5) - (decimal * 1000) ) /10);

// tampilan tegangan ke LCD
      lcd_gotoxy(0,1);
      lcd_puts("teg =");

      itoa(decimal,&dum);
   lcd_puts(&dum);
   lcd_putc(',');
      
       if(pecahan <10) lcd_putc('0');

      itoa(pecahan,&dum);
   lcd_puts(&dum);

   lcd_puts(" V    ");
  

      _delay_ms(100);  //delay pembacaan, ubah2 sesuai keinginan, makin cepet susah dibaca tapi makin realtime

   }


return 0;

}




Selanjutnya jika menginginkan perhitungan dB (desibel) dari level suara, maka kita buat tabel seperti contoh berikut :


dB P1 P2 P3 AVG BINER
45 2.09 2.22 2.12 2.14 429
50 2.12 2.25 2.19 2.19 437
47 2.15 2.27 2.21 2.21 442
48 2.18 2.31 2.22 2.24 447
49 2.25 2.32 2.23 2.27 453
51 2.28 2.34 2.24 2.29 457
52 2.32 2.35 2.26 2.31 462
53 2.36 2.37 2.27 2.33 467
55 2.41 2.39 2.29 2.36 473
56 2.47 2.42 2.31 2.40 480
58 2.53 2.44 2.33 2.43 487
59 2.56 2.46 2.34 2.45 491
61 2.57 2.48 2.35 2.47 493
62 2.59 2.49 2.37 2.48 497
65 2.60 2.53 2.41 2.51 503
67 2.62 2.54 2.43 2.53 506
68 2.63 2.56 2.44 2.54 509
70 2.66 2.58 2.47 2.57 514 



Dengan perolehan data seperti diatas maka dapat dilakukan pengambilan sample level db vs voltage(rata-rata) kemudian secara mudah dapat dilakukan menggunakan lookup array ataupun paling primitif menggunakan "IF ELSE" saja seperti contoh berikut:




  if( baca <= 429) lcd_puts("<45 dB");
  else if( baca > 429 && baca <= 437 ) lcd_puts(" 45 dB");
  else if( baca > 437 && baca <= 442 ) lcd_puts(" 50 dB");
  else if( baca > 442 && baca <= 447 ) lcd_puts(" 47 dB");
  else if( baca > 447 && baca <= 453 ) lcd_puts(" 48 dB");
  else if( baca > 453 && baca <= 457 ) lcd_puts(" 49 dB");
  else if( baca > 457 && baca <= 462 ) lcd_puts(" 51 dB");
  else if( baca > 462 && baca <= 467 ) lcd_puts(" 52 dB");
  else if( baca > 467 && baca <= 473 ) lcd_puts(" 53 dB");
  else if( baca > 473 && baca <= 480 ) lcd_puts(" 55 dB");
  else if( baca > 480 && baca <= 487 ) lcd_puts(" 56 dB");
  else if( baca > 487 && baca <= 491 ) lcd_puts(" 58 dB");
  else if( baca > 491 && baca <= 493 ) lcd_puts(" 59 dB");
  else if( baca > 493 && baca <= 497 ) lcd_puts(" 61 dB");
  else if( baca > 497 && baca <= 503 ) lcd_puts(" 62 dB");
  else if( baca > 503 && baca <= 506 ) lcd_puts(" 65 dB");
  else if( baca > 506 && baca <= 509 ) lcd_puts(" 67 dB");
  else if( baca > 509 && baca <= 514 ) lcd_puts(" 68 dB");
  else if( baca > 514 ) lcd_puts(">70 dB");



Hasilnya pada video berikut ...jangan terkejut alau kualitas video jelek dan ada suara latar yang sangat "menggetarkan hati..."





Dan seperti biasa kabar gembira muncul dari hasil bimbinganku ini, tugas akhir yang dibuat mahasiswi dari aceh ini mendapatkan nilai "A"  . Duh ...senangnya.....


SELAMAT MENCOBA
Share:

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:

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:

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:

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:

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 (26) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (59) 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 (28) 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