นี่คือคู่มือแบบ Step-by-Step ที่พี่จัดทำขึ้นสำหรับมือใหม่และพวก ArduiNOOBS อย่างเราๆ
ในบทสอนนี้ เราจะคุยกันเรื่องความรู้พื้นฐานเกี่ยวกับ Shift Register 8-bit ที่ชื่อว่า 74HC595 กันหน่อย เรียนรู้วิธีต่อมันแบบ Daisy-Chain และใช้โค้ดจาก Library HC595 กัน
อีกอย่าง พี่เจอปัญหากับ Shift Register บางตัวด้วย ไม่รู้ทำไม เป็นเพราะไฟไม่พอรึเปล่า?
Deep Daisy-Chaining: ขยายขอบเขตด้วย Shift Register
Arduino Uno มี Digital pin อยู่ 14 ขา ถ้าน้องอยากจุดไฟ LED แยกกัน 32 ดวง (แบบทำ LED Cube ขนาดยักษ์ หรือแดชบอร์ดเครื่องบิน) มันทำไม่ได้ทางกายภาพอยู่แล้ว โปรเจคนี้จะแนะนำคอนเซปต์พื้นฐานของวิทยาการคอมฯ เรื่อง Serial-To-Parallel conversion โดยการต่อแบบ Cascade เพื่อขยายขีดจำกัดของ Output อย่างมหาศาล โดยใช้แค่ 3 ขาจาก Uno เท่านั้น!

The Synchronous Cascade Protocol
ชิป 74HC595 มีขา Output 8 ขา (Q0-Q7) แต่ใช้ขา Input แค่ 3 ขา (Data, Clock, Latch)
- ฟิสิกส์ของการ Daisy-Chain: น้องจะต้องต่อสายจากขา
Q7'(Serial Out) ของชิป #1 เข้าไปที่ขาData Pinของชิป #2 โดยตรงเลย! - น้องต้องเชื่อมขา
Clockทั้ง 4 เส้นเข้าด้วยกัน และขาLatchทั้ง 4 เส้นเข้าด้วยกัน ตอนนี้เราก็ได้ฮาร์ดแวร์บล็อก 32-bit ที่รวมเป็นหนึ่งเดียวแล้ว! - การทำงานของ Data Pipeline: ถ้าจะเปิด LED ตัวที่ 32, Uno ต้องปั๊มค่า
1ลงไปในสายข้อมูล มันจะเข้าไปในชิปที่ 1 จากนั้นเราก็ดัน0อีก 31 ตัวเข้าไป ค่า1นั้นจะถูกผลักทางคณิตศาสตร์ให้ไหลไปจนสุดท่ออิเล็กทรอนิกส์ เข้าไปอยู่ในชิปที่ 4 ตำแหน่งที่ 8 พอดี!

การใช้ shiftOut() กับ Bit-Masking ใน Register
จะส่งเลขฐานสิบธรรมดาๆ ไปไม่ได้หรอกน้อง ต้องใช้ shiftOut() เท่านั้น
- ใน
loop()เราใช้เลขจำนวนเต็มขนาด 32 บิตแบบไม่มีเครื่องหมาย (หรือก็คือ 4 ไบต์ ขนาด 8 บิต)!uint32_t ledMatrix = 0b10000000000000000000000000000001; // เปิด LED ตัวแรกกับตัวสุดท้าย! digitalWrite(latchPin, LOW); // หยุดการส่งออกทางกายภาพก่อน! แช่แข็ง LED ไว้! // ต้องแยกเลข 32 บิตยักษ์นี่ออกเป็น 4 ก้อน ก้อนละ 8 บิต เพื่อส่งลง SPI! shiftOut(dataPin, clockPin, MSBFIRST, (ledMatrix >> 24)); // ส่งให้ Chip ตัวที่ 4! shiftOut(dataPin, clockPin, MSBFIRST, (ledMatrix >> 16)); // ส่งให้ Chip ตัวที่ 3! shiftOut(dataPin, clockPin, MSBFIRST, (ledMatrix >> 8)); // ส่งให้ Chip ตัวที่ 2! shiftOut(dataPin, clockPin, MSBFIRST, ledMatrix); // ส่งให้ Chip ตัวที่ 1! digitalWrite(latchPin, HIGH); // ส่งเสร็จแล้ว! จัดเต็มเปิด LED ทั้ง 32 ตัวพรึบ! - การทำงานมันเร็วมากจนตามองแทบไม่ทันเลยล่ะ ทำให้เราสามารถทำเอฟเฟกต์ไฟวิ่งแบบ Knight-Rider ผ่าน LED ทั้ง 32 ตัวได้ลื่นปรื๊ด!
อุปกรณ์ที่ต้องใช้ (จัดเต็มเวอร์)
- Arduino Uno/Nano (พื้นฐานต้องมี)
- ไอซี Shift Register 74HC595 จำนวน 4 ตัว (แบบ DIP)
- LED สีแดง/เขียว/น้ำเงิน ขนาด 5mm จำนวน 32 ตัว
- ตัวต้านทาน (Resistor) 220 โอห์ม ธรรมดา จำนวน 32 ตัว
- Adaptor 5V 3Amp (ถ้าจะเปิด LED ทั้ง 32 ตัวเต็มสว่างพร้อมกัน อย่าไปพึ่งไฟจากบอร์ด Uno เด็ดขาด ไม่งั้น Regulator ระเบิดแน่!)


