บทความ ESPino32 ตอนที่ 8 การสื่อสารอนุกรมแบบ I2C

สารบัญ บทความ ESPino32

บทความ ESPino32 ตอนที่ 8 การสื่อสารอนุกรมแบบ I2C

        บทความ ESPino32 ตอนที่ 8 การสื่อสารอนุกรมแบบ I2C เป็นการใช้งานบอร์ดไมโครคอนโทรเลอร์เพื่อรับส่งข้อมูลระหว่างบอร์ดไมโครคอนโทรเลอร์กับอุปกรณ์ภายนอกอื่นๆที่เกี่ยวข้อง ดังรูป การสื่อสารระหว่างบอร์ด ESPino32 กับอุปกรณ์ที่ใช้สื่อสารแบบ I2C โดยการสื่อสารแบบ I2C จะเป็นส่วนหนึ่งของการรับส่งข้อมูลแบบอนุกรมในแบบซิงโครนัส ตัวอย่างที่ใช้งานการสื่อสารอนุกรมแบบ I2C เช่น การสื่อสารระหว่างบอร์ด ESPino32 กับจอภาพแสดงผล การสื่อสารระหว่างบอร์ด ESPino32 กับอุปกรณ์ขยายจำนวนพอร์ท GPIO การสื่อสารระหว่างบอร์ด ESPino32 กับอุปกรณ์อ่านค่า ADC/DAC เป็นต้น

การสื่อสารระหว่างบอร์ด ESPino32 กับอุปกรณ์ที่ใช้สื่อสารแบบ I2C

        I2C ย่อมาจาก Inter-Integrated Circuit คือรูปแบบการสื่อสารข้อมูลอย่างหนึ่งที่สร้างขึ้นมาเพื่อสื่อสารข้อมูลความเร็วต่ำ นิยมใช้กับอุปกรณ์จำพวกไมโครโปรเซสเซอร์ ไมโครคอนโทรเลอร์และอุปกรณ์ต่างๆที่เกี่ยวข้อง I2C ถูกคิดค้นขึ้นมาในปี ค.ศ. 1982 โดย Philip semiconductor (ปัจจุบันเปลี่ยนชื่อเป็น NXP semiconductor)  ข้อดีของการสื่อสารอนุกรมแบบ I2C คือ สามารถรับ-ส่งข้อมูลได้หลายอุปกรณ์ในบัสเดียวกัน ดังรูป การเชื่อมต่อระบบด้วยการสื่อสารอนุกรมแบบ I2C และใช้สายสัญญาณเพียง 2 เส้นในการรับส่ง-ข้อมูล ทำให้สามารถลดสายสัญญาณที่ใช้ในการเชื่อมต่ออุปกรณ์ลงมาก โดยสายสัญญาณทั้ง 2 เส้นแบ่งเป็น

– SDA (Serial Data) คือ สายสัญญาณสำหรับรับ-ส่งข้อมูล

– SCL (Serial Clock) คือ สายสัญญาณนาฬิกา ใช้เป็นสำหรับควบคุมการรับ-ส่งข้อมูล

การเชื่อมต่อระบบด้วยการสื่อสารอนุกรมแบบ I2C

        จากรูป การเชื่อมต่อระบบด้วยการสื่อสารอนุกรมแบบ I2C ประกอบไปด้วย 2 ส่วนคือ 1. อุปกรณ์หลัก (Master Device) และ 2.อุปกรณ์ย่อย (Slave Device) ในระบบการสื่อสารแบบอนุกรม I2C สามารถต่ออุปกรณ์ I2C Device ได้หลายอุปกรณ์ เวลาสื่อสารกันในระบบ Master Device จะอ้างอิง Address ของ Slave Device เพื่อระบุว่าต้องการสื่อสารกับ Slave Device ตัวไหน และจะเห็นได้ว่าสายสัญญาณทั้ง 2 เส้นต้องต่อตัวต้านทานแบบ Pull-up สาเหตุมาจากบอร์ด ESPino32 ไม่สามารถรับอินพุตแบบ Open Drain หรือ Open Collector ของอุปกรณ์ I2C Device ได้โดยตรงจึงต้องมีการต่อตัวต้านทานแบบ Pull-up มาเปลี่ยนสัญญาณทางไฟฟ้าให้กลายเป็นแบบ LVTTL ที่ตัวบอร์ด ESPino32 สามารถรับได้ แต่ส่วนใหญ่อุปกรณ์ I2C Device ต่างๆ ใส่ตัวต้านทานแบบ Pull-up มาจากโรงงานเรียบร้อยแล้ว ดังรูป Pull-up Resistor on I2C

DevicePull-up Resistor on I2C Device


เวอร์ชั่นการพัฒนาของการสื่อสารอนุกรมแบบ I2C

– เวอร์ชันต้นฉบับเริ่มต้นในปี ค.ศ. 1982 เวอร์ชันนี้ถูกสร้างขึ้นเพื่อเป็นระบบบัสภายในที่ใช้งานง่ายสำหรับควบคุมและสื่อสารอุปกรณ์อิเล็กทรอนิกส์ต่างๆ ความเร็วในการสื่อสารของเวอร์ชันนี้อยู่ที่ 100 kHz

– เวอร์ชัน 1 เริ่มต้นในปี ค.ศ. 1992 เวอร์ชันนี้เพิ่ม Fast mode (FM) ที่มีความเร็วในการสื่อสาร 400 kHz และเพิ่มจำนวน Address ที่รองรับเป็น 10 บิต

– เวอร์ชัน 2 เริ่มต้นในปี ค.ศ. 1998 เวอร์ชันนี้เพิ่ม High speed mode (HS) ที่มีความเร็วในการสื่อสาร 3.4 MHz และลดการใช้พลังงานลง

– เวอร์ชัน 2.1 เริ่มต้นในปี ค.ศ. 2000 เวอร์ชันนี้อธิบายเวอร์ชัน 2 โดยไม่มีการเปลี่ยนแปลงหน้าที่สำคัญ

– เวอร์ชัน 3 เริ่มต้นในปี ค.ศ. 2000 เวอร์ชันนี้เพิ่ม Fast mode plus (Fm+) ที่มีความเร็วในการสื่อสาร 1 MHz และเพิ่มการเปลี่ยนแปลง Address ของอุปกรณ์

– เวอร์ชัน 4 เริ่มต้นในปี ค.ศ. 2012 เวอร์ชันนี้เพิ่ม Ultra Fast mode (UFm) ที่มีความเร็วในการสื่อสาร 5 MHz ใช้ลอจิกแบบ push-pull แทน pull-up resistor และเพิ่ม manufacturer ID

– เวอร์ชัน 5 เริ่มต้นในปี ค.ศ. 2012 เวอร์ชันนี้แก้ไขความผิดพลาดของเวอร์ชันก่อนหน้า

– เวอร์ชัน 6 เริ่มต้นในปี ค.ศ. 2014 เวอร์ชันนี้แก้ไขความผิดพลาดของสองเวอร์ชันก่อนหน้า และใช้เวอร์ชันนี้เป็นมาตรฐาน

        สำหรับพอร์ทการสื่อสารอนุกรมแบบ I2C ของบอร์ด ESPino32 ขา Serial Data (SDA) จะอยู่ที่ขา GPIO21 และขา Serial Clock (SCL) จะอยู่ที่ขา GPIO22 สามารถดูตำแหน่งพอร์ทการสื่อสารแบบอนุกรมแบบ I2C ของบอร์ด ESPino32 เพิ่มเติมได้จากแถบสีเขียวแก่ ในรูป ESPino32 Pinout

ESPino32 Pinout

การใช้งานการสื่อสารอนุกรมแบบ I2C

        สำหรับการใช้งานการสื่อสารอนุกรมแบบ I2C จะใช้รูปแบบการสื่อสารที่เป็นมาตรฐานของการสื่อสารอนุกรมแบบ I2C มีขั้นตอนการเขียนข้อมูลด้วยการสื่อสารอนุกรมแบบ I2C และการอ่านข้อมูลด้วยการสื่อสารอนุกรมแบบ I2C ดังนี้

การเขียนข้อมูลด้วยการสื่อสารอนุกรมแบบ I2C มีขั้นตอนดังนี้

1. Master Device ส่งสัญญาณ Start ไปยัง Slave Device

2. Master Device เขียนไบต์ควบคุม (Control Byte) ไปยัง Slave Device (ไบต์ควบคุม คือ Address ของ Slave ขนาด 7 บิต และคำสั่งเขียนข้อมูล (0) จำนวน 1 บิต)

3. Master Device เขียนข้อมูลไปยัง Slave Device

4. Master Device ส่งสัญญาณ Stop ไปยัง Slave Device

การอ่านข้อมูลด้วยการสื่อสารอนุกรมแบบ I2C มีขั้นตอนดังนี้

1. Master Device ส่งสัญญาณ Start ไปยัง Slave Device

2. Master Device ส่งไบต์ควบคุม ไปยัง Slave Device (ไบต์ควบคุม คือ Address ของ Slave Device ขนาด 7 บิตและตามด้วยคำสั่งเขียนข้อมูล (0) จำนวน 1 บิต)

3. Master Device ส่งสัญญาณ Stop ไปยัง Slave Device

4. Master Device ส่งสัญญาณ Start ไปยัง Slave Device

5. Master Device ส่งไบต์ควบคุมไปยัง Slave Device (ไบต์ควบคุม คือ Address ของ Slave Device ขนาด 7 บิตและตามด้วยคำสั่งอ่านข้อมูล (1) จำนวน 1 บิต)

6. Master Device อ่านข้อมูลจาก Slave Device

7. Master Device ส่งสัญญาณ Stop ไปยัง Slave Device

รูปแบบสื่อสารอนุกรมแบบ I2C

        สำหรับการพัฒนาโปรแกรมการสื่อสารอนุกรมแบบ I2C บนแพลตฟอร์ม Arduino จะใช้งานผ่านไลบรารี่ Wire ที่ถูกติดตั้งมาบนโปรแกรม Arduino IDE เรียบร้อยแล้ว เมื่อผู้ใช้ต้องการพัฒนาโปรแกรมบนโปรแกรม Arduino IDE จึงสามารถเรียกใช้งานผ่านการ #include <Wire.h>

ฟังก์ชันการใช้งานการสื่อสารอนุกรมแบบ I2C ด้วยไลบรารี่ Wire

– Wire.begin()                                   ฟังก์ชันสำหรับเริ่มต้นใช้งานการสื่อสารอนุกรมแบบ I2C

– Wire.beginTransmission(address)          ฟังก์ชันสำหรับเริ่มส่งข้อมูลไปยังอุปกรณ์ที่มี Address ที่กำหนด

– Wire.endTransmission()                      ฟังก์ชันสำหรับสิ้นสุดการสื่อสารอนุกรมแบบ I2C

– Wire.write()                                    ฟังก์ชันสำหรับเขียนข้อมูล I2C

– Wire.requestFrom(address, quantity)     ฟังก์ชันสำหรับร้องขอข้อมูลโดยระบุจำนวนข้อมูลที่ต้องการในหน่วยไบต์จากอุปกรณ์ที่มี Address ที่กำหนด

– Wire.available()                              ฟังก์ชันสำหรับตรวจสอบว่ามีข้อมูลจาก Slave เข้ามาหรือไม่

– Wire.read()                                    ฟังก์ชันสำหรับอ่านข้อมูล I2C

การตรวจสอบการเชื่อมต่อระหว่างบอร์ด ESPino32 กับอุปกรณ์ I2C

ขั้นแรกก่อนที่จะใช้งานการสื่อสารอนุกรมแบบ I2C จะต้องทำการตรวจสอบการเชื่อมต่อระหว่างตัวบอร์ด ESPino32 กับอุปกรณ์ I2C Device ก่อนว่าถูกต้องสมบูรณ์หรือไม่ ส่วนใหญ่ปัญหาที่พบในการสื่อสารแบบอนุกรม I2C จะมีอยู่ 2 อย่าง ได้แก่

1. ปัญหาจากการเชื่อมต่อ – ปัญหานี้อาจเกิดได้จากการต่อสาย SDA, SCL สลับกัน หรือต่อวงจรไม่ครบ เป็นต้น

2. ปัญหาจาก Address – ปัญหานี้อาจเกิดได้จากสายจั๊มพ์ที่ใช้ขาดในทำให้การเชื่อมต่อไม่สมบูรณ์ทำให้บอร์ด ESPino32 มองไม่เห็น Address ของอุปกรณ์ หรือ โมดูลบางตัวเปลี่ยนไอซีทำให้ Address เปลี่ยน เวลาใช้โปรแกรมที่เคยพัฒนามาแล้วไม่สามารถใช้ได้ เป็นต้น

        การตรวจสอบการเชื่อมต่อระหว่างบอร์ด ESPino32 กับอุปกรณ์ I2C Device สามารถตรวจสอบได้โดยใช้โปรแกรม i2c_scanner ดูเพิ่มเติมได้ที่ https://playground.arduino.cc/Main/I2cScanner เมื่อใช้งานโปรแกรมนี้บอร์ด ESPino32 จะค้นหา Address ทั้งหมดที่ต่ออยู่บนพอร์ท I2C ของบอร์ด แล้วแสดงผลเป็น Address 7 บิตของอุปกรณ์นั้นๆ ออกมาทาง Serial Monitor

ตัวอย่างโปรแกรมที่ใช้

หลังจากอัพโหลดโปรแกรมลงบนบอร์ด ESPino32 เรียบร้อยแล้ว เปิด Serial เพื่อดูผลลัพธ์ของการแสกน ดังรูป I2C Address 7 บิตของ I2C Device

I2C Address 7 บิตของอุปกรณ์ I2C Device

หากตรวจสอบการเชื่อมต่อระหว่างบอร์ด ESPino32 กับอุปกรณ์ I2C Device แล้วพบว่าตัวบอร์ดมองเห็น Address ของอุปกรณ์ I2C Device แสดงว่าการเชื่อมต่อสมบูรณ์แล้ว สามารถนำไปใช้พัฒนาโปรแกรมต่อไปได้

ตัวอย่างการสื่อสารอนุกรมแบบ I2C กับโมดูล PCF8574 I/O Expansion Board

        สำหรับตัวอย่างการสื่อสารอนุกรมแบบ I2C กับโมดูล PCF8574 I/O Expansion Board เป็นตัวอย่างเริ่มต้นการใช้งานการสื่อสารอนุกรมแบบ I2C ที่ทางทีมงานคิดว่าเหมาะสำหรับผู้เริ่มใช้งานมากที่สุด โดยตัวอย่างนี้จะใช้บอร์ด ESPino32 ต่อเข้ากับโมดูล PCF8574 I/O Expansion Board ผ่านช่องทางการสื่อสารอนุกรมแบบ I2C ภายในตัวอย่างนี้จะแยกออกเป็น 2 ส่วนคือ

– บอร์ด ESPino32 เขียนข้อมูล I2C เพื่อใช้งาน GPIO ของโมดูล PCF8574 เป็นเอาต์พุต

– บอร์ด ESPino32 อ่านข้อมูล I2C เพื่อใช้งาน GPIO ของโมดูล PCF8574 เป็นอินพุต

บอร์ด ESPino32 เขียนข้อมูล I2C เพื่อใช้งาน GPIO ของโมดูล PCF8574 เป็นเอาต์พุต

        สำหรับตัวอย่างใช้งานบอร์ด ESPino32 เขียนข้อมูล I2C เพื่อใช้งาน GPIO ของโมดูล PCF8574 เป็นเอาต์พุต จะเป็นตัวอย่างการเขียนโปรแกรมสื่อสารผ่านพอร์ท I2C โดยมีวิธีการทำคือ ใช้งานบอร์ด ESPino32 เขียนข้อมูล I2C ตามรูป Interface Definition เพื่อควบคุมการทำงานของขา GPIO ต่างๆของไอซี PCF8574

Interface Definition

การทดลองนี้ใช้วงจรแบบ Active LOW เนื่องจาก IC PCF8574 จ่ายกระแสออกมาน้อยทำให้หลอด LED ไม่สว่างมาก จึงเลือกใช้วงจรแบบ Active LOW ดังนั้นหากจะให้โมดูลทำงานจะต้องสั่งให้ขา GPIO ของโมดูลให้มีสถานะเป็น LOW หลอด LED ถึงจะติด

ต่อวงจรดังรูป บอร์ด ESPino32 ใช้งานโมดูล PCF8574 เป็นเอาต์พุต

บอร์ด ESPino32 ใช้งานโมดูล PCF8574 เป็นเอาต์พุต

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         เรียกใช้งานไลบรารี่ Wire
บรรทัดที่ 2         define ค่าคงที่ PCF8574_I2C_ADDRESS ให้มีค่าเท่ากับ 0x20 (Address ของ PCF8574)
บรรทัดที่ 3         สร้างฟังก์ชัน setup()
บรรทัดที่ 4         เปิดฟังก์ชัน setup()
บรรทัดที่ 5         เริ่มต้นการใช้งานไลบรารี่ Wire
บรรทัดที่ 6         ปิดฟังก์ชัน setup()
บรรทัดที่ 7         สร้างฟังก์ชัน gpio_out(data) โดยรับพารามิเตอร์ data เข้ามาประมวลผล
บรรทัดที่ 8         เปิดฟังก์ชัน gpio_out()
บรรทัดที่ 9         บอร์ด ESPino32 เริ่มส่งข้อมูล I2C ไปยัง Address PCF8574_I2C_ADDRESS
บรรทัดที่ 10        บอร์ด ESPino32 เขียนข้อมูล I2C จากพารามิเตอร์ data ไปยังโมดูล PCF8574
บรรทัดที่ 11        บอร์ด ESPino32 สิ้นสุดการส่งข้อมูลกับโมดูล PCF8574
บรรทัดที่ 12       ปิดฟังก์ชัน gpio_out()
บรรทัดที่ 13        สร้างฟังก์ชัน loop()
บรรทัดที่ 14        เปิดฟังก์ชัน loop()
บรรทัดที่ 15        เรียกใช้งานฟังก์ชัน gpio_out() โดยใส่พารามิเตอร์ B00001111 เข้าไป ทำให้ LED 4 ดวงแรกดับ และ 4 ดวงหลังติด
บรรทัดที่ 16        หน่วงเวลา 1000 มิลลิวินาที
บรรทัดที่ 17        เรียกใช้งานฟังก์ชัน gpio_out() โดยใส่พารามิเตอร์ B11110000 เข้าไป ทำให้ LED 4 ดวงแรกติด และ 4 ดวงหลังดับ
บรรทัดที่ 18        หน่วงเวลา 1000 มิลลิวินาที
บรรทัดที่ 19        ปิดฟังก์ชัน loop()

ผลการทดลอง

        เมื่อบอร์ด ESPino32 เริ่มทำงาน โปรแกรมจะใช้งานฟังก์ชัน gpio_out() โดยใส่พารามิเตอร์ B00001111 เข้าไปทำให้ LED ดวงที่ต่อกับ GPIO0 – GPIO4 ของโมดูล PCF8574 ดับ และ LED ดวงที่ต่อกับ GPIO5 – GPIO7 ของโมดูล PCF8574 ติด จากนั้นหน่วงเวลา 1000 มิลลิวินาที แล้วใช้ฟังก์ชัน gpio_out() โดยใส่พารามิเตอร์ B11110000ทำให้ LED ดวงที่ต่อกับ GPIO0 – GPIO4 ของโมดูล PCF8574 ติดและ LED ดวงที่ต่อกับ GPIO5 – GPIO7 ของโมดูล PCF8574 ดับ จากนั้นหน่วงเวลา 1000 มิลลิวินาที แล้ววนรอบการทำงานในฟังก์ชัน loop() ต่อไป

รูปสัญญาณที่ขา SCL และ SDA ขณะเขียนข้อมูล


รูปสัญญาณที่ขา SCL และ SDA ขณะเขียนข้อมูล

บอร์ด ESPino32 อ่านข้อมูล I2C เพื่อใช้งาน GPIO ของโมดูล PCF8574 เป็นอินพุต

            สำหรับตัวอย่างใช้งานบอร์ด ESPino32 อ่านข้อมูล I2C เพื่อใช้งาน GPIO ของโมดูล PCF8574 เป็นอินพุต จะเป็นตัวอย่างการเขียนโปรแกรมสื่อสารผ่านพอร์ท I2C ต่อจากการเขียนข้อมูล I2C โดยมีวิธีการทำ คือ ใช้งานบอร์ด ESPino32 อ่านข้อมูล I2C ตามรูป Interface Definition เพื่ออ่านสถานะทางดิจิทัลของขา GPIO บนไอซี PCF8574

Interface Definition

ต่อวงจรดังรูป บอร์ด ESPino32 ใช้งานโมดูล PCF8574 เป็นอินพุต การทดลองนี้ใช้การต่อวงจรแบบ pull-down กับสวิตท์ไว้เพื่อให้สถานะของขา GPIO เป็น “0” ตลอดเวลา ถ้าสวิตท์ถูกเปิดจะได้สถานะเป็น “1”

บอร์ด ESPino32 ใช้งานโมดูล PCF8574 ให้เป็นอินพุต

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         เรียกใช้งานไลบรารี่ Wire
บรรทัดที่ 2         define ค่าคงที่ PCF8574_I2C_ADDRESS ให้มีค่าเท่ากับ 0x20
บรรทัดที่ 3         สร้างฟังก์ชัน setup()
บรรทัดที่ 4         เปิดฟังก์ชัน setup()
บรรทัดที่ 5         เริ่มต้นการใช้งานไลบรารี่ Wire
บรรทัดที่ 6         ใช้งานฟังก์ชัน Serial โดยตั้งค่าอัตราเร็ว Baud rate อยู่ที่ 115200 บิตต่อวินาที
บรรทัดที่ 7         ปิดฟังก์ชัน setup()
บรรทัดที่ 8         สร้างฟังก์ชัน loop()
บรรทัดที่ 9         เปิดฟังก์ชัน loop() บอร์ด ESPino32 เริ่มส่งข้อมูล I2C ไปยัง Address PCF8574_I2C_ADDRESS
บรรทัดที่ 10        บอร์ด ESPino32 ร้องขอข้อมูลจากโมดูล PCF8574 โดยขอข้อมูลจำนวน 1 ไบต์
บรรทัดที่ 11        ฟังก์ชันตรวจสอบว่ามีข้อมูลอยู่ใน Wire หรือไม่
บรรทัดที่ 12       เปิดฟังก์ชันถ้ามีข้อมูลอยู่ใน Wire
บรรทัดที่ 13        อ่านค่าใน Wire จากนั้นแสดงข้อมูลที่อ่านได้ออกมาในรูปแบบเลขฐานสองและขึ้นบรรทัดใหม่
บรรทัดที่ 14        ปิดฟังก์ชันถ้ามีข้อมูลอยู่ใน Wire
บรรทัดที่ 15        หน่วงเวลา 1000 มิลลิวินาที
บรรทัดที่ 16        ปิดฟังก์ชัน loop()

ผลการทดลอง

            เมื่อบอร์ด ESPino32 เริ่มทำงาน โปรแกรมในจะบอร์ด ESPino32 ร้องขอข้อมูลจากโมดูล PCF8574 จำนวน 1 ไบต์ จากนั้นโปรแกรมตรวจสอบว่ามีข้อมูลตอบกลับมาหรือไม่ ถ้ามีข้อมูลตอบกลับมาจะทำการอ่านค่าใน Wire แล้วทำการแสดงผลออกมาเป็นเลขฐานสอง ดังรูป ผลลัพธ์ การใช้บอร์ด ESPino32 อ่านค่าอินพุตจากโมดูล PCF8574 และหน่วงเวลา 1000 มิลลิวินาที แล้ววนรอบการทำงานในฟังก์ชัน loop() ต่อไป

ผลลัพธ์ การใช้บอร์ด ESPino32 อ่านค่าอินพุตจากโมดูล PCF8574

ผลลัพธ์ การใช้บอร์ด ESPino32 อ่านค่าอินพุตจากโมดูล PCF8574

รูปสัญญาณที่ขา SCL และ SDA ขณะอ่านข้อมูล

        สำหรับบทความ ESPino32 ในตอนที่ 8 การสื่อสารอนุกรมแบบ I2C เป็นหนึ่งในรูปแบบการสื่อสารที่ถือว่าได้รับความนิยมในการเชื่อมต่อระหว่างบอร์ดไมโครคอนโทรเลอร์กับอุปกรณ์ต่างๆ ในบทความนี้จะเป็นพื้นฐานสำหรับการใช้งานการสื่อสารอนุกรมแบบ I2C ในการสื่อสารกับอุปกรณ์ต่างๆ ซึ่งปัจจุบันพื้นฐานการเชื่อมต่อสื่อสารอนุกรมแบบ I2C อาจถูกมองข้ามไปเพราะอุปกรณ์ต่างๆส่วนใหญ่มีไลบรารี่สำหรับใช้งานกับอุปกรณ์นั้นๆได้ทันที

ขอขอบคุณข้อมูลอ้างอิงจาก

– http://aimagin.com/blog/

– http://www.ecpe.nu.ac.th/ponpisut/ourwork.html

– https://iamzxlee.wordpress.com/2014/07/26/pcf8574a-8-bit-io-expander/

สารบัญ บทความ ESPino32