Sabtu, 14 November 2015

Rangkaian Radio FM 3 volt Sederhana

Rangkaian radio FM sederhana ini bekerja dengan sumber tegangan DC +3 volt dari 2 unit batere AA. Radio FM pada gambar dibawah telah dilengkapi dengan penguat audio (audio amplifier) sebagai penguat sinyal audio untuk menggerkan sebuah hedphone. Pada dasarnya rangkaian radio FM sederhana ini disusun oleh 2 unit transistor dan penguat audio mengunakan IC TDA7050. Gambar skema dan nilai komponen untuk membuat rangkaian radio FM sederhana ini dapat dilihat pada gambar berikut.

 Rangkaian Radio FM Sederhana 3V

Dari gambar rangkaian diatas terlihat bahwa rangkaian radio FM sederhana 3 Volt diatas terdiri dari beberapa bagian sebagai berikut.
Bagian radio penerima (receiver) FM dibangun menggunakan 2 unit transistor tipe BF199. Kedua transistor ini membentuk rangkaian receiver FM yang sangat sederhana. Secara keseluruhan rangkaian penerima radio (receiver) FM ini adalah konfigurasi kedua transistor T1 dan T2 tipe BF199 tersebut dengan rangkaian induktor L dan kapasior C. Frekuensi tuning radio penerima (receiver) FM pada gambar diatas diatur menggunakan sebuah variabel kapasitor (varco). Sebagai detektor FM digunakan konfigurasi RC C1, R2 dan C2. Bagian penguat audio, bagian in berfungsi untuk menguatkan isyarat informasi (sinyal audio) dari rangkaian penerima (receiver) FM. Rangkaian penguat audio ini dibangun menggunakan IC TDA7050 yang diberikan beban sebuah headphone untuk mendengarkan isyarat informasi tersebut. Pada bagian penguat audio rangkaian radio penerima (receiver) FM ini dilengkapi dengan pengatur volume yang berfungsi untuk menentukan level sinyal audio yang dikuatkan oleh bagian penguat audio ini.

loading...

sumber:
skemarangkaianpcb.com

Jumat, 13 November 2015

Rangkaian Radio FM Stereo TDA7000




Saat ini sudah jaman digital, mendengarkan radio sudah ditinggalkan bagi sebagian orang. HP kita juga sudah dilengkapi dengan radio FM digital. Buat apa merakit tuner radio FM jadul? Bagi saya menikmati siaran radio FM masih merupakan hobi yang takkan pernah ditinggalkan. Mutar-mutar gelombang radio secara manual bagi saya masih  sangat asik dibandingkan dengan pencet-pencet tombol digital. Makanya saya masih tertarik untuk merakit tuner radio FM stereo.


Saat ini banyak sekali IC dan model tuner FM. Ada dari Matsushita Panasonic, Sony dengan IC CX1619B, dari Toshiba misalnya TA8122, Sanyo LA1267, dll masih banyak lagi. Saya pribadi lebih menyukai rangkaian FM dari Philips seri TDA7000 karena hanya membutuhkan rangkain komponen eksternal resistor dan kapasitor saja. Jadi komponennya tidak ada yang sulit, semuanya mudah didapkan di toko-toko elektronik disekitar kita.

Pada rangkaian diatas terlihat semua komponen mudah ditemukan di toko elektronik. IC TDA7000, Varco biasa sperti yang terdapat di radio-radio analog, Lilitan L menggunakan kawat tembaga 0,6mm sebanyak 4 lilitan. Tidak ada komponen yang kritis disini. Transistor low noise C945 sebagai penguat sinyal sebelum diumpan ke rangkain dekoder FM stereo LA3361. Catu daya menggunakan arus ter-regulasi IC 7806.

Karena tidak ada rangkaian yang kritis maka FM tuner stereo ini bisa di rakit diatas PCB berlubang ukuran IC kecil.

Oh ya... selain TDA7000 ada varian TDA7021 dan TDA7088 untuk varian IC tuner FM. IC TDA7088 versi china menggunakan seri SC1088.

loading...

sumber:
diyaudioku.blogspot.co.id

Kamis, 12 November 2015

Rangkaian Radio FM Stereo Hifi

Rangkaian radio penerima FM stereo hifi tersebut adalah skema rangkaian tuner penerima FM stereo dngn mutu tinggi. Sensitifitas skema rangkaian radio penerima FM stereo & mutu audio yg dihasilkan radio penerima FM stereo tersebut benar-benar bagus. Skema rangkaian radio penerima FM stereo tersebut telah benar-benar popular di kelompok pengagum elektronika, dipasaran skema rangkaian radio penerima FM stereo tersebut bisa di beri Kite ataupun PCB-nya dngn nama �rangkaian super FM stereo�.

Pabrikan PCB yg sediakan PCB untuk skema rangkaian radio penerima FM stereo tersebut cukup banyak, salah satunya RONICA & SATURN. Skema rangkaian radio FM stereo hifi tersebut bekerja dngn sumber tegangan/voltage + 9 volt DC. Skema rangkaian radio FM stereo tersebut memakai modul tuner FM type varco (Variabel Coil) & memakai IC penerima FM LA1260 dan demodulator FM stereo IC LA3361. Skema rangkaian lengkap & daftar komponen menempel pada gambar skema rangkaian radio FM stereo hifi di bawah.



Skema rangkaian Radio FM Stereo Hifi

Skema rangkaian radio penerima FM stereo di atas sudah dilengkapi dngn skema rangkaian sumber daya memakai regulator tegangan/voltage LM7809. Skema rangkaian radio FM stereo hifi di atas dilengkapi dngn 2 indikator, LED pada IC LA1260 berperan sebagai indikator penerimaan siaran radio lalu LED pada IC LA3361 berperan sbg indikator stereo. Sistem perakittan skema rangkaian radio FM stereo hifi tersebut cukup gampang, setelah sistem perakitan usai dilanjutkan dngn sistem tuning yg dimulai dngn :

Mencari penerimaan pancaran frekuensi radio dari pemancar hingga dapat yg paling kecil. Keadaan tersebut ditandai dngn LED pad IC 1260 menyala berkedip atau agak redup.
Lakukan seting transformer MF 10, 7 MHz untuk memperoleh mutu penerimaan yg jernih hingga LED pad IC LA1260 menyala stabil & jelas.
Langkah paling akhir yaitu seting demodulator stereo IC LA3361 untuk memperoleh mutu penacaran radio yg stereo dngn langkah mengatur posisi tuas variabel resistor/hambatan dengan ukuran VR 10 KOhm pad IC LA3361 hingga LED pada IC LA3361 menyala dngn stabil.
Sistem seting radio penerima FM di atas bakal menghasilkan mutu penerimaan yg peka, mutu audio yg jernih & stereo. Skema rangkaian radio FM stereo tersebut hanya skema rangkaian tuner FM stereo saja hingga mempunyai output/keluaran yg butuh dikuatkan memakai audio amplifier & pengatur suara supaya bisa didengarkan lewat loud loud speaker.

Cukup sekian. Terima kasih

loading...

sumber:
corelita.com

Selasa, 10 November 2015

DASAR OUTPUT & INPUT dengan ATTINY 2313


Siapkan bahan2 sesuai skematik berikut ini :




dan jangan lupa programmer AVR nya ...

PROJECT 1 LED BLINK

#define F_CPU 1000000UL // frekuensi clock internal
#include <avr/io.h> // definisi standar io port
#include <util/delay.h> // definisi include untuk delay


int main(void)

{



DDRB=0b1 ; // Inisialisasi bahwa port B0 adalah output , jika pake port B5 ya inisialisai jadi DDRB=0b100000;



while(1)

{

PORTB=0b1; //port B0 = 1 atau nyala

_delay_ms(1000); //delay

PORTB=0b0; //port B0 = 0 atau mati

_delay_ms(1000); //delay

}

return 0;





PROJECT 2 LED BLINK

Gunakan 2 LED di port B#0 dan B#5
Kita akan memperkenalkan operasi bit untuk inisialisasi rangkap

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


int main(void)

{



DDRB |= (1<<PB5)|(1<<PB0) ; // inisialisai menggunakan operasi bit

PORTB |= (1<<PB5) ; // operasi bit PORT B#5 = 1
PORTB &= ~(1<<PB0) ; //operasi bit PORT B#0 =0

while(1)

{

PORTB ^=(1<<PB5) ; // operasi bit toggle atau NEGASI/KEBALIKAN dari posisi bit sebelumnya
PORTB ^=(1<<PB0) ;

_delay_ms(1000);



}

return 0;

}


loading...

PROJECT - MEMBACA TOMBOL

kali ini kita akan membaca tombol dan kita gunakan untuk mengatur nyala matinya LED
kita memanfaatkan syntax " if (bit_is_set(PIN#, PIN##)) "

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

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)

{


if (bit_is_set(PINB, PINB1)) // membaca jika port input B#1 di set atau HIGH / 1 ( posisi awal di ground /LOW )
{
PORTB ^=(1<<PB5) ; //TOGGLE LED di PORT B#1
_delay_ms(500);

}

if (bit_is_set(PINB, PINB2)) // membaca jika port input B#2 di set atau HIGH / 1 ( posisi awal di ground /LOW )
{
PORTB ^=(1<<PB0) ; //TOGGLE LED di PORT B#2
_delay_ms(500);

}
}

return 0;

}









sumber:

Senin, 09 November 2015

Belajar Bahasa GCC

PART 1
Gnu Compiler Collection merupakan sebuah project compiler berbasis open source untuk beberapa bahasa pemrograman. Karena sifatnya yang "terbuka" inilah membuat pengembang bahasa pemrograman untuk microcontroller memilih bahasa C yang digabungkan dalam environment GCC, sebagai bahasa pemrogramman pada beberapa compiler seperti WINAVR atau TOOLCHAIN.

Kali ini akan kita bahas GCC yang digunakan paling umum untuk menyusun script dari pemrogramman AVR yang digunakan umum pada AVR STUDIO yatu WINAVR. Atmel sebagai produsen microcontroller AVR memiliki beberapa kerjasama dengan bahasa pemrograman lain seperti IAR akan tetapi banyak juga yang memilih versi gratisnya dengan menginstall plugin WINAVR. Pola pemrograman dari winavr umumnya seperti berikut :


HEADER


#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include "coba.h"

uint8_t jam,menit,detik,show;

#define hidup PORTB|=_BV(PB3)



Pada  bagian header ini dinyatakan beberapa syntax yang berhubungan dengan pre-processor (#define),  variabel global serta  "include" yang merupakan rujukan compiler untuk menyertakan file-file eksternal. mari kita bahas satu persatu.


#define nama kondisi

Setelah #define terdapat  dua buah kalimat yang dipisahkan dengan spasi. Kalimat sebelah kiri merupakan rujukan sedangkan sebelah kanan merupakan proses yang dilakukan. Seperti contoh diatas maka dapat diartikan bahwa setiap syntax yang ditulis sebagai "nama" akan berubah menjadi "kondisi", contoh lain #define F_CPU 4000000UL berarti setiap syntax pada script yang berisikan "F_CPU" maka akan digantikan dengan "4000000UL" .

Jika ditulis seperti ini #define hidup PORTB|=_BV(PB3) maka setiap kita menulis  " hidup; " pada syntax maka akan terjadi kejadian pada port B3 akan menjadi "high" atau kalau dikasi LED akan menyala. Kenapa? karena syntax hidup telah diartikan sebagai syntax PORTB|=_BV(PB3) yang merupakan syntax untuk menghidupkan port B3.

Berguna banget apabila kita menggunakan perulangan "kondisi" yang banyak sehingga menyingkat dalam penulisan dan mempermudah proses tracing atau debuging error(kesalahan) syntax serta jalannya dari program yang diinginkan.


#include "nama.file"

Bagian ini untuk melakukan penyertaan compiling kepada file-file external. Contoh yang paling gampang adalah #include <avr/io.h> dimana compiler akan menyertakan directory pada instalasi WINAVR pada folder "include/avr" . File io.h merupakan file yang berisikan definisi port input output yang disesuaikan dengan jenis IC microcontroller yang digunakan. Include yang lain juga sangat berguna dan disesuaikan dengan kebutuhan, contohnya delay.h yang berhubungan dengan delay, interrupt.h yang berhubungan dengan interupt, string.h yang berhubungan dengan operasi string dan lain sebagainya. Untuk itu dapat dibaca pada website WINAVR di : http://winavr.sourceforge.net.

Untuk file include yang menggunakan tanda petik merupakan penyertaan file lokal yang diletakkan di folder atau direktori yang sama dengan direktori project


int variabel;

Untuk menyimpan suatu nilai pada memory maka diperlukan pemesanan lokasi variabel terlebih dahulu. GCC memiliki cara dinamis untuk menempatkan memory sehingga memudahkan dalam penyusunan. Variabel ini tentunya harus diberitahukan jenisnya sehingga dapat dipesankan sesuai kebutuhan. Contoh dari type variabel yang sering digunakan adalah seperti berikut :

- unsigned : menyatakan kalau type variabel berupa 8 bit sehingga nilainya antara 0-255, sama seperti char
- int : integer, merupakan memory 16 bit memiliki nilai antara -32768 sampai + 32767

ada beberapa type integer yang dapat diambil dengan menggunakan #include <inttypes.h>

- uint8_t  : 8 bit
- uint16_t: 16 bit
- uint32_t: 32 bit

sebagai contoh kita akan menyompan data karakter huruf, cukup dengan menggunakan unsigned char atau char saja karena karakter ascii merupakan data dengan lebar 8 bit. Sedangkan untuk perhitungan timer 16 bit maka sebaiknya menggunakan uint16_t yang memiliki lebar data 16 bit dan selalu bernilai positif.


PART 2
Bagian kedua dari tutorial akan membahas susunan scipt GCC yang digunakan sebagai bahasa pemrogramman microcontroller. Setelah sebelumnya kita membahas bagia header, maka sekarang kita bahas mengenai "function". Dalam bahasa C  semua kode dieksekusi berada dalam suatu function. Function adalah sebuah blok yang mempunyai nama  yang melakukan tugas dan kemudian akan mengembalikan kontrol ke pemanggil. Perhatikan bahwa bahasa pemrograman lain mungkin membedakan antara "function", "subroutine", "subprogram", "procedure", atau "metode" -  sedangkan dalam C hal ini semuanya sama dan bernama function.  Array dalam Bahasa C  dapat didefinisikan sebagai jumlah lokasi memori, yang masing-masing dapat menyimpan tipe data yang sama dan yang bisa menjadi referensi melalui nama variabel yang sama.


FUNCTION

Sebuah function sering dieksekusi (dipanggil) beberapa kali, dari beberapa tempat yang berbeda, selama eksekusi dari sebuah program. Setelah menyelesaikan subrutin, program ini akan bercabang dan kembali ke titik setelah dimana function ini dipanggil. Function adalah alat pemrograman yang kuat yang merupakan salah satu kelebihan bahasa C.


Secara umum pada pemrograman microcontroller berbasis GCC - Winavr, pola function paling utama adalah seperti berikut:


int main(void)

{  
  uint8_t a;
  DDRA  |= (1<<PA6)|(1<<PA7); //port yg digunakan PA6 & PA7  
  a=100;
  while(1)

   {    
    
  a=200;
    }
   
   return 0;

  }

loading...

function yang bernama main() merupakan function utama dimana awal dari program microcontroller dimulai. Function ini sebaiknya diberikan tipe data yang akan di kembalikan (return) karena beberapa compiler menanggap semua function itu sama. Jika tidak diberi type maka di depan main diberikan tanda void. Trus kenapa di dalam kurung terdapat void juga ? perhatikan jenis function berikut ini.




void coba_fungsi_1(void)

{  DDRA  |= (1<<PA6)|(1<<PA7);
//isi fungsi bebas ................
}


 int coba_fungsi_2(int var_a,  int var_b  ) 
 {
int var_c;

var_c = var_a + var_b ;
   
return (var_c);
   
  }
 
function yang berisikan kata-kata void berarti bahwa type dan variabel dari function tidak digunakan. Bandingkan dengan contoh function yang ke dua yang bertype integer dengan 2 buah variabel didalam kurung, yang jika dipanggil menggunakan perintah seperti berikut :


int main(void)

{  

int output;

 //panggil function1

    coba_fungsi_1();

  //panggil function2

   output = coba_fungsi_2(5, 3);


 // nilai dari variabel output =  8


  }



ARRAY

Array adalah penamaan kolektif yang diberikan kepada sekelompok data pada memory dalam jumlah yang sama. Jumlah yang sama ini contohnya bisa berupa nilai dari 100 siswa, jumlah kursi di rumah, atau gaji dari 300 karyawan atau usia dari 25 orang siswa. Jadi array adalah kumpulan elemen yang sama. Biasanya array dari banyak karakter disebut sebagai "string" array. Semua elemen dari setiap array yang diberikan harus dari jenis yang sama semisal kita tidak bisa memiliki sebuah array dari 10 buah nomor , yang 5 bertipe integer dan 5 sisanya bertipe uint8_t.

Contoh array yang sering dipakai dalam project-project di www.aisi555.com adalah array untuk data teks pada project led matrix "love hurt".



const char love[5]  =

{

0b0011110,

0b0100001,

0b1000010,

0b0100001,

0b0011110



};


const char L[5]  ={0x7f, 0x7f, 0x40, 0x40, 0x20}; 

const char O[5] ={0x3e, 0x7f, 0x41, 0x41, 0x3e};


char isinya[5],hasilnya[10];


const char creature[]={0x4e, 0x31, 0x35, 0x31, 0x4e}; 

uint8_t EEMEM tengkorak[5]= {0x1e, 0x75, 0x61, 0x75, 0x1e}; 




Dapat dilihat bahwa array memiliki nilai yang dapat di inisialkan terlebih dahulu atau nilainya kosong. Besar dari data yang dipesan untuk array sebaiknya di tentukan namun jika datanya seragam dapat juga dikosongkan. Array ini dapat kemudian dipindahkan ke dalam variabel lain ataupun di ubah nilainya.




int main(void)

{


  
//memindahkan data dari data yang sudah ada ke memory lain
 isinya[0]=creature[0]
 isinya[1]=creature[1];   
 isinya[2]=creature[2];
 isinya[3]=creature[3];   
 isinya[4]=creature[4];


//merubah data dari array secara sengaja

love[4]=0b0001100;


}





Jadi perlu diperhatikan ukuran dan jenis dari array yang akan dipindah-pindah haruslah sesuai.


PART 3
Setiap bahasa pemrograman memiliki suatu proses yang dinamakan "conditonal statement". Yang dimaksud sebagai contional statement adalah percabangan dimana terdapat beberapa pilihan jalannya program sesuai dengan kondisi yang terjadi.









Sementara itu pengulangan atau looping adalah proses pengulangan dari suatu perintah dimana bisa diberikan sebuah atau lebih kondisi yang menyebabkan pengulangan atau looping akan berhenti. Secara flowchart dapat digambarkan seperti berikut:

for.gif (383�402)



Kondisi Percabangan
Dalam bahasa C terdapat beberapa kondisi percabangan yang sering kita temui. Kita akan bahas satu persatu dengan contoh-contoh yang sering dipakai pada project di blog ini.

IF



if(kondisi == 1)
{
  //script 1

}

else if(kondisi == 3 || kondisi == 4)
{
  //script 2

}
 else if(kondisi <= 10 && kondisi >5)
{
   //script 3

}

else
 {   

 //script kondisi terakhir

}



Ada yang perlu diperhatikan pada percabangan yaitu selalu ada kondisi pembanding. Kondisi pembanding yang terdapat pada bahasa C adalah:


Pembanding sederhana:

==         Sama dengan

!=         Tidak sama dengan

<           Kurang dari

>           Lebih besar dari

<=         Kurang dari atau sama dengan

>=         Lebih besar dari atau sama dengan


Pembanding logika :

Hal ini dapat menggabungkan pembanding untuk mendapatkan logika yang lebih kompleks

&&         Dan (and)

||             Atau (or)



secara umum proses pencabangan IF .. ELSE  atau   IF .... ELSE IF ....ELSE membandingkan satu kondisi dengan kondisi yang lain , dan dapat juga menggabungkannya dengan tambahan pembanding logika. Untuk pencabangan IF .... ELSE IF ...dst .. yang terdiri dari banyak kondisi ELSE IF maka pencabangan akan menjalankan perintah pada kondisi yang benar kemudian mengabaikan yang lainnya. Perlu diingat jika eksekusi dari pencabangan mengikuti urutan atas ke bawah sehingga penempatan dari statement kondisi sangat penting.


SWITCH

Pola pencabangan yang lain adalah metode switch case seperti pada contoh berikut :


ISR(USART_RX_vect)



 char databyte;

 databyte = UDR; 



     switch (databyte)       

  {
     

    case 0xD : {  

             kirim_text(menu) ;

              break; }

    case '1' : {  

                     PORTB ^=(1<<0);

                     break; }

    case '2' : {

            
             PORTB ^=(1<<1);


                break; }

    default :{   
              PORTB |=(1<<1);
              break;}
  }  

}

Ketika mendefinisikan ekspresi kondisi yang hasilnya akan mengarah pada pelaksanaan program yang spesifik dan umumnya berjumlah banyak maka dapat menggunakan "switch".  Hasil yang berbeda tercantum dalam tiap tubuh "case" dari pernyataan switch dan setiap case memiliki eksekusi sendiri. Tubuh pernyataan switch dibatasi dari pembukaan ke penutupan kurung  kurawal: "{"   "}" dan jika memerlukan eksekusi tunggal maka diberikan perintah terminasi "break".  Sintaks dari kondisi switch seperti berikut :


switch(Expression)
{
    case Choice1:
        Statement1;
    case Choice2:
        Statement2;
    case Choice-n:
        Statement-n;
}






PENGULANGAN / LOOPING 
Pengulangan membantu program untuk menghemat penulisan pada urutan syntaxnya dengan memberikan kondisi keluar tertentu. Loop yang paling dasar adalah for(;;), yang memiliki 3 buah isian didalamnya berupa "kondisi awal" ; "kondisi keluar" ; "proses update" ; . Jika for tanpa isian seperti contoh for ( ; ; ) maka akan menciptakan looping tidak berhingga yang tak akan pernah selesai.


void proses (void) 

{
int a;


for(a=0; a < 10 ; a++) 
   {
      PORTB = a;
      PORTC = (10 - a) ;
   }

}


script diatas memiliki penjelasan bahwa nilia a berawal pada angka 0, akan diulang terus bila nilai a lebih kecil dari 10  sedangkan kondisi update nilai a ditambah 1 tiap pengulangan. Jadi nilai a bermula dari 0 diteruskan menuju 1,2,3,4,5,6,7,8,9  kemudian pada saat nilai a mencapai nilai 10 maka loop akan  selesai.


Jenis looping yang lain memiliki pola yang sama yaitu while(condition) {  }  dan do { } while(condition). Kondisi keluar dari loop ditentukan pada awal atau akhir namun memiliki pola yang sama yaitu kondisi awal dan akhir harus dirubah berdasarkan pengulangan atau kondisi luar ,seperti contoh berikut :




int a;
a=0;
while(a < 10)
{
  PORTB=a;
  PORTC=(10-a);

   a++;
}
a=0;


do
{
PORTB=a;
a++;
}
while(a <10)


while(bit_is_set(PIND, PIND3) )
{

PORTB|=_BV(PB3);

}


Ingat jika kondisi dari variabel harus di inisialisasikan terlebih dahulu sehingga tidak menimbulkan kesalahan dan warning saat dicompile. Contoh yang terakhir menunjukkan bahwa kondisi looping akan berhenti jika ada perubahan nilai dari luar , dalam hal ini nilai logika biner dari port microcontroller PIND3 .


SELAMAT BELAJAR











sumber:
www.aisi555.com

Minggu, 08 November 2015

Rangkaian Running Led lebih dari 10 Led

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




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 :





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








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 gambar 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 .


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.




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

loading...

sumber:
www.aisi555.com

RANGKAIAN UNTUK PALANG PINTU KERETA API OTOMATIS DENGAN ATTINY2313


Bahan utama yang kita perlukan adalah motor stepper. Dipasaran komponen elektronika, motor stepper dijual umumnya memiliki kumparan berjenis BIPOLAR, dimana nantinya diperlukan sebuah driver H-bridge untuk merubah polaritas kumparannya. Sedangkan jika beruntung (cari di loakan) atau punya duit berlebih, maka motor stepper UNIPOLAR tentunya menjadi pilihan yang lebih simple.


Cara mudah membedakan jenis motor steep adalah jumlah kabel, untuk bipolar biasanya memiliki kabel 4 , sedangkan unipolar memiliki kabel 5 dimana 1 kabel sebagai common (supply)


File:Drive.png
cara menggerakkan motor stepper (courtesy wikipedia)



Prinsip sensor yang digunakan untuk mendeteksi kereta datang dan pergi maka diletakkan sensor "cahaya terhalang" menggunakan pasangan LED INFRARED & PHOTODIODA yang biasanya digunakan sebagai transmiter & receiver untuk remote TV. Kedua led ini diposisikan berhadap-hadapan (sebaiknya diberi casing/ penghalang cahaya dari samping) sehingga ketika tanpa halangan, dengan rangkaian tambahan resistor pull down dan anoda ke 5v , photodioda akan memberikan logika 1 (seperti tehubung langsung ke 5v). Kondisi ketika sinar infre merah terhalang maka photo dioda akan memutus hubungan dari 5V dan rangkaian menjadi logika 0 karena terhubung melalui resistor 10k ohm menuju ground (0v).


Untuk mendeteksi kedatangan kereta api, maka sensor "kedatangan" akan mendeteksi perubahan dari 1 ke 0 (falling edge) sehingga dalam script ditunjukkan dengan INTERUPT 0 yang diinisialisasikan sebagai falling edge. Sedangkan sensor untuk "kereta sudah lewat" menggunakan logika interupt rising edge (0 ke 1), dimana ketika kereta masih berada di perlintasan akan menghalangi sinar led infra (kondisi logika 0). Setelah semua rangkaian lewat maka sinar akan kembali mengaktifkan logika 1 pada photodioda.



MCUCR |= (1<<ISC01) | (0<<ISC00) |(1<<ISC11) | (1<<ISC10); 



Sensor yang ketiga merupakan sensor posisi awal dari palang pintu, diletakkan pada posisi palang pintu terbuka penuh (90 derajat) , sehingga ketika alat dihidupkan atau direset maka motor stepper akan bergerak ke kiri sampai posisi palang pintu menghalangi sinar led menuju photodioda ke 3.




loading...

Kereta api kan bolong-bolong, ada jeda antar gerbong ...nah looo...error dah....pintunya kebuka baru 1 gerbong lewat?? Tenang saja, ini hanya simulasi..kita anggap bahwa kereta api itu benda yang full kontinyu tanpa lubang jeda antar gerbong. Jika ingin menerapkan ke dunia nyata dimana ada jarak antar gerbong, maka diperlukan suatu timer yang akan mendeteksi waktu berapa milli second sinar infra yang dilewatkan lubang tersebut. Jika gerbong terakhir yang lewat tentunya waktunya lebih lama ketimbang sinar melalui celah - celah rangkaian kereta api, nah inilah pembedanya.


Trus pertanyaan lainnya, bagaimana jika yang diinginkan adalah palang pintu keretanya 2 arah ? Sekali lagi kita sebaiknya menggunakan metode timer saja, jadi kita perkirakan jika cahaya tidak terhalang selama selang waktu (misal 5 detik)  maka pintu akan terbuka.


Skematik dari palang pintu otomatis seperti berikut :




 (klik untuk memperbesar)



Harap diperhatikan jenis motor yang digunakan dan sesuaikan driver motor yang tepat.



FULL SCRIPT METODE INTERUPT  1 ARAH:
/*

Pintu Kereta Api Otomatis
Dengan motor stepper
by: ahocool@gmail.com
SURABAYA - 2012
1 arah saja
*/


#define F_CPU 100000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


#define SPEED _delay_ms(10)  // ubah nilai delay sesuai kecepatan yang diinginkan

//stepper FULL STEP, bisa dirubah sesuai keinginan
void puter_kanan(void)


   PORTB |=_BV(PB0);
   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) ;
   SPEED;


   PORTB |=_BV(PB1);
   PORTB &= ~_BV(PB0) & ~_BV(PB2) & ~_BV(PB3) ;
   SPEED;


   PORTB |=_BV(PB2);
   PORTB &= ~_BV(PB1) & ~_BV(PB0) & ~_BV(PB3) ;
   SPEED;


   PORTB |=_BV(PB3);
   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB0);
   SPEED;

   PORTB |=_BV(PB0) | _BV(PB2);
   PORTB &= ~_BV(PB1)  & ~_BV(PB3) ;
}

void puter_kiri(void)


   PORTB |=_BV(PB3);
   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB0) ;
   SPEED;


   PORTB |=_BV(PB2);
   PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB3) ;
   SPEED;


   PORTB |=_BV(PB1);
   PORTB &= ~_BV(PB2) & ~_BV(PB0) & ~_BV(PB3) ;
   SPEED;


   PORTB |=_BV(PB0);
   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) ;
   SPEED;

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

}

SIGNAL (SIG_INT0)
{
  int a;

   //ubah nilai max looping berikut sampai posisi berhenti yg pas
   for(a=0;a<3;a++) puter_kanan();

}

SIGNAL (SIG_INT1)
{
int a;

   //ubah nilai max looping berikut sampai posisi berhenti yg pas
   for(a=0;a<3;a++) puter_kiri();

}




int main(void)
{


   PORTB |= _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) ; //OUTPUT Stepper pin A,B,C,D
   PORTD &= ~_BV(PD4); //sensor posisi awal
    
   //aktifkan interupt

   MCUCR |= (1<<ISC01) | (0<<ISC00) |(1<<ISC11) | (1<<ISC10); 
   // interupt 0 (datang) falling edge, interupt 1 (pergi) rising edge

   GIMSK |= (1<<INT0) |(1<<INT1); 

   sei();

   //inisialisasi awal saat dihidupkan , pintu membuka sampai sensor posisi OFF


     
     while (bit_is_set(PIND, PIND4) )
  {
      puter_kiri(); //steper naik sampe sensor awal terhalang
      
  }

 while(1)
  {

  }

return 0;
}




FULL SCRIPT METODE TIMER - 2 ARAH :
/*
Pintu Kereta Api Otomatis
Dengan motor stepper
by: ahocool@gmail.com
SURABAYA - 2012
versi timer -- 2 arah
*/

#define F_CPU 100000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define SPEED _delay_ms(10)  // ubah nilai delay sesuai kecepatan yang diinginkan
#define TIMER 5 // timer dari gerbong terakhir menlewati sensor dan membuka palang pintu

int detik, posisi, depan;

void init_timer(void)
{
   TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
   TIMSK |= (1 << OCIE1A); // Enable CTC interrupt 
   OCR1A  = 7812; //compare the CTC A 
   TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64
   TCNT1 = 0;
   detik=0;
   sei();
}

void init_sensor_fall(void)
{
    
   cli();

   //aktifkan interupt
   MCUCR |= (1<<ISC01) | (0<<ISC00) |(1<<ISC11) | (0<<ISC10); 
   // interupt 0 & 1   falling edge , untuk deteksi 2 arah

   GIMSK |= (1<<INT0) |(1<<INT1); 

   sei();

   posisi = 0 ; // sebagai penanda kalo posisi pintu terbuka
}


void init_sensor_rise(void)
{
   cli();
   //aktifkan interupt
   MCUCR |= (1<<ISC01) | (1<<ISC00) |(1<<ISC11) | (1<<ISC10); 
   // interupt 0 & 1   rising edge , untuk deteksi akhir gerbong

   GIMSK |= (1<<INT0) |(1<<INT1); 

   sei();

   posisi = 1 ; // sebagai penanda kalo posisi pintu tertutup
}


void puter_kanan(void)


   PORTB |=_BV(PB0);
   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) ;
   SPEED;


   PORTB |=_BV(PB1);
   PORTB &= ~_BV(PB0) & ~_BV(PB2) & ~_BV(PB3) ;
   SPEED;


   PORTB |=_BV(PB2);
   PORTB &= ~_BV(PB1) & ~_BV(PB0) & ~_BV(PB3) ;
   SPEED;


   PORTB |=_BV(PB3);
   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB0);
   SPEED;

   PORTB |=_BV(PB0) | _BV(PB2);
   PORTB &= ~_BV(PB1)  & ~_BV(PB3) ;
}

void puter_kiri(void)


   PORTB |=_BV(PB3);
   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB0) ;
   SPEED;


   PORTB |=_BV(PB2);
   PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB3) ;
   SPEED;


   PORTB |=_BV(PB1);
   PORTB &= ~_BV(PB2) & ~_BV(PB0) & ~_BV(PB3) ;
   SPEED;


   PORTB |=_BV(PB0);
   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) ;
   SPEED;

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

}

SIGNAL (SIG_INT0)
{
  int a;
  
  
   //jika pintu terbuka dan kereta lewat  
   if( posisi == 0) {
       depan = 1; //berarti sensor 1 jadi yg didepan
       init_sensor_rise(); //mode interupt berubah
  
   //ubah nilai max looping berikut sampai posisi berhenti yg pas
       for(a=0;a<3;a++) puter_kanan();
     
                 }
   else {
   //jika ada kondisi celah gerbong (0 -> 1) maka reset timer
     if(depan == 1)init_timer(); 
   
        }
}

SIGNAL (SIG_INT1)
{
int a;
   
    //jika pintu terbuka dan kereta lewat 
     if( posisi == 0) {
       depan = 2; //berarti sensor 2 jadi yg didepan
       init_sensor_rise();//mode interupt berubah 
  
   //ubah nilai max looping berikut sampai posisi berhenti yg pas
       for(a=0;a<3;a++) puter_kanan();
     
                 }
   else {
   //jika ada kondisi celah gerbong (0 -> 1) maka reset timer
     if(depan == 2)init_timer(); 
   
        }
}



ISR(TIMER1_COMPA_vect) // interupt timer detik


int a;


detik++;

if(detik >= TIMER ) // jika lebih dari timer yg ditentukan maka pintu terbuka

  {

    init_sensor_fall(); //kembalikan sensor sebagai interupt fall edge
    TIMSK=0; //matikan timer


   //ubah nilai max looping berikut sampai posisi berhenti yg pas
   for(a=0;a<3;a++) puter_kiri();
   
  }
}



int main(void)
{


   PORTB |= _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) ; //OUTPUT Stepper pin A,B,C,D
   
   PORTD &= ~_BV(PD2) & ~_BV(PD3) & ~_BV(PD4); //sensor sebagai input
    
   init_sensor_fall(); //awal sebagai interupt fall

   //inisialisasi awal saat dihidupkan , pintu membuka sampai sensor posisi OFF

  
     while (bit_is_set(PIND, PIND4) )
  {
      puter_kiri(); //steper naik sampe sensor awal terhalang
      
  }



 while(1)
 {

 }

   
return 0;
}





SELAMAT MENCOBA !








sumber:
www.aisi555.com