การขยาย Output Arduino จาก 12 pin เป็น 32 pin ด้วย IC 74HC595

ในกระทู้นี้เรามาว่ากันถึงเรื่องของ output ของ Arduino ในบางครั้ง output มีให้มาน้อยเกินไป แต่ความต้องการใช้ output มีมากกว่า ซึ่งวิธีแก้ปัญหาในเคสนี้จะใช้ ไอซี เบอร์ 74HC595 ขยาย pin ออกไปให้เพียงพอ ยกตัวอย่างเช่นต้องการจำนวน 32 pin เพื่อที่จะควบคุม LED 32 ดวง เราจะใช้ 74HC595 เพื่อแปลง 12 pin เป็น 32 pin

74Hc595

74hc595 datasheet

image

image

วิธีการต่อ

Code ที่ใช้งาน

int time = 100;

int LPA = 12;      
int CPA = 11; 
int DPA = 13;

int LPB = 9;      
int CPB = 8; 
int DPB = 10;

int LPC = 6;      
int CPC = 5; 
int DPC = 7;

int LPD = 3;      
int CPD = 2; 
int DPD = 4;

byte leds = 0;

void USCA()
{
   digitalWrite(LPA, LOW);
   shiftOut(DPA, CPA, LSBFIRST, leds);
   digitalWrite(LPA, HIGH);
}
void USCB()
{
   digitalWrite(LPB, LOW);
   shiftOut(DPB, CPB, LSBFIRST, leds);
   digitalWrite(LPB, HIGH);
}
void USCC()
{
   digitalWrite(LPC, LOW);
   shiftOut(DPC, CPC, LSBFIRST, leds);
   digitalWrite(LPC, HIGH);
}
void USCD()
{
   digitalWrite(LPD, LOW);
   shiftOut(DPD, CPD, LSBFIRST, leds);
   digitalWrite(LPD, HIGH);
}
void setup() 
{
  pinMode(LPA, OUTPUT);
  pinMode(DPA, OUTPUT);  
  pinMode(CPA, OUTPUT);
  pinMode(LPB, OUTPUT);
  pinMode(DPB, OUTPUT);  
  pinMode(CPB, OUTPUT);
  pinMode(LPC, OUTPUT);
  pinMode(DPC, OUTPUT);  
  pinMode(CPC, OUTPUT);
  pinMode(LPD, OUTPUT);
  pinMode(DPD, OUTPUT);  
  pinMode(CPD, OUTPUT);
}
void loop() 
{
    leds = 0;
  USCA();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, 7-i);
    USCA();
    delay(time);
  }
  leds = 0;
  USCB();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, 7-i);
    USCB();
    delay(time);
  }
  leds = 0;
  USCC();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, 7-i);
    USCC();
    delay(time);
  }
  leds = 0;
  USCD();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, 7-i);
    USCD();
    delay(time);
  }
  delay(1000);
  
  leds = 0;
  USCD();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    digitalWrite(LPA,LOW);
    delay(time);
  }
    leds = 0;
  USCC();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    digitalWrite(LPA,LOW);
    delay(time);
  }
    leds = 0;
  USCB();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    digitalWrite(LPA,LOW);
    delay(time);
  }
    leds = 0;
  USCA();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    digitalWrite(LPA,LOW);
    delay(time);
  }
  delay(1000);
  
  leds = 0;
  USCD();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    USCD();
    delay(time);
  }
  leds = 0;
  USCC();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    USCC();
    delay(time);
  }
 
  leds = 0;
  USCB();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    USCB();
    delay(time);
  }
  leds = 0;
  USCA();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    USCA();
    delay(time);
  }
  delay(1000);
  
 
  delay(1000);
  leds = 0;
  USCD();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    digitalWrite(LPA,LOW);
    delay(time);
  }
    leds = 0;
  USCC();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    digitalWrite(LPA,LOW);
    delay(time);
  }
    leds = 0;
  USCB();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    digitalWrite(LPA,LOW);
    delay(time);
  }
    leds = 0;
  USCA();
  delay(time);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    digitalWrite(LPA,LOW);
    delay(time);
  }
}

Simulate


ที่มา
[1] : Circuit design 32 LEDs flashing using 74HC595 | Tinkercad
[2] : http://www.ti.com/lit/ds/symlink/sn74hc595.pdf