ETT :: Article :: ARM:STM32:STM8 :: Arduino STM32: EP3 I2C LCD 16x2

© 2020,จารุต บุศราทิจ

บทความนี้เราเขียนโปรแกรมเพื่อให้ ET-STM32F103 สั่งงาน LCD แบบ I2C แบบ 2 แถว แถวละ 16 ตัวอักษร เนื่องจากประหยัดพอร์ต และสามารถติดตั้ง LCD ได้ 8 ตัว ด้วยการกำหนดค่าตำแหน่งของ LCD ให้แตกต่างกัน ยิ่งถ้าผู้อ่านเลือกใช้ตัวหนึ่งเป็น PCF8754 กับอีกคัวเป็น PCF8754A ยิ่งทำให้ค่าตำแหน่งอยู่ช่วงค่าที่แตกต่างกัน ส่งผลให้สามารถติดตั้ง LCD ได้พร้อมกัน 16 ตัว สะดวกกว่าการเลือกใช้ LCD ในแบบปกติมากมาย ซึ่งบนบอร์ดมีส่วนเชื่อมประสานกับ LCD ปกติให้ใช้งานดังภาพด้านล่าง

จากภาพจะเห็นว่าเป็นการสั่งงาน LCD ในโหมด 4 บิต และขาเชื่อมต่อระหว่างพอร์ตและขาของ LCD เป็นดังรายละเอียดต่อไปนี้

แต่อย่างไรก็ดีครับ ในบทความนี้เราเลือกใช้ LCD แบบ I2C น่อ

เป้าหมาย

อุปกรณ์ที่ต้องใช้

มาทำความรู้จัก I2C

I2C หรือ IIC เป็นบัสสื่อสารประเภทหนึ่งที่ออกแบบใช้ขาสัญญาณในการทำงานเพียง 4 ขา คือ GND, Vcc, SDA และ SCL โดยขา SDA ใช้สำหรับการรับ/ส่งข้อมูลในการสื่อสาร และ SCL เป็นขาให้สัญญาณนาฬิการระหว่างการสื่อสาร ...​รายละเอียดเพิ่มเติมอ่านจากที่นี่ครับ

หน้าตาขาสื่อสารบัส I2C ของ LCD ของเราเป็นดังภาะต่อไปนี้ครับ

จากภาพจะเห็นว่าเมื่อเทียบกับขาเชื่อมต่อที่มากับบอร์ด ET-STM32F103 นั้นแตกต่างกันเลยทีเดียว และคราวนี้เราจะต้องเชื่อมต่อกับบอร์ดอย่างไรดีล่ะ? ... เมื่อเราดูจากผังของไอซี STM32F103RBT6 แล้วจะพบว่า ขา PB6 ทำหน้าที่ I2C1_SCL และขา PB7 ทำหน้าที่ I2C1_SDA ดังนั้น หน้าที่ของเราคือ ต่อ SDA หรือ PB7 เข้ากับขา SDA ของ LCD 16x2 I2C และ SCL หรือ PB6 เข้ากับขา SDL ของ LCD 16x2 I2C ซึ่งภาพผังของไอซีเป็นดังนี้

การต่อเชื่อมระหว่างกันก็เป็นตามภาพนี้ครับผม (ระวังถูกหลอกนะครับ อิๆๆ พอดีผมทำ 2 ครั้ง เพื่อให้แน่ใจ แล้วกลายเป็นว่าภาพนึงสีของสายไฟดันไม่เหมือนกับอีกภาพจากอีกครั้งนึ่งซะงั้น แต่เชื่อมค่อถูกต้องครับ)

มาติดตั้งไลบรารีกันครับ

ข้อดีของการใช้แพลตฟอร์มของ Arduino ก็คือ มีคนสร้างไลบรารีสำหรับอุปกรณ์ให้เราใช้เยอะมาก แตกต่างจากสมัยก่อนที่จะต้องอ่าน datasheet ต้องเข้าใจหน้าที่ของแต่ละขา และต้องเข้าใจพวก timing diagram แล้วทดลองเขียนกันอย่างหักโหม ได้บ้าง ไม่ได้บ้าง ท้อบ้าง เลิกไปบ้างก็มี ...​แต่สมัยนี้ง่ายขึ้นมาก ...​แต่ก็มีข้อปวดหัวเหมือนกันครับ เพราะบางทีไลบรารีก็ใช้ได้กับบางไอซี บางไอซีก็ใช้ไม่ได้ พอใช้ไม่ได้ก็ต้องมาแกะโค้ดเขา และแก้ไข คราวนี้บรรยากาศเดิม ๆ ก็จะพรั่งพรูกลับมา (แต่ง่ายกว่าเดิม เพราะอย่างน้อยก็มีแนวคิดการเขียนของคนอื่นให้เราศึกษา)

ไลบรารีที่เราจะใช้มีชื่อว่า LiquidCrystal_I2C มาเริ่มกันที่เข้าเมนู Sketch แล้วเลือก Include Library แล้วเลือกรายการย่อย Manage Libraries ... เพื่อเรียกหน้าต่างติดตั้งไลบรารีดังภาพด้านล่างนี้ครับ

จากหน้าต่างเราก็ใส่คำค้นเป็น LiquidCrystal_I2C แล้วจะพบว่ามีหลายเจ้าเลยที่เดียวที่พัฒนาไลบรารีขึ้นมา แต่เราเลือกใช้แบบชื่อตรง ๆ ซึ่งพัฒนาโดย Frank De Brabander ดังภาพนี้ครับ

เขียนโค้ดกันเลย

เมื่อเขียนเสร็จ Verify ผ่าน (หรือแก้ไขเสร็จแล้ว) ก็อัพโหลดเข้าบอร์ดกันได้เลย หน้าตาผลลัพธ์ก็จะเป็นดังนี้ครับ โดยโปรแกรมที่เราเขียนมีคำสั่งดังต่อไปนี้

มาวาดหัวใจกัน

จากตัวอย่างแรกเราได้แสเงข้อความ ณ​ ตำแหน่งที่กำหนดกันได้แล้ว คราวนี้เราจะอัพโหลดข้อมูลบิตที่เราเตรียมเป็นภาพหัวใจไปเก็บในหน่วยความจำของ LCD 16x2 I2C หลังจากนั้นจึงเรียกใช้เพื่อให้แสดงผลบนจอ โดยข้อมูลบิตแมพที่เราสร้างขึ้นจะถูกมองว่า ค่า 0 คือไม่แสดงจุดสีดำ และค่า 1 แสดงจุดสีดำ ดังนั้น ตัวแปรเก็บค่ารูปหัวใจจึงเป็นได้ดังนี้

byte heart[8] = { B01010, B10101, B10001, B10001, B01010, B01010, B00100 };
สาเหตุที่จองเป็นแถวลำดับ (array) จำนวน 8 สมาชิกเนื่องจากเราสร้างบิตแมพขนาด 8x8 จุด

ขั้นตอนที่ 2 คือ การอัพโหลดข้อมูลเข้าไปยังหน่วยความจำของ LCD 16x2 I2C ด้วยคำสั่งต่อไปนี้

lcd1.createChar(0, heart);

ขั้นตอนของการแสดงภาพหัวใจสั่งงานดังนี้ครับ

lcd1.write(byte(0));

เอาล่ะครับ มาดูโค้ดของโปรแกรมกัน

สรุป

ในตอนนี้เราสามารถติดตั้ง เชื่อมต่อวงจร และเขียนโปรแกรมเรียกใช้ไลบรารีเพื่อสั่งงาน LCD 16x2 I2C แบบเบื้องต้นได้แล้ว ในครั้งหน้า เราจะนำ LCD 16x2 I2C มาใช้อีกครั้งเพื่อเป็นอุปกรณ์แสดงผลลัพธ์ และทำการอ่านค่าอุณหภูมิจากเซ็นเซอร์อุณหภูมิ ... :) มาถึงตอนนี้จะเห็นว่า โดยพื้นฐานแล้ว เราสามารถใช้เจ้า ET-STM32F103 แทนบอร์ด Arduino ได้ แต่อย่างที่บอกครับ โดยพื้นฐาน แต่ถ้าเมื่อไรที่เราต้องใช้งานคุณสมบัติพิเศษที่ขึ้นกับไมโครคอนโทรลเลอร์ เช่น การทำอินเทอร์รัพท์ การสั่งไทเมอร์ การสั่ง WDT เป็นต้น อันนี้ต้องดูในรายละเอียดอีกครั้งว่าผู้พัฒนาเขาได้เตรียมไว้ให้เราหรือไม่ ถ้าเตรียมไว้ก็ถือว่าไม่เหนื่อย แต่ถ้าไม่มีให้ใช้ก็ต้องออกแรงกันไปครับ

:----: บทความก่อนหน้านี้ :----: บทความตอนถัดไป (next) :----:

--ไม่สามารถเข้าถึงฐานข้อมูลได้--