Mahir Arduino Sketch dan Elektro secara praktek

19 - Shift Register 8-Bit Binary Counter

Pada proyek ke 19, kita akan mencoba menggunakan IC (integrated circuits) shift registers, yang digunakan untuk mengatur LEDs menampilkan binary counter. Kita akan mengatur 8 buah LED dengan hanya menggunakan 3 output pin Arduino.

Komponen

  • 1 x 74HC595 Shift Register IC
  • 8 x 560Ω Resistors*
  • 8 x 5mm LEDs
  • 0.1uF Capacitor

Skema

Perhatian: hubungkan daya 5V dari Arduino di jalur bawah dibagian bawah breadboard dan ground di jalur atasnya. Lalu hubungkan dengan kabel dari bagian bawah breadboard ke bagian atas breadboard (lihat gambar).

Biasanya untuk mencari pin 1 dari chip, ditunjukan dengan titik bulat (dimple) pada sisi kiri bawah. Pin 1 dibawah dimple tersebut dan pin 8 ada di kanan bawah, pin 9 di kanan atas, and pin 16 di kiri atas.

Pasang kabel untuk menghubungkan pins 10 dan 16 ke sumber daya 5V , untuk ground hubungkan ke pins 8 dan 13.

Hubungkan kabel untuk digital pin 8 dengan pin 12 pada IC. Digital pin 12 ke pin 11 pada IC, dan dari digital pin 11 ke pin 14 pada IC.

Gunakan resistor 560Ω pada led, hubungkan katoda dari led dengan ground. Anoda pada LED 1 hubungkan dengan pin 15 pada IC. Dan untuk anoda LED 2 sampai 8 hubungkan dengan pin 1 sampai 7 pada IC.

Kita perlu melakukan bypass kapasitor (decoupling capacitor). Pastikan rating voltage lebih tinggi dibandingkan voltage yang digunakan. Pastikan kapasitor sedekat mungkin dengan chip. Manfaat dari kapasitor ini untuk mengurangi efek electrical noise pada rangkaian.

Silakan cek gambar dibawah, setelah rangkaian beres, masukan kode arduino.



Sketch

// Project 19
int latchPin = 8; //Pin connected to Pin 12 of 74HC595 (Latch)
int clockPin = 12; //Pin connected to Pin 11 of 74HC595 (Clock)
int dataPin = 11; //Pin connected to Pin 14 of 74HC595 (Data)

void setup() {
//set pins to output
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  //count from 0 to 255
  for (int i = 0; i < 256; i++) {
    shiftDataOut(i);
    //set latchPin low then high to send data out
    digitalWrite(latchPin, LOW);
    digitalWrite(latchPin, HIGH);
    delay(1000);
  }
}

void shiftDataOut(byte dataOut) {
  // Shift out 8 bits LSB first, clocking each with a rising edge of the      clock line
  boolean pinState;
  for (int i=0; i<=7; i++) { // for each bit in dataOut send out a bit
    digitalWrite(clockPin, LOW); //set clockPin to LOW
    // if the value of DataOut and (logical AND) a bitmask
    // are true, set pinState to 1 (HIGH)
    if ( dataOut & (1<<i) ) {
      pinState = HIGH;
    }
    else {
      pinState = LOW;
    }

    //sets dataPin to HIGH or LOW depending on pinState
    digitalWrite(dataPin, pinState); //send bit out 
    digitalWrite(clockPin, HIGH);
  }
  digitalWrite(clockPin, LOW); //stop shifting out data
}

Baca Juga : Bitwise Operator

Overview 74HC595
Kita menggunakan shift register type 74HC595. Type ini adalah type 8-bit serial-in, serial or parallel-out shift register with output latches. Ini berarti kita dapat mengirim data ke shift register secara serial  dan ouput secara paralel. Series berarti, 1 bit per satu waktu. Parallel berarti lebih dari 1 bits, dalam hal ini adalah 8 bits dalam satu waktu.

Kita mengirimkan data pada shift registers 1 bit setiap waktu. Setiap bit akan dipush selama ada bit baru yang masuk, ketika bit ke 9 dimasukan, bit pertama tadi akan di push dari shist register dan hilang (bila kita tidak melakukan sesuatu pada data tersebut).

Ketika latch signal diubah dari LOW ke HIGH, isi dari shift registers saat ini di copy ke output latches.(Proses copy ini tidak mempengaruhi isi dari shift register).

Type shift register ini umum digunakan untuk konversi data dari serial ke paralel. Ada type juga dari masuk pararlel, keluar serial, yang digunakan untuk konversi dari paralel ke serial.

Pada case kita ini, data output adalah 1s dan 0s (atau 0V dan 5V), dapat kita gunakan untuk menyalakan atau mematikan 8 LEDs.

Shift register pada proyek ini hanya membutuhkan 3 input dari Arduino. Output dari Arduino dan Input shift registers 74HC595595 yang dibutuhkan adalah:

Arduino74HC595Deskripsi
812Storage Register Clock Input
1114Serial Data Input
1211Shift Register Clock Input

Kita tidak menggunakan pin 10 (master reset) dan13 (output enable input). Kita hanya perlu set high pada pin 10 atau  low pada pin 13 agar projek ini berjalan dengan baik.


Pembahasan Sketch

Pertama-tama, inisialisasi 3 variable untuk 3 pin yang akan kita gunakan.

int latchPin = 8; //Pin connected to Pin 12 of 74HC595 (Latch)
int clockPin = 12; //Pin connected to Pin 11 of 74HC595 (Clock)
int dataPin = 11; //Pin connected to Pin 14 of 74HC595 (Data)


Kemudian, pada setup, ataur pin ke mode output.

void setup() {
//set pins to output
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}


Pada loop , melakukan counting dari 0 sampai 255. Pada setiap iterasi, latchPin di set ke LOW untuk keperluan data entry. Kemudia panggil fungsi shiftDataOut, passing nilai dari i pada for.  Kemdian set latchPin ke HIGH, transfer data dari shift register ke output latches and output
pins. Kemudian delay setengah second sebelum melakukan iterasi berikutnya.

void loop() {
  //count from 0 to 255
  for (int i = 0; i < 256; i++) {
    shiftDataOut(i);
    //set latchPin low then high to send data out
    digitalWrite(latchPin, LOW);
    digitalWrite(latchPin, HIGH);
    delay(1000);
  }
}

Fungsi shiftDataOut menerima 1 byte (8-bit angka), yaitu angka dalam rentang 0 sampai 255.  Kita menggunakan byte  karena kita memang hanya membutuhkan 8 bit yang dikirimkan ke shift register.

void shiftDataOut(byte dataOut) {


Inisialisai boolean variable pinState. Digunakan untuk menyimpan status pin  ketika data dikirim.

boolean pinState;


Kita sudah siap mengirim 8 bits secara serie ke 74HC595, 1 bit per waktu Lihat loop for dibuat berulang 8 kali.
for (int i=0; i<=7; i++) {

Clock pin diatur ke LOW sebelum mengirim bit data.
digitalWrite(clockPin, LOW);

if/else statement untuk menentukan apakah pinState variable harus diset ke 1 atau 0.

if ( dataOut & (1<<i) ) {
  pinState = HIGH;
}
else {
  pinState = LOW;
}

Kode berikutnya melakukan digitalWrite nilai HIGH atau LOW  ke data pin dan set clockPin HIGH untuk menuliskan nilai bit ke  storage register.

digitalWrite(dataPin, pinState); //send bit out 
digitalWrite(clockPin, HIGH);

Kemudian ClockPin diset  ke LOW untuk memastikan tidak ada bit lagi yang ditulis ke storage register.
digitalWrite(clockPin, LOW); //stop shifting out data


Related Article
Proyek 18 - L293D-motor-driver

1 comment: