LabVIEW Embedded and Mini2440/Micro2440 using Call DLL

LabVIEW กับการติดต่อ Hardware 
บนบอร์ด Mini2440/Micro2440 ด้วยการ Call DLL

Introduction

     จากบทความแรก เราได้กล่าวถึงการ Create Project และ การนำเอาโปรแกรมของเรา ส่งไปทำงานบนบอร์ด Mini2440 แล้ว จะเห็นว่าเราสามารถนำเอาความสามารถของโปรแกรม LabVIEW มาใช้ในการ สร้าง GUI ได้ง่ายและสะดวกเป็นอย่างมาก และ จุดเด่นของ LabVIEW อีกประการหนึ่งคือ การเขียนโปรแกรมในลักษณะของ การนำเอา block ของสัญลักษณ์มาเชื่อมต่อกัน จึงทำให้ User ไม่จำเป็นต้องอาศัยทักษะทาง programming มากนักก็สามารถใช้งานได้

ในบทความนี้กล่าวถึง พื้นฐานการนำเอาโปรแกรม LabVIEW มาติดต่อกับ Hardware บนบอร์ดทดลอง ซึ่งโดยปรกติแล้ว LabVIEW จะใช้การติดต่อกับ Hardware โดยผ่าน Module คุณภาพสูงต่าง ๆ ที่ทาง NI เป็นผู้ผลิตซึ่งถูกออกแบบมาใช้สำหรับงานทางด้านอุตสาหกรรมโดยเฉพาะ จึงสามารถสร้างความน่าเชื่อถือได้เป็นอย่างดี ด้วยเหตุผลเหล่านี้จึงทำให้โมดูลเหล่านี้มีราคาที่ค่อนค่างสูงตามไปด้วย แต่ก็คุ้มค่ากับผลลัพธ์ที่ได้ (ในงานอุตสาหกรรม Hardware ที่มีราคาสูงนั้นมีเหตุผลที่รับกันได้ เช่น การทนต่อสัญญาณรบกวนได้เป็นอย่างดี และการใช้งานที่คงทน การสร้างความน่าเชื่อถือสำหรับอุปกรณ์ที่ใช้ในงานอุตสากรรมเป็นสิ่งที่ต้อง ทำ ถ้าคุณต้องการสร้างอุปกรณ์ไปขายในตลาดนี้)

แต่สำหรับงานเล็กๆที่สามารถยอมรับได้กับการใช้งาน Hardware พื้นฐาน หรือ เพื่อการศึกษา อย่างเช่น บอร์ด Mini2440/Micro2440 ก็เป็นสิ่งที่น่าสนใจเช่นกัน 

บทความนี้เป็นบทความต่อจาก LabVIEW with ARM9 (base on S3C2440) เมื่อท่านมีพื้นฐานการใช้งาน LabVIEW พอสมควร และกำลังมองหา Hardware ทางด้าน Embedded บทความนี้จะเป็นการอธิบายการใช้งาน LabVIEW Embedded ติดต่อกับ Hardware เพื่อการศึกษาหรือใช้งานในสภาพที่ยอมรับได้ เช่น บอร์ด Mini2440/Micro2440 ด้วยการ Call DLL (บอร์ด ARM9 ต้องทำการลง WIN CE 6.0 )

พื้นฐานการใช้งาน Hardware บนบอร์ด Mini2440/Micro2440
  
เนื่องจาก Image ของ OS Windows CE 6.0 ที่ทาง ThaiEasyElec.com เป็นผู้พัฒนาขึ้นเพื่อใช้กับบอร์ด Mini2440 /Micro2440 และได้มีการพัฒนา Driver ที่ใช้สำหรับติดต่อ Hardware พื้นฐานของบอร์ดขึ้นมา

Driver ต่าง ๆ ประกอบด้วย GPIO , ADC ฯลฯ ตามรายละเอียดด้านล่าง บทความนี้จะไม่ขอกล่าวถึงการใช้งานโดยทั่วไป ในการเรียก Driver เหล่านี้เพื่อติดต่อใช้งาน เพราะตัวอย่างต่าง ๆ นั้นต้องทดลองร่วมกับ C#.net ซึ่งพัฒนาบน PC แล้วโยนไฟล์ EXE ไป RUN บนบอร์ด จึงจะเข้าใจหลักการ Function เรียกใช้ Driver ต่างๆ ผู้เขียนบทความขอแนะนำให้เข้าอบรมเพิ่มเติม >> Course “Beginning ARM9 S3C2440 using WIN CE 6.0 (WORKSHOP)”

  • GPIO Driver
  • ADC Driver
  • PWM Driver(Beta)
  • SPI Driver (coming soon)
  • I2C Driver (coming soon)
  • Serial Port เป็นพื้นฐาน สามารถใช้งานร่วมกับ VISA ของ LabVIEW ได้อยู่แล้ว

การติดต่อ LabVIEW เข้ากับ Driver ของ ThaiEasyElec.com
 
LabVIEW จะมี Function ที่เราสามารถจะเชื่อมต่อกับโปรแกรมภายนอกได้นั่นก็คือ Call Library Function Node และเพื่อให้ง่ายต่อการใช้งาน ทาง ThaiEasyElec จึงได้เขียน ไฟล์ HW_2440_LabVIEW.dll ขึ้นมาเพื่อเป็นตัวเชื่อม LabVIEW เข้ากับ ThaiEasyElec Driver

ขั้นตอนการ Add HW_2440_LabVIEW.dll เข้าไปใน Project 
เพื่อการใช้งาน Call Library Function Node

  1. ทำการ Create Project เพื่อใช้งานบน Mobile ตามบทความ LabVIEW with ARM9 (base on S3C2440)
  2. Download ไฟล์ DLL_HW_LabVIEW (ZIP) แล้วทำการแตกไฟล์ ภายในจะมีไฟล์อยู่ 3 ตัว คือ HW_2440_LabVIEW.dll , HW_2440_LabVIEW.cpp และ HW_2440_LabVIEW.lib
  3. ไปที่หน้าต่าง Project Explorer คลิกขวาที่ หัวข้อ Windows Mobile ⇒ADD ⇒File…

  4. เข้าไปเลือก File 
        > HW_2440_LabVIEW.dll
        > HW_2440_LabVIEW.cpp
        > HW_2440_LabVIEW.lib 
  5. ไปที่หน้าต่าง Project Explorer คลิกขวาที่  ชื่อโปรเจค ใน Build Specifications ⇒ Properties จะปรากฏ หน้าต่าง ใหม่ขึ้นมาให้เข้าไปที่ Category ⇒ Source File

  6. จากนั้นเลือก File  HW_2440_LabVIEW.cpp และ HW_2440_LabVIEW.lib เข้าไปใน Addition File ดังรูป และ คลิก OK เป็นการจบการ Add File เข้าไปในโปรเจค

การใช้งาน Call Library Function Node

  1. เข้าไปที่หน้า Block Diagram เลือก Function Connectivity ⇒ Library and Executable ⇒ Call Library Function Node
  2. เลือก Function มาวางบนหน้า Block Diagram
  3. ดับเบิลคลิกที่  Call Library Function Node
  4. จะปรากฏ ให้เลือก Browse File และ เลือก File  ⇒  HW_2440_LabVIEW.dll
  5. ลองเลือกที่แถบ  Function name จะปรากฏ ชื่อ Function ที่มีอยู่ใน File HW_2440_LabVIEW.dll
  6. ทดลองเลือก Function ADC และ เข้าไปในหัวข้อ Parameters

  7. จากนั้นให้ทำการกำหนด Parameter ต่างๆให้กับ Function ให้ถูกต้อง เช่น ตามที่ให้ทดลอง เลือก Function ADC ซึ่ง Function ADC เป็น Function ที่ถูกเขียนขึ้นในไฟล์  HW_2440_LabVIEW.cpp และมีการกำหนด header เอาไว้ดังนี้

    DWORD ADC(DWORD ch);

    เพราะฉะนั้นเราต้องเลือก Parameter ใน LabVIEW ให้สอดคล้อง กับ DWORD ADC(DWORD ch) ด้วย Function  DWORD ADC(DWORD ch); ซึ่งมีค่า Return เป็น DWORD (DWORD คือ ค่าตัวแปลขนาด 32 bit) เราจึงต้องเลือก ค่า Return ใน LabVIEW เป็น 

    Type ⇒ Numeric
    Data type ⇒ Signed 32 bit -Integer
  8. ยังมีค่า DWORD ch เป็น argument รับค่า ch อีก 1 ตัว เพราะฉะนั้นเราต้อง add argument เพิ่มอีก 1 ตัวด้วย โดยเลือกคลิ๊กที่เครื่องหมายบวก และ เนื่องจาก ch มีค่าเป็น DWORD เช่นเดียวกับค่า Return จึงตั้ง

    Type ⇒ Numeric
    Data type ⇒ Signed 32 bit –Integer

    เช่นเดียวกัน

  9. คลิก OK และสังเกตที่  Call Library Function Node จะเห็นว่ามี port ให้เราสามารถลากเส้น เพื่อ Link ไปยัง Function อื่นๆได้

LAB 1 : ตัวอย่างการใช้งาน GPIO

ให้ทำการ Create Project เพื่อใช้งานบน Mobile ตามบทความ LabVIEW with ARM9 (base on S3C2440) แล้ว Add File HW_2440_LabVIEW.dll ,  HW_2440_LabVIEW.cpp , HW_2440_LabVIEW.lib เข้าไปในโปรเจคตามหัวข้อที่กล่าวมาแล้วในต้นบทความ แล้วตั้งค่าต่าง ๆ ใน Call Library Function Node ดังนี้

โหมด Output

  • เลือก Browse File และ เลือก File ⇒ HW_2440_LabVIEW.dll
  • เลือก Function name เป็น GPIO_OUTPUT
  • จากนี้คือการตั้งค่า Parameter ให้ตรงกับ Driver ที่เราจะเชื่อมต่อ (รายละเอียด Function และ Parameter จะอยู่ในหัวข้อถัดไป)

    *** header ของ function void GPIO_OUTPUT(char *port,DWORD pin,DWORD state);

    GPIO_OUTPUT(พอร์ตที่ใช้ ,Pinที่ต้องการให้เป็น  out  put ,กำหนด output เป็น Hi /Low(1/0));

    ตั้งค่า Parameter return 
    Type ⇒ Numeric
    Data type ⇒ Signed 32 bit -Integer


    ตั้งค่า Parameter arg1 
    Type  ⇒ String
    Data type ⇒ C String Pointer


    ตั้งค่า Parameter arg2 
    Type ⇒ Numeric
    Data type ⇒ Signed 32 bit –Integer


    ตั้งค่า Parameter arg3
    Type ⇒ Numeric
    Data type ⇒ Signed 32 bit –Integer

 Download Example อื่น ๆ จาก ThaiEasyElec >> ex_labview_paper (ZIP)

รายละเอียด File HW_2440_LabVIEW

โหมด GPIO จะประกอบไปด้วย 2 Function

  1. คำสั่ง Output

    void GPIO_OUTPUT(char *port,DWORD pin,DWORD state);

    > char *port คือ การเลือก PORT ที่ต้องการส่ง Output ออกไป จะต้องกำหนดเป็นตัวอักษร และ เป็นตัวพิมพ์ใหญ่เสมอ เช่น ‘A’,’B’,’C’ 
    > DWORD pin  คือ การกำหนดให้ pin ที่เท่าไหร่ใน Port นั้นๆ เป็น Output โดย ต้องกำหนด เป็นตัวแปลขนาด 32 bit เช่น ถ้าหากต้องการให้ Pin ที่ 0,1,2,3 เป็น out put จะสามารถกำหนดได้ เช่น 15(Dec) หรือ 0x0F(Hex) 
    > DWORD state เป็นตัวกำหนด สถานะ Logic ที่สั่ง Output ออกไปถ้าหาก กำหนดเป็น
    1 = Output High
    0 = Output Low
  2. คำสั่ง Input

    DWORD GPIO_INPUT(char *port,DWORD pin);

    > คำสั่ง input จะสั่ง Input ที่อ่านจาก Register ออกทาง Return เป็นตัวแปล DWORD(32 bit)
    > char *port  คือ การเลือก PORT ที่ต้องการส่ง Output ออกไป จะต้องกำหนดเป็นตัวอักษร และ เป็นตัวพิมพ์ใหญ่เสมอ เช่น ‘A’,’B’,’C’ 
    > DWORD pin คือ การกำหนดให้ pin ที่เท่าไหร่ใน Port นั้นๆ เป็น Output โดย ต้องกำหนด เป็นตัวแปลขนาด 32 bit เช่น ถ้าหากต้องการให้ Pin ที่ 0,1,2 เป็น out put จะสามารถกำหนดได้ เช่น 7(Dec) หรือ 0x07(Hex)

โหมด ADC จะประกอบไปด้วย 1 Function

  1. Function ADC

    DWORD ADC(DWORD ch);

    > คำสั่ง ADC จะส่งค่าที่ได้จากการ convert ค่า analog เป็นค่า digital ออกมาทาง Return
    > DWORD ch เป็นตัวกำหนดเลือกใช้ Port ADC บนบอร์ดซึ่งกำหนดเป็นตัวเลข ได้ ดังนี้
    0 = อ่านค่า ADC จาก ADC0
    1 = อ่านค่า ADC จาก ADC1
    2 = อ่านค่า ADC จาก ADC2
    3 = อ่านค่า ADC จาก ADC3

โหมด PWM จะประกอบไปด้วย 6 Function

  1. void OPEN_PWM(DWORD on_off);
    คำสั่ง เปิด ใช้งาน PWM Driver โดย ต้องกำหนด DWORD on_off  = 1
  2. void CLOSE_PWM(DWORD on_off);
    คำสั่ง ปิดการ ใช้งาน PWM Driver โดย ต้องกำหนด DWORD on_off  = 1
  3. void SET_PWM1(DWORD frq,DWORD duty,DWORD on_off);
    > เป็นคำสั่งสำหรับ Set ค่า Duty cycle และ Frequency  ของ PWM ช่องที่ 1
    > DWORD frq  ใช้กำหนด Frequency
    > DWORD duty  ใช้กำหนด Duty cycle ซึ่งค่าที่ใส่คิดเป็น % ที่ 0-99%
    >  DWORD on_off ใช้เปิดปิดการ Set ค่า โดย 1=on , 0=off
  4. void SET_PWM2(DWORD frq,DWORD duty,DWORD on_off);
    > เป็นคำสั่งสำหรับ Setค่า Duty cycle และ Frequency  ของ PWM ช่องที่ 2
    > DWORD frq  ใช้กำหนด Frequency
    > DWORD duty  ใช้กำหนด Duty cycle ซึ่งค่าที่ใส่คิดเป็น % ที่ 0-99%
    >  DWORD on_off ใช้เปิดปิดการ Set ค่า โดย 1=on , 0=off
  5. void STOP_PWM1(DWORD on_off);
    > ใช้สำหรับ ปิด PWM ช่องที่ 1
    > DWORD on_off ใช้เปิดปิด  คำสั่ง STOP โดย 1=on,0=off
  6. void STOP_PWM2(DWORD on_off);
    > ใช้สำหรับ ปิด PWM ช่องที่ 2
    > DWORD on_off ใช้เปิดปิด  คำสั่ง STOP โดย 1=on,0=off

 LabVIEW mini2440 ControlHW

LabView+mini2440 Control GPIO

LabView+mini2440 ADC