พัฒนา Touch Screen Application บน ARM7 LPC2378 ด้วยบอร์ดทดลอง BlueScreen และ บน ARM7 LPC2478 ด้วยบอร์ดทดลอง BlueScreen SUN article

Download บทความ PDF  ,  อบรมการเขียนโปรแกรม ARM7 ควบคุม TFT Touch Screen

           เทคโนโลยีระบบสัมผัส (Touch screen) นับวันจะยิ่งมีบทบาทในชีวิตประจำวันมากขึ้น เพราะปุ่มกดแบบเก่าจะมีปุ่มตายตัว ไม่สามารถใส่ลูกเล่นลงไปได้ อีกทั้งยังเปลืองพื้นที่ของอุปกรณ์ คราวนี้ลองจินตนาการว่าถ้านำเอาเทคโนโลยีนี้ มาประยุกต์ใช้กับงาน Embedded System ของคุณ จะช่วยเพิ่มมูลค่าของชิ้นงานได้ขนาดไหน

แนะนำ BlueScreen และ Bluescreen SUN
(Download Source Code ARM7 ฟรี ที่รหัสสินค้า ETEE009 , ETEE012)

             บอร์ด BlueScreen (รหัสสินค้า ETEE009) ได้ถูกพัฒนาขึ้น เพื่อเป็นต้นแบบสำหรับพัฒนาการใช้งานระบบสัมผัส โดยที่ผู้ใช้สามารถนำไปพัฒนาต่อยอดได้ทันที มีฟังก์ชั่นพื้นฐานที่ใช้ควบคุมฮาร์ดแวร์ ระบบควบคุมออบเจ็คต์บนหน้าจอ และออบเจ็คต์พื้นฐาน ได้แก่ ปุ่มกด แป้นคีย์ แป้นตัวเลข กล่องข้อความ Checkbox และ Radio button ให้ใช้งาน โดยผู้ใช้ เพียงแค่เรียกใช้ออบเจ็คต์เหล่านี้ กำหนดตำแหน่ง ขนาด และคุณสมบัติอื่นๆ ตามแต่ชนิดของออบเจ็คต์นั้นๆ นอกจากนี้หากต้องการปรับแต่งรูปลักษณ์ต่างๆ ก็สามารถทำการแก้ไขซอร์สโค้ดเองได้ นอกจากนี้ หากต้องการใช้กับจอที่มีขนาดใหญ่ขึ้น บอร์ด BlueScreen SUN ( ETEE012   ,ETEE012 with Ethernet ) ก็ได้ถูกออกแบบมาเพื่อใช้กับจอสัมผัสขนาด 4.3 นิ้ว และ 7 นิ้ว โดยใช้ไลบรารีเกี่ยวกับการแสดงผล และประมวลผลต่างๆร่วมกัน โดยบอร์ด BlueScreen มีไมโครคอนโทรลเลอร์บนบอร์ด เบอร์ LPC2378 ส่วน BlueScreen SUN จะเป็นเบอร์ LPC2478 ซึ่งทั้งสองเบอร์นี้ ใช้สถาปัตยกรรม ARM7 จากค่าย NXP

Bluescreen – ARM7 LPC2378 with 2.8 inch QVGA TFT LCD Touch Screen

             BlueScreen  และ BlueScreen SUN สามารถใช้ Software Keil , IAR , Rowley Crossworks , และ Eclipse IDE ในการพัฒนา (ThaiEasyElec.com มีตัวอย่างรองรับ เฉพาะ Keil , Rowley Crossworks , และ Eclipse IDE )  ซึ่งในส่วน BlueScreen จะมี  Serial , SPI , I2C interface , Mini-B USB connector ,  16 GPIO สามารถโปรแกรมผ่าน Jtag  เพื่อประยุกต์ใช้ในการพัฒนางานต่าง ๆ กับจอ 2.8 นิ้ว TFT Touch Screen

ARM7 LPC2478 with 4.3 / 7 TFT Touch Screen – Bluescreen SUN

ARM7 LPC2478 with 4.3 / 7 TFT Touch Screen – Bluescreen SUN

            สำหรับ BlueScreen SUN นอกจากสามารถต่อออกจอ TFT LCD Touch Screen 4.3 นิ้ว หรือ 7 นิ้ว  มี SDRAM 64MB , มี USB (Host  1 ชุด , Device 1 ชุด) , มี SD Card 1 ช่องที่ รองรับ High Capacity (HC Type) สูงสุด 16GB , มี Serial Port  2 ชุด  , SPI, I2C, ADC, RTC , GPIO และ สามารถโปรแกรมผ่าน Jtag รวมทั้งรองรับระบบปฎิบัติการ  uCLinux

             บทความนี้จะเป็นตัวอธิบายการใช้งานไลบรารี และฟังก์ชั่นต่างๆ สำหรับควบคุมหน้าจอ โดยก่อนอื่น ให้ดูตัวอย่างการใช้งานจริงจากคลิบวิดิโอใน ThaiEasyElec Youtube (ตัวอย่าง Clip Video ของ Bluescreen และ Bluescreen SUN) พร้อมกับ ดาวน์โหลดซอร์สโค้ดจากเว็บ โดยเข้าไปที่หน้าของ บอร์ด BlueScreen (รหัสสินค้า ETEE009) หรือ  เข้าไปที่ Blog  http://bluescreen-etee009.blogspot.com/ (ดูบทความแรก ๆ ของ Blog ) 

            สำหรับบทความนี้ให้ Download ตัวอย่าง Application คือ MP3 Player Example Code with Multi-font and Bold font support ซึ่ง ภายในไฟล์ตัวอย่าง Application แต่ละไฟล์ จะมีองค์ประกอบที่เหมือน ๆ กัน หลังจากนั้น แตกไฟล์แล้วเปิดดูไฟล์ในแต่ละรายการ ซึ่งจะอธิบายการใช้งานต่อไป

อธิบายการใช้งานจากซอร์สโค้ดตัวอย่าง

            เริ่มจากที่ไฟล์ app_bluescreen_demo.c  ซึ่งเป็นไฟล์หลักที่ใช้ควบคุมการทำงานของบอร์ด (สำหรับ main.c ทำหน้าที่กำหนดค่าเริ่มต้นของฮาร์ดแวร์เท่านั้น) ที่ AppTask10ms ซึ่งจะทำงานทุกๆ 10 ms จะเรียกฟังก์ชั่น AppScanPen ทำหน้าที่ตรวจเช็คว่ามีการกดหน้าจอหรือไม่ เมื่อมีการกดหน้าจอ ก็จะอ่านค่าจาก IC Touch screen controller AD7843 มาและคำนวณเป็นตำแหน่งบนหน้าจอ แล้วส่งค่าตำแหน่งไปยังฟังก์ชั่น ScrObjDo พร้อมกับสถานะของการกด ว่าเป็นการกดครั้งแรก กดค้าง การปล่อย หรือไม่มีการกด (PST_DOWN, PST_HOLD, PST_UP, PST_NOTFOUND ตามลำดับ) การกระทำพิเศษที่ต้องการทำสำหรับออบเจ็คต์ต่างๆ ก็จะถูกเขียนไว้ที่นี่ เช่น สั่งเล่นหรือหยุดเพลง เมื่อมีการกดปุ่ม Play ใน mp3 Player

            ตำแหน่งที่ส่งไปนั้น จะเป็นโกลบอล โพซิชั่น คือตำแหน่งที่เทียบกับมุมซ้ายบนของหน้าจอ จากนั้นในฟังก์ชั่น ScrObjDo (ไฟล์ screen_obj.c) ก็จะทำการตรวจสอบว่าตำแหน่งดังกล่าว อยู่ในออบเจ็คต์ใด โดยจะตรวจสอบจากออบเจ็คต์ที่อยู่ในชั้นบนสุดก่อน (คืออยู่หน้าสุด ดังเช่น แป้นคีย์ ที่เวลาขึ้นมาจะอยู่บน checkbox) และออบเจ็คต์นั้น ต้องอยู่ในสถานะแอคทีฟ (SO_ST_ON) เมื่อพบออบเจ็คต์บนสุดที่แอคทีฟอยู่ ก็จะทำการหาตำแหน่ง  โลคอลโพซิชั่น  ( Local Position) ซึ่งก็คือตำแหน่งที่เทียบกับมุมซ้ายบนของออบเจ็คต์ (horigin, vorigin) แล้วเรียก so_obj.do() ซึ่งเป็นฟังก์ชั่นที่เราสร้างและผูกไว้แล้วกับออบเจ็คต์นั้นๆ โดยภายในฟังก์ชั่น so_obj.do จะต้องเช็คค่า p_stat ก่อน ซึ่งก็คือสถานะของการกดหน้าจอ

           so_obj.do  ซึ่งเป็นPointer to Function มีหน้าที่ในการดำเนินการตามที่ผู้เขียนโปรแกรมได้เขียนไว้เมื่อเกิดEventจาก การกดที่บริเวณออบเจ็คต์ (เช่น Button, Textbox, Checkbox, เป็นต้น )ที่เราสร้างขึ้นมา ในการใช้งานจะต้องMapping ฟังก์ชั่นเข้ากับ so_obj.do (ดูตัวอย่างการใช้งานข้างล่าง)  และต้องตรวจสอบค่า p_stat ซึ่งก็คือสถานะของการกดหน้าจอก่อน

            ในการใช้งานPointer to Function มีข้อควรระวังคือเราจะต้องกำหนดฟังก์ชั่นที่so_obj.doชี้ไปก่อนที่จะมีการ เรียกใช้ ไม่เช่นนั้นในการรันโปรแกรมจริงจะเกิดการรีเซต ซึ่งในซอร์สโค้ดไฟล์ screen_obj.c ตั้งแต่เวอร์ชั่น1.01ขึ้นไป ได้ทำการInitial so_obj.do โดยMappingให้ชี้ไปที่ฟังก์ชั่น

             void so_obj_xx_null() {}

            ดังนั้นสำหรับออปเจ็คต์ใด ที่ไม่ต้องการใช้งานบางฟังก์ชั่นก็ไม่จำเป็นต้องสร้างฟังก์ชั่นไว้ ยกตัวอย่างเช่น so_obj.task100ms ซึ่งเป็นPointer to Functionที่ชี้ฟังก์ชั่นที่ต้องการให้ทำงานทุกๆ100ms ซึ่งในบางออปเจ็คต์ เช่น Button อาจจะไม่ต้องการใช้ ผู้ใช้ก็ไม่จำเป็นต้องMappingฟังก์ชั่นเอง เนื่องจากได้กำหนดให้ชี้ไปที่ฟังก์ชั่น so_obj_task100ms_null() ในช่วงInitialโปรแกรมแล้ว

            การสร้างฟังก์ชั่นไว้ใน structure เช่นนี้ ก็เพื่อให้สามารถเปลี่ยนฟังก์ชั่นนั้นๆได้ อย่างเช่น ถ้าแอพพลิเคชั่นต้องมีหน้าจอหลายหน้า เมื่อต้องขึ้นหน้าใหม่ ก็สามารถผูกฟังก์ชั่นเหล่านี้ให้เป็นออบเจ็คต์ตัวใหม่ได้ โดยที่ใช้ so_obj ตัวเดิม

             เมื่อเห็นภาพรวมของตัวโปรแกรมแล้ว ก็มาลงลึกในรายละเอียดของแต่ละฟังก์ชั่น และพารามิเตอร์ต่างๆมากขึ้น โดยเนื้อหาจะอ้างอิงซอฟต์แวร์เวอร์ชั่นที่ใช้กับโปรเจ็คต์ Test Library คือscreen_obj_v1_01.c ขณะที่ mp3 Player และ Keypad อาจจะไม่มีบางฟังก์ชั่นหรือบางพารามิเตอร์ แต่ก็สามารถอัพเดทมาใช้เวอร์ชั่นใหม่ได้ทันที โดยการเพิ่มไฟล์ screen_obj_v1_01.c เข้าในโปรเจ็คต์แทนเวอร์ชั่นเก่า และแก้ชื่อไฟล์ที่ถูก include ใน app_config.h

             เริ่มที่การกำหนดค่าเริ่มต้นของออบเจ็คต์ในฟังก์ชั่น TestLibScreenInit() ในกรณีที่ใช้คอมโพเนนท์พื้นฐานที่มีให้อยู่แล้ว ลักษณะการกำหนดค่าเริ่มต้นเป็นดังนี้

             ObjTextBoxInit(SO_NAME_TXT,80,30,16,1) ;                -> กำหนดค่าเริ่มต้นสำหรับกล่องข้อความ
                      so_obj[SO_NAME_TXT].draw = name_draw ;     -> ผูกฟังก์ชั่น draw
                      so_obj[SO_NAME_TXT].do_ = name_do ;           -> ผูกฟังก์ชั่น do
                      so_obj[SO_NAME_TXT].leave = name_leave ;     -> ผูกฟังก์ชั่น leave
                      so_obj[SO_NAME_TXT].up = name_up ;             -> ผูกฟังก์ชั่น up
             ObjKeypadEvent(name_char_event) ;                           -> ผูก event ฟังก์ชั่น จากแป้นคีย์ 
             เข้ากับกล่องข้อความนี้ ที่ ObjTextBoxInit จะเป็นการกำหนดค่าเริ่มต้นเช่น ขนาด ตำแหน่ง 
             ให้โดยที่ผู้พัฒนาไม่ต้องเขียนเอง ทั้งหมด โดยสามารถเข้าไปดูพารามิเตอร์ต่างๆได้ใน obj_lib.c

ฟังก์ชั่น draw คือฟังก์ชั่นวาดออบเจ็คต์บนหน้าจอ เมื่อไปดูที่ name_draw  จะเห็นว่าจะเรียกใช้ ObjTextBoxDraw  ซึ่งหมายความว่าผู้พัฒนา ไม่ต้องเขียนโปรแกรมให้วาดกล่องข้อความ แต่ตัว obj_lib จะทำให้แทน เช่นเดียวกันกับฟังก์ชั่นอื่นๆ เช่น do, leave, up ก็เพียงแค่เรียกใช้ ObjTextBox นั้นๆ โดย up จะทำเมื่อออบเจ็คต์อื่นถูกกดใช้งานอยู่ แล้วจากนั้นออบเจ็คต์นี้ก็ถูกกดใช้งานแทน ส่วน leave จะทำเมื่อออบเจ็คต์นั้นกำลังถูกกดใช้งานอยู่ แล้วมีการกดไปที่ออบเจ็คต์ตัวอื่นแทน อย่างเช่นกล่องข้อความ เมื่อเรากดไปที่กล่องข้อความ ก็จะมี แป้นคีย์ขึ้นมาให้กดตัวอักษร แต่เมื่อเราไปกดไปที่ตัวอื่น หรือข้างนอก แป้นคีย์ก็จะหายไป การขึ้นมาของแป้นคีย์ จะทำใน up ส่วนการหายไป จะทำใน leave

              สำหรับ ObjKeypadEvent(name_char_event) เนื่องจากกล่องข้อความกับแป้นคีย์ หรือแป้นตัวเลข จะทำงานสัมพันธ์กัน แต่เป็นออบเจ็คต์คนละตัวกัน ดังนั้นจะต้องมีการเชื่อมโยงตัวอักษรที่ถูกกด มาส่งให้กล่องข้อความ บรรทัดนี้ก็คือการกำหนดให้ เมื่อมีการกดแป้นคีย์ ให้ส่งตัวอักษรนั้นมาที่กล่องข้อความตัวนี้ อย่างไรก็ตาม ในหนึ่งหน้าจออาจมีกล่องข้อความหลายกล่อง เมื่อกล่องข้อความใดถูกกด ก็จะโยงแป้นคีย์เข้ากับกล่องนั้นๆ อย่างเช่นใน name_up และ message_up

              สำหรับไฟล์ screen_obj.h จะเป็นการเจาะลึกเรื่อง พารามิเตอร์แต่ละตัว

typedef struct{         so_pos_t hsize;                         //current horizontal size         so_pos_t vsize;                         //current vertical size         so_pos_t horigin;                       //current horizontal origin         so_pos_t vorigin;                       //current vertical origin         so_stat_t stat;                           //status of the object         int val;                                       //value of the object         void (*draw)(void);                       //draw function         void (*do_)(so_pos_t lhpos,so_pos_t lvpos,so_pos_t ghpos,so_pos_t gvpos,pstatus_t p_stat);  //do function         void (*task100ms)(void);             //do every 100 ms         unsigned char (*is_white)(so_pos_t lhpos,so_pos_t lvpos);    //check if the specific position is white         void (*up)(unsigned char last_obj_id);    //do when the object is concentrated         void (*leave)(unsigned char new_obj_id);   //do when the object is left} so_obj_t;

โดยที่
            Horizontal – แกนนอน
            Vertical -แกนตั้ง
            Size – ขนาด
            Origin – พิกัดซ้ายบนของออบเจ็คต์ 
            Stat- สถานะของออบเจ็คต์ ON, OFF
            Val – คือค่า ของออบเจ็คต์ ซึ่งจะถูกใช้งานหลากหลาย ตามแต่ชนิดของออบเจ็คต์ เช่น Checkbox และ Radio Button จะมีค่า val เป็น 1 เมื่อถูกเช็ค และเป็น 0 เมื่อไม่ถูกเช็ค แป้นคีย์ จะใช้ val ในการเก็บสถานะว่ามีการกด Shift หรือ Caplock หรือไม่ กล่องข้อความจะใช้ val ในการเก็บตำแหน่งของเคอร์เซอร์ ว่าอยู่ที่ตำแหน่งใด ส่วน แป้นตัวเลข ไม่ได้ใช้ตัวแปรนี้

            ส่วนฟังก์ชั่นที่ยังไม่ได้อธิบายคือ is_white ใช้รองรับออบเจ็คต์ที่มีรูปร่างไม่เป็นสี่เหลี่ยม และขอบเขตการกดของออบเจ็คต์ไม่เป็นสี่เหลี่ยม ในขณะนี้ยังไม่มีการใช้งานในซอร์สโค้ดตัวอย่าง และจะรีเทอร์นค่า 0 เสมอ

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

           บอร์ด BlueScreen และ BlueScreen SUN ได้ถูกพัฒนาให้มีฟังก์ชั่นการใช้งานมากขึ้นเรื่อยๆ จนล่าสุด สามารถรองรับการใช้งานตัวอักษรภาษาไทย และยังมีตัวอักษรภาษาอังกฤษให้เลือกใช้อีกหลายขนาด รองรับตัวอักษรปกติ และตัวหนา ซึ่งวิธีการใช้งานฟังก์ชั่นต่างๆเหล่านี้ ทางทีมงานจะได้จัดทำและนำมาลงบทความในวาระต่อไป และหากมีข้อสงสัย สามารถส่งอีเมล์มาถามได้ที่ อีเมล์ => support at thaieasyelec dot com ครับ

Download บทความ PDF  ,  อบรมการเขียนโปรแกรม ARM7 ควบคุม TFT Touch Screen