I2C Multiplexing: สถาปัตยกรรมการเชื่อมต่อ LCD 16x2 สองจอ
บทนำ
ในโปรเจกต์นี้ พี่จะมาสอนวิธีเชื่อมต่อ LCD สองตัวให้ทำงานด้วย Arduino ตัวเดียวให้ดู พี่เจอปัญหามาเยอะตอนเริ่มทำ เลยจะมาแชร์วิธีให้น้องทำได้ง่ายๆ ไม่ต้องเจอปัญหาแบบพี่ พี่ค้นหาข้อมูลในเน็ตเยอะมากแต่ก็หาไม่เจออะไรที่ช่วยได้จริงๆ
เกี่ยวกับอุปกรณ์
เมื่อเชื่อม LCD สองตัวกับ Arduino ข้อความที่เลื่อนจบในจอแรกจะถูกส่งต่อไปยังจอที่สองโดยอัตโนมัติ พี่ปวดหัวเรื่องโค้ด Arduino สำหรับงานนี้มาก LCD 16x2 ปกติที่ต่อกับ Arduino Nano ใช้พินไป 12 พิน ดังนั้นถ้าจะต่อสองจอแบบธรรมดาก็ต้องใช้พินถึง 24 พิน โดยใช้ 6 พินต่อจอสำหรับส่งข้อมูล ในเซ็ตอัพของพี่ พี่ต่อแค่ 14 พินจาก LCD ไปยัง Arduino Nano: 12 พินสำหรับส่งข้อมูล และ 2 พินสำหรับฟังก์ชันอื่น
แต่มีวิธีที่ประหยัดพินกว่านั้นเยอะ! ถ้านักวิศวะต้องการแสดงข้อมูลเทเลเมทรีแบบยาวเหยียด (เช่น ติดตามเกมยานอวกาศ หรือแสดงสถิติหลายแถว) LCD 16x2 จอเดียวมันไม่พอแน่นอน ทางออกที่ชัดเจนคือเพิ่มจอแสดงผลอีกจอสิ! แต่ว่า การเชื่อม LCD สองจอ ด้วยโปรโตคอล I2C แบบมาตรฐานจะเจอปัญหาทันที: พวกมันมักจะมีแอดเดรสฮาร์ดแวร์เดียวกันเป๊ะ (ส่วนใหญ่คือ 0x27) พอ Arduino ส่งคำสั่งไปว่า "HELLO" ทั้งสองจอจะแสดง "HELLO" พร้อมกันเลย! วิธีแก้คือต้องไปปรับแต่งฮาร์ดแวร์บนโมดูล I2C backpack นั่นเอง เพื่อให้แต่ละจอมีแอดเดรสเป็นของตัวเองบนบัสข้อมูลเส้นเดียวกัน!
การปรับแอดเดรส I2C ด้วยการบัดกรี (PCF8574)
พิน SDA (ข้อมูล) และ SCL (สัญญาณนาฬิกา) สามารถต่อขนานไปยังหน้าจอทั้งสองได้อย่างปลอดภัย ปัญหาหลักคือรหัส ID ของอุปกรณ์ I2C
- ชิปสีดำ PCF8574T ที่ด้านหลังของโมดูล LCD จะมีแผ่นทองแดงเล็กๆ สามจุดเขียนไว้ว่า
A0,A1, และA2 - โดยปกติมันจะไม่ถูกเชื่อมต่อ (เปิดวงจรอยู่) ทำให้ได้แอดเดรสเริ่มต้นเป็น
0x27 - เพื่อให้หน้าจอที่สองมี ID ที่ไม่ซ้ำกัน ให้ใช้หัวแร้งบัดกรีเชื่อมแผ่นทองแดง
A0บนจอแสดงผลเพียงจอเดียวเท่านั้น - การปรับฮาร์ดแวร์นี้จะเปลี่ยนแอดเดรสของ LCD นั้นเป็น
0x26
นี่คือโครงสร้างโค้ดพื้นฐานสำหรับควบคุมทั้งสองจอแยกกัน:
#include <LiquidCrystal_I2C.h>
// Initialize each LCD with its unique I2C address
LiquidCrystal_I2C lcd1(0x27, 16, 2); // The default, unmodified LCD
LiquidCrystal_I2C lcd2(0x26, 16, 2); // The LCD with the soldered A0 bridge
void setup() {
lcd1.init();
lcd2.init();
lcd1.backlight();
lcd2.backlight();
lcd1.setCursor(0, 0);
lcd1.print("Master Control!");
lcd2.setCursor(0, 0);
lcd2.print("Telemetry Hub!"); // Each screen operates independently!
}
กำจัดฝันร้ายสายริบบอน 16 เส้น
ก่อนที่ I2C backpack จะฮิตกันแบบทุกวันนี้ การต่อจอ LCD เปล่าๆ สองจอเข้าด้วยกันเนี่ย มันคือวงจรเขาวงกตที่ต้องใช้สายตั้ง 12 เสน่ห์ต่อจอ เกือบจะกิน pin ดิจิตอลของ Arduino Uno หมดบอร์ดเลยทีเดียว
- แต่พอลองใช้โปรโตคอล
I2Cดู ปรากฏว่า Arduino ใช้แค่ สองพินเท่านั้น คือ Analog 4 (SDA) กับ Analog 5 (SCL)! - ตามทฤษฎีแล้ว เราสามารถต่อจอ LCD ได้ถึง แปด (8) จอ บนสายสองเส้นนี้เลยนะ เงื่อนไขคือต้องตั้งค่า solder bridge (ใช้การผสมกันของ
A0,A1,A2) ให้แต่ละโมดูลมีที่อยู่ (address) ไม่ซ้ำกัน
อุปกรณ์ที่ต้องใช้
- Arduino Uno/Nano (ทำหน้าที่เป็นสมองหลัก คอยประมวลผลและจัดการสตริง)
- จอ LCD 16x2 พร้อม โมดูล I2C PCF8574 Backpack จำนวน 2 จอ
- หัวแร้งและตะกั่วบัดกรีปลายแหลม (จำเป็นมากสำหรับการบัดกรี jumper ที่ address pads)
- สเก็ตช์ I2C Scanner (เครื่องมือแก้ปัญหาสำคัญ ที่ใช้สแกนบัสเพื่อตรวจสอบว่าเราเปลี่ยน address เป็น
0x27กับ0x26สำเร็จแล้วจริงๆ)
วิดีโอสาธิต
{% embed url="https://www.youtube.com/embed/YRgJcx0-wZY" %} วิดีโอสาธิตการทำงานของโปรเจค {% endembed %}
ถ้าชอบก็กดไลค์ แชร์ คอมเมนต์ และติดตามกันด้วยนะวัยรุ่น
รูปภาพโปรเจค

ภาพโปรเจค

แผนภาพวงจร