วันนี้เราจะมาพูดถึงเรื่องการต่อใช้งานจอ LCD กันนะครับ จะว่าไปแล้วก็รวมถึงอุปกรณ์อื่นๆ ด้วยที่ใช้การสื่อสารอนุกรมแบบ I2C (Inter-Integrated Circuit) อ่านว่า "ไอสแควร์ซี" ถ้าผู้อ่านยังไม่รู้จักกับการสื่อสารอนุกรมชนิดนี้ ผมขอเล่าให้ฟังคร่าวๆ นะครับ แต่ถ้าต้องการรายละเอียดมากกว่านี้ ผมแนะนำให้อ่านบทความของเราที่เขียนไว้แล้วตามลิงค์นี้นะครับ
https://www.arduitronics.com/article/i2c-communication-case-study-of-gy-30-ambient-light-sensor
เอาแบบคร่าวๆ ก็ตรงนี้นะครับ สมมุติว่าเราต้องการออกแบบให้มีการทำงานกับโมดูล และ บอร์ดไมโครคอนโทรลเลอร์ หรือ PC อื่นๆ ตามข้อกำหนดดังนี้
ถ้าดูตัวอย่างในรูปบน จะเห็นว่ามีการต่อโดยมี Arduino Board เป็น Master เพื่อเรียกและควบคุมลักษณะการทำงานของอุปกรณ์ต่างๆ ซึ่งจะเป็น Slave ได้แก่ Gy-30 Gyroscope และ I2C LCD ขั้นตอนการสื่อสารโดย I2C มีดังนี้ครับ
เอาละครับ ถ้าคร่าวๆ ก็ประมาณนี้ อย่างไรก็ตาม อ่านครั้งแรกอาจจะดูยุ่งยากไปหน่อย แต่ Arduino ได้มี Library เพื่อจัดการกับการสื่อสารแบบ I2C ไว้ให้แล้ว โดยแต่ละโมดูลก็จะใช้ Library ที่เฉพาะตัว
วันนี้เราจะสาธิตการใช้งาน I2C LCD นะครับ ซึ่งก่อนอื่นผมจะขอให้ข้อมูลเกี่ยวกับ LCD และ I2C โมดูลซะก่อน สำหรับการใช้งาน LCD ปกติที่ไม่มีการใช้งานร่วมกับ I2C โมดูลนั้น สามารถอ่านได้ที่นี่ครับ
ซึ่งข้อมูลในบทความตามลิงค์นั้นจะเป็นการใช้งาน LCD แบบปกติ ทำให้ต้องใช้สายสัญญาณ หรือ Pin ของ Arduino เยอะมาก ทำให้เปลือง Pin ที่อาจจะต้องไปใช้งานกับอุปกรณ์ต่อพ่วงอื่นๆ ดังนั้นจะมีคนนำเอา I2C มาประยุกต์ใช้งานกับ LCD โมดูล เพื่อที่จะลดจำนวน Pin ที่ต้องใช้จำนวนมาก เหลือเพียง 2 สาย คือ SCL และ SDA เท่านั้น นอกจากนี้ยังคงสามารถติดต่อกับอุปกรณ์อื่นที่ใช้ I2C ได้บนสายเดียวกันด้วย
วันนี้เราจะมาพูดกันในรายละเอียดของ I2C โมดูลกันซะหน่อยครับ คำถามที่สำคัญคือว่า เราจะสามารถนำสัญญาณ 10 ช่องของ LCD มายัดลง SDA และ SCL ได้อย่างไร
หัวใจของ I2C โมดูลสำหรับ LCD ตัวนี้คือ Chip PCF8574 ของ NXP ครับ ซึ่งทำหน้าที่รับสัญญาณจาก I2C มาและกระจายของตามขาที่ LCD ต้องใช้
http://www.nxp.com/documents/data_sheet/PCF8574.pdf
ทีนี้ตัว PCF8574 สามารถใช้ได้เพียง 8 Pin เท่านั้น เนื่องจากมีขนาดเท่ากับ 1 byte ตามที่ I2C ส่งไปในแต่ละ Package แต่ LCD มีอยู่ทั้งหมดมากกว่า 16 ขา แต่เราโชคดีครับที่ LCD ยังมีโหมด 4 Bit ให้สามารถเลือกใช้ ดังนั้น หากเลือกใช้งานในโหมดนี้ เราก็ยังเหลือข้อมูลไว้ใช้กับ RW และ ENA รวมถึง การควบคุม Back Light ได้อีกด้วย
https://www.arduitronics.com/product/845/16x2-lcd-display-i2c-interface
ฟังดูแล้วยุ่งยากนะครับ แต่อย่างที่ว่า เรามี Library ให้หมดแล้ว ดังนั้นขั้นตอนทื่ว่านี้ก็จัดการได้ด้วย Library เลยครับ
เหลืออีกนิดเดียวเท่านั้น ที่เราต้องแน่ใจว่าเรียก Address ของโมดูลนี้อย่างถูกต้อง เพราะ Master ซึ่งเป็น Arduino Board เรียกไม่ตรงกับ Address เราจะให้ทุกอย่างนิ่งเงียบ เหมือนกับมันเสียเลยนะครับ
ที่เราต้องคิดต่อคือ แล้ว Address ของ I2C โมดูลนี้หามาอย่างไร มีค่าเท่าไหร่ ในโมดูลรุ่นที่ร้าน Arduitronics นำเข้ามาจำหน่ายนั้น มี Address ที่เป็น Default อยู่ตามนี้นะครับ
"0011 1111" หรือ Hex "3F" ครับ
ลองสังเกตดูรูปด้านล่างครับ จะเห็นว่ามีเขียน A0 A1 A2 อยู่ หมายถึงกรณีที่ต้องการเปลี่ยนค่า Address เพื่อควบคุมจอ LCD หลายจอ ก็สามารถทำได้โดยการบัดกรีเพื่อเชื่อต่อขั้วด้านล่างเข้ากับด้านบนนะครับ นั่นหมายความว่า เราสามารถเลือก Address "0011 1XXX" 3 บิตสุดท้าย A0 A1 และ A2 ของ LCD ได้อีก 8 แบบ (การไม่บัดกรีหมายถึงบิตนั้นๆ มีค่าเป็น 1) และเมื่อไม่มีการบัดกรีใดๆ ดังนั้น 3 บิตสุดท้ายจึงมีค่า "111" ดังที่แสดงไว้ด้านบนนะครับ
มีข้อที่ต้องระวังนะครับ I2C โมดูลที่ใช้กับ จอ LCD นั้นมีหลายรุ่น ขึ้นกับผู้ออกแบบและผู้ผลิตนะครับ ที่ผมเขียนไว้ด้านบน ใช้กับโมดูลที่ Arduitronics.com จำหน่ายนะครับ รุ่นอื่นๆ อาจะะมีความแตกต่างกันในเรื่องของการกำหนด Address ได้ครับ
แต่ไม่ต้องกังวลครับ ผมก็มีวิธีหา Address ให้สำหรับโมดูลรุ่นอื่นๆ ที่อาจจะไม่มีการแสดง Adress ที่ชัดเจน เรามีผู้เขียน Sketch ชื่อคุณ Nick Gammon เพื่อทดสอบหา Address ดังนี้ครับ
https://arduino-info.wikispaces.com/LCD-Blue-I2C
ให้หา Address โดยการ copy Sketch นี้และต่อเข้ากับจอดังรูปครับ
จะเห็นผลการตรวจสอบ Address บนหน้าจอ Serial monitor ดังนี้
จะเห็นว่า Serial monitor รายงานว่า (0x3F) หรือ "011 1111" ครับ
จากนั้นลง Library จากที่นี่ครับ ให้ Download จากนั้น unzip และติดตั้งใน Folder Libraray นะครับ
ซึ่งจะเห็นผลการแสดงข้อมูลบนจอ LCD ผ่านI2C โมดูลดังนี้ครับ
วันนี้เท่านี้ครับ พบกันตอนต่อไป
เราให้คำปรึกษาหลังการขายกับลูกค้าด้วยนะครับ
ติดต่อผ่าน facebook โทรศัพท์ หรือ line ได้ครับ
ไม่ได้คิดแต่จะขายของถูกๆ อย่างเดียวครับ
ลิงค์ที่เกี่ยวข้อง
https://www.arduitronics.com/product/845/16x2-lcd-display-i2c-interface
https://www.arduitronics.com/product/121/i2c-character-lcd
https://www.arduitronics.com/product/366/acrylic-stand-for-16x2-character-lcd-adafruit
หน้านี้เป็นสารบัญของบทความที่ปรากฏในเว็บของ Arduitronics.com นะครับ จะขอแบ่งออกเป็นหัวข้อตามกลุ่มของสินค้าในร้านดังต่อไปนี้
หน้าที่เข้าชม | 15,387,561 ครั้ง |
ผู้ชมทั้งหมด | 5,890,639 ครั้ง |
เปิดร้าน | 21 พ.ค. 2556 |
ร้านค้าอัพเดท | 13 ก.ย. 2568 |