บทคัดย่อ
บทสอนนี้ถูกออกแบบมาเป็นพิเศษสำหรับ “บอร์ดลอจิกดิจิทัล” ซึ่งจัดอยู่ในระดับความยากปานกลาง ใช้เป็นอุปกรณ์ฝึกหัดสำหรับมือใหม่ที่พึ่งก้าวเข้าสู่วงการอิเล็กทรอนิกส์ รวมถึงเรียนรู้คอนเซปต์วงจรสำคัญในโลกของลอจิกดิจิทัล
แทนที่จะใช้วงจร TTL “ทรานซิสเตอร์-ทรานซิสเตอร์ ลอจิก” แบบเก่า เราจะใช้ไมโครคอนโทรลเลอร์จาก Microchip ที่สามารถโปรแกรมได้ผ่านบอร์ดต้นแบบ Arduino และ Arduino IDE
หัวใจหลักของโปรเจกต์นี้คือการเรียนรู้เรื่องลอจิก, ไทม์มิ่งของโปรโตคอล, การส่งผ่านข้อมูล ซึ่งทั้งหมดล้วนเกี่ยวข้องกับสัญญาณดิจิทัลแบบบูลีน
ในหน้าถัดไป เราจะอธิบายคอนเซปต์เกี่ยวกับโปรเจกต์นี้แบบจัดเต็ม:
- บอร์ด Arduino ฝั่ง Slave (ซ้าย) จะทำหน้าที่จ่ายไฟให้ LED โดยใช้เฟรมข้อมูลขนาด 4 ไบต์ที่ส่งมาจาก Master Arduino และควบคุมไอซี 74HC595 โดยตรง
- สายสัญญาณ 2 เส้นคือ SDA และ SCL จะซิงโครไนซ์สตรีมของไบต์ระหว่าง Arduino สองตัวผ่านโปรโตคอล I2C
- บอร์ด Arduino หลักฝั่ง Master (ขวา) จะอ่านสถานะของสวิตช์และตัดสินใจส่งบิตข้อมูลเดี่ยวผ่านบัส I2C พร้อมกับข้อความข้อมูลแบบเฟรม 4 ไบต์
วิดีโอ
รากฐานแห่งซิลิคอน: บอร์ดลอจิกดิจิทัลแบบอินเทอร์แอคทีฟ
ก่อนจะมาเป็น C++; ก่อนจะมีตัวแปร, อาร์เรย์, และลูปซับซ้อน; ทุกสิ่งในการคำนวณล้วนพึ่งพาฟิสิกส์พื้นฐานของทรานซิสเตอร์ที่เราเรียกว่า เกตลอจิก (AND, OR, NOT, XOR) โปรเจกต์ บอร์ดลอจิกดิจิทัล นี้คือแท่นทดสอบเพื่อการศึกษาที่สุดยอดมาก! แทนที่จะนั่งเขียนโค้ด คุณจะได้เสียบ ไอซีตระกูล 7400 TTL (`ทรานซิสเตอร์-ทรานซิสเตอร์ ลอจิก`) ตัวเบิ้มลงบนแท่นทดสอบ ใช้สวิตช์กดแบบจับต้องได้เป็น `อินพุต` และใช้ LED ขนาดใหญ่เป็น `เอาต์พุต` เพื่อ "สัมผัส" พีชคณิตบูลีนที่เกิดขึ้นด้วยความเร็วแสงแบบเห็นๆ!
ทดสอบตารางความจริงด้วยมือตัวเอง
เกต `AND` (เช่น ไอซี 74HC08) ต้องการอินพุตสองตัวเป็น `HIGH (5V)` พร้อมกันเท่านั้น ถึงจะทำให้เอาต์พุตทำงาน
- บอร์ดลอจิกของเรามีปุ่มกดใหญ่ๆ 2 ปุ่ม (A และ B)
- ปุ่มทั้งสองมีตัวต้านทาน Pull-Down 10K-โอห์ม คอยดึงสัญญาณให้เป็น `LOW (0V)` เสถียรเมื่อไม่กด
- พินเอาต์พุตของชิปจะขับ LED สีแดงที่มีตัวต้านทาน 330 โอห์มป้องกันอยู่
- ขั้นตอนการทดลอง: กดปุ่ม A (ไม่มีอะไรเกิดขึ้น) กดปุ่ม B (ก็ยังไม่มีอะไร) จากนั้นกดปุ่ม A และ B พร้อมกันแบบจัดเต็ม... สถาปัตยกรรมทรานซิสเตอร์ภายในจะประมวลผลเมทริกซ์ `A & B` และ LED สีแดงก็จะสว่างวาบ!
ส่วนติดต่อผู้ใช้ด้านหน้า
ไล่จากบนลงล่าง
- เกตลอจิก 7 ชนิด
- สวิตช์เปิด-ปิดไฟ DC
- มัลติเพล็กเซอร์ 8 บิต
- ดีโคเดอร์ 8 บิต
- เอ็นโคเดอร์ 8 บิต
- ฟลิปฟลอปแบบ J-K
- ชิฟต์เรจิสเตอร์แบบ SIPO
- แอดเดอร์เต็มรูปแบบ 4 บิต
- ชื่อนักเรียน
การสร้างแท่นทดสอบ
โปรเจกต์นี้ไม่มี Arduino Programming นะจ๊ะน้อง มันเกี่ยวกับการเดินลายทองแดงดิบๆ เพื่อสร้างสภาพแวดล้อมที่สะอาดสำหรับทดสอบชิปอันบอบบางแบบไดนามิกต่างหาก
- เรลไฟ้ 5V ที่เสถียร: เราใช้เรกูเลเตอร์แรงดัน LM7805 เพื่อรับประกันว่าเกตลอจิกจะได้รับไฟ 5.0V ที่บริสุทธิ์ เพราะถ้าเอาไฟ 9V เข้าไปตรงๆ ในไอซีตระกูล 7400 ซิลิคอนไดส์ข้างในอาจแตกเป็นเสี่ยงๆ ได้เลย ห้ามช็อตนะตัวนี้!
- ซ็อกเก็ตแบบ ZIF (แรงเสียบศูนย์): วิธีที่ดีที่สุดคือใช้ซ็อกเก็ต ZIF สีเขียวตัวเบิ้ม ผู้ใช้แค่หย่อนเกตลอจิกปริศนาลงไป, ล็อคคันโยก, แล้วก็แมปการทำงานของลอจิกด้วยมือเปล่าเพื่อหาว่าชิปนั้นเป็นเกต `NAND` หรือ `XOR` โดยที่ขาชิปไม่บิดงอ!
แพลตฟอร์มออกแบบกราฟิก
Canva เป็นเว็บไซต์เครื่องมือออกแบบกราฟิก ก่อตั้งในปี 2012 ใช้งานแบบลากแล้วปล่อย (drag-and-drop) และมีรูปภาพ กราฟิก และฟอนต์ให้เลือกใช้เป็นล้านๆ ตัว ทั้งมือใหม่และมือโปรก็ใช้ได้หมด ออกแบบได้ทั้งงานเว็บและงานพิมพ์
สเปคบอร์ดแบบเร็วๆ
มาเล่นกับบอร์ดกัน
- อย่างแรกเลย ต้องเปิดไฟให้บอร์ดด้วยสวิตช์ Rocker ก่อน
- ถ้าอยากเปลี่ยนค่าอินพุตลอจิก ก็ขยับสวิตช์ Toggle โลด
- ถ้าลอจิกเป็นจริง (true) ไฟ LED สีแดงจะติดสว่างจ้า
- ตรงนี้แหละที่น้องต้องไปนั่งทบทวน Truth Table ของแต่ละวงจรให้แม่น
- ลอจิกเกตที่ต้องเจอมี (AND, NAND, OR, NOR, XOR, XNOR, NOT)
- Multiplexer
- Decoder, Encoder
- J-K Flip Flop
- Shift Register
- 4-Bit Full Adder
ฮาร์ดแวร์พื้นฐานสำหรับทดสอบ
- เบรดบอร์ดยักษ์ หรือ PCB แบบสั่งทำเอง จัดไปวัยรุ่น
- ชุด IC ลอจิกตระกูล 7400 ให้ครบ (`74HC00 NAND`, `74HC02 NOR`, `74HC04 NOT`, `74HC08 AND`, `74HC32 OR`, `74HC86 XOR`)
- สวิตช์กด Tactile / สวิตช์โยก SPDT สำหรับตั้งอินพุต 0/1 แบบตายตัว
- LED กับตัวต้านทานจำกัดกระแส (Current Limiting Resistors)
- แหล่งจ่ายไฟ 5V ควบคุมแรงดันได้ (Regulated) (เช่น MB102 Breadboard Power Supply Module)
เรกูเลเตอร์ L7805
เจ้านี่อาจกินแรงดันขับ (drop voltage) ไป 1.5 โวลต์ ดังนั้นต้องป้อนไฟให้มันอย่างน้อย 8 โวลต์ขึ้นไป ถ้าจะใช้ไฟเยอะๆ
ระวังตอนต่อกับ PC ขณะที่ไฟ 9 โวลต์ยังติดอยู่!
อาจทำลายแบตเตอรี่ข้างในได้! ห้ามช็อตนะตัวนี้
ตัวต้านทาน Pull-up
วิธีต่อบนเบรดบอร์ด
74HC595 Serial in Parallel Out Shift Register
74HC595 SIPO Shift Register ต่อกับ Arduino
74HC595 SIPO Shift register ต่อกับ Arduino
1. ต่อสายตามนี้เลย:
GND (ขา 8) ต่อกับกราวด์
Vcc (ขา 16) ต่อกับ 5V
OE (ขา 13) ต่อกับกราวด์
MR (ขา 10) ต่อกับ 5V
การตั้งค่านี้ทำให้พินเอาต์พุตทั้งหมดทำงานและสามารถสั่งการได้ตลอดเวลา ข้อเสียอย่างเดียวคือ พอเปิดไฟครั้งแรก ก่อนโปรแกรมจะรัน ไฟอาจติดในสถานะสุดท้ายหรืออะไรแปลกๆ ไปซะก่อน จะแก้ก็ได้โดยควบคุมขา MR กับ OE จาก Arduino อีกที แต่ต่อแบบนี้ก็ใช้ได้และเหลือพินว่างไว้ใช้มากขึ้น สู้งานนะน้อง
2. ต่อกับ Arduino กันเถอะ
ขา DS (ขา 14) ต่อกับ Arduino DigitalPin 11 (สายสีน้ำเงิน) จัดไปวัยรุ่น
ขา SH_CP (ขา 11) ต่อกับ Arduino DigitalPin 12 (สายสีเหลือง)
ขา ST_CP (ขา 12) ต่อกับ Arduino DigitalPin 8 (สายสีเขียว)
จากนี้ไปเราจะเรียกเจ้าพวกนี้ว่า dataPin, clockPin, และ latchPin ตามลำดับนะจ๊ะ
สังเกตตัวเก็บประจุ (capacitor) 0.1"f ที่ขา latchPin นะ ถ้าไฟกระพริบแปลกๆ เวลา latch pin ทำงาน ลองใส่ตัวเก็บประจุช่วยปรับสัญญาณให้เรียบขึ้นได้ สู้งานนะน้อง
3. มาต่อ LED 8 ดวงเพิ่มความสดใส
ในเคสนี้ ให้ต่อขาแคโทด (ขาสั้น) ของ LED แต่ละดวงลงกราวด์ร่วมกัน ส่วนขาแอโนด (ขายาว) ให้ต่อกับขาเอาต์พุตของ shift register แต่ละขา การใช้ shift register จ่ายไฟแบบนี้เรียกว่า sourcing current บางตัวมันจ่ายไฟแบบนี้ไม่ได้นะ มันทำได้แค่ sinking current (คือดึงไฟลงกราวด์) ถ้าน้องเจอตัวแบบนั้น แสดงว่าต้องต่อ LED กลับด้าน คือเอาขาแอโนดต่อไฟตรงๆ แล้วเอาขาแคโทด (ขากราวด์) ไปต่อกับขาเอาต์พุตของ shift register แทน ตรวจสอบ datasheet ของชิปตัวเองให้ดีถ้าไม่ได้ใช้ชิปตระกูล 595 นะ ห้ามช็อตนะตัวนี้ อย่าลืมใส่ตัวต้านทาน (Resistor) 470 โอห์มต่ออนุกรมกัน LED ไหม้ด้วยล่ะ
ดีไซน์การต่อ 74HC595 ของเรา
Pinout สำหรับ Arduino Mega 2560
I²C บน Arduino Mega 2560
สาย Serial Data Line (SDA) และ Serial Clock Line (SCL) บนบอร์ด Arduino แบบ Atmel Mega
- SDA (ขา 20)
- SCL (ขา 21)
***ด้านหลังฉาก (Back End)***
ผลงานสุดท้าย งานเข้าตามสไตล์ช่าง