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.
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.
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:
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
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 19int 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:
Arduino | 74HC595 | Deskripsi |
8 | 12 | Storage Register Clock Input |
11 | 14 | Serial Data Input |
12 | 11 | Shift 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);
digitalWrite(clockPin, LOW); //stop shifting out data
Related Article
Proyek 18 - L293D-motor-driver
makasih min
ReplyDeletePemotong simcard