Anda di halaman 1dari 14

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 nilai-
nilai 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: // Constants for key pins used in shifting out


2: int pinData = 7;
3: int pinLatch = 8;
4: 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 langkah-
langkah 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: void write595(byte aData)


2: {
3: // latch the outputs so the shifting process will not affect
4: // the outputs
5: digitalWrite(pinLatch, LOW);
6:
7: // shift out the data bits
8: shiftOut(pinData, pinClock, MSBFIRST, aData);
9:
10: // open the latch to transfer the shifted data to output pins
11: digitalWrite(pinLatch, HIGH);
12: }

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: void loop()
2: {
3: for (byte i=0; i<8; i++)
4: {
5: write595(1<<i);
6: delay(50);
7: }
8: }

Sketch Lengkap

Sketch lengkap dapat diperoleh di sini (file teks ektensi .ino) atau di sini (terkompresi zip).

Hasil
Kalau anda belum menghubungkan Arduino anda ke PC tempat IDE Arduino anda, sekarang
saatnya menghubungkannya dan pilih serial port yang tepat yang mewakili board Arduino
tersebut. Klik tombol Upload untuk kompilasi sketch di atas dan mengunggahnya. Setelah
selesai anda akan memperoleh hasil kurang lebih seperti berikut ini.
Proyek Demo 2
Dalam proyek ini kita akan mempelajari bagaimana menghubungkan beberapa chip 74HC595
untuk memperoleh pin digital tambahan lebih dari 8 dengan tetap hanya menggunakan 3 buah
pin Arduino.

Dalam proses penggeseran, bit yang sebelumnya berada pada posisi MSB (Most Significant Bit)
akan menjadi bit carry. Pada 74HC595, bit carry akan dikirim ke pin Q7' (pin #9). Jadi, nilai bit
yang sebelum clocking berada pada pin Q7 (pin #7) setelah clocking akan berada pada pin Q7'.
Kita dapat menghubungkan pin Q7' ini ke pin input (pin DS) 74HC595 lain, memberikan
sinyal clock dan latch yang sama dengan 74HC595 pertama, dan akan kita dapati pin Q1 pada
chip 74HC595 kedua akan berisikan nilai bit pin Q7' dari chip 74HC595 pertama. Hal ini
disebut cascading atau juga daisy wheel.

Secara teori, tidak ada batasan jumlah chip 74HC595 dapat dihubungkan berantai seperti ini.

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. 2 buah chip 74HC595.

5. 16 buah tahanan 220.

6. 16 buah LED hijau. Tentu saja warna lain juga boleh digunakan.

Tata Letak Breadboard

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


Skema Rangkaian
Perhatikan bahwa dari tata letak breadboard dan skema rangkaian dapat disimpulkan hal-hal
berikut ini.

1. Kedua chip 74HC595 menggunakan sinyal clock dan latch yang sama.

2. Pin Q7' pada chip 74HC595 pertama dihubungkan ke pin DS chip 74HC595 kedua.
Koneksi ini yang membawa bit carry dari 74HC595 pertama menjadi input 74HC595
kedua.

Perangkat Lunak
Sebenarnya tidak ada perbedaan mencolok dari sketch Proyek Demo 2 ini dengan yang
sebelumnya. Hanya saja dikarenakan fungsi shiftOut() hanya bisa mengirim 8 bit data, sementara
kini dibutuhkan pengiriman 16 bit data, penggunaan shiftOut() harus dilakukan dua kali. Masing-
masing mengirimkan 8 bit. Karenanya, fungsi write595() dimodifikasi menjadi sebagai berikut.
1: void write595(int aData)
2: {
3: // latch the outputs so the shifting process will not affect
4: // the outputs
5: digitalWrite(pinLatch, LOW);
6:
7: // Shift out the first byte
8: int vTmp = aData >> 8;
9: shiftOut(pinData, pinClock, MSBFIRST, vTmp);
10:
11: // shift out the second byte
12: shiftOut(pinData, pinClock, MSBFIRST, aData);
13:
14: // open the latch to transfer the shifted data to output pins
15: digitalWrite(pinLatch, HIGH);
16: }
17:

Sketch lengkap dapat diperoleh di sini (file teks berekstensi .ino) dan di sini (file terkompres,
.zip).

Hasil

Proyek Demo 3
Sebenarnya tidak ada yang istimewa dalam proyek demo ini. Tujuan proyek demo 3 ini untuk
menekankan bahwa pada sistem mikrokontroller, perangkat keras yang sama dapat berperilaku
berbeda bila diberi program/perangkat lunak yang berbeda. Karena dalam proyek demo 3 ini
perangkat keras yang digunakan adalah perangkat keras dari proyek demo 2 (yang menggunakan
2 chip 74HC595 untuk menghasilkan 16 pin tambahan), tetapi menggunakan sketch dari proyek
demo 1 (yang hanya menggunakan 1 buah chip 74HC595).

Dari kombinasi tersebut diperoleh hasil seperti ditunjukkan dalam video berikut ini. Pembaca
dipersilahkan untuk menganalisa sendiri mengapa diperoleh hasil seperti itu, sebagai bahan
latihan.

back to top
< Sebelumnya

Berikutnya >

Language Selection

Anda mungkin juga menyukai