เมื่อก่อนพี่เคยสอนวิธีควบคุม 7 Segment Display ด้วย Arduino ใช้อิ้งไปตั้ง 7 ขาเลยใช่มะ
คราวนี้พี่จะพาน้องไปรู้จักกับ ชิฟต์เรจิสเตอร์ (Shift Register) ตัวช่วยที่ทำให้เราควบคุม 7 Segment หลายๆ ตัวได้ด้วยแค่ 3 ขา! งานนี้จัดไปวัยรุ่น!
ขยายขาแบบจัดเต็มด้วย 74HC595 Shift Register
บอร์ด Arduino Uno นี่ขา Digital มันจำกัดมาก ถ้าน้องลองต่อ LED หรือรีเลย์ 8 ตัว รับรองหมดขาแบบไม่เหลือให้เซนเซอร์หรือ LCD เลย! Shift Register นี่แหละคือฮีโร่ที่มาช่วยแก้ปัญหานี้ ด้วย IC ตำนานอย่าง 74HC595 เราสามารถยัดข้อมูลไบนารี่ 8 บิต (เช่น 11001010) เข้าไปผ่านแค่ 3 ขา ของ Arduino เท่านั้น! ตัวชิปจะทำหน้าที่เป็นบัฟเฟอร์ฮาร์ดแวร์ เก็บข้อมูลแบบเรียงลำดับ แล้วส่งออกไปพร้อมกันแบบขนาน ทำให้ 3 ขา กลายเป็น 8 ขา!
รู้จักกับ Synchronous Serial Interface (Data, Clock, Latch)
74HC595 ไม่ใช่ I2C หรือ SPI นะ มันใช้โปรโตคอลแบบ 3 สายดิบๆ ที่เราต้องสั่งงานด้วย shiftOut() เองเลย!
- Clock Pin (
SRCLK): สัญญาณนาฬิกา ติ๊กต็อกๆ คอยจับจังหวะให้ Arduino กับ IC ทำงานพร้อมกัน - Data Pin (
SER): ขานี้ Arduino จะยิงสัญญาณHIGHหรือLOWลงไปในแต่ละจังหวะของ Clock - Latch Pin (
RCLK): พอข้อมูล 8 บิตโหลดเข้าไปในหน่วยความจำของชิปหมดแล้ว Arduino จะดึงขานี้เป็นHIGHทันใดนั้น IC ก็จะปล่อยสถานะของทั้ง 8 บิตออกไปที่ขา Output (QA-QH) พร้อมกันแบบรัวๆ!
int dataPin = 11;
int clockPin = 12;
int latchPin = 8;
void loop() {
// มาลองเปิด LED ขาที่ 1, 3, และ 8 กัน! Binary: 10000101 (Hex: 0x85)
byte ledMatrix = 0b10000101;
digitalWrite(latchPin, LOW); // ล็อกบัฟเฟอร์ไว้ก่อน!
// ยิงข้อมูล 8 บิตออกไปด้วย shiftOut()!
shiftOut(dataPin, clockPin, MSBFIRST, ledMatrix);
digitalWrite(latchPin, HIGH); // ปล่อยของ! LED ทั้ง 8 ดวงอัพเดทพร้อมกัน!
delay(1000);
}
ต่อเป็นทอดๆ ได้ขาเพิ่มแบบไม่รู้จบ!
ความเจ๋งของ 74HC595 อยู่ที่ขา Q7' (Pin 9) ที่เป็น Serial Out!
- ถ้าน้องต่อขา
Q7'ของ Shift Register ตัวแรก เข้ากับขา Data Input ของตัวที่สอง... - น้องก็สามารถใช้
shiftOut()สองครั้ง โดยใช้ Arduino แค่ 3 ขาเดิม! - ข้อมูล 8 บิตแรกจะล้นจากชิปตัวแรกเข้าไปในตัวที่สองทันที! เท่ากับว่าน้องได้ 16 ขา Output จาก 3 ขา เท่านั้น! ทฤษฎีแล้วต่อเป็นทอดๆ ได้เป็นร้อยชิปเลยนะ เอาไปทำเมทริกซ์ 8x8 ยังไหว! ห้ามช็อตนะตัวนี้
อุปกรณ์ที่ต้องมี
- Arduino Uno/Nano (เป็นหัวเรือใหญ่คอยคำนวณและส่งข้อมูล)
- IC 74HC595 Shift Register (ตัวงานหนักที่แปลงข้อมูลแบบอนุกรมให้เป็นแบบขนาน)
- LED 8 ดวง และตัวต้านทาน (Resistor) 330 โอห์ม
- บอร์ดเบรดบอร์ด (แนะนำให้ใช้ตัวเก็บประจุ (Capacitor)
0.1µFต่อคร่อมระหว่างขาVCC/GNDของ 74HC595 ด้วยนะ จะได้ลดสัญญาณรบกวนเวลาสวิตช์ความถี่สูง ไม่งั้นข้อมูลอาจเพี้ยนได้!)