Jumat, 25 Januari 2013

Laundry yuk ! software admin + kasir untuk laundry kiloan



LAUNDRY YUK !!


12036376.png (591×640)



Kini Versi 4 Lebih Keren Loooo






PERNAH MENGALAMI KEJADIAN SEPERTI INI ??

12036385.jpg (640×440)


KEUNTUNGAN MEMAKAI SOFTWARE INI


  •           Mempermudah transaksi  pada usaha laundry kiloan
  •           Mengurangi komplain karena kesalahan pegawai laundry dalam memasukkan data laundry
  •           Mempermudah pembukuan transaksi
  •         Mempercantik usaha laundry kiloan, dengan memanfaatkan screensaver sebagai media iklan saat tidak ada transaksi


KEBUTUHAN PERANGKAT

>>      PC / LAPTOP standar dengan kemampuan dual monitor/duplicate
Laptop yg dijual secara umum sudah memiliki dual monitor, jadi lebih baik menggunakan Laptop dikarenakan PC membutuhkan alat tambahan berupa monitor extender/splitter
>>       2 Buah layar monitor, 1 untuk pegawai/penjaga, 1 (diusahakan layar lebar) yg ditempatkan di etalase yg menuju pelanggan. Bisa juga untuk layar monitor sentuh atau menggunakan 1 buah display saja.
>>     Keyboard/numpad (USB) + Mouse(USB)  tambahan di untuk di etalase pelanggan. Jika kabel kurang panjang, dibutuhkan kabel extender USB




FASILITAS TERBARU VERSI 4 KEATAS :

- Login pengguna software yg bisa dibedakan berdasarkan kewenangannya
- Bisa untuk cucian kiloan, satuan, sistem deposit dan cuci express
- Sistem database sederhana tanpa perlu install mysql, dbase dll
- Print nota hanya menggunakan printer biasa (inkjet / deskjet) yang murah
- Ter-integrasi dengan pembukuan yg bisa diubah ke excel
- Fasilitas upload foto sebelum dan sesudah mencuci





KINI DENGAN REKAP BULANAN /HARIAN di EXCEL









SCREEN SHOOT

12036396.jpg (640×400)

12036397.jpg (640×400)

12036398.jpg (640×400)


PRINT OUT 





DEMO Ver. 4.0 DAPAT DOWNLOAD DISINI



HANYA 500rb SAJA !!



SELAMAT MENCOBA


Senin, 21 Januari 2013

KONTROL MOTOR SERVO JARAK JAUH via DTMF / HANDPHONE dengan IC 555


Untuk pembahasan kali ini adalah hasil bimbingan saya ke rekan pembaca blog yang bingung mengerjakan TA(skripsi) nya. Setelah rekan ini membaca pembahasan DTMF pada blog  disini, dia kebingungan ketika ingin merubah rancangan tanpa micro di blog menjadi dengan micro karena dasar micronya lemah. Kenapa dipaksa pakai micro ? toh dengan 555 saja servo bisa jalan ...perhatikan skematik berikut :



dari rangkaian PWM sederhana diatas sudah dapat mengontrol pergerakan dari motor servo dengan merubah dutycycle nya yang dikontrol oleh potensio P1. Nahh bagaimana dengan rangkaian DTMF ? kembali ke blog dan perhatikan gambar rangkaian berikut:

(klik untuk memperbesar)

rangkaian decoder dtmf sederhana diatas menggunakan ic decoder 8870 yg umum dijual di toko komponen, dengan truth table seperti berikut :


(klik untuk memperbesar)



nahh...dengan memperhatikan truth table diatas, secara sederhana kita dapat menggunakan 4 buah output menjadi control dutycycle PWM 555, dengan merubah-rubah pembagian tegangan yg akan diberikan ke pin 7 dari 555 melalui kontrol DTMF. Caranya mudah dengan memparalel beberapa trimpot dan melakukan switching ke pin tengahnya yg menuju ke pin 7 dari 555, switch ini bisa dilakukan dengan transistor atau menggunakan relay seperti yg dilakukan rekan dengan email : fendrian1989@gmail.com , memang agak membingungkan tapi dia berhasil kok...kalo bingung hubungi dia saja..hehehe

(klik untuk memperbesar)

tiap posisi servo yg diinginkan dapat dicoba terlebih dahulu (dengan merubah puteran trimpot/potensio) sebelum di switch menggunakan teknik relay atau transistor..

hasilnya seperti berikut, agan ini menggunakan servo continous yg muter terus sesuai perubahan arah yg diinginkan, kalo pake yg non kontinyu maka PWM berkolerasi dengan posisi sudut dari servo. Posisi yg dapat diperoleh dengan rangkaian sederhana ini adalah 4 posisi, sedangkan jika menginginkan 10 posisi sesuai jumlah dial telepon maka menggunakan BCD to Decimal decoder seperti penjelasan disini



Selamat Mencoba

Kamis, 17 Januari 2013

BERMAIN DENGAN TV PART #3 - OSD (Composite Video Text Overlay) dengan Attiny2313




Text Overlay atau On Screen Display (OSD) merupakan fitur yang umum dijumpai pada televisi modern. Gambar composite (AV in) dapat ditumpuk dengan text seperti text berjalan (scroll text / crawler) , logo , jam dan berbagai macam sesuai keinginan. Bagaimana cara menimpa gambar video dengan text akan kita bahas disini, dan diharapkan membaca penjelasan mengenai dasar-dasar bermain televisi menggunakan microcontroller disini:  PART#1  PART#2  JAM TV



Courtesy of  VIENA WIRELESS SOCIETY 


Gunakan rangkaian yg terhubung dengan AIN saja, yg di dekat TX RX diabaikan saja


Pada web aslinya yang digunakan ic microcontroller  ATMega8 ,prinsip utamanya memanfaatkan analog komparator untuk mendeteksi sinkronisasi vertikal & horisontal dari sinyal input video composit (semisal dari kamera atau dvd).


Pada script di web asli dijelaskan bahwa yg digunakan video NTSC..karena di indonesia menggunakan PAL maka saya ubah script menjadi PAL dan menggunakan ATTINY



dari gambar ic attiny 2313 kita akan menggunakan pin AIN0 dan AIN1 serta pin MOSI, dan beberapa pin digunakan sebagai tombol seperlunya, rangkai sesuai gambar asli. gunakan nilai komponen sesuai catatan dan dengan bereksperimen maka akan didapat efek2 yg tidak diduga seperti warna text, warna latar dsb.


untuk itu kita bahas script satu persatu ...


>>> Header <<



#define F_CPU 20000000UL //xtal 20MHz

#include <avr/io.h>

#include <util/delay.h>

#include <avr/interrupt.h>

#include <avr/pgmspace.h>

#include <avr/sleep.h>





#define FONTHEIGHT 12 //panjang text



//rumus dan variabel syncronisasi

#define HSYNC PORTB=0;

#define GREY PORTB=0x80;

#define COL(r) textnya=word[r][fontline];



static uint8_t fontline = 0;

static uint8_t fontzoom = 0;

static uint16_t rasterline=0;



// ARRAY untuk tulisan nomer 0,1,2 dst



const unsigned char font[12][FONTHEIGHT] PROGMEM = { 

   {

 0b00000000,

 0b01111100,

 0b11000110,

 0b11001110,

 0b11011110,

 0b11010110,

 0b11110110,

 0b11100110,

 0b11000110,

 0b01111100,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b00010000,

 0b00110000,

 0b11110000,

 0b00110000,

 0b00110000,

 0b00110000,

 0b00110000,

 0b00110000,

 0b11111100,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b01111000,

 0b11001100,

 0b11001100,

 0b00001100,

 0b00011000,

 0b00110000,

 0b01100000,

 0b11001100,

 0b11111100,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b01111000,

 0b11001100,

 0b00001100,

 0b00001100,

 0b00111000,

 0b00001100,

 0b00001100,

 0b11001100,

 0b01111000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b00001100,

 0b00011100,

 0b00111100,

 0b01101100,

 0b11001100,

 0b11111110,

 0b00001100,

 0b00001100,

 0b00011110,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b11111100,

 0b11000000,

 0b11000000,

 0b11000000,

 0b11111000,

 0b00001100,

 0b00001100,

 0b11001100,

 0b01111000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b00111000,

 0b01100000,

 0b11000000,

 0b11000000,

 0b11111000,

 0b11001100,

 0b11001100,

 0b11001100,

 0b01111000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b11111110,

 0b11000110,

 0b11000110,

 0b00000110,

 0b00001100,

 0b00011000,

 0b00110000,

 0b00110000,

 0b00110000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b01111000,

 0b11001100,

 0b11001100,

 0b11101100,

 0b01111000,

 0b11011100,

 0b11001100,

 0b11001100,

 0b01111000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b01111000,

 0b11001100,

 0b11001100,

 0b11001100,

 0b01111100,

 0b00011000,

 0b00011000,

 0b00110000,

 0b01110000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b00000000,

 0b00000000,

 0b00110000,

 0b00110000,

 0b00000000,

 0b00000000,

 0b00110000,

 0b00110000,

 0b00000000,

 0b00000000,

 0b00000000,

 },

 {

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 0b00000000,

 }};





//variabel pelengkap



uint8_t word[7][12];

int y;

uint8_t jam,menit,detik,textnya,tick;







>>> timer untuk horisontal sync PAL (64us) <<


void timer_init(void){



 TCCR1B |= (1<<WGM12);

 TIMSK |= (1<<OCIE1A);

 OCR1A = 1280; //64*16;

 TCCR1B |= (1<<CS10);



}





>> geser2 bit untuk menampilkan angka dari Array <<



void geser(void)

{ 

PORTB = (textnya  & 0x80) +0x8  ;

textnya <<=1;

PORTB = (textnya  & 0x80) +0x8 ;

textnya <<=1;

PORTB = (textnya  & 0x80)  +0x8 ;

textnya <<=1;

PORTB = (textnya  & 0x80)  +0x8 ;

textnya <<=1;

PORTB = (textnya  & 0x80)  +0x8 ;

textnya <<=1;

PORTB = (textnya  & 0x80)   +0x8;

textnya <<=1;

PORTB = (textnya  & 0x80)   +0x8 ;

textnya <<=1;

PORTB = (textnya  & 0x80)   +0x8 ;



}





>> proses tulis tiap 1us dari frame horisontal 64us <<




void tulis(void){



//31 & 43 adalah batas tinggi karakter 12 scan/rasterline/vsync

//y adalah posisi rasterline(Vsync) yg sedang ditulis

 if( rasterline > (31+y) && rasterline <= (43+y) ) {

  _delay_us(8);

    COL(0);

    geser();

    COL(1);

    geser();

    COL(2);

    geser();

    COL(3);

    geser();

    COL(4);

    geser();

    COL(2);

    geser();

    COL(5);

    geser();

    COL(6);

    geser();

       PORTB=0;

      _delay_us(1);

  fontline++; //pindah ke array selanjutnya

 } 

//jika tidak menulis 

   else { 

  _delay_us(8);

   fontline = 0;

  fontzoom=0;

   }



// yang ini batas scannline trus bisa sisipkan proses

//      memasukkan data ke memory 

//  sesuaikan karena kaskus merubah text &word; (hilangkan ' ; ') 

 if( rasterline > 311 )

  { memcpy_P(&word;[0],&font;[jam/10],12);

   memcpy_P(&word;[1],&font;[jam],12);

   memcpy_P(&word;[2],&font;[10],12);

   memcpy_P(&word;[3],&font;[menit/10],12);

   memcpy_P(&word;[4],&font;[menit],12);

   memcpy_P(&word;[5],&font;[detik/10],12);

   memcpy_P(&word;[6],&font;[detik],12);

 

      }

}



// interupt 64us 

ISR (TIMER1_COMPA_vect) {



rasterline = 0;



}



>> comparator untuk mendeteksi awal Vsync dan Hsync <<



SIGNAL(SIG_COMPARATOR)



{ //trik mendeteksi hsync dan vsync dengan melihat lama blanking



 TCNT1=0; // reset timer

 while(TCNT1<70); // wait 5us to see if H or V sync



 if(!((ACSR>>ACO)&1)) { // its an H sync

  TCNT1=0; // reset timer

  rasterline++;

  tulis();

 }

 else { // this a V sync

  rasterline=0;

    

//sekalian aja ditambah timer untuk nambah detik

  tick++;

    if(tick >= 200){

    tick=0;

       detik++;

    if(detik==60){

      menit++;

   detik=0;}



       if(menit==60){

    menit=0;

    jam++;}

    if (jam==24) jam=0;

  }

 }

}  





>> Tombol untuk ubah jam dan geser2 posisi jam <<




void tombol(void)

{

if(bit_is_clear(PIND, PIND3)) 

{

jam++;



if(jam == 24) jam=0;



detik=0;

_delay_ms(200);

}



else if(bit_is_clear(PIND, PIND4))

{

menit++;  



if(menit == 60) menit =0;





detik=0;

_delay_ms(200);

}



else if(bit_is_clear(PIND, PIND5)) //naik

{

y-=3;



if(y<1) y=1;



_delay_ms(200);

}



else if(bit_is_clear(PIND, PIND6)) //turun

{

y+=3;



if(y>300) y=300;



_delay_ms(200);

}






>> main program<<




int main() {

tick=0;

jam=22;

menit=19;

detik=44;

rasterline=0;

y=0; //variable posisi text

    



    ACSR = (1<<ACIE)|(1<<ACIS0)|(1<<ACIS1);  //analog comparator

    DDRD &=~(1<<PD3) & ~(1<<PD4)&~(1<<PD5) & ~(1<<PD6) ; //tombol

    

  // data text dan MISO, PB0 pada web asli dirubah jadi PB3 attiny 

    DDRB |= (1<<PB7)|(1<<PB3);

  



        timer_init(); //idupin timer

    

 set_sleep_mode(SLEEP_MODE_IDLE); //menghemat tenaga



 sei();



 for( ;; )tombol();

}





rangkaian ini cocok buat nambahin text ke kamera CCTV murah yg ga ada textnya, jadi bisa ditambahin jam atau text penanda nomer kamera




SELAMAT MENCOBA

Jumat, 11 Januari 2013

PAPAN SKOR BADMINTON LAYAR LEBAR, CONTROL via WI-FI

Setelah berjualan papan score "E-scoreboard" di link ini




dengan bangga mempersembahkan kepada negara tercinta ...




SOFTWARE PAPAN SKOR BADMINTON 


Cara Kerja bagaimana ?






1. Display scoreboard Layar Lebar dikontrol oleh PC yang dinamakan PC server
2. Kontrol penjurian menggunakan software remote, sebaiknya menggunakan tablet windows
3. Koneksi penjurian dari remote ke server menggunakan TCP/IP via LAN atau Wi-Fi


contoh seperti video berikut:





KABAR BAIK... DEMO DAPAT DIDOWNLOAD LHOO....




http://www.4shared.com/zip/HQ0t7Yz-/demo_scoreboard.html



MELAYANI JUGA UNTUK CABANG OLAH RAGA LAIN SESUAI KEINGINAN




berminat ?? silahkan PM atau hubungi via email : ahocool@gmail.com
ym : ahokleng
PIN BB:321477A8
HP: 085733889569 , 087882045949

Senin, 07 Januari 2013

Tentang Penulis - Waktunya Untuk 'Narsis'



Setelah sekian lama menulis di blog ini tak ada salahnya untuk memposting "narcism moment" dari saya. Mungkin sedikit bikin eneq tapi apa daya inilah sang penulis yang 'terpakasa' narsis karena didorong oleh temen yg mengatakan " tulisan mu udah banyak, saatnya elo 'menjual' diri sekarang !" Apaaa  ?   menjual diri ? 

Lahir dari keluarga kecil di kota kecil Singaraja Bali, menghabiskan masa kecil bermain solder & Avometer pinjeman dari mantan pacar kakak perempuan, sering utak-atik dan modifikasi hampir setiap barang elektronika yg ada dirumah. Suatu hari aku merusak radio-tape merek National kesayangan bapak karena membaca artikel di majalah tentang memperkuat tangkapan radio FM, Bapak pun marah-marah dan melarangku mengutak-atik barang-barang kelistrikan di rumah. Tapi namanya anak-anak ya tetap saja tangannya gatel dan kembali berhasil merusakkan radio FM saku yg diutak-atik agar dapat  mendengarkan percakapan tower bandara dengan pesawat terbang. Begitu lah hari-hari di masa kecil kulalui dengan bermain semua hal elektronika yg bisa didapat di kota kecil itu.


hobby selaen nyolder , jadi gitaris band kelas di acara ultah smansa singaraja


Suatu hari ada kesempatan untuk melancong ke kota buaya bersama pacar sang kakak ( yg gagal jadi ipar ) dan diperkenalkanlah diriku pada surganya tukang solder, surga ini bernama "Pasar Genteng". Mimpi ku untuk menelusuri 'surga' ini lebih luas lagi menjadi kenyataan ketika pada tahun 1998 diterima di Jurusan Telknik Elektro ITS dan bertemulah dengan master-master sesepuh elektronika seperti bapak Heru, Alm. Ir. Sutikno, bapak Rahmat dan masih banyak lagi yg kepanjangan jika disebutkan.

Sebagai penghuni LAB - B202 tahun 2001-2003 membuat ku menjadi paham dengan prinsip elektronika yang sebenarnya, walau kadang otak tidak sampai karena memang lemah di bidang analisa, ya setidaknya dengan masuk LAB dan tidur disana membuatku mengirit pengeluaran dari uang saku yg dibuat super 'ngepress' untuk seukuran jaman itu. Hampir semua bahan-bahan untuk tugas (praktikum) didapatkan dari membongkar (istilah anak-anak 'leles-leles') peralatan elektronika yg sudah tidak terpakai atau dari 'lungsuran' alias warisan dari kakak kelas yg sudah selesai mengerjakan tugas.

Kampus elektro - ITS sekitar tahun 2000 ,saya paling depan 


Waktu untuk mengerjakan skripsi pun datang, walau masih kepingin tetap di lab (setelah 5 tahun dikampus), tetapi pesan dari seorang paman menyarankan saya segera lulus agar meringankan beban orang tua, dan kemudian fokus 6 bulan di skripsi yang bertema rancang bangun automatic fish feeder berbasis FPGA. Ketika itu dosen kepala bidang studi melarang menggunakan microcontroller kecuali  mereka yang sudah batas akhir. Dan tak lama kemudian namaku mendapat tambahan embel-embel gelar ST . 

Masa kuliah berakhir dan saatnya melangkah ke dunia sebenarnya. Idealisme pun beradu dengan kenyataan. Apakah mesti tetap idealis dengan embel-embel sarjana teknik elektro atau menuju dunia lain yg tidak ada hubungannya dengan kuliah. Pertentangan ini sempat terjadi ketika mengikuti rangkaian test kerja di salah satu bank swasta ternama dan disela-sela proses yg tinggal 2 langkah muncul tawaran dari sebuah pabrik di wilayah brebek-sidoarjo dan pabrik ini bergerak di manufaturing komponen elektronika. Surga ? tidak ! Manufakturing elektronika di indonesia terpuruk dengan munculnya pesaing baru ...TIONGKOK! Akibatnya pabrik pun bersaing dengan pabrik yg disubsidi oleh pemerintah komunis-sosialis. Penekanan COST ! itu yang selalu dingiangkan ke telinga karyawan.

Kenyataan ini menggoyahkan idealisme, melihat buruh-buruh kontrak yang ku pecat tiap 3 bulan dan dipaksa  melihat kenyataan gaji mereka habis untuk bayar hutang . Hanya satu hal yang meringankan 'kegundahan' dari dunia buruh ini adalah kepolosan dan kejujuran para pekerja-pekerja baru serta semangat mereka dari desa ingin merubah nasib ke kota.  Mereka yang baru lulus sma dan melihat ku sebagai sarjana yg masih muda, banyak yg bermimpi untuk kuliah dan bertanya kepadaku "apakah saya bisa kuliah pak?" . Dan jawaban saya "BISA ! "  Senang sekali ketika beberapa tahun setelah meninggalkan pabrik, saya mendapat telepon dari mantan buruh di bagian kerja saya bahwa dia sekarang kuliah di universitas negeri dengan biaya sendiri sebagai SPG toko.

sebagai telco engineer di samsung telecom indonesia

Keluar dari pabrik, meninggalkan dunia elektronika dan masuk ke dunia yang sebenernya masih berhubungan, Telekomunikasi ! Project-project telco di pertengahan 2000-an bermunculan dimana-mana, vendor dan operator telco berlomba-lomba menggelar layanan yang membuat dunia telco begitu kinclong. Sampai suatu saat mendapatkan gelar 'Best Engineer Award 2008' dan berkesempatan jalan-jalan ke korea. Bersama rekan-rekan dari wilayah kerja lain yg juga mendapatkan hadiah,  berkeliling suwon-seoul menikmati pemandangan di korea yang mungkin tidak ditemui di negeri sendiri. Saat itu halyu (korean wave) dengan gangnam style -nya  belum seterkenal sekarang akan tetapi sudah cukup sering kita lihat sinetron K-drama di tv lokal. A dream come true ?   Maybe....kemudian dunia telco kembali dijajah oleh...TIONGKOK !!  ARGHGGHHHH . Kinclongnya pun serasa lampu redup !

Di Suwon - Korea Selatan tahun2008

Kenyataan bahwa dunia telco tidak sekinclong dulu mengubah duniaku untuk kembali ke jalan hidup sesuai kata hati. Kembali ke pasar genteng dengan wajah-wajah yang masih sama, tetapi produk yang dijual berbeda. AVR dan minimum system berbasis arduino umum dijumpai. Arduino menawarkan jalan pintas dan aku tidak suka karena membuat tergantung pada shield atau perangkat tambahan untuk melakukan fungsi yg sederhana sekalipun. Dan kembalilah seperti masa kuliah dulu yaitu 'start from scratch' belajar dari menyusun di breadboard. Sampai suatu saat mendapatkan kembali kemampuan yg mungkin lebih jago dari jaman kuliah, mungkin karena sekarang sudah ada dana dari hasil kerja kantoran untuk bebas membeli komponen dan tools yang diinginkan

Dimulai dari tulisan di room hobby di kaskus, terus berusaha menularkan hobby dan ilmu elektronika , sempat berpikir untuk untuk membuat workshop, dan akhirnya kembali ke awal mula sebagai anak dari pasangan guru, menulis dan menularkan ilmu serasa lebih mudah daripada menjual project-project yg kadang-kadang kesulitan dalam menentukan harganya. Seperti kata seseorang di acara motivasi di TV...'Bekerjalah tanpa memikirkan hasil (gaji) , jika tekun dan serius duit akan mengalir dengan sendirinya'. Mari kita buktikan kawan !


Selamat Berkarya 

NYOMAN YUDI KURNIAWAN, ST

Jumat, 04 Januari 2013

Animasi LED keren


Berdasarkan reques seorang pembaca , posting saya kali ini sesuai dengan video youtube dibawah ini.




Sebenernya project serupa pernah saya bahas di project led berjalan dengan ic 4017, hanya kali ini animasinya lumayan keren dan memakai banyak LED. Untuk mendrive LED yang banyak dibutuhkan transistor dan perhitungan tegangan sumber vs jumlah LED beserta kombinasi rangkaian paralel/seri sesuai rumus di www.ledcalculator.net

Gambaran driving led jumlah  banyak seperti gambar dibawah ini.


Gambar yang diatas menunjukkan 5 buah LED yang langsung dihubungkan ke output 4017 karena ic 4017 diberi tegangan 12volt dimana jika memakai 5 LED maka masing-masing LED mendapatkan tegangan yang cukup. Jika Led lebih banyak maka diperlukan perhitungan seri-paralel sesuai rumus.

Pada video youtube terdapat 4 buah rangkaian LED yang disusun membentuk karakter. Berdasarkan sifat output 4017 maka untuk membuat animasi seperti pada video maka mudah saja dengan memberikan output single pada out  0 - 1 - 2 - 3  ke masing-masing huruf. Sedangkan untuk membikin kedip bareng maka yang disambungkan secara paralel adalah output 5 - 7 - 9. Agar animasi sesuai dan tidak numpuk maka ditambahkan dioda small signal 1N4148 yang disusun seperti rangkaian berikut:



(klik untuk memperbesar)



Mudah Bukan ? Selamat Mencoba

Cara Membuat Led Berjalan yang Panjang (cascade)

5050-RGB-Running-LED-Strip.jpg (290×258)



Banyak pertanyaan yang datang melalui sms, group BBM atau facebook yang bertanya bagaimana membuat rangkaian Led Berjalan (Running LED) yang memiliki panjang lebih dari 10 ? Jika anda googling maka akan diarahkan menuju website hobby yang sudah terkenal milik sesepuh elektronika BILL BOWDEN. Rangkaian pertama yang ditawarkan seperti berikut:


courtesy of BILL BOWDEN 's    http://www.bowdenshobbycircuits.info

(klik untuk memperbesar)

Rangkaian ini memanfaatkan 2 buah 4017 dan 10 transistor yang akan membuat led berjalan 25 buah, dan jika mau dapat di perpanjang sampai 10 x 10 atau 100 buah. Rangkaian ini memanfaatkan kombinasi scanning kolom dan baris seperti halnya dot matrix, akan tetapi jika LED disusun berurutan maka maksimum 100 sequence bisa diperoleh.

Rangkaian dasar dari running 10 LED seperti berikut :

(klik untuk memperbesar)


Sedangkan jika di cascade 2 buah 4017 caranya dengan menambahkan dioda dan beberapa resistor.



(klik untuk memperbesar)



Rangkaian cascade ini memanfaatkan output clock dari pin ke  3 dari  4017 pertama. Kadang-kadang orang pintar pun banyak salahnya dan rangkaian diatas tidak berhasil jika dicoba lhoo. Penulis akhirnya bereksperimen sehingga menemukan cara yang lebih akurat dengan menggunakan transistor sebagai pengendali input ke pin enable dan reset seperti rangkaian berikut.



(klik untuk memperbesar  , VDD = Tegangan (+)  VSS = Tegangan (-) atau Ground ) 



Komponen tambahan berupa dioda 1N4148, resistor 10K dan transistor NPN umum seperti 2N3904, BC107, 2N2222, C9013 dan lain sebagainya. Input clock dari rangkaian berasal dari rangkaian clock 555 (atau yg lainnya) yang sama diberikan ke tiap ic 4017.

Prinsip dari rangkaian adalah memberikan input ke pin 13 (chip enable yang aktif LOW ) pada sequence terakhir (Q9) dari sebuah IC 4017. Selama sequence belum berakhir maka  Q9 yang nilainya "LOW" akan mengenable kan IC serta me-Reset IC pada posisi setelahnya. Efek yang terjadi adalah bahwa hanya sebuah 4017 yang akan aktif sedangkan ic 4017 setelahnya berada pada kondisi "Reset" sedangkan pada ic 4017 posisi sebelumnya mendapatkan posisi disable.

Rangkaian ini dapat disusun sampai banyak 4017 tak terhingga, dan pada ic 4017 terakhir, sequence terakhir  (Q9) akan dihubungkan menuju reset pada ic 4017 pertama. Sebaiknya hubungannya diberikan dioda agar logikanya tidak mengambang (float). Kondisi ini akan mereset semua ic 4017 dan memulai sequence dari awal lagi. Output yang dikorbankan adalah Q0 dan Q9 sehingga berkurang 2 buah sequence tiap ic 4017.

Trick cascading ini sangat berguna untuk proses scanning kolom untuk rangkaian text scroll menggunakan led matrix yang jumlahnya banyak seperti pembahasan disini .


Cara lain yang cukup simple adalah memanfaatkan ic shift register seperti 74LS595 / 74HC164 tetapi ic shift register akan susah dijumpai di daerah-daerah pinggiran sehingga ic 4017 yang lebih universal menjadi pilihan terbaik.

(klik untuk memperjelas)



terjemahan dari web asli :

16 (bisa lebih) Tahap LED Sequencer

Sirkuit pada gambar di atas menggunakan hex ​​inverter Schmitt Trigger (74HC14) dan dua 8 bit Serial-In/Parallel-Out register geser (74HCT164 atau 74HC164) untuk urutan 16 LED. Rangkaian dapat diperluas ke panjang lebih besar dengan cascading shift register tambahan dan menghubungkan output ke-8 (pin 13) ke input data (pin 1) tahap berikutnya. sebuah Schmitt trigger osilator (74HC14 pin 1 dan 2) menghasilkan sinyal clock untuk register geser, dengan kecepatan clock yang kira-kira 1/RC. Dua tambahan tahap Schmitt trigger digunakan untuk me-reset dan memuat register saat dinyalakan. Ketepatan waktu tidak perlu terlalu diperhatikan , namun output pada pin 8 dari  Schmitt Trigger harus tetap "HIGH" selama "LOW" atau 0 yang pertama  dan digunakan untuk transisi clock ke "HIGH"di pin 8 dari register, dan harus kembali "LOW" sebelum sisi kenaikan clock untuk memuat satu bit. Jika clock rate meningkat, panjang sinyal pada pin 9 dari  Schmitt Trigger harus diturunkan secara proporsional untuk menghindari memuat lebih dari satu bit. IC dengan type HC biasanya akan menyediakan sekitar 4 mA (dinamakan arus sink) dari setiap output tetapi dapat memasok arus besar (mungkin 25 mA) jika hanya satu output dimuat. Umumnya  resistor 150 ohm membatasi arus bawah 25 mA jika menggunakan sumber daya 6 volt. Jika sirkuit ini dioperasikan dengan dua atau lebih LED pada pada saat yang sama, resistor mungkin diperlukan secara seri dengan masing-masing LED untuk menghindari melebihi total output maksimum saat ini untuk setiap IC dari 25 mA. Untuk kecerahan yang lebih besar, transistor buffer/daya dapat digunakan seperti yang pernah dibahas pada perancangan led berjalan 10 tahap disini.


SELAMAT MENCOBA

Kamis, 03 Januari 2013

Interrupt - solusi eksekusi perintah real time

interrupt.jpg (537×694)


Secara harfiah interrupt dapat diartikan sebagai "pemecah" atau "penyelaan" dari suatu keadaan yang sedang berlangsung. Ya begitulah interrupt dapat diartikan seperti halnya interupsi pada sidang-sidang dewan di senayan. Jika di tarik kedalam proses suatu microcontroller maka interrupt merupakan suatu keadaan "menyela" dari program utama untuk masuk kedalam proses yg dikendalikan oleh interrupt itu sendiri. Ingat bahwa proses kerja dari microprosessor atau microcontroller adalah melakukan perintah sesuai script yang diberikan dari atas ke bawah. Jadi perhatikan proses membaca tombol berikut ini seperti yang dibahas pada project dasar input - output :


int main(void)

{

DDRB |= (1<<PB5)|(1<<PB0) ; //inisialisasi port B#5 & B#0 sebagai output
DDRB &= ~(1<<PB1) & ~(1<<PB2) ; //inisialisasi port B#1 & B#2 sebagai input

PORTB |= (1<<PB5) | (1<<PB0); //kita SET LED NYALA semuanya

while(1)
{

// membaca jika port input B#1 di set atau HIGH 
//  atau 1 ( posisi awal di ground /LOW )

if (bit_is_set(PINB, PINB1)) 
{
PORTB ^=(1<<PB5) ; //TOGGLE LED di PORT B#1
_delay_ms(500);

}

// membaca jika port input B#2 di set atau HIGH 
// atau 1 ( posisi awal di ground/LOW )

if (bit_is_set(PINB, PINB2)) 
{
PORTB ^=(1<<PB0) ; //TOGGLE LED di PORT B#2
_delay_ms(500);
 
}
}

return 0;
}

Script diatas merupakan perintah pembacaan tombol yang terdapat pada PORT B1 dan B2 yang akan mengendalikan nyala dari 2 buah LED pada PORT B0 dan B5. Perintah pembacaan tombol ini merupakan cara 'pooling' dimana terpadat proses IF yang menunggu sampi BIT dari tombol berubah dari 0 ke 1. Bagaimana jika scipt nya panjang semisal ada proses perhitungan yang panjang ? Yang akan terjadi adalah proses pembacaan tombol harus menunggu beberapa waktu sampai posisi akumulator dari processor berada tepat pada proses IF.

Solusi dari permasalahan pooling adalah dengan menciptakan suatu table interupt yang memiliki prioritas tertentu dan tentunya prioritasnya lebih dari proses pooling biasa. Interupt ada beberapa jenis tergantung fasilitas yang disediakan oleh microprocessor atau microcontroller. Interupt dapat di kendalikan oleh proses luar (input external) maupun internal. External interupt umumnya merupakan proses perubahan logika(logic) dari pin input (biasanya pin ditentukan sebagai pin INT). Jenis perubahan logika ini terdiri dari :

-  AKTIF HIGH  : interupt akan dieksekusi ketika pin input mendapat logika "1"
-  AKTIF LOW   : interupt akan dieksekusi ketika pin input mendapat logika "0"
-  RISING EDGE  : interupt akan dieksekusi ketika pin input berubah dari logika "0" ke logika "1"
-  FALLING EDGE  : interupt akan dieksekusi ketika pin input berubah dari logika "1" menuju logika "0"

Ada 2 buah istilah baru yaitu rising dan falling edge yang lebih menekankan ke perubahan logika dari input interupt. Hal ini lebih bermafaat dikarenakan umumnya proses interupt dieksekusi sekali saja. Semisal kita akan menunggu interupt dari suatu pulsa untuk menambah atau mengurangi suatu nilai variabel ,  sehingga hanya perubahan yang dikehendaki saja akan menambah nilai tersebut dan hebatnya akan ditambah hanya sekali saja dalam proses interuptnya.

Interrupt secara internal pada umumnya di trigger oleh suatu kondisi dari hasil eksekusi program dan contoh yang paling sering kita temui adalah interupt yang di trigger oleh proses timer.

Untuk ATTINY 2313 proses interrupt external dikendalikan oleh 2 buah INT0 dan INT1 serta interupt lainnya berupa Pin Change Interupt yang dapat dipasang diantara PINB 0-7. Register atau memory yang merupakan memory kontrol dari interupt attiny seperti berikut :
















Contoh script dari  inisialisasi interupt external pada attiny2313 adalah sebagai berikut :


int main(void)
{

   // aktifkan interrupt 0 dan 1
   GIMSK |= (1<<INT0) |(1<<INT1);
   
   // interrupt rising EDGE ( perubahan 0 ke 1) 
   MCUCR |= (1<<ISC01) | (1<<ISC00) |(1<<ISC11) | (1<<ISC10); 

   
sei();   // perintah bahwa interupt aktif / enable

while(1)

{

//looping tak berhingga

}

return 0;

}


Sedangkan perintah (susunan script) ketika interupt mendapat trigger dan berada pada posisi aktif ditempatkan dengan posisi seperti berikut :




SIGNAL (SIG_INT0)
{

// masukkan perintah eksekusi interupt di pin INT0  
    
}

SIGNAL (SIG_INT1)
{

// masukkan perintah eksekusi interupt di pin INT1  
    
}



Berikut akan ditampilkan contoh interupt internal yang ditrigger oleh timer. Proses timer dengan interrupt sangatlah akurat sehingga cocok dipakai untuk timer atau jam digital.




void init_jam(void)
{
   TCCR1B |= (1 << WGM12); // konfihurasi timer 1 mode CTC 
   TIMSK |= (1 << OCIE1A); // Enable CTC interrupt 
   OCR1A  = 31249; //nilai timer 1 detik dari CTC A 
   TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer Fcpu/64
   TCNT1 = 0;
   
   sei();
}


ISR(TIMER1_COMPA_vect) // interupt internal dari timer akurat 1 detik

{ 

detik++;

if(detik >= 60)

{  
   detik=0;
   menit++;



}

if(menit >= 60)

     { menit=0; 
       jam++;
     }

if (jam >= 24) jam = 0 ;




}






SELAMAT MENCOBA

Selasa, 01 Januari 2013

Script Break Down - Episode Love Hurt






SELAMAT TAHUN BARU 2013 kepada para pembaca setia blog tercinta. Dengan semangat baru di tahun yang baru ini kita mulai dengan pembahasan script-script yang terdapat di blog ini karena ada beberapa teman yang merasa "terintimidasi" dengan bahasa pemrograman yang dianggap terlalu susah. 

Kali ini kita akan membahas script dari percobaan led matriks  "love hurt" yang ditulis agustus 2011. Project love hurt ini juga terdapat dalam paket belajar dasar microcontroller  yang dapat anda pesan dengan harga yang cukup terjangkau oleh  kantong anak SMA sekalipun.

Seperti pada posting led matrix love hurt rangkaian yang digunakan seperti skematik berikut ini :



Rangkaian nya sangat simple, sesimple scriptnya juga dan marilah kita break down scriptnya


HEADER


#define F_CPU 1000000UL
#include < avr/io.h >
#include < util/delay.h >
#include < avr/pgmspace.h >
#include < string.h >
#include < avr/eeprom.h >

Pada penjelasan terdahulu mengenai dasar-dasar bahasa GCC maka dapat dilihat pada header terdapat inisialisai dari beberapa parameter. Yang pertama adalah #define F_CPU yang menjelaskan clock microcontroller yang digunakan. Berdasarkan skematik rangkaian dapat dilihat jika microcontroller attiny2313 yang dipakai tanpa menggunakan xtal sehingga dapat dikatakan memakai internal clock (Calibrated RC Oscillator). Secara default ketika ic attiny2313 keluar dari pabrik memiliki clock internal 8MHz dengan pembagian CLKDIV8=ON yang berarti clock dibagi 8 sehingga menghasilkan angka 1MHz. Untuk melihat clock yang dipakai dapat dilihat pada pembacaan fusebit, dapat dilakukan melalui menu programming pada AVRSTUDIO.

  
Image Hosted by PicturePush - Photo Sharing


Selanjutnya didalam header dituliskan beberapa include yang berguna dalam script love hurt seperti definisi kaki micro (io.h) ,delay.h sebagai pengatur delay waktu, pgmspace.h sebagai trick memanfaatkan flash memory sebagai static ram, string.h sebagai pengolah data berupa string dan eeprom.h yang memudahkan penulisan script untuk akses eeprom (memory non-volatile / tidak hilang saat micro tanpa power) .


DEFINISI VARIABEL , RAM & EEPROM


//Progmem simpannya di FLASH memory

const char love1[] PROGMEM =
{
0b0011110,
0b0100001,
0b1000010,
0b0100001,
0b0011110

};

const char love2[] PROGMEM =
{
0b0001100,
0b0010010,
0b0100100,
0b0010010,
0b0001100

};

const char L[] PROGMEM ={0x7f, 0x7f, 0x40, 0x40, 0x20};
const char O[] PROGMEM ={0x3e, 0x7f, 0x41, 0x41, 0x3e};
const char V[] PROGMEM ={0x3f, 0x7e, 0x40, 0x20, 0x1f};
const char E[] PROGMEM ={0x7f, 0x7f, 0x49, 0x49, 0x41};
const char H[] PROGMEM ={0x7f, 0x7f, 0x08, 0x08, 0x7f};
const char U[] PROGMEM ={0x3f, 0x7f, 0x40, 0x40, 0x3f};
const char R[] PROGMEM ={0x7f, 0x7f, 0x11, 0x29, 0x46};
const char T[] PROGMEM ={0x03, 0x03, 0x7f, 0x03, 0x02};

const char creature[]={0x4e, 0x31, 0x35, 0x31, 0x4e}; //simpan di memory/RAM aja

uint8_t EEMEM tengkorak[5]= {0x1e, 0x75, 0x61, 0x75, 0x1e}; //simpan di EEPROM

uint8_t EEMEM pacman[5]= {0x26, 0x67, 0x67, 0x7f, 0x3e}; //simpan di EEPROM


char dotnya[5],scrolnya[7];



Untuk mengetahui angka hexa yang terdapat dalam array ada lebih baiknya terlebih dahulu membuka software generator dot matrix yang dapat dilihat disini.

Pada penulisan array diatas ada 3 type yang dipergunakan yaitu RAM, PROGMEM dan EEMEM. Kenapa mesti seperti ini ya karena dikarenakan attiny2313 yang memiliki kapasitas RAM yang super irit yaitu 128byte saja, sehingga untuk menambah memory maka kita manfaatkan memory flash (program) yang cukup lumayan 2048byte atau 2Kbyte (ini aja masih kecil banget). Untuk memanfaatkan flash diperlukan inisialisasi tambahan berupa PROGMEM dan tidak bisa dipakai langsung seperti halnya jika ditempatkan pada RAM umum, harus ada proses memindahkan flash PROGMEM menuju memory RAM. Tentunya tidak semuanya tapi yang akan diolah saja yang dipindahkan. Pada inisialisasi variabel array diatas terdapat 2 buah array RAM yaitu dotnya[5] dan scrolnya[7] yang akan ditimpa dengan isi PROGMEM jika dibutuhkan.

Pada project lovehurt diperlihatkan juga cara mengakses memory EEPROM dengan inisialisai berupa EEMEM. Tujuan menggunakan memory EEPROM adalah sifatnya yang tidak terhapus jika baterai atau power dimatikan (non-volatile memory)


BAGIAN MENULIS KE LED MATRIX

void tulis(uint8_t lama)
{
  uint8_t a,b;

for(a=0 ; a<lama ; a++)
   {
   for(b=0 ; b<5 ; b++)     
  {
         PORTB = ~(1<<b) ;
         PORTD = dotnya[b];
                _delay_ms(2);
  }

   }
}


void geser(uint8_t lama)
{
  uint8_t a,b;
   for(a=0 ; a<11 ; a++)     
    {
    if( a<6) 
      { 
                for(b=0 ; b<(5-a) ; b++)  dotnya[b]=0x80;
                for(b=(5-a); b<5 ;b++) dotnya[b]=scrolnya[b-5+a];
     
                tulis(10);
        }
    else if (a==6) tulis(lama);

    else 
       {        for(b=0 ; b<11-a ; b++) dotnya[b]=scrolnya[a-5+b];
                for(b=(11-a); b<11 ;b++) dotnya[b]=0x80;  
      
                tulis(10);
       }     
     }  
}

void naik (uint8_t lama)

{ uint8_t q,step=0;
  
  
  while(step!=16)
   {
 if( step <8)
    {   
                for(q=0 ; q < 5 ; q++) dotnya[q] = scrolnya[q] << (7 - step) ; 

                tulis(10);
           } 
   
        else if (step == 8)
           {    
             tulis(lama); 
    
           }      
 else 
    {   
              for(q=0 ; q < 5 ; q++)  dotnya[q] = scrolnya[q] >> (step - 7) ;  
          
              tulis(10);
     } 
        step++; 
   }    
}

}

Nah inilah bagian utama dari penggerak tulisan geser kiri atau naik. Perhatikan pertama bagian function tulis dimana terdapat isian variabel lama yang berarti lama looping dieksekusi yang akan menentukan lama tulisan ditampilkan. Begitu pula jika ingin menggeser maka variabel lama perlu dimasukkan untuk menentukan lama nya teks diam setelah digeser.

Bagaimana sih cara menghidupkan dotmatrix ? sebaiknya baca penjelasannya disini . Jadi pada intinya nilai hexa yang diinisialisaikan pada array diawal berjumlah 5 buah array. Sedangkan bit yang digunakan adalah 7 bit karena memang dot matrix yang dgunakan bertype 5x7 (5 kolom  x 7 baris) . Perhatikan loop berikut :


 for(b=0 ; b<5 ; b++)

{
PORTB = ~(1<<b) ;
PORTD = dotnya[b];
                 _delay_ms(2);
}


Skematik menunjukkan bahwa kolom di kontrol oleh port B0 - B3 dan baris dikontrol oleh port D0 - D6. Loop diatas menunjukkan proses geser kolom (scanning) dengan perintah PORTB = ~(1<<b)  yang artinya angka 1(biner) digeser ke sebelah kiri  sebanyak dari nilai b kemudian dinegasi .  Variabel b mengontrol pergeseran berdasarkan loop. Jika kolom dot matrix '0' akan menyebabkan LED pada baris yang mendapat bit '1' menyala. Hal ini dapat dikatakan kolom aktif LOW dan baris aktif HIGH. Urutan loop dari scanning pada PORTB seperti berikut (11110) , (11101) ,(11011) ,(10111) ,(01111).

Ingat penjelasan terdahulu bahwa array yang ada pada flash (PROGMEM) atau EEPROM harus dipindahkan kedalam array memori RAM  dotnya[b]. Sekali lagi variabel b berperan dalam menentukan array baris yang sesuai dengan kolom yang sedang aktif atau mendapat scanning "LOW" (0).

Untuk proses geser ke kiri dan geser keatas ada sebuah variabel yaitu step yang berfungsi sebagai penanda posisi pergeseran yang sedang tampil sehingga text yang tampil pada dot matrix memiliki efek bergeser. Selebihnya yang diperlukan hanya proses kreatif mengeser-geser bit dari baris berdasarkan loop yang sedang berjalan dan dipindahkan ke array scrolnya[ ].


MAIN PROGRAM



int main(void)
{
 DDRD = 0b1111111; // untuk baris
 DDRB = 0b11111;  // untuk kolom

 PORTD =0; // Set all pins low
 PORTB =0b11111; //matikan layar
    
    
 
 
 while(1)
 {
    // yang ini nulis langsung 
  
     strncpy_P(dotnya,love2,5);
     tulis(20);
     strncpy_P(dotnya,love1,5);
     tulis(40);
     strncpy_P(dotnya,love2,5);
     tulis(20);
     strncpy_P(dotnya,love1,5);
     tulis(40);
     strncpy_P(dotnya,love2,5);
     tulis(20);
     strncpy_P(dotnya,love1,5);
     tulis(40);     

//yang ini pake function geser 

     strncpy_P(scrolnya,L,5);
     geser(50);
     strncpy_P(scrolnya,O,5);
     geser(50);
     strncpy_P(scrolnya,V,5);
     geser(50);
     strncpy_P(scrolnya,E,5);
     geser(50);
     strncpy_P(scrolnya,H,5);
     geser(50);
     strncpy_P(scrolnya,U,5);
     geser(50);
     strncpy_P(scrolnya,R,5);
     geser(50); 
     strncpy_P(scrolnya,T,5);
     geser(50); 

//geser ambil dari RAM
 
     strncpy(scrolnya,creature,5);  //tanpa _P karena ambil di RAM
     naik(50); 
 
//ambil dari eeprom ..mengirit..

     eeprom_read_block((void*)&scrolnya,(const void*)&tengkorak, 5); 
     naik(50);

     eeprom_read_block((void*)&scrolnya,(const void*)&pacman, 5); 
     geser(50);

   }
 
 return 0;
}



Pada bagian awal dari function main( ) terdapat inisialisai port dari attiny yang digunakan yaitu PORTB dan PORTD yang kesemuanya diberi bit 1 yang artinya port tersebut dipakai sebagai port output.

Script yang digunakan untuk memindahkan memory flash (PROGMEM) menuju RAM adalah  operasi string strncpy_P, ingat array dari char (8byte) dapat dianggap sebagai string,   seperti contoh  strncpy_P(dotnya,love2,5)  yang artinya isi dari array dotnya[ ] diisi dengan array dari array PROGMEM love2. Jika diambil dari RAM langsung maka operasi copy ini menggunakan strncpy( ) tanpa _P.

Untuk pemindahan isi dari EEPROM menuju RAM menggunakan syntax eeprom_read_block ( *pointer_ram_tujuan, *posisi_memori_eeprom, jumlah blok ), seperti contoh  eeprom_read_block((void*)&scrolnya,(const void*)&tengkorak, 5). Jangan dipusingkan dengan void dan * (pointer) karena itu hanya atribut yang menyatakan type data diabaikan.


MUDAH BUKAN ? jika ada pertanyaan atau request script break down yang lain akan saya bahas dengan senang hati.


SELAMAT TAHUN BARU 2013 KAWAN



 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Best Web Hosting