จอแสดงผลแบบสี หรือจอที่เรามักจะเรียกกันติดปากว่า "จอ LCD" นั้น หากมองในมุมมองของผู้ใช้แล้ว การเลือกใช้จอนั้นสามารถเลือกได้หลากหลาย ทั้งขนาดที่มีให้เลือกตั้งแต่ขนาดเล็ก ๆ 5 นิ้ว 7 นิ้ว 10 นิ้ว ไปจนถึงจอใหญ่ ๆ ระดับ 50 นิ้วขึ้นไป รวมทั้งยี่ห้อ พอร์ตการเชื่อมต่อ ฟีเจอร์เสริมต่าง ๆ สามารถเลือกได้อิสระ ตามกำลังทรัพย์ และความต้องการของแต่ละคนเอง
แต่หากมองในมุมมองของนักพัฒนาระบบสมองกลฝังตัวแล้ว จะพบว่าการเลือกจอมาใช้งานค่อนข้างที่จะลำบากมาก ๆ เนื่องจากจอขนาดมาตรฐานทั่วไป หาได้ยาก และมีตัวเลือกไม่มากนักในงานระบบสมองกลฝังตัว ขนาดมาตรฐานที่ขายกันอยู่นั้นมักจะมีขนาดที่เล็ก เช่น 0.96 นิ้ว (OLED) 1.8 นิ้ว 2.0 นิ้ว 2.2 นิ้ว 2.8 นิ้ว เป็นต้น รวมทั้งมักมีให้เลือกเพียงรูปแบบเดียว หรือเพียงสองรูปแบบเท่านั้น ดังนั้นราคา ฟีเจอร์ ลักษณะการต่อใช้งานจึงจำกัดอยู่ที่ตัวอุปกรณ์ ซึ่งผู้พัฒนามีหน้าที่ ที่จะนำอุปกรณ์เหล่านั้นมาปรับแก้ให้เหมาะสมกับงานนั้น ๆ ด้วยตัวเอง
บทความนี้เกิดจากผู้เขียนมองเห็นถึงปัญหาการนำจอ TFT LCD ของ Arduino Uno R3 มาใช้ร่วม ESP32 แล้วทำให้ ESP32 นั้นไม่เหลือขาใช้งานสำหรับต่อเซ็นเซอร์ หรืออุปกรณ์อื่น ๆ เลย ทำให้ผู้เขียนหาข้อมูลเกี่ยวกับการลดจำนวนขาจอ LCD ให้น้อยลง เพื่อให้การเชื่อมต่อกับไมโครคอนโทรลเลอร์ไม่ยุ่งยาก และมีขา GPIO เหลือไปต่อให้อุปกรณ์อื่น ๆ ต่อไป
ผู้เขียนพบว่า การลดจำนวนขาจอแสดงผล หรืออุปกรณ์อื่น ๆ ที่ใช้สายจำนวนมาก และใช้การเชื่อมต่อแบบขนาน มักเลือกที่จะแปลงให้เป็นการเชื่อมต่อแบบอนุกรมแทน จะทำให้ลดจำนวนสายลงไปได้ แต่อาจแลกมาด้วยความเร็วที่ต่ำลง การแปลงให้เป็นการเชื่อมต่ออนุกรมมักเลือกใช้บัสอยู่ 2 ประเภท คือ SPI และ I2C
SPI ถือเป็นการเชื่อมต่อแบบอนุกรมที่นิยมใช้งานมากสำหรับอุปกรณ์ที่ต้องการความเร็วสูง หรือถ่ายโอนข้อมูลปริมาณมาก เพราะ SPI มีขา DATA-IN DATA-OUT ชัดเจน (MOSI : Master-Out Slave-In, MISO : Master-In Slave-Out) และการรับ-ส่งข้อมูลมักมีความผิดพลาดน้อยและกำหนดความเร็วได้ เพราะมีขา SCK คอยบอกปลายทางเป็นตัวบอกจังหวะระหว่างกัน (เรียกว่าการสื่อสารแบบซิงค์โคนัส) โดยความถี่ SPI จะวัดจากขา SCK เป็นหลัก และเร่งความถี่ให้สูงที่สุดเท่าที่อุปกรณ์ปลายทางจะรับได้ เพราะยิ่งเร่งความถี่ขึ้นไปให้สูงเท่าไร การอ่ายโอนข้อมูลยังยิ่งเร็วมากยิ่งขึ้นเท่านั้น
เดิมแล้วจอ TFT LCD บางรุ่น บางผู้ผลิต จะมีการเชื่อมต่อแบบ SPI มาให้อยู่แล้ว ทำให้สามารถเชื่อมต่อผ่าน SPI เข้าไปได้เลย แต่สำหรับบทความนี้ได้เลือกใช้จอที่ไม่มี SPI มาในตัว ทำให้ต้องสร้างวงจรแปลงขึ้นมาเอง
การเชื่อมต่อแบบ I2C เป็นอีกหนึ่งบัสที่มีผู้ใช้งานมาก ตัวจอ Character LCD เองก็ใช้การเชื่อมต่อแบบนี้ โดยใช้ไอซี PCF8574 ในการแปลงการเชื่อมต่อแบบอนุกรมเป็น I2C
การเชื่อมต่อแบบ I2C ไม่เชิงว่าจะช้าไปกว่า SPI เพราะมีขา SCL เป็นตัวกำหนดจังหวะ และสามารถกำหนดความถี่ได้เองแบบอิสระ แต่ด้วยการสื่อสารที่ซับซ้อนมากกว่า SPI จึงทำให้การใช้บัส SPI เหมาะสมมากกว่าในกรณีนี้
ขาต่าง ๆ ของจอ TFT LCD
ก่อนที่เราจะไปเริ่มวงจรแปลงการเชื่อมต่ออนุกรมเป็น SPI สิ่งที่ต้องคำนึงถึงตัวอุปกรณ์เลย คือมีขาใดบ้างที่สามารถลดได้ แล้วไม่ทำให้ความเร็วในการทำงานโดยรวมลดลง โดยตัวจอ TFT LCD จะแบ่งขาใช้งานต่าง ๆ ได้ 2 กลุ่ม ดังนี้
จะเป็นขาที่นำหน้าด้วย D.. โดยจะใช้ในการรับ-ส่งข้อมูลแบบขนาน จำนวนขาของกลุ่มนี้มักจะเป็น 8 ขา หรือ 16 ขา แต่ในการส่งข้อมูลสี จะส่งที่ 16 บิตเหมือนกัน ดังนั้นหากมีขากลุ่มนี้ 8 ขา การส่งข้อมูลสีจะต้องส่ง 2 รอบ รอบละ 8 บิต เพื่อให้ครบ 16 บิต แต่หากมีขา 16 ขา จะส่งค่าสีไปทีเดียว 16 บิตเลย จำนวนขาของกลุ่มนี้จะสัมพันธ์กับความเร็วของจอโดยตรงในกรณีที่ใช้การเชื่อมต่อแบบขนาน เพราะระหว่างการส่งข้อมูล 8 บิต 2 รอบ กับส่งทีเดียว 16 บิต การส่งทีเดียว 16 บิตย่อมเร็วกว่าอยู่แล้ว แต่หากเป็นการเชื่อมต่อแบบอนุกรม แม้จะมีจำนวนขาเท่าใดก็แทบไม่มีผลกับความเร็วทั้งสิ้น เนื่องจากไม่ว่าจะเป็น 8 ขา หรือ 16 ขา ก็ต้องส่งที่ 16 บิตอยู่ดี (เพราะสีต้องส่ง 16 บิต)
ขากลุ่มนี้จะมีทั้งหมด 5 ขา ประกอบด้วยขาต่าง ๆ ที่มีหน้าที่ดังนี้
ขากลุ่มนี้จะสามารถลดได้สูงสุด 2 ขา คือ
ส่วนขาอื่น ๆ ยังจำเป็นต้องต่อเข้าที่ตัวไมโครคอนโทรลเลอร์เช่นเดิม
ไอซี 74HC595 เป็นไอซี Shift Register ที่ร้านนำมาจำหน่ายอยู่แล้ว ด้วยตัวถัง DIP-16 ทำให้ง่ายต่อการทดลองบนโพรโทบอร์ด หรือประกอบลงบนแผ่นปริ้นอเนกประสงค์ นอกจากนี้ยังไม่ต้องการอุปกรณ์ต่อร่วมอื่น ๆ ทำให้สามารถใช้งานได้ง่าย และไม่ยุ่งยากมากนัก
การต่อวงจร ให้ต่อได้ตามวงจรนี้
ในวงจรจะมีขาที่ไม่มีระบุไว้ คือขา 16 ของ 74HC595 เป็น VCC ให้รวมเข้ากับช่อง 5V ของจอ แล้วจ่ายแรงดัน 5V เข้าไปได้เลย ส่วนขา 8 เป็น GND ให้ต่อเข้ากับ GND ของ ESP32
ให้ต่อตามตารางต่อไปนี้
ชุดจอ + 74HC595 | ESP32 (NodeMCU-32S) |
---|---|
RST | GPIO26 |
CS | GPIO25 |
RS | GPIO33 |
SCK | GPIO14 |
MOSI | GPIO13 |
SS | GPIO15 |
3.3V | 3.3V |
5V | VIN |
GND | GND |
หรือดูรูปต่อไปนี้เทียบกับรูปที่ผ่านมา
เพื่อให้ง่ายต่อการใช้งาน และทดลองใช้กับไมโคร ฯ เบอร์อื่น ๆ ในโอกาศต่อไป ผู้เขียนจึงได้นำแผ่นปริ้นอเนกประสงค์ของ Arduino Uno มาใช้ โดยต่อวงจรลงไปบนบอร์ดให้เรียบร้อย สายที่ใช้เชื่อมต่อระหว่างจุดใช้สายวายแลป และใช้ Female Header 8Pin * 2 + Female Header 6Pin * 2 เป็นตัวกลาง เพื่อให้สามารถถอดตัวจอออกมาใช้กับอย่างอื่นได้
ต้นฉบับไลบรารี่มาจากของ Adafruit ทางร้านได้นำมาดัดแปลงให้สามารถใช้งานได้กับวงจรที่ใช้ SPI
ไลบรารี่สามารถดาวน์โหลดได้ที่ลิงค์ https://github.com/ioxhop/Adafruit-ILI9481-ESP32-SPI นำมาติดตั้งให้เรียบร้อย และหากยังไม่ได้ติดตั้งไลบรารี่ Adafruit_GFX จำเป็นต้องติดตั้งเพิ่มเติมด้วย จากนั้นเปิดตัวอย่าง graphicstest ได้เลย (ไม่ต้องกำหนดขา เพราะขาต่าง ๆ กำหนดไว้ในไลบรารี่แล้ว)
อัพโหลดโปรแกรมให้เรียบร้อย หากต่อวงจรทุกอย่างทุกต้อง ผลที่ได้จะเป็นไปตามวิดีโอด้านล่างนี้
เนื่องจากไลบรารี่ที่ร้านนำมาแก้ไขนั้น ได้สืบทอดเมธอตต่าง ๆ มาจากไลบรารี่ Adafruit_GFX มา หากท่านเคยใช้งานมาก่อนจะพบว่าไลบรารีนี้มีฟังก์ชั่นต่าง ๆ ที่เหมือนกันทุกประการ แต่หากท่านยังไม่เคยใช้งานจอ TFT LCD มาก่อน ท่านสามารถอ่านรายชื่อฟังก์ชั่นทั้งหมดได้ที่ https://github.com/adafruit/Adafruit-GFX-Library/blob/master/Adafruit_GFX.h (แนะนำให้ไล่ดูรายชื่อฟังก์ชั่นตั้งแต่บรรทัดที่ 19 เป็นต้นไป)
ในบทความนี้เราได้นำตัว 74HC595 มาเป็นตัวแปลงจากขา D0 - D7 ให้เป็น SPI เพื่อให้ต่อใช้งานกับ ESP32 ได้ง่ายมากยิ่งขึ้น ตัวไลบรารี่ที่ใช้งานดัดแปลงมาจากของ Adafruit ดังนั้นชื่อฟังก์ชั่นใช้งานจอ จะอ้างอิงอยู่กับไฟล์ Adafruit_GFX.h ซึ่งท่านสามารถศึกษารายละเอียดฟังก์ชั่นได้ด้วยตนเอง
สำหรับบทความนี้ก็มีเพียงเท่านี้ อาจจะเป็นบทความที่เป็นเชิงเทคนิคซักเล็กน้อย แต่รับรองได้ว่าบทความนี้จะเป็นประโยชน์ต่อท่านแน่นอน
~ สวัสดีครับ ~