โปรเจกต์อิเล็กทรอนิกส์เกือบทุกโปรเจกต์ในที่สุดจะต้องเชื่อมต่อสองสิ่งเข้าด้วยกัน — ตัวควบคุมกับเซนเซอร์ ตัวควบคุมกับจอแสดงผล หรือสองบอร์ดที่สื่อสารกัน มาตรฐานการสื่อสารสามแบบครอบคลุมการเชื่อมต่อส่วนใหญ่เหล่านี้: I2C, SPI และ UART แต่ละแบบแก้ปัญหาด้วยวิธีที่แตกต่างกัน และการเลือกแบบที่ถูกต้อง (หรือการรู้ว่าโมดูลหนึ่ง ๆ คาดหวังแบบไหนอยู่แล้ว) จะทำให้การต่อสายและการดีบักง่ายขึ้นอย่างมาก
ทำไมโปรโตคอลการสื่อสารจึงสำคัญ
สายไฟสามารถนำพาสัญญาณที่เปลี่ยนแปลงตามเวลาได้เท่านั้น — เปิด ปิด เปิด ปิด โปรโตคอลการสื่อสารคือชุดกฎที่ตกลงร่วมกันซึ่งอุปกรณ์ทั้งสองฝั่งใช้ในการแปลงกระแสสัญญาณเปิด/ปิดนั้นให้เป็นข้อมูลที่มีความหมาย: สายไหนหมายถึงอะไร สัญญาณเปลี่ยนแปลงเร็วแค่ไหน และแต่ละฝั่งรู้ได้อย่างไรว่าข้อความเริ่มต้นและสิ้นสุดเมื่อไร หากไม่มีโปรโตคอลที่ตกลงกัน อุปกรณ์สองตัวที่ต่อสายเข้าด้วยกันก็เป็นเพียงการเชื่อมต่อทางไฟฟ้าเท่านั้น — ยังไม่ได้สื่อสารกันจริง ๆ
I2C: บัสร่วม สายไฟเรียบง่าย
I2C (Inter-Integrated Circuit) ใช้สายสัญญาณเพียงสองเส้น — SDA (ข้อมูล) และ SCL (สัญญาณนาฬิกา) — บวกกับไฟเลี้ยงและกราวด์ และอุปกรณ์หลายตัวสามารถใช้สายทั้งสองเส้นนี้ร่วมกันได้พร้อมกัน อุปกรณ์แต่ละตัวบนบัสมีแอดเดรสของตัวเอง ดังนั้นตัวควบคุมจึงสามารถสื่อสารกับเซนเซอร์หรือโมดูลหลายตัวโดยใช้ขาเพียงสองขาเท่านั้น ไม่ว่าจะมีอุปกรณ์เชื่อมต่ออยู่กี่ตัวก็ตาม
สิ่งนี้ทำให้ I2C สะดวกเป็นพิเศษสำหรับโปรเจกต์ที่มีเซนเซอร์ความเร็วต่ำหลายตัว: เซนเซอร์วัดสภาพแวดล้อม นาฬิกาเรียลไทม์ และจอแสดงผลขนาดเล็ก ทั้งหมดสามารถใช้สายสองเส้นเดียวกันได้ ตราบใดที่ไม่มีตัวใดมีแอดเดรสขัดแย้งกัน (ปัญหาเชิงปฏิบัติที่พบได้บ่อยและควรตรวจสอบก่อนต่อสายใด ๆ) ข้อแลกเปลี่ยนคือความเร็ว — I2C โดยทั่วไปช้ากว่า SPI — และความยาวบัส I2C เหมาะกับการเชื่อมต่อระยะสั้นบนบอร์ดหรือสายสั้น มากกว่าการเดินสายระยะไกล
SPI: รวดเร็ว แบบจุดต่อจุด
SPI (Serial Peripheral Interface) โดยทั่วไปใช้สายสี่เส้น: MOSI (ตัวควบคุมส่งออก อุปกรณ์รับเข้า), MISO (ตัวควบคุมรับเข้า อุปกรณ์ส่งออก), SCLK (สัญญาณนาฬิกา) และสาย chip-select (CS) แยกต่างหากสำหรับอุปกรณ์แต่ละตัวที่เชื่อมต่อ ต่างจากบัสแบบใช้แอดเดรสร่วมกันของ I2C, SPI จะระบุว่ากำลังสื่อสารกับอุปกรณ์ตัวไหนโดยดูจากสาย chip-select เส้นไหนที่กำลังทำงานอยู่ — หมายความว่าอุปกรณ์แต่ละตัวที่เพิ่มเข้ามาโดยทั่วไปต้องการขา chip-select ของตัวเอง แม้ว่าสายอีกสามเส้นมักจะใช้ร่วมกันได้
แลกกับการใช้ขามากขึ้น SPI มีความเร็วสูงกว่า I2C อย่างมีนัยสำคัญ และเป็นตัวเลือกมาตรฐานสำหรับอุปกรณ์ต่อพ่วงความเร็วสูง — จอแสดงผลที่ต้องรีเฟรชเร็ว การ์ด SD และโมดูลอื่น ๆ ที่ปริมาณข้อมูลมีความสำคัญจริง ๆ หากดาต้าชีตของโมดูลระบุถึงอัตราการรีเฟรชสูงหรือการส่งข้อมูลขนาดใหญ่โดยเฉพาะ มีความเป็นไปได้สูงว่าโมดูลนั้นสร้างขึ้นบนพื้นฐานของ SPI แทนที่จะเป็น I2C
UART: ซีเรียลแบบง่าย ไม่มีบัส
UART (Universal Asynchronous Receiver-Transmitter) เป็นแบบที่ง่ายที่สุดในสามแบบในเชิงแนวคิด: สายหนึ่งเส้นสำหรับส่ง (TX) และหนึ่งเส้นสำหรับรับ (RX) เชื่อมต่อโดยตรงระหว่างอุปกรณ์สองตัวเท่านั้น ไม่มีบัสร่วมและไม่มีระบบแอดเดรสใด ๆ ทั้งสองฝั่งเพียงแค่ต้องตกลงอัตรา baud (ความเร็วในการเปลี่ยนแปลงของสัญญาณ) ล่วงหน้า
เนื่องจาก UART เป็นแบบจุดต่อจุดอย่างเคร่งครัด จึงเหมาะสำหรับการเชื่อมต่ออุปกรณ์สองตัวโดยตรง — ตัวควบคุมกับโมดูล GPS ตัวควบคุมกับโมดูล Bluetooth หรือเซลลูลาร์ หรือสองบอร์ดที่ส่งข้อความง่าย ๆ ถึงกัน มันไม่สามารถขยายไปยังหลายอุปกรณ์ได้เหมือน I2C หากไม่มีฮาร์ดแวร์เพิ่มเติม แต่ความเรียบง่ายของมันทำให้ดีบักง่าย — logic analyzer หรือแม้แต่ serial monitor พื้นฐาน มักแสดงให้เห็นได้ชัดเจนว่ากำลังส่งอะไรอยู่
เปรียบเทียบความเร็วและความซับซ้อน
เป็นแนวทางคร่าว ๆ: UART เข้าใจและดีบักง่ายที่สุด แต่เชื่อมต่อได้เพียงสองอุปกรณ์ในแต่ละครั้ง I2C แลกความเร็วบางส่วนเพื่อความสะดวกในการให้หลายอุปกรณ์ใช้สายเพียงสองเส้นร่วมกัน SPI แลกการเดินสายที่มากขึ้น (chip-select เฉพาะต่ออุปกรณ์) เพื่อความเร็วที่สูงขึ้นอย่างมีนัยสำคัญ ไม่มีแบบไหนที่ "ดีกว่า" แบบสากล — ตัวเลือกที่ถูกต้องขึ้นอยู่กับจำนวนอุปกรณ์ที่คุณกำลังเชื่อมต่อ ปริมาณข้อมูลที่ต้องเคลื่อนย้าย และจำนวนขาที่คุณมีเหลือ
ข้อผิดพลาดในการต่อสายที่พบบ่อย
ข้อผิดพลาดเพียงไม่กี่อย่างเป็นสาเหตุของช่วงเวลา "มันไม่ทำงาน" ส่วนใหญ่กับโปรโตคอลเหล่านี้ การสลับสาย TX/RX บน UART — ต่อ TX เข้ากับ TX แทนที่จะเป็น TX กับ RX — เป็นข้อผิดพลาดที่พบบ่อยที่สุดอย่างหนึ่ง สายทั้งสองเส้นต้องสลับกัน ไม่ใช่ขนานกัน บน I2C อุปกรณ์สองตัวที่ใช้แอดเดรสเริ่มต้นเดียวกันบนบัสเดียวกันจะขัดแย้งกัน จึงควรตรวจสอบดาต้าชีตหรือเอกสารของโมดูลสำหรับแอดเดรส (และจัมเปอร์สำหรับเลือกแอดเดรสใด ๆ) ก่อนที่จะสันนิษฐานว่ามันจะอยู่ร่วมกับอุปกรณ์อื่นได้ บน SPI การลืมว่าอุปกรณ์แต่ละตัวโดยทั่วไปต้องการสาย chip-select ของตัวเอง — และต่อขา CS ของหลายอุปกรณ์เข้าด้วยกันโดยผิดพลาด — เป็นสาเหตุที่พบบ่อยของความล้มเหลวที่ดูเหมือนเกิดขึ้นเป็นระยะและสร้างความสับสน ความไม่ตรงกันของแรงดันไฟเป็นปัจจัยที่พบในทั้งสามแบบ: การผสมอุปกรณ์ลอจิก 3.3V และ 5V บนบัสเดียวกันโดยไม่มีการปรับระดับสัญญาณ (level shifting) เป็นสาเหตุทั่วไปของการเชื่อมต่อที่ไม่เสถียรหรือเสียหาย
การเลือกอินเทอร์เฟซที่เหมาะสมสำหรับโปรเจกต์ของคุณ
ในทางปฏิบัติ คุณมักจะไม่ได้เลือกโปรโตคอลตั้งแต่ต้น — เซนเซอร์หรือโมดูลจอแสดงผลหนึ่ง ๆ มักถูกสร้างขึ้นบนพื้นฐานของอินเทอร์เฟซเฉพาะหนึ่งแบบอยู่แล้ว และการตัดสินใจนั้นถูกกำหนดไว้ให้คุณโดยตัวโมดูลเอง สิ่งที่ความรู้นี้ช่วยได้จริง ๆ คือการอ่านสเปกของโมดูลก่อนซื้อ: การรู้ว่า "I2C" "SPI" หรือ "UART" ในรายการสินค้าหมายความว่ามันจะใช้ขาร่วมกับส่วนที่เหลือของโปรเจกต์ได้ง่าย ต้องการการเดินสายเฉพาะ หรือต้องตรวจสอบแอดเดรสที่ขัดแย้งกัน สำหรับรายละเอียดเพิ่มเติมว่าควรตรวจสอบอะไรอีกบนรายการสินค้าก่อนซื้อเซนเซอร์โมดูล ดูคู่มือของเราเกี่ยวกับการอ่านรายการสินค้าเซนเซอร์โมดูล เมื่อคุณทราบแล้วว่าส่วนประกอบของโปรเจกต์ต้องการอินเทอร์เฟซแบบไหน การเลือกดูเซนเซอร์หรือจอแสดงผลตามหมวดหมู่จะทำให้การยืนยันความเข้ากันได้ก่อนซื้อง่ายขึ้น