เครื่องแปลงเลขฐานสองเป็นฐานสิบด้วย Arduino และจอ OLED
ในโลกของวิศวกรรมคอมพิวเตอร์และอิเล็กทรอนิกส์ดิจิทัล "เลขฐานสอง (Binary)" ก็เหมือนภาษาพื้นเมืองที่เครื่องจักรใช้สื่อสารกัน แต่สำหรับมนุษย์อย่างเราๆ การเข้าใจและคำนวณเลขฐานสองหลายหลักเนี่ย บางทีก็ชวนปวดหัวเหมือนกัน โปรเจคนี้เลยออกแบบมาเพื่อเชื่อมโลกดิจิทัลกับมนุษย์ ด้วยการสร้างเครื่องแปลงเลขฐานสอง 8 บิต (00000000 - 11111111) เป็นเลขฐานสิบ (0 - 255) ที่เราใช้กันจนคุ้นชิน โดยใช้บอร์ด Arduino เป็นสมองหลัก
โปรเจคนี้จะแสดงวิธีแปลงเลขฐานสอง (สูงสุด 8 บิต) ให้เป็นเลขฐานสิบ เราใส่เลขฐานสองเข้าไปใน Arduino ผ่านสวิตช์ DIP 8 ตัว จากนั้น Arduino ก็จะแปลงเลขฐานสองนั้นเป็นเลขฐานสิบ แล้วแสดงผลออกมาทั้งบนจอ OLED และ Serial Monitor
รายละเอียดทางวิศวกรรมและชิ้นส่วนหลัก
ในการออกแบบระบบนี้ เราเน้นที่ความแม่นยำในการรับข้อมูลเข้าและการแสดงผลแบบเรียลไทม์ ชิ้นส่วนสำคัญมีดังนี้
1. ส่วนรับข้อมูล: สวิตช์ DIP 8 ตัว
สวิตช์ DIP ทำหน้าที่เป็นอินพุตดิจิทัล 8 ช่อง มันจำลองการทำงานของ "รีจิสเตอร์ (Register)" ขนาด 1 ไบต์ในหน่วยความจำคอมพิวเตอร์ แต่ละสวิตช์แทน 1 บิต ไล่ตั้งแต่บิตที่มีค่าน้อยที่สุด (LSB - $2^0$) ไปจนถึงบิตที่มีค่ามากที่สุด (MSB - $2^7$)
- โน๊ตวิศวะ: ในวงจรอิเล็กทรอนิกส์ การต่อสวิตช์จำเป็นต้องมีตัวต้านทานแบบ Pull-up หรือ Pull-down เพื่อป้องกันสภาวะลอย (Floating) หรือแรงดันไม่เสถียร ในโปรเจคนี้ เราสามารถใช้ฟังก์ชัน
INPUT_PULLUPที่มีอยู่ภายใน Arduino เองได้เลย ทำให้วงจรง่ายขึ้นเยอะ
2. ส่วนประมวลผล: ไมโครคอนโทรลเลอร์ Arduino
บอร์ด Arduino ทำหน้าที่เป็นสมองของระบบ มันจะสแกนสถานะลอจิกของพินดิจิทัล I/O ทั้ง 8 ขาที่ต่อกับสวิตช์ DIP จากนั้นก็นำค่าที่อ่านได้ (0 หรือ 1) มาคำนวณตามหลักคณิตศาสตร์ของเลขฐานสอง
3. ส่วนแสดงผล: จอ OLED (SSD1306)
เราเลือกใช้จอ OLED ขนาดเล็กที่สื่อสารผ่านโปรโตคอล I2C (Inter-Integrated Circuit) ซึ่งใช้สายสัญญาณแค่ 2 เส้น (SDA และ SCL) เท่านั้น ช่วยเซฟพินของ Arduino และข้อความที่แสดงก็ชัดกว่า LCD ทั่วไปอีกด้วย
ตรรกะซอฟต์แวร์ (Logic ของโค้ด)
หัวใจของโปรเจคนี้คืออัลกอริทึมสำหรับแปลงเลขฐานสองเป็นค่าฐานสิบ ซึ่งทำงานตามขั้นตอนนี้:
- การสแกนบิต: โปรแกรมเริ่มต้นด้วยการอ่านค่าจากพินดิจิทัลทั้ง 8 ที่ต่อกับสวิตช์ DIP โดยใช้คำสั่ง
digitalRead()ภายในลูปหรือการอ่านจากอาร์เรย์ - การคำนวณฐานสองเป็นฐานสิบ: เมื่อได้สถานะของแต่ละบิตแล้ว โปรแกรมจะใช้หลักการ "น้ำหนักตามตำแหน่ง (Positional Weighting)" ดังนี้:
$$Decimal = \sum_{i=0}^{7} (Bit_i \times 2^i)$$
ตัวอย่างเช่น ถ้าตั้งสวิตช์ DIP เป็น
10000001โปรแกรมจะคำนวณ: $(1 \times 2^7) + (0 \times 2^6) + ... + (0 \times 2^1) + (1 \times 2^0) = 128 + 1 = 129$ - อัพเดทแบบเรียลไทม์: เพื่อให้การทำงานลื่นไหล โปรแกรมจะวนลูปอย่างต่อเนื่องเพื่อสแกนค่าและอัพเดทหน้าจอ OLED พร้อมทั้งส่งข้อมูลไปยัง Serial Monitor ด้วย ทำให้ผู้ใช้เห็นการเปลี่ยนแปลงของค่าฐานสิบทันทีที่สลับสวิตช์
ประโยชน์และการประยุกต์ใช้ต่อยอด
โปรเจคนี้ไม่ได้เป็นแค่เครื่องมือสอนวิชา Digital Logic เท่านั้นนะน้อง แต่ยังเป็นฐานรากสำคัญสำหรับการสร้างอินพุตอินเตอร์เฟสแบบกำหนดเอง (custom configuration Input Interfaces) ในงานด้านวิศวกรรมควบคุมอีกด้วย เช่น ใช้ตั้งค่าที่อยู่ (address) ของเซ็นเซอร์ในระบบ RS-485 หรือตั้งค่ารหัสผ่านเริ่มต้นในระบบ Embedded Systems อื่นๆ การเข้าใจการเชื่อมโยงระหว่างสวิตช์จริงๆ (Physical Switch) กับตรรกะ (Logic) ภายในโปรเซสเซอร์ จะช่วยให้น้องๆ วิศวกรรุ่นเยาว์เข้าใจกลไก Low-level ของการทำงานคอมพิวเตอร์ได้ลึกซึ้งขึ้นอีกโขเลย จัดไปวัยรุ่น!