การใช้งาน Character LCD Display กับ Arduino (ตอนที่2 – รูปแบบการเชื่อมต่อแบบ I2C)

การใช้งาน Character LCD Display กับ Arduino

(ตอนที่2 – รูปแบบการเชื่อมต่อแบบ I2C)

           จากบทความตอนที่แล้ว ที่กล่าวถึง การใช้งาน Character LCD Display กับ Arduino (ตอนที่1 – รูปแบบการเชื่อมต่อแบบ Parallel) ในบทความนี้ เราจะมาอธิบายในอีกส่วนหนึ่ง คือการเชื่อมต่อจอ Character LCD Display 16×2 กับ Arduino ในรูปแบบ I2C (Serial) รวมถึงการนำไปใช้งานจริงและมีฟังก์ชั่นอะไรบ้างที่ใช้ในการสั่งงานจอ LCD

            ก่อนอื่นเรามาย้อนไปดูกันก่อนว่าจอ LCD ที่มีการเชื่อมแบบ I2C นั้นมีขาในการเชื่อมต่ออะไรบ้าง จอ LCD ที่มีการเชื่อมต่อแบบ I2C หรือเรียกอีกอย่างว่าการเชื่อมต่อแบบ Serial จะเป็นจอ LCD ธรรมดาทั่วไปที่มาพร้อมกับบอร์ด I2C Bus ที่ทำให้การใช้งานได้สะดวกยิ่งขึ้นและยังมาพร้อมกับ VR สำหรับปรับความเข้มของจอ ในรูปแบบ I2C จะใช้ขาในการเชื่อมต่อกับ Microcontroller เพียง 4 ขา (แบบ Parallel ใช้ 16 ขา) ซึ่งทำให้ใช้งานได้ง่ายและสะดวกมากยิ่งขึ้น สามารถดูได้จากตารางด้านล่างครับ

01
02

การควบคุมการแสดงผลของจอ LCD (I2C)

           ในการควบคุมหรือสั่งงาน โดยทั่วไปจอ LCD จะมีส่วนควบคุม (Controller) อยู่ในตัวแล้ว ผู้ใช้สามารถส่งรหัสคำสั่งสำหรับควบคุมการทำงานของจอ LCD (I2C) เช่นเดียวกันกับจอ LCD แบบธรรมดา พูดง่ายๆ คือรหัสคำสั่งที่ใช้ในการควบคุมนั้นเหมือนกัน แต่ต่างกันตรงที่รูปแบบในการรับส่งข้อมูล ในบทความนี้เราจะมาพูดถึงจอ LCD 16×2 ที่มีการส่งข้อมูลรูปแบบ I2C ที่ใช้ขาเพียง 4 ขาที่ใช้ในการเชื่อมต่อเท่านั้น 
           1. GND เป็น Ground ใช้ต่อระหว่าง Ground ของระบบ Microcontroller กับ LCD 
           2. VCC เป็นไฟเลี้ยงวงจรที่ป้อนให้กับ LCD มีขนาด +5VDC
           3. SDA (Serial Data) เป็นขาที่ใช้ในการรับส่งข้อมูล
           4. SCL (Serial Clock) เป็นขาสัญญาณนาฬิกาในการรับส่งข้อมูล

การรับ-ส่งข้อมูลแบบ I2C BUS

03

 – MCU จะทำการส่งสถานะเริ่มต้น (START Conditions) เพื่อแสดงการขอใช้บัส

            – แล้วตามด้วย รหัสควบคุม (Control Byte) ซึ่งประกอบ ด้วยรหัส ประจำตัวอุปกรณ์ Device ID, Device Address และ Mode ในการเขียนหรืออ่านข้อมูล
            – เมื่ออุปกรณ์รับทราบว่า MCU ต้องการจะติดต่อด้วย ก็ต้องส่งสถานะรับรู้ (Acknowledge) หรือแจ้งให้ MCU รับรู้ว่าข้อมูลที่ได้ส่งมามีความถูกต้อง
            – และเมื่อสิ้นสุดการส่งข้อมูล MCU จะต้องส่งสถานะสิ้นสุด (STOP Conditions) เพื่อบอกกับอุปกรณ์ว่า สิ้นสุดการใช้บัส

การเชื่อมต่อระหว่าง Microcontroller กับ LCD (I2C)
            สำหรับการเชื่อมต่อสัญญาณระหว่าง Microcontroller กับ LCD ที่มีบอร์ด I2C อยู่แล้วนั้น การส่งข้อมูลจาก Microcontroller จะถูกส่งออกมาในรูปแบบ I2C ไปยังบอร์ด I2C และบอร์ดจะมีหน้าที่จัดการข้อมูลให้ออกมาในรูปแบบปกติ หรือแบบ Parallel เพื่อใช้ในการติดต่อไปยังจอ LCD โดยที่รหัสคำสั่งที่ใช้ในการสั่งงานจอ LCD ยังคงไม่ต่างกับจอ LCD ที่เป็นแบบ Parallel โดยส่วนใหญ่บอร์ด I2C จะเชื่อมต่อกับตัวควบคุมของจอ LCD เพียง 4 บิตเท่านั้น เดี๋ยวเราจะมาดูกันว่า วงจรภายในระหว่างจอ LCD กับบอร์ด I2C นั้น มีการต่อไว้อย่างไรบ้าง

04

จากรูปวงจรจะเห็นได้ว่าจอ LCD และ บอร์ด I2C ได้มีการเชื่อมต่อขาสำหรับการรับส่งข้อมูลเป็นแบบ 4 บิต ขาที่เชื่อมต่อไว้คือ ขา P4 > DB4, P5 > DB5, P6 > DB6, P7 > DB7 และขา P2 > E (Enable), P1 > R/W, P0 > RS รวมไปถึงตัวต้านทานสำหรับปรับค่าความเข้มของตัวอักษร และ Switch Blacklight จากวงจรขาที่จำเป็นในการใช้งานถูกเชื่อมต่อเข้ากับตัวบอร์ด I2C และอุปกรณ์อิเล็กทรอนิกส์เรียบร้อยแล้ว สถานะพร้อมใช้งานครับ

05

การเชื่อมต่อระหว่าง Arduino กับจอ LCD (I2C)

14
07

รายละเอียดชุดคำสั่งที่ใช้ในการสั่งงานระหว่าง Arduino กับจอ LCD

           คำสั่งที่ใช้ในการควบคุมจอ LCD ของ Arduino แบบ I2C นั้นไม่ต่างจากจอ LCD แบบธรรมดา (Parallel) มากนัก ทั้งนี้ยังได้มีการพัฒนา Library I2C มาให้ใช้งานได้อย่างสะดวกมากยิ่งขึ้น เรามาเริ่มต้นขั้นตอนแรกในการเขียนโปรแกรมกันเลยครับ ขั้นตอนแรกคือการนำไฟล์ Library LCD (I2C) ไปไว้ใน Library ของ Arduino ก่อนเพื่อให้ง่ายต่อการเรียกใช้ Library ผู้ใช้สามารถทำตามขั้นตอนด้านล่างได้เลยครับ
           1. Download Library LCD (I2C) ก่อนครับ >> (ไฟล์ LiquidCrystal_I2C.7z)

           2. ทำการแยกไฟล์ที่โหลดมาข้างต้น แล้วนำไปไว้ยัง  C:\Program Files (x86)\Arduino\libraries (Drive ที่ได้ทำการติดตั้งโปรแกรม Arduino IDE ไว้)

08

หลังจากที่เรานำไฟล์ Library ไปไว้เรียบร้อยแล้ว เราก็มาเริ่มการเขียนโปรแกรมกันเลยครับ ก่อนอื่นให้เราเรียก Library ของการสื่อสารแบบ I2C และ Library ของจอ LCD (I2C) ก่อนเลยครับ คือ Wire.h และ LiquidCrystal_I2C.h หลังจากทำการเรียก Library เรียบร้อยแล้ว เราจะมาดูกันว่ามีฟังก์ชั่นเบื้องต้นอะไรบ้างที่จะทำให้จอ LCD ของเราแสดงผล

           ฟังก์ชั่นแรก LiquidCrystal_I2C(); ใช้ในการประกาศ Address และ ขนาดของจอ รูปแบบของคำสั่งคือ
LiquidCrystal_I2C lcd(Address, columns, rows); ในบทความนี้เราจะกำหนดดังนี้ LiquidCrystal_I2C lcd(0x27, 16, 2); หมายถึง Address ของจอคือ 27 ขนาดของจอคือ 16 ตัวอักษร 2 บรรทัด
           ฟังก์ชั่นต่อมา begin(); ใช้ในการกำหนดการเริ่มต้นในการใช้งานจอ
           ฟังก์ชั่นต่อมา setCursor(); ใช้ในการกำหนดตำแหน่งของ Cursor เช่น lcd.setCursor(0, 1); คือให้เคอร์เซอร์ไปที่ ตำแหน่งที่ 0 บรรทัดที่ 1 (การนับตำแหน่งเริ่มจาก 0)
           ฟังก์ชั่น print(); ใช้ในการกำหนดข้อความที่ต้องการแสดง เช่น lcd.print(“ThaiEasyElec”); คือกำหนดให้แสดงข้อความ “ThaiEasyElec” ออกทางหน้าจอ LCD

ในบทความนี้เราจะใช้เพียงฟังก์ชั่นที่กล่าวถึงด้านบน ส่วนฟังก์ชั่นอื่นๆ สามารถดูได้จาก Arduino.cc <<< คลิกได้เลยครับ

ตัวอย่างโค้ดโปรแกรม

#include <Wire.h> 

#include <LiquidCrystal_I2C.h> //ประกาศ Library ของจอ I2C
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
// initialize the LCD
lcd.begin();
// Print a message to the LCD.
lcd.print("Hello !!!"); //ฟังก์ชั่นในการกำหนดข้อความที่ต้องการแสดงผล
lcd.setCursor(0, 1); //ฟังก์ชั่นในการกำหนดตำแหน่ง Cursor
lcd.print("ThaiEasyElec");
}
void loop() 
{
}

ผลลัพธ์ที่ได้ตามรูปด้านล่างนะครับ !!!!

09

ยังมีตัวอย่างอื่นๆ สามารถเปิดได้จาก Arduino IDE ในเมนู  File >> Example >> LiquidCrystal_I2C >> …….

ส่วนเพิ่มเติม ในกรณีต้องการเปลี่ยน Address ใหม่ หรือต้องการต่อจอ LCD มากกว่า 1 จอ

ในเบื้องต้นบอร์ด I2C ได้ทำการกำหนดมาแล้ว โดยการต่อไฟ 5VDC เข้าไว้ที่ขา A0-A2 ของบอร์ด I2C

I2C

จึงทำให้ Address นั้นคือ 27 เลขที่ Address ดูได้จากตารางด้านล่าง

11

  ดูจากตารางด้านบนเราจะเห็นได้ว่า เราสามารถกำหนด Address ได้ถึง 8 Address ด้วยกัน จากตัวอย่างโค้ด Address คือ 27 นั่นคือเราได้จ่ายไฟ หรือให้สถานะ High (1) ไว้ที่ขา A0, A1, A2 ดังตารางด้านบน ถ้าเราต้องการเปลี่ยน Address เราต้องทำการแก้ไข input ที่จ่ายให้ขา A0-A2 สามารถทำได้ดังนี้
          1. ด้านหลังบอร์ด I2C จะมีจัมเปอร์ให้เราบัดกรี 3 จุดคือ A0, A1, A2 ถ้าไม่ได้ต่อเข้าหากันคือ ค่าเริ่มต้น High(1) ทั้ง 3 ขา ถ้าทำการบัดกรีเข้าหากันคือ การทำให้ขานั้นอยู่ในสถานะ Low(0)

12

 2. ถ้าต้องการให้ Address = 26 เราต้องทำการเชื่อมต่อจัมเปอร์ที่ขา A0 ตามภาพ ตำแหน่ง Address ก็จะเป็น 26 ครับ (ตำแหน่ง Address ดูได้จาตารางด้านบนครับ)

13