Shift Register 74hc595 [PDF]

  • 0 0 0
  • Suka dengan makalah ini dan mengunduhnya? Anda bisa menerbitkan file PDF Anda sendiri secara online secara gratis dalam beberapa menit saja! Sign Up
File loading please wait...
Citation preview

Pengantar Keterbatasan Jumlah Pin Bila anda mengikuti dan mencoba tutorial-tutorial sebelum ini, tentu anda sudah menyadari ketergantungan Arduino terhadap pin-pin yang dimilikinya untuk berinteraksi dengan dunia luar. Setiap perangkat yang ingin kita hubungkan akan menggunakan paling sedikit satu buah pin. Karena jumlah pin terbatas, seringkali kita kehabisan pin saat kita harus menghubungkan cukup banyak perangkat. Untuk ini kita harus bisa "menambah" pin ke Arduino untuk bisa menghubungkan. Terdapat beberapa cara untuk menambahkan pin ke Arduino. Salah satunya adalah dengan menggunakan chip shift register. Silahkan kunjungin laman wikipedia ini untuk pembahasan lebih dalam mengenai shift register. Dalam tulisan ini kita akan membahas cara menambahkan pin output menggunakan shift register SIPO (Serial In Paralel Out). Tentu saja ada keterbatasan dalam penambahan pin output menggunakan shift register ini. Keterbatasan utama adalah pin output tambahan ini hanyalah pin digital. Hanya bisa mengeluarkan nilai 0 atau 1 (LOW atau HIGH; 0V atau 5V). Jadi jangan berharap bisa menggunakan PWM.



Shift Register SIPO 74HC595 Sekilas Mengenai Shift Register Shift register SIPO (Serial In Paralel Out) memiliki pin input serial, pin clock, dan beberapa pin output. Setiap kali sinyal clock terdeteksi di pin clock, nilai-nilai pada pin-pin output akan digeser ke kiri (umumnya), dan nilai pin input akan diselipkan menjadi bit terendah (LSB). Sinyal clock umumnya ditandai dengan perubahan tegangan naik (rising up) atau turun (rising down) tergantung dari spesifikasi shift register yang bersangkutan. Sebagai contoh, misalkan shift register SIPO A memiliki 4 pin output, 1 pin input, dan 1 pin clock. Pada keadaan awal, seluruh pin output bernilai 0, atau 0000b. Dan kita hendak mengubah pin output #0 menjadi 0, pin output #1 menjadi 1, pin output #2 menjadi 0, dan pin output #3 menjadi 1, atau 1010b. Maka kita harus melakukan hal berikut. Clock #



Input pin



O0



O1



O2



O3



O0'



O1'



O2'



O3'



0



1



0



0



0



0



1



0



0



0



1



0



1



0



0



0



0



1



0



0



Clock #



Input pin



O0



O1



O2



O3



O0'



O1'



O2'



O3'



2



1



0



1



0



0



1



0



1



0



3



0



1



0



1



0



0



1



0



1



Keterangan: 



O0 = nilai pin 0 sebelum clocking







Q1 = nilai pin 1 sebelum clocking







Q2 = nilai pin 2 sebelum clocking







Q3 = nilai pin 3 sebelum clocking







Q0' = nilai pin 0 setelah clocking







Q1' = nilai pin 1 setelah clocking







Q2' = nilai pin 2 setelah clocking







Q3' = nilai pin 3 setelah clocking



74HC595 Di pasaran terdapat beberapa pilihan shift register. Salah satu yang populer adalah 74HC595. Datasheet-nya dapat dilihat di sini atau di sini (salinan lokal). Berikut skematik dari 74HC595.



Legenda: Pin



Name



Keterangan



VCC GND DS



Data Serial in



OE



Object Enabled



ST_CP Latch Clock SH_CP Register Clock MR



Master Reset



Q0-Q7



Output pins



Q7'



Carry pin



Nilai Q7 lama akan dikirim ke pin ini setelah proses geser (shift).



Menggunakan 74HC595 Berikut ini informasi cepat cara menghubungkan chip 74HC595 ke sistem Arduino. 1. Hubungkan pin Vcc (pin #16) ke sumber tegangan +5V. 2. Hubungkan pin GND (pin #8) ke ground. 3. Hubungkan pin OE (pin #13) ke ground bila anda ingin chip 74HC595 yang bersangkutan untuk selalu aktif/terpilih setiap saat, atau hubungkan ke pin digital Arduino



jika anda butuh untuk mengaktifkan chip yang bersangkutan hanya pada saat-saat tertentu, dan tidak aktif di saat lain. 4. Hubungkan pin MR (pin #10) ke sumber tegangan 5V bila anda tidak butuh fitur master reset, atau ke salah satu pin digital Arduino bila anda butuh fitur master reset. Bila anda gunakan pilihan terakhir, selalu set nilai pin Arduino yang bersangkutan ke HIGH, kecuali saat anda ingin seluruh pin output 74HC595 di-reset jadi 0. 5. Hubungkan pin DS (pin #14) ke pin digital Arduino yang akan menyediakan data nilainilai yang harus dikeluarkan oleh pin Q0 - Q7. 6. Hubungkan pin SH_CP (pin #11) ke pin digital Arduino yang akan menyediakan sinyal clock. 7. Hubungkan pin ST_CP (pin #12) ke pin Arduino yang akan mengatur pembukaan latch register untuk memindahkan data serial yang sudah lengkap diberikan ke pin-pin output. 8. Pin Q0 hingga Q7 akan menjadi pin tambahan bagi sistem Arduino kita. Jadi hubungkan pin-pin ini ke perangkat yang anda ingin kontrol. Perlakukan pin-pin ini lazimnya pin digital biasa. Tentu saja kita tidak bisa langsung menggunakan fungsi digitalWrite() bawaan Arduino. 9. Hubungkan pin Q7' ke pin DS chip 74HC595 lain jika anda ingin menambahkan lebih banyak lagi pin output tambahan.



Jadi pada kondisi paling minimal (tidak menggunakan pin MR dan OE), dengan 74HC595 kita dapat menambahkan 8 pin digital dengan hanya meng-"konsumsi" 3 buah pin Arduino. Dan tidak sampai di sini saja, anda dapat menambahkan pin digital sebanyak-banyaknya dengan tetap hanya meng-"konsumsi" 3 pin digital yang sama, dengan menghubungkan beberapa chip 74HC595 secara berantai dengan menghubungkan pin DS chip 74HC595 yang satu dengan 74HC595 berikutnya.



Proyek Demo 1 Dalam demo proyek ini kita akan membuat 8 buah LED nyala dan padam sedemikian rupa sehingga terlihat seperti berlari dengan hanya menggunakan 3 buah pin Arduino. Ingat bahwa bila proyek ini diselesaikan tanpa penambahan pin, kita terpaksa menggunakan 8 pin Arduino. Untuk kali ini mungkin terlihat penambahan ini tidak diperlukan, karena semua board Arduino memiliki jumlah pin lebih dari 8. Tapi tujuan utama proyek ini adalah untuk memudahkan anda memahami cara menggunakan 74HC595 untuk menambahkan pin output.



Dalam demo proyek 2, kita akan melihat bagaimana membuat 16 LED "berlari" dengan tetap hanya menggunakan 3 pin Arduino. Sampai saat ini hanya Arduino Leonardo, Due, Mega 2560, dan Mega ADK yang memiliki jumlah pin lebih dari 16. Jadi bila menggunakan UNO, Nano, atau board Arduino lain, proyek demo 2 mustahil diselesaikan tanpa penambahan pin.



Perangkat Keras Komponen yang dibutuhkan 1. 1 buah board Arduino UNO, atau board lain yang kompatibel. 2. 1 buah breadboard 830/840 titik. 3. Kabel-kabel breadboard. 4. 1 buah chip 74HC595. 5. 8 buah tahanan 220Ω. 6. 8 buah LED hijau. Warna lain juga boleh digunakan. Untuk proyek ini kita akan menggunakan pendekatan minimal dengan tujuan menggunakan pin Arduino seminimal mungkin. Seperti telah dibahas sebelumnya, untuk ini kita hanya membutuhkan 3 buah pin Arduino. mari tentukan pin-pin mana yang akan kita gunakan dan dihubungkan ke pin 74HC595 yang mana. 1. Pin Arduino #7 dihubungkan ke pin DS 74HC595. Pin ini selanjutnya kita namakan pinData. 2. Pin Arduino #8 dihubungkan ke pin ST_CP (latch) 74HC595. Pin ini selanjutnya kita namakan pinLatch. 3. Pin Arduino #9 dihubungkan ke pin SH_CP (clock) 74HC595. Pin ini selanjutnya kita namakan pinClock.



Tata Letak Breadboard Atur tata letak komponen-komponen di atas sesuai dengan gambar berikut.



Skema Rangkaian



Perangkat Lunak



Inisialisasi Pertama-tama tentu kita harus mendeklarasikan konstanta pinData, pinLatch, dan pinClock sesuai dengan pin-pin yang kita tentukan sebelumnya. Memang sebenarnya tidak harus menggunakan konstanta, tapi ini akan sangat membantu sekali dalam me-maintain kode kita nantinya. 1: 2: 3: 4:



// Constants for key pins used in shifting out int pinData = 7; int pinLatch = 8; int pinClock = 9;



Kemudian di bagian setup() kita harus menetapkan modus pin-pin tersebut di atas. Semuanya bermodus OUTPUT, karena kita akan mengirimkan data melalui mereka. 1: void setup() 2: { 3: pinMode(pinData, OUTPUT); 4: pinMode(pinClock, OUTPUT); 5: pinMode(pinLatch, OUTPUT); 6: 7: // Initially we want to shut all the LEDs down 8: write595(0); 9: delay(50); 10: }



Dua baris kode terakhir di atas sebenarnya tidak terlalu penting. Hanya saja kita ingin agar semua pin-pin tambahan bernilai 0 pada saat sistem mulai berjalan. Fungsi write595() akan dibahas berikut ini.



Mengirim Data ke Pin-pin Tambahan Seperti yang sebelumnya telah ditekankan, penulisan data ke pin-pin digital tambahan ini tidak bisa melalui fungsi digitalWrite(). Karena sesungguhnya pin-pin tersebut tidak langsung diatur oleh Arduino. Kita harus berkoordinasi dengan 74HC595 untuk memperoleh output yang kita inginkan. Berikut langkah-langkah untuk mengirimkan data ke pin-pin tambahan.



1. "Kunci" register latch pada 74HC595, agar proses penggeseran data tidak langsung mempengaruhi pin-pin output 74HC595. Di sini kita akan mengirim data 0/LOW ke pinLatch. 2. Kirim bit pertama ke pinData. 3. Kirim sinyal clock ke pinClock. 4. Ulangi langkah 2 dan 3 untuk semua sisa bit. 5. "Buka" register latch 74HC595, agar data yang telah lengkap kita kirimkan dipindahkan ke pin-pin output 74HC595. Dalam hal ini kita akan mengirim data 1/HIGH ke pinLatch.



Fungsi ShiftOut() Kita beruntung karena pustaka Arduino telah menyediakan fungsi untuk melakukan langkah 2 hingga 4 di atas, bila data berukuran 8 bit. Fungsi tersebut adalah shiftOut(). Silahkan kunjungi laman ini untuk informasi resmi dan lengkap tentang fungsi shiftOut(). Dan kita akan menggunakannya dalam kode kita



Fungsi write595() Kode-kode yang akan kita tulis yang berkaitan langsung dengan mengirimkan data ke pin-pin tambahan kita akan disimpan dalam fungsi yang bernama write595(). Hal ini agar mudah maintenance, dan untuk kemudahan membaca kode. Kita akan mengimplementasi langkahlangkah 1 sampai 5 di atas ke dalam fungsi ini, dengan menggunakan shiftOut() saat melakukan langkah 2 sampai 4. Penggunaan shiftOut() di sini sangat sempurna, selain karena merupakan pustaka bawaan Arduino, dan mempermudah proses koding, juga karena data kita ukurannya tepat 8 bit. Berikut ini kode lengkap untuk fungsi write595(). 1: 2: 3: 4: 5: 6: 7: 8: 9:



void write595(byte aData) { // latch the outputs so the shifting process will not affect // the outputs digitalWrite(pinLatch, LOW); // shift out the data bits shiftOut(pinData, pinClock, MSBFIRST, aData);



10: 11: 12:



// open the latch to transfer the shifted data to output pins digitalWrite(pinLatch, HIGH); }



Tubuh Sketch Dalam bagian loop() kita ingin menghidupkan hanya 1 buah led dalam satu saat, sesuai dengan index bit dalam satu byte. Sesuai skema rangkaian dan breadboard kita, maka LED paling kanan (LED1) mewakili bit 0, LED di sebelah kirinya mewakili bit 1, demikian seterusnya hingga LED terakhir yang paling kiri mewakili bit 7. Untuk ini kita menggunakan perintah for untuk menghitung dari 0 hingga 7, dan di dalam loop tersebut kita melakukan operasi geser kiri (shift left) terhadap nilai 1 sejumlah counter for. Dengan demikian kita akan memperoleh nilai byte di mana hanya satu bit tertentu yang bernilai 1 (sesuai dengan posisi counter for). Berikut ini kode lengkap untuk bagian loop(). 1: 2: 3: 4: 5: 6: 7: 8:



void loop() { for (byte i=0; i