วิธีการแสดงภาพบนจอ TFT LCD

การคลี่คลายความซับซ้อนของการแสดงภาพบนจอ TFT LCD เป็นเพียงเรื่องของการเชี่ยวชาญกระบวนการแปลงข้อมูลดิจิทัลให้เป็นจอแสดงผลภาพที่มีประสิทธิภาพ

วิธีการแสดงภาพบนจอ TFT LCD

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

การใช้งาน TFT LCD ที่นิยมใช้กันมากที่สุดคือการแสดงภาพ ทำให้เหมาะสำหรับโครงการต่างๆ เช่น กรอบรูปดิจิทัล ป้ายดิจิทัล และโครงการ DIY ในบทความนี้ เราจะแสดงวิธีแสดงภาพบน TFT LCD โดยใช้การ์ด SD และ Arduino Due

สิ่งที่คุณจะต้องมี

  • บอร์ดไมโครคอนโทรลเลอร์ Arduino Due
  • TFT 240x320 พร้อม ST7789VI หรือ IC เทียบเท่า ( NHD-2.4-240320AF-CSXP )
  • บอร์ดเบรกเอาต์ FFC 40 พิน ระยะห่าง 0.5 มม. ( NHD-FFC40 )
  • การ์ด SD
  • บอร์ดแยกการ์ด SD
  • แผงวงจร
  • สายจั๊มเปอร์
  • สาย USB สำหรับไมโครคอนโทรลเลอร์
  • ซอฟต์แวร์ Arduino IDE
  • ซอฟต์แวร์แปลงภาพ LCD

ตารางพินเอาต์

คำอธิบายพินเอาต์และการเชื่อมต่อแบบสมบูรณ์สำหรับการเชื่อมต่อระหว่าง TFT LCD, บอร์ดเบรกเอาต์การ์ด SD และ Arduino Due

TFT LCD และ Arduino กำหนดให้มี Pinout

พินเอาต์ของบอร์ดเบรกเอาต์การ์ด SD:

แผนผังการเดินสายไฟ

แผนผังสายไฟด้านล่างแสดงวิธีการเชื่อมต่อ TFT LCD และการ์ด SD เข้ากับ Arduino Due เพื่อแสดงกราฟิกและเข้าถึงการ์ด SD

แผนผังการเดินสายไฟระหว่าง TFT LCD, การ์ด SD และ Arduino เนื่องจากการแสดงภาพบนหน้าจอ

แปลงรูปภาพเป็นไฟล์ข้อความและบันทึกลงในการ์ด SD

จอ LCD ส่วนใหญ่ไม่แปลความหมายรูปแบบภาพมาตรฐาน เช่น JPEG หรือ PNG โดยตรง แต่จะใช้ข้อมูลพิกเซลดิบ ซึ่งมักแสดงในรูปแบบเลขฐานสิบหก ขั้นแรก เราต้องแปลงภาพเป็นอาร์เรย์ข้อมูลภาพโดยดาวน์โหลด ซอฟต์แวร์ LCD Image Converter และทำตามขั้นตอนเหล่านี้:

  1. เปิดซอฟต์แวร์ LCD Image Converter
  2. ไปที่ Image -> Import และเปิดภาพที่คุณต้องการแสดงบน LCD ความละเอียดของไฟล์ภาพจะต้องตรงกับความละเอียดของ LCD
  3. ไปที่ตัวเลือก -> การแปลง และตรวจสอบให้แน่ใจว่าได้เลือกค่าที่ตั้งไว้ล่วงหน้า “Color R5G6B5”
  4. คลิกที่แท็บ “Image” ในส่วน “Common” ให้ยกเลิกการเลือก “Split to rows” และตั้งค่าขนาดบล็อกเป็น “8 บิต”
  5. ที่ด้านซ้ายล่างของหน้าต่าง คลิก “แสดงตัวอย่าง”
  6. คัดลอกและวางค่าเลขฐานสิบหกลงในโปรแกรมแก้ไขข้อความและบันทึกไฟล์เป็น “image1.txt”
  7. ถ่ายโอนไฟล์ข้อความไปยังการ์ด SD และเสียบการ์ด SD เข้าไปในบอร์ดแยกส่วน

คัดลอกโค้ดตัวอย่างไปยัง Arduino IDE

เปิด Arduino IDE และเริ่ม Sketch ใหม่ ลบโค้ดที่มีอยู่ก่อนหน้านี้ จากนั้นคัดลอกและวางโค้ดที่ให้ไว้ด้านล่าง

#include <Wire.h>
#include <SPI.h>
#include <SD.h>
/****************************************************
*         PINOUT: Arduino Due -> 2.4" TFT           *
*****************************************************/
#define    RS   2     
#define    WR  11
const char slave = 0x38;
const int ChipSelect = 49;
int image_value = 0;
File myFile;
/****************************************************
*                 Function Commands                  *
******************************************************/
void comm_out(unsigned char c)
{
  PIOB -> PIO_CODR = 1 << 25;   //RS LOW
  REG_PIOC_ODSR = c << 1; 
  PIOD -> PIO_CODR = 1 << 7;    //WR LOW
  PIOD -> PIO_SODR = 1 << 7;    //WR HIGH
}
void data_out(unsigned char d)
{
  PIOB -> PIO_SODR = 1 << 25;   //RS HIGH
  REG_PIOC_ODSR = d << 1;
  PIOD -> PIO_CODR = 1 << 7;    //WR LOW
  PIOD -> PIO_SODR = 1 << 7;    //WR HIGH
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//  Window Set Function
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void window_set(unsigned s_x, unsigned e_x, unsigned s_y, unsigned e_y)
{
  comm_out(0x2a);    //SET column address
  data_out((s_x)>>8);     //SET start column address
  data_out(s_x);
  data_out((e_x)>>8);     //SET end column address
  data_out(e_x);
  comm_out(0x2b);    //SET page address
  data_out((s_y)>>8);     //SET start page address
  data_out(s_y);
  data_out((e_y)>>8);     //SET end page address
  data_out(e_y);
}
/****************************************************
*         Initialization and Setup Routine          *
*****************************************************/
void setup()
{
  delay(100);
  pinMode(RS,OUTPUT);  
  pinMode(WR,OUTPUT);  
  PIOC->PIO_OER = 0xFFFFFFFF;
  digitalWrite(WR, LOW);
  comm_out(0x28);  //display off
  comm_out(0x11);  //exit SLEEP mode
  delay(100);
  comm_out(0x36);  //MADCTL: memory data access control
  data_out(0x10);  //changing from 0x88
  comm_out(0x21);  //display inversion
  comm_out(0x3A);  //COLMOD: Interface Pixel format  *** 65K-colors in 16bit/pixel (5-6-5) format when using 16-bit interface to allow 1-byte per pixel
  data_out(0x55);  //0x55 = 65k   //0x65 = 262k
  comm_out(0xB2);  //PORCTRK: Porch setting
  data_out(0x0C);
  data_out(0x0C);
  data_out(0x00);
  data_out(0x33);
  data_out(0x33);
  comm_out(0xB7);  //GCTRL: Gate Control
  data_out(0x35);
  comm_out(0xBB);  //VCOMS: VCOM setting
  data_out(0x2B);
  comm_out(0xC0);  //LCMCTRL: LCM Control
  data_out(0x2C);
  comm_out(0xC2);  //VDVVRHEN: VDV and VRH Command Enable
  data_out(0x01);
  data_out(0xFF);
  comm_out(0xC3);  //VRHS: VRH Set
  data_out(0x11);
  comm_out(0xC4);  //VDVS: VDV Set
  data_out(0x20);
  comm_out(0xC6);  //FRCTRL2: Frame Rate control in normal mode
  data_out(0x0F);
  comm_out(0xD0);  //PWCTRL1: Power Control 1
  data_out(0xA4);
  data_out(0xA1);
  comm_out(0xE0);  //PVGAMCTRL: Positive Voltage Gamma control  
  data_out(0xD0);
  data_out(0x00);
  data_out(0x05);
  data_out(0x0E);
  data_out(0x15);
  data_out(0x0D);
  data_out(0x37);
  data_out(0x43);
  data_out(0x47);
  data_out(0x09);
  data_out(0x15);
  data_out(0x12);
  data_out(0x16);
  data_out(0x19);
  comm_out(0xE1);  //NVGAMCTRL: Negative Voltage Gamma control  
  data_out(0xD0);
  data_out(0x00);
  data_out(0x05);
  data_out(0x0D);
  data_out(0x0C);
  data_out(0x06);
  data_out(0x2D);
  data_out(0x44);
  data_out(0x40);
  data_out(0x0E);
  data_out(0x1C);
  data_out(0x18);
  data_out(0x16);
  data_out(0x19);
  comm_out(0x2A);  //X address set
  data_out(0x00);
  data_out(0x00);
  data_out(0x00);
  data_out(0xEF);
  comm_out(0x2B);  //Y address set
  data_out(0x00);
  data_out(0x00);
  data_out(0x01);
  data_out(0x3F);
  delay(10);
  comm_out(0x29);  //display ON
  delay(10);
  SD.begin(ChipSelect);
}
/*****************************************************
*           Loop Function, to run repeatedly         *
*****************************************************/
void loop()
{ 
  SD_Card_Image(1);
  delay(5000);
  //SD_Card_Image(2);
  //delay(5000);
  //SD_Card_Image(3);
  //delay(5000);
  //SD_Card_Image(4);
  //delay(5000);
  //SD_Card_Image(5);
  //delay(5000);
}
void SD_Card_Image(unsigned char image){       /*The images used are in a textfile*/
    unsigned char dummy;
    unsigned int incr =0;
    switch (image){
      case 1: 
        image_value=1;
        myFile = SD.open("image1.txt");  
        break;
      case 2:
        image_value=2;
        myFile =SD.open("image2.txt");    
        break;    
      case 3:
        image_value=3;
        myFile = SD.open("image3.txt");   
        break;     
      case 4:
        image_value=4;
        myFile = SD.open("image4.txt");   
        break; 
      case 5:
        image_value=5;
        myFile = SD.open("image5.txt");   
        break;           
    }
  comm_out(0x2A);  /*X address set*/
  data_out(0x00);
  data_out(0x00);
  data_out(0x00);
  data_out(0xEF);
  comm_out(0x2B);  /*Y address set*/
  data_out(0x00);
  data_out(0x00);
  data_out(0x01);
  data_out(0x3F);      
  comm_out(0x2C);  /*command to begin writing to frame memory     */
  byte  data_in1,data_in2,data_in,data_out_value;
  uint8_t data_send;
  char data_conv[1]={0};
  int i;  
  int track ;
  while (myFile.available()){ /*convert the input char data to integers*/
        dummy = myFile.read(); 
        dummy = myFile.read(); 
        data_in1 = myFile.read(); 
        data_in2 = myFile.read(); 
        data_in=data_in1;
        if(data_in >=48 && data_in<=57){    /*if values are in range of 0-9 values*/
            data_in1 = data_in-48;
            track=1;
          }
          if(data_in <=102 && data_in>=97){ /*if values are in range of a-f*/
            data_in1 = data_in - 87; 
            track=1;
          }
          if( data_in ==32/*Space*/ || data_in==44 /*comma*/ || data_in == 120 /*x*/){
            dummy =data_in;
            track=0;
            data_in1 =0;
            data_in2 =0;
          }      
        data_in=data_in2;
        if(data_in >=48 && data_in<=57){   /*if values are in range of 0-9 values*/
            data_in2 = data_in-48;
            track=1;
          }
          if(data_in <=102 && data_in>=97){/*if values are in range of a-f*/
            data_in2 = data_in - 87; 
            track=1;
          }
          if( data_in ==32/*Space*/ || data_in==44 /*comma*/ || data_in == 120 /*x*/){/*skip dummy data*/
            dummy =data_in;
            track=0;
            data_in1 =0;
            data_in2 =0;
          }              
        dummy = myFile.read(); 
        dummy = myFile.read();  
        data_out_value = data_in1<<4 | data_in2;  
        data_out(data_out_value);
      }
      myFile.close();   
}
	

อัพโหลดโค้ดไปยัง Arduino

ขั้นตอนสุดท้ายคือการอัปโหลดโค้ดไปยัง Arduino IDE

  1. เชื่อมต่อ Arduino เข้ากับพีซีของคุณด้วยสาย USB-B
  2. ใน Arduino IDE ให้เลือกบอร์ดและพอร์ต
  3. คลิกปุ่ม “อัปโหลด” เพื่อตั้งโปรแกรม Arduino ด้วยโค้ดของคุณ

เมื่ออัพโหลดรหัสสำเร็จแล้ว รูปภาพของคุณควรปรากฏบนหน้าจอ LCD

บทสรุป

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

วิธีการแสดงภาพบนจอ TFT LCD

การคลี่คลายความซับซ้อนของการแสดงภาพบนจอ TFT LCD เป็นเพียงเรื่องของการเชี่ยวชาญกระบวนการแปลงข้อมูลดิจิทัลให้เป็นจอแสดงผลภาพที่มีประสิทธิภาพ

นักเขียนบทความ
by 
นักเขียนบทความ
วิธีการแสดงภาพบนจอ TFT LCD

วิธีการแสดงภาพบนจอ TFT LCD

การคลี่คลายความซับซ้อนของการแสดงภาพบนจอ TFT LCD เป็นเพียงเรื่องของการเชี่ยวชาญกระบวนการแปลงข้อมูลดิจิทัลให้เป็นจอแสดงผลภาพที่มีประสิทธิภาพ

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

การใช้งาน TFT LCD ที่นิยมใช้กันมากที่สุดคือการแสดงภาพ ทำให้เหมาะสำหรับโครงการต่างๆ เช่น กรอบรูปดิจิทัล ป้ายดิจิทัล และโครงการ DIY ในบทความนี้ เราจะแสดงวิธีแสดงภาพบน TFT LCD โดยใช้การ์ด SD และ Arduino Due

สิ่งที่คุณจะต้องมี

  • บอร์ดไมโครคอนโทรลเลอร์ Arduino Due
  • TFT 240x320 พร้อม ST7789VI หรือ IC เทียบเท่า ( NHD-2.4-240320AF-CSXP )
  • บอร์ดเบรกเอาต์ FFC 40 พิน ระยะห่าง 0.5 มม. ( NHD-FFC40 )
  • การ์ด SD
  • บอร์ดแยกการ์ด SD
  • แผงวงจร
  • สายจั๊มเปอร์
  • สาย USB สำหรับไมโครคอนโทรลเลอร์
  • ซอฟต์แวร์ Arduino IDE
  • ซอฟต์แวร์แปลงภาพ LCD

ตารางพินเอาต์

คำอธิบายพินเอาต์และการเชื่อมต่อแบบสมบูรณ์สำหรับการเชื่อมต่อระหว่าง TFT LCD, บอร์ดเบรกเอาต์การ์ด SD และ Arduino Due

TFT LCD และ Arduino กำหนดให้มี Pinout

พินเอาต์ของบอร์ดเบรกเอาต์การ์ด SD:

แผนผังการเดินสายไฟ

แผนผังสายไฟด้านล่างแสดงวิธีการเชื่อมต่อ TFT LCD และการ์ด SD เข้ากับ Arduino Due เพื่อแสดงกราฟิกและเข้าถึงการ์ด SD

แผนผังการเดินสายไฟระหว่าง TFT LCD, การ์ด SD และ Arduino เนื่องจากการแสดงภาพบนหน้าจอ

แปลงรูปภาพเป็นไฟล์ข้อความและบันทึกลงในการ์ด SD

จอ LCD ส่วนใหญ่ไม่แปลความหมายรูปแบบภาพมาตรฐาน เช่น JPEG หรือ PNG โดยตรง แต่จะใช้ข้อมูลพิกเซลดิบ ซึ่งมักแสดงในรูปแบบเลขฐานสิบหก ขั้นแรก เราต้องแปลงภาพเป็นอาร์เรย์ข้อมูลภาพโดยดาวน์โหลด ซอฟต์แวร์ LCD Image Converter และทำตามขั้นตอนเหล่านี้:

  1. เปิดซอฟต์แวร์ LCD Image Converter
  2. ไปที่ Image -> Import และเปิดภาพที่คุณต้องการแสดงบน LCD ความละเอียดของไฟล์ภาพจะต้องตรงกับความละเอียดของ LCD
  3. ไปที่ตัวเลือก -> การแปลง และตรวจสอบให้แน่ใจว่าได้เลือกค่าที่ตั้งไว้ล่วงหน้า “Color R5G6B5”
  4. คลิกที่แท็บ “Image” ในส่วน “Common” ให้ยกเลิกการเลือก “Split to rows” และตั้งค่าขนาดบล็อกเป็น “8 บิต”
  5. ที่ด้านซ้ายล่างของหน้าต่าง คลิก “แสดงตัวอย่าง”
  6. คัดลอกและวางค่าเลขฐานสิบหกลงในโปรแกรมแก้ไขข้อความและบันทึกไฟล์เป็น “image1.txt”
  7. ถ่ายโอนไฟล์ข้อความไปยังการ์ด SD และเสียบการ์ด SD เข้าไปในบอร์ดแยกส่วน

คัดลอกโค้ดตัวอย่างไปยัง Arduino IDE

เปิด Arduino IDE และเริ่ม Sketch ใหม่ ลบโค้ดที่มีอยู่ก่อนหน้านี้ จากนั้นคัดลอกและวางโค้ดที่ให้ไว้ด้านล่าง

#include <Wire.h>
#include <SPI.h>
#include <SD.h>
/****************************************************
*         PINOUT: Arduino Due -> 2.4" TFT           *
*****************************************************/
#define    RS   2     
#define    WR  11
const char slave = 0x38;
const int ChipSelect = 49;
int image_value = 0;
File myFile;
/****************************************************
*                 Function Commands                  *
******************************************************/
void comm_out(unsigned char c)
{
  PIOB -> PIO_CODR = 1 << 25;   //RS LOW
  REG_PIOC_ODSR = c << 1; 
  PIOD -> PIO_CODR = 1 << 7;    //WR LOW
  PIOD -> PIO_SODR = 1 << 7;    //WR HIGH
}
void data_out(unsigned char d)
{
  PIOB -> PIO_SODR = 1 << 25;   //RS HIGH
  REG_PIOC_ODSR = d << 1;
  PIOD -> PIO_CODR = 1 << 7;    //WR LOW
  PIOD -> PIO_SODR = 1 << 7;    //WR HIGH
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//  Window Set Function
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void window_set(unsigned s_x, unsigned e_x, unsigned s_y, unsigned e_y)
{
  comm_out(0x2a);    //SET column address
  data_out((s_x)>>8);     //SET start column address
  data_out(s_x);
  data_out((e_x)>>8);     //SET end column address
  data_out(e_x);
  comm_out(0x2b);    //SET page address
  data_out((s_y)>>8);     //SET start page address
  data_out(s_y);
  data_out((e_y)>>8);     //SET end page address
  data_out(e_y);
}
/****************************************************
*         Initialization and Setup Routine          *
*****************************************************/
void setup()
{
  delay(100);
  pinMode(RS,OUTPUT);  
  pinMode(WR,OUTPUT);  
  PIOC->PIO_OER = 0xFFFFFFFF;
  digitalWrite(WR, LOW);
  comm_out(0x28);  //display off
  comm_out(0x11);  //exit SLEEP mode
  delay(100);
  comm_out(0x36);  //MADCTL: memory data access control
  data_out(0x10);  //changing from 0x88
  comm_out(0x21);  //display inversion
  comm_out(0x3A);  //COLMOD: Interface Pixel format  *** 65K-colors in 16bit/pixel (5-6-5) format when using 16-bit interface to allow 1-byte per pixel
  data_out(0x55);  //0x55 = 65k   //0x65 = 262k
  comm_out(0xB2);  //PORCTRK: Porch setting
  data_out(0x0C);
  data_out(0x0C);
  data_out(0x00);
  data_out(0x33);
  data_out(0x33);
  comm_out(0xB7);  //GCTRL: Gate Control
  data_out(0x35);
  comm_out(0xBB);  //VCOMS: VCOM setting
  data_out(0x2B);
  comm_out(0xC0);  //LCMCTRL: LCM Control
  data_out(0x2C);
  comm_out(0xC2);  //VDVVRHEN: VDV and VRH Command Enable
  data_out(0x01);
  data_out(0xFF);
  comm_out(0xC3);  //VRHS: VRH Set
  data_out(0x11);
  comm_out(0xC4);  //VDVS: VDV Set
  data_out(0x20);
  comm_out(0xC6);  //FRCTRL2: Frame Rate control in normal mode
  data_out(0x0F);
  comm_out(0xD0);  //PWCTRL1: Power Control 1
  data_out(0xA4);
  data_out(0xA1);
  comm_out(0xE0);  //PVGAMCTRL: Positive Voltage Gamma control  
  data_out(0xD0);
  data_out(0x00);
  data_out(0x05);
  data_out(0x0E);
  data_out(0x15);
  data_out(0x0D);
  data_out(0x37);
  data_out(0x43);
  data_out(0x47);
  data_out(0x09);
  data_out(0x15);
  data_out(0x12);
  data_out(0x16);
  data_out(0x19);
  comm_out(0xE1);  //NVGAMCTRL: Negative Voltage Gamma control  
  data_out(0xD0);
  data_out(0x00);
  data_out(0x05);
  data_out(0x0D);
  data_out(0x0C);
  data_out(0x06);
  data_out(0x2D);
  data_out(0x44);
  data_out(0x40);
  data_out(0x0E);
  data_out(0x1C);
  data_out(0x18);
  data_out(0x16);
  data_out(0x19);
  comm_out(0x2A);  //X address set
  data_out(0x00);
  data_out(0x00);
  data_out(0x00);
  data_out(0xEF);
  comm_out(0x2B);  //Y address set
  data_out(0x00);
  data_out(0x00);
  data_out(0x01);
  data_out(0x3F);
  delay(10);
  comm_out(0x29);  //display ON
  delay(10);
  SD.begin(ChipSelect);
}
/*****************************************************
*           Loop Function, to run repeatedly         *
*****************************************************/
void loop()
{ 
  SD_Card_Image(1);
  delay(5000);
  //SD_Card_Image(2);
  //delay(5000);
  //SD_Card_Image(3);
  //delay(5000);
  //SD_Card_Image(4);
  //delay(5000);
  //SD_Card_Image(5);
  //delay(5000);
}
void SD_Card_Image(unsigned char image){       /*The images used are in a textfile*/
    unsigned char dummy;
    unsigned int incr =0;
    switch (image){
      case 1: 
        image_value=1;
        myFile = SD.open("image1.txt");  
        break;
      case 2:
        image_value=2;
        myFile =SD.open("image2.txt");    
        break;    
      case 3:
        image_value=3;
        myFile = SD.open("image3.txt");   
        break;     
      case 4:
        image_value=4;
        myFile = SD.open("image4.txt");   
        break; 
      case 5:
        image_value=5;
        myFile = SD.open("image5.txt");   
        break;           
    }
  comm_out(0x2A);  /*X address set*/
  data_out(0x00);
  data_out(0x00);
  data_out(0x00);
  data_out(0xEF);
  comm_out(0x2B);  /*Y address set*/
  data_out(0x00);
  data_out(0x00);
  data_out(0x01);
  data_out(0x3F);      
  comm_out(0x2C);  /*command to begin writing to frame memory     */
  byte  data_in1,data_in2,data_in,data_out_value;
  uint8_t data_send;
  char data_conv[1]={0};
  int i;  
  int track ;
  while (myFile.available()){ /*convert the input char data to integers*/
        dummy = myFile.read(); 
        dummy = myFile.read(); 
        data_in1 = myFile.read(); 
        data_in2 = myFile.read(); 
        data_in=data_in1;
        if(data_in >=48 && data_in<=57){    /*if values are in range of 0-9 values*/
            data_in1 = data_in-48;
            track=1;
          }
          if(data_in <=102 && data_in>=97){ /*if values are in range of a-f*/
            data_in1 = data_in - 87; 
            track=1;
          }
          if( data_in ==32/*Space*/ || data_in==44 /*comma*/ || data_in == 120 /*x*/){
            dummy =data_in;
            track=0;
            data_in1 =0;
            data_in2 =0;
          }      
        data_in=data_in2;
        if(data_in >=48 && data_in<=57){   /*if values are in range of 0-9 values*/
            data_in2 = data_in-48;
            track=1;
          }
          if(data_in <=102 && data_in>=97){/*if values are in range of a-f*/
            data_in2 = data_in - 87; 
            track=1;
          }
          if( data_in ==32/*Space*/ || data_in==44 /*comma*/ || data_in == 120 /*x*/){/*skip dummy data*/
            dummy =data_in;
            track=0;
            data_in1 =0;
            data_in2 =0;
          }              
        dummy = myFile.read(); 
        dummy = myFile.read();  
        data_out_value = data_in1<<4 | data_in2;  
        data_out(data_out_value);
      }
      myFile.close();   
}
	

อัพโหลดโค้ดไปยัง Arduino

ขั้นตอนสุดท้ายคือการอัปโหลดโค้ดไปยัง Arduino IDE

  1. เชื่อมต่อ Arduino เข้ากับพีซีของคุณด้วยสาย USB-B
  2. ใน Arduino IDE ให้เลือกบอร์ดและพอร์ต
  3. คลิกปุ่ม “อัปโหลด” เพื่อตั้งโปรแกรม Arduino ด้วยโค้ดของคุณ

เมื่ออัพโหลดรหัสสำเร็จแล้ว รูปภาพของคุณควรปรากฏบนหน้าจอ LCD

บทสรุป

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

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

วิธีการแสดงภาพบนจอ TFT LCD

วิธีการแสดงภาพบนจอ TFT LCD

การคลี่คลายความซับซ้อนของการแสดงภาพบนจอ TFT LCD เป็นเพียงเรื่องของการเชี่ยวชาญกระบวนการแปลงข้อมูลดิจิทัลให้เป็นจอแสดงผลภาพที่มีประสิทธิภาพ

Lorem ipsum dolor amet consectetur adipiscing elit tortor massa arcu non.

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

การใช้งาน TFT LCD ที่นิยมใช้กันมากที่สุดคือการแสดงภาพ ทำให้เหมาะสำหรับโครงการต่างๆ เช่น กรอบรูปดิจิทัล ป้ายดิจิทัล และโครงการ DIY ในบทความนี้ เราจะแสดงวิธีแสดงภาพบน TFT LCD โดยใช้การ์ด SD และ Arduino Due

สิ่งที่คุณจะต้องมี

  • บอร์ดไมโครคอนโทรลเลอร์ Arduino Due
  • TFT 240x320 พร้อม ST7789VI หรือ IC เทียบเท่า ( NHD-2.4-240320AF-CSXP )
  • บอร์ดเบรกเอาต์ FFC 40 พิน ระยะห่าง 0.5 มม. ( NHD-FFC40 )
  • การ์ด SD
  • บอร์ดแยกการ์ด SD
  • แผงวงจร
  • สายจั๊มเปอร์
  • สาย USB สำหรับไมโครคอนโทรลเลอร์
  • ซอฟต์แวร์ Arduino IDE
  • ซอฟต์แวร์แปลงภาพ LCD

ตารางพินเอาต์

คำอธิบายพินเอาต์และการเชื่อมต่อแบบสมบูรณ์สำหรับการเชื่อมต่อระหว่าง TFT LCD, บอร์ดเบรกเอาต์การ์ด SD และ Arduino Due

TFT LCD และ Arduino กำหนดให้มี Pinout

พินเอาต์ของบอร์ดเบรกเอาต์การ์ด SD:

แผนผังการเดินสายไฟ

แผนผังสายไฟด้านล่างแสดงวิธีการเชื่อมต่อ TFT LCD และการ์ด SD เข้ากับ Arduino Due เพื่อแสดงกราฟิกและเข้าถึงการ์ด SD

แผนผังการเดินสายไฟระหว่าง TFT LCD, การ์ด SD และ Arduino เนื่องจากการแสดงภาพบนหน้าจอ

แปลงรูปภาพเป็นไฟล์ข้อความและบันทึกลงในการ์ด SD

จอ LCD ส่วนใหญ่ไม่แปลความหมายรูปแบบภาพมาตรฐาน เช่น JPEG หรือ PNG โดยตรง แต่จะใช้ข้อมูลพิกเซลดิบ ซึ่งมักแสดงในรูปแบบเลขฐานสิบหก ขั้นแรก เราต้องแปลงภาพเป็นอาร์เรย์ข้อมูลภาพโดยดาวน์โหลด ซอฟต์แวร์ LCD Image Converter และทำตามขั้นตอนเหล่านี้:

  1. เปิดซอฟต์แวร์ LCD Image Converter
  2. ไปที่ Image -> Import และเปิดภาพที่คุณต้องการแสดงบน LCD ความละเอียดของไฟล์ภาพจะต้องตรงกับความละเอียดของ LCD
  3. ไปที่ตัวเลือก -> การแปลง และตรวจสอบให้แน่ใจว่าได้เลือกค่าที่ตั้งไว้ล่วงหน้า “Color R5G6B5”
  4. คลิกที่แท็บ “Image” ในส่วน “Common” ให้ยกเลิกการเลือก “Split to rows” และตั้งค่าขนาดบล็อกเป็น “8 บิต”
  5. ที่ด้านซ้ายล่างของหน้าต่าง คลิก “แสดงตัวอย่าง”
  6. คัดลอกและวางค่าเลขฐานสิบหกลงในโปรแกรมแก้ไขข้อความและบันทึกไฟล์เป็น “image1.txt”
  7. ถ่ายโอนไฟล์ข้อความไปยังการ์ด SD และเสียบการ์ด SD เข้าไปในบอร์ดแยกส่วน

คัดลอกโค้ดตัวอย่างไปยัง Arduino IDE

เปิด Arduino IDE และเริ่ม Sketch ใหม่ ลบโค้ดที่มีอยู่ก่อนหน้านี้ จากนั้นคัดลอกและวางโค้ดที่ให้ไว้ด้านล่าง

#include <Wire.h>
#include <SPI.h>
#include <SD.h>
/****************************************************
*         PINOUT: Arduino Due -> 2.4" TFT           *
*****************************************************/
#define    RS   2     
#define    WR  11
const char slave = 0x38;
const int ChipSelect = 49;
int image_value = 0;
File myFile;
/****************************************************
*                 Function Commands                  *
******************************************************/
void comm_out(unsigned char c)
{
  PIOB -> PIO_CODR = 1 << 25;   //RS LOW
  REG_PIOC_ODSR = c << 1; 
  PIOD -> PIO_CODR = 1 << 7;    //WR LOW
  PIOD -> PIO_SODR = 1 << 7;    //WR HIGH
}
void data_out(unsigned char d)
{
  PIOB -> PIO_SODR = 1 << 25;   //RS HIGH
  REG_PIOC_ODSR = d << 1;
  PIOD -> PIO_CODR = 1 << 7;    //WR LOW
  PIOD -> PIO_SODR = 1 << 7;    //WR HIGH
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//  Window Set Function
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void window_set(unsigned s_x, unsigned e_x, unsigned s_y, unsigned e_y)
{
  comm_out(0x2a);    //SET column address
  data_out((s_x)>>8);     //SET start column address
  data_out(s_x);
  data_out((e_x)>>8);     //SET end column address
  data_out(e_x);
  comm_out(0x2b);    //SET page address
  data_out((s_y)>>8);     //SET start page address
  data_out(s_y);
  data_out((e_y)>>8);     //SET end page address
  data_out(e_y);
}
/****************************************************
*         Initialization and Setup Routine          *
*****************************************************/
void setup()
{
  delay(100);
  pinMode(RS,OUTPUT);  
  pinMode(WR,OUTPUT);  
  PIOC->PIO_OER = 0xFFFFFFFF;
  digitalWrite(WR, LOW);
  comm_out(0x28);  //display off
  comm_out(0x11);  //exit SLEEP mode
  delay(100);
  comm_out(0x36);  //MADCTL: memory data access control
  data_out(0x10);  //changing from 0x88
  comm_out(0x21);  //display inversion
  comm_out(0x3A);  //COLMOD: Interface Pixel format  *** 65K-colors in 16bit/pixel (5-6-5) format when using 16-bit interface to allow 1-byte per pixel
  data_out(0x55);  //0x55 = 65k   //0x65 = 262k
  comm_out(0xB2);  //PORCTRK: Porch setting
  data_out(0x0C);
  data_out(0x0C);
  data_out(0x00);
  data_out(0x33);
  data_out(0x33);
  comm_out(0xB7);  //GCTRL: Gate Control
  data_out(0x35);
  comm_out(0xBB);  //VCOMS: VCOM setting
  data_out(0x2B);
  comm_out(0xC0);  //LCMCTRL: LCM Control
  data_out(0x2C);
  comm_out(0xC2);  //VDVVRHEN: VDV and VRH Command Enable
  data_out(0x01);
  data_out(0xFF);
  comm_out(0xC3);  //VRHS: VRH Set
  data_out(0x11);
  comm_out(0xC4);  //VDVS: VDV Set
  data_out(0x20);
  comm_out(0xC6);  //FRCTRL2: Frame Rate control in normal mode
  data_out(0x0F);
  comm_out(0xD0);  //PWCTRL1: Power Control 1
  data_out(0xA4);
  data_out(0xA1);
  comm_out(0xE0);  //PVGAMCTRL: Positive Voltage Gamma control  
  data_out(0xD0);
  data_out(0x00);
  data_out(0x05);
  data_out(0x0E);
  data_out(0x15);
  data_out(0x0D);
  data_out(0x37);
  data_out(0x43);
  data_out(0x47);
  data_out(0x09);
  data_out(0x15);
  data_out(0x12);
  data_out(0x16);
  data_out(0x19);
  comm_out(0xE1);  //NVGAMCTRL: Negative Voltage Gamma control  
  data_out(0xD0);
  data_out(0x00);
  data_out(0x05);
  data_out(0x0D);
  data_out(0x0C);
  data_out(0x06);
  data_out(0x2D);
  data_out(0x44);
  data_out(0x40);
  data_out(0x0E);
  data_out(0x1C);
  data_out(0x18);
  data_out(0x16);
  data_out(0x19);
  comm_out(0x2A);  //X address set
  data_out(0x00);
  data_out(0x00);
  data_out(0x00);
  data_out(0xEF);
  comm_out(0x2B);  //Y address set
  data_out(0x00);
  data_out(0x00);
  data_out(0x01);
  data_out(0x3F);
  delay(10);
  comm_out(0x29);  //display ON
  delay(10);
  SD.begin(ChipSelect);
}
/*****************************************************
*           Loop Function, to run repeatedly         *
*****************************************************/
void loop()
{ 
  SD_Card_Image(1);
  delay(5000);
  //SD_Card_Image(2);
  //delay(5000);
  //SD_Card_Image(3);
  //delay(5000);
  //SD_Card_Image(4);
  //delay(5000);
  //SD_Card_Image(5);
  //delay(5000);
}
void SD_Card_Image(unsigned char image){       /*The images used are in a textfile*/
    unsigned char dummy;
    unsigned int incr =0;
    switch (image){
      case 1: 
        image_value=1;
        myFile = SD.open("image1.txt");  
        break;
      case 2:
        image_value=2;
        myFile =SD.open("image2.txt");    
        break;    
      case 3:
        image_value=3;
        myFile = SD.open("image3.txt");   
        break;     
      case 4:
        image_value=4;
        myFile = SD.open("image4.txt");   
        break; 
      case 5:
        image_value=5;
        myFile = SD.open("image5.txt");   
        break;           
    }
  comm_out(0x2A);  /*X address set*/
  data_out(0x00);
  data_out(0x00);
  data_out(0x00);
  data_out(0xEF);
  comm_out(0x2B);  /*Y address set*/
  data_out(0x00);
  data_out(0x00);
  data_out(0x01);
  data_out(0x3F);      
  comm_out(0x2C);  /*command to begin writing to frame memory     */
  byte  data_in1,data_in2,data_in,data_out_value;
  uint8_t data_send;
  char data_conv[1]={0};
  int i;  
  int track ;
  while (myFile.available()){ /*convert the input char data to integers*/
        dummy = myFile.read(); 
        dummy = myFile.read(); 
        data_in1 = myFile.read(); 
        data_in2 = myFile.read(); 
        data_in=data_in1;
        if(data_in >=48 && data_in<=57){    /*if values are in range of 0-9 values*/
            data_in1 = data_in-48;
            track=1;
          }
          if(data_in <=102 && data_in>=97){ /*if values are in range of a-f*/
            data_in1 = data_in - 87; 
            track=1;
          }
          if( data_in ==32/*Space*/ || data_in==44 /*comma*/ || data_in == 120 /*x*/){
            dummy =data_in;
            track=0;
            data_in1 =0;
            data_in2 =0;
          }      
        data_in=data_in2;
        if(data_in >=48 && data_in<=57){   /*if values are in range of 0-9 values*/
            data_in2 = data_in-48;
            track=1;
          }
          if(data_in <=102 && data_in>=97){/*if values are in range of a-f*/
            data_in2 = data_in - 87; 
            track=1;
          }
          if( data_in ==32/*Space*/ || data_in==44 /*comma*/ || data_in == 120 /*x*/){/*skip dummy data*/
            dummy =data_in;
            track=0;
            data_in1 =0;
            data_in2 =0;
          }              
        dummy = myFile.read(); 
        dummy = myFile.read();  
        data_out_value = data_in1<<4 | data_in2;  
        data_out(data_out_value);
      }
      myFile.close();   
}
	

อัพโหลดโค้ดไปยัง Arduino

ขั้นตอนสุดท้ายคือการอัปโหลดโค้ดไปยัง Arduino IDE

  1. เชื่อมต่อ Arduino เข้ากับพีซีของคุณด้วยสาย USB-B
  2. ใน Arduino IDE ให้เลือกบอร์ดและพอร์ต
  3. คลิกปุ่ม “อัปโหลด” เพื่อตั้งโปรแกรม Arduino ด้วยโค้ดของคุณ

เมื่ออัพโหลดรหัสสำเร็จแล้ว รูปภาพของคุณควรปรากฏบนหน้าจอ LCD

บทสรุป

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