บันทึกผลการศึกษาเรื่องจอ LCD TFT ลึกระดับปานกลาง

ก่อนอื่นต้องขอบอกขอบเขตของบันทึกนี้ก่อนนะครับ

บันทึกนี้เป็นบันทึกที่จะใช้ “รื้อฟื้น” ความรู้ทั้งหมดที่ได้ศึกษาในช่วงนี้ เนื่องจากข้อมูลที่เข้ามาในแต่ละวันมีมากมายเหลือเกิน จึงเป็นเรื่องปกติที่มนุษย์เราจะพยายามลืมบางอย่างเพื่อให้สมองไม่บอบช้ำ การแก้ปัญหาของผมจึงเน้นไปที่การเขียนบทความในสิ่งที่ตกเองรู้ แล้วเผยแพร่ออกสู่สาธาณะ เพื่อให้มั่นใจได้ว่า ความรู้ที่มีอยู่จะไม่สูญหาย และสามารถเรียกกลับมาใช้ได้ตลอดเวลา

สำหรับขอบเขตบันทึกนี้ที่ได้บอกไว้ว่าเป็นความลึกเกี่ยวกับจอ LCD TFT ระดับกลาง คือ จะไม่เจาะลึกลงไปถึงหลักการทำงาน แต่จะมองแค่ผิว มองแค่วิธีสั่งงาน มองที่จำนวนขา และมองที่วงจรไดร์ สุดท้ายจึงมองที่โค้ด และข้อมูลที่ใช้ส่งให้จอสามารถทำงานได้

จอ LCD TFT แบบ RGB มีทั้งแบบส่งข้อมูลทีละ 8 บิต และ 16 บิต

ข้อมูลที่ส่งเข้าไปจะขึ้นอยู่กับจำนวนขาของจอ LCD รุ่นนั้น ๆ ตัวอย่างเช่น จอรุ่น ILI9481 แบบโมดูลสำเร็จรูปที่ใช้กับบอร์ด Arduino Uno หรือบอร์ดที่ตำแหน่งขาเทียบเท่า จะใช้ขา Data ทั้งหมด 8 บิต แต่สำหรับจอรุ่น ILI9486 แบบโมดูลสำเร็จรูปที่ใช้กับ R pi จะใช้ขา Data ทั้งหมด 16 บิต (แต่ผ่านวงจรไดร์แบบ SPI ก่อน)

จอรุ่น ILI9481 แบบโมดูลสำเร็จรูปจาก elecrow

จอรุ่น ILI9486 แบบโมดูลสำเร็จรูปจาก waveshare และเจ้าอื่น ๆ ที่ก๊อบมา (มีทัช)

ขาอื่น ๆ ที่เกี่ยวข้องกับการสั่งงาน

จอ LCD TFT จะมีขาอื่น ๆ เพิ่มเติมที่เกี่ยวข้องกับการควบคุมข้อมูลเข้าออกตัวจอ LCD โดยมีรายละเอียดแยกตามขาดังนี้

ขา RD

ใช้ควบคุมการอ่าน / เขียนข้อมูลเข้าที่จอ โดยหาขานี้มีลอจิกเป็น 1 จะใช้โหมดเขียนข้อมูลแต่ถ้าเป็น 0 จะใช้โหมดอ่านข้อมูลออกจากจอ

ขา WR

เทียบได้กับขา EN บน Character LCD ทำหน้าที่ควบคุมให้จอรับข้อมูลเข้าไป หรือส่งข้อมูลออกมา โดยปกติแล้วจะมีลอจิกเป็น 1 แต่เมื่อมีลอจิกเป็น 0 เมื่อไร จอจะรับข้อมูลเข้า / ส่งข้อมูลออกทันที

ขา RS

ใช้บอกว่าข้อมูลนั้น ๆ ที่กำลังส่งให้จอ เป็นคำสั่ง หรือข้อมูล โดยหากเป็นลอจิก 0 จะเป็นคำสั่ง และหากเป็นลอจิก 1 จะเป็นข้อมูล

ขา CS

ใช้สั่งให้จออยู่ในสถานะพร้อมรับข้อมูลเข้า / ส่งข้อมูลออก โดยปกติแล้วเมื่อจะรับ-ส่งข้อมูลจะเซ็ตเป็นลอจิก 0 และจะเซ็ตเป็น 1 เมื่อต้องการปิดการทำงานของจอ (แต่จอยังคงแสดงผลตามเดิม แค่ในขณะเป็นลอจิก 1 จะไม่สามารถรับ-ส่งข้อมูลใด ๆ ได้)

ขา RST

ใช้รีเซ็ตการทำงานของจอ แต่อย่าลืมว่าจะรีเซ็ตเฉพาะตัวจอ ข้อมูลที่เขียนลงแรมของจอไปแล้ว จะยังคงอยู่ ทำให้ต่อให้รีเซ็ตจอ ภาพที่เคยส่งไปก่อนหน้านี้ก็จะยังอยู่ แต่เข้าใจว่า จะใช้ยกเลิกการรับ-ส่งข้อมูลที่ไม่สมบูรณ์ขณะนั้นได้

การเขียนโปรแกรมสั่งงานจอ

ก่อนอื่น ให้พยามหาโค้ดตัวอย่างง่าย ๆ ของจอรรุ่นนั้น ๆ ก่อน ที่ใช้กับไมโครที่ทำงานง่าย ๆ ไม่ซัพซ้อนมาก เช่น PIC เป็นต้น สำหรับตัวอย่าง Arduino ก็ใช้ได้ แต่ไม่ควรเป็นไลบารี่สำเร็จมาเลย เพราะจะไล่โค้ดได้ยากมาก (ใช้ไฟล์ .ino ไฟล์เดียวมาทดสอบจะดีกว่า)

การใช้งานจอ LCD TFT ทุกครั้ง จะต้องมีการส่งคำสั่งจำนวนหนึ่งออกไปก่อน เพื่อให้จออยู่ในสถานะพร้อมใช้งานก่อน โดยปกติแล้วพวกชุดคำสั่งที่ใช้สั่งให้จอทำงานได้จะอยู่ในรูปแบบอาเรย์ ที่จะรวมคำสั่ง และข้อมูลที่ต้องส่งใว้ในอาเรย์เดียวกัน และภายในอาเรย์นั้น ยังมีการออกแบบให้สามารถหน่วงเวลาได้ด้วย ซึ่งสามารถเข้าไปดูโค้ดได้ที่ https://github.com/notro/fbtft โดยให้หาชื่อรุ่นของจอที่ต้องการ

 

ลักษะณะของการส่งข้อมูล

คำสั่งจะส่งเป็น 8 บิตเสมอ

ข้อมูลที่ใช้ในการเริ่มต้นจอ จะใช้การส่งข้อมูลครั้งเดียวขนาด 8 บิต

ข้อมูลสี จะต้องส่งทีละ 8 บิต จำนวน 2 รอบ หรือส่งทีละ 16 บิต จำนวน 1 รอบ

วงจรแปลงการส่งข้อมูลแบบขนาน เป็นอนุกรม

จะใช้พวกไอซี shift register เข้ามาช่วย และอาจจะมีไอซีลอจิกอื่นเข้ามาร่วมเพื่อให้ลดการใช้สายสัญญาณลง ทั้งนี้วงจรให้เข้าไปดูได้ที่ https://github.com/notro/fbtft/wiki/SPI-interface-circuit แต่หากเป็นจอที่ใช้สายสัญญาณข้อมูล 8 เส้น สามารถใช้ 74HC595 ที่คุ้นเคยกว่าได้เลย

ไลบารี่ที่นำไปแก้ไขได้ง่ายเพื่อใช้กับ Arduino

ใช้ไลบารี่ Adafruit_ILI9486_STM32 เป็นต้นแบบ เพื่อนำมาแก้ไขส่วนโค้ดสั่งเริ่มต้นใช้งานจอ รูปแบบการส่งข้อมูล (แบบขนาน หรือ SPI) เข้าไปดูได้ที่ https://github.com/stevstrong/Adafruit_ILI9486_STM32

ต่อวงจรใช้จอ ILI9481 กับ Arduino

เนื่องจากโมดูลสำเร็จรูปบอกขามาชัดเจนมาก จึงไม่มีปัญหากับการเชื่อมต่อสาย

ต่อวงจรใช้จอ ILI9486 กับ Arduino

ข้อเสียคือ ต้องใช้จอ ILI9486 เข้ากับไมโคร ฯ ที่ใช้แรงดันไฟฟ้า 3.3V เท่านั้น มิฉนั้นไอซีดิจิตอลจะไม่ทำงาน ส่วนตำแหน่งขาเป็นไปดังรูปด้านล่าง

เว็บขายเฉพาะตัวจอ ไม่ประกอบลงโมดูล

เลือกขนาดจอที่ต้องการได้เลย บางจอรองรับ SPI มาในตัวด้วย จึงควรเลือกตัวนั้นเพราะไม่ต้องมายุ่งยากเรื่องวงจรภายหลัง : http://www.buydisplay.com/