Arduino-Based Embedded Data Logger using LabVIEW
Transcript of Arduino-Based Embedded Data Logger using LabVIEW
Arduino-Based Embedded Data Logger using LabVIEW
2015
Amornthep Phunsin Fb.com/LabviewEmbedded4Arduino
5/22/2015
Arduino-Based Embedded Data Logger using LabVIEWTM
อมรเทพ ผนสน
(Version 1.0.2, May 2015)
บทความนจะน าเสนอการพฒนาอปกรณ Data Logger โดยใชไมโครคอนโทรลเลอร Arduino
รวมกบการเขยนโปรแกรมดวยภาษา LabVIEW สามารถบนทกสญญาณจากเซนเซอรภายนอกไดหลาย
ชนด อาท เซนเซอรอณหภมทางอตสาหกรรม Thermocouple สามารถบนทกเวลา และจดเกบขอมลลง
SD Card เพอน ามาวเคราะหขอมลทางคอมพวเตอร
สารบญ
บทน า ................................................................................................................................................ 4
ท าความรจก Arduino Compatible Compiler for LabVIEW ................................................................ 7
ขอดของการเขยนโปรแกรม LabVIEW รวมกบบอรด Arduino ............................................................... 8
ฮารดแวร Arduino ทรองรบการคอมโพลและดาวนโหลดโปรแกรม ......................................................... 9
การตดตง Arduino compatible compiler for LabVIEW .................................................................... 10
การจดการพนทหนวยความจ าบนฮารดแวร Arduino .......................................................................... 13
ใบงานท 1. การใชงานพอรต Digital I/O แสดงผลทาง LED และ Buzzer ............................................. 17
ใบงานท 2. การใชงานพอรต Analog Port อานคาอณหภมจาก LM35 ................................................ 18
ใบงานท 3.การใชงานรวมกบ LCD 16x2 ผานพอรต I2C Interface ..................................................... 20
ใบงานท 4.ขนตอนการ Compile Code และ Download ลงบอรด Arduino ......................................... 23
ใบงานท 5.การใชงานฟงกชน Debug Tool และตรวจสอบทรพยากร (RAM) ........................................ 25
ใบงานท 6. การใชงานรวมกบ Real-Time Clock (RTC) ดวย I2C Interface ........................................ 27
ใบงานท 7. การเขยนขอมล RTC ลง SD Card (SPI Interface) ........................................................... 31
ใบงานท 8. เขยนโปรแกรมอานคาอณหภมจาก Thermocouple จาก MAX6675 ผานพอรต SPI ........... 35
ใบงานท 9. การสราง Thermocouple Data Logger ฉบบสมบรณ ...................................................... 38
บทสรป ............................................................................................................................................ 44
บทสงทาย ........................................................................................................................................ 45
บทน า
อนดบแรกตองยอมรบวากระแสนยมในการพฒนาไมโครคอนโทรลเลอร Arduino ทงเมองนอกและ
เมองไทยมาแรงแบบฉดไมอยจรงๆ ไมเฉพาะกบนกพฒนาในวงการอเลกทรอนกสเทานน แตยงแพรหลาย
ในวงกวางไปยงนกเรยน นกศกษา และผ ทมไมมพนฐานการเขยนโปรแกรม ทกคนหนมาสนใจคดประดษฐ
โครงงานเปนของตวเอง แตเดมเรามกไดยนนกพฒนาเรยกกลมของตนเองวา “DIY” แตปจจบนเรมมการใช
ค าวา “Maker” เรยกแทนตวเองกนมากขน ซงเปนแนวทางการพฒนาโครงงานทผสมผสานทงซอรฟแวร
และฮารดแวรเขาดวยกน
เนองดวยฮารดแวรในแพลตฟอรม Arduino มราคาถก และซอรฟแวรทใชพฒนากใชฟร จงท าให
ทกคนเขาถงเครองมอในการพฒนาอยางเทาเทยมกน ทกคนมงเนนพฒนาแอพพลเคชนใหมประสทธภาพ
มากขน โดยมตองกงวลเรองตนทนในการพฒนา จงท าใหตลอดระยะเวลากวา 10 ป ตงแตโปรเจค
Arduino ถอก าเนดขนเมอป 2005 มการพฒนาตอยอดแบบกาวกระโดด โดยมองคกรใหญๆทหนมา
สนบสนนอยางมากมาย จนถอไดวาเปนการเรมตนปฎวตการพฒนาไมโครคอนโทรลเลอรในศตวรรษท 21
เลยทเดยว
ดวยความท Arduino เปนแพลตฟอรมโอเพนซอรสทงระบบ ท าใหมผผลตจ านวนมาก เพมเตม
ฟงกชนตางๆของตนเองลงบนฮารดแวร และผลตบอรด Arduino ของตนเองออกมาจ าหนาย โดยเรยกวา
“Arduino-Compatible” หรอ “Clone” จงยงท าใหการพฒนาตอยอดดานฮารดแวรเตบโตอยางรวดเรว
อกฝากฝงหนงคอซอรฟแวรทใชพฒนา ซงแตเดมจะมเพยง Arduino IDE ทรองรบภาษา C/C++
ซงเปน Text Programming เพยงอยางเดยว กเรมมหลายๆบรษทพฒนา IDE เขยนโปรแกรมดวยภาษา
กราฟฟก Graphical Programming อยางแพรหลาย อาท Ardublock, VISUINO และ LabVIEW ซงขอด
ของภาษาแบบกราฟฟกคอ เรยนรไดรวดเรว ท าความเขาใจโคดไดงาย ท าใหผ เรมตนศกษา Arduino เปน
เรองทงายขนไปอก
ภาษาโปรแกรมแบบกราฟฟกส าหรบ Arduino
LabVIEW คอ ภาษาโปรแกรมทเขยนในรปแบบกราฟฟก (Graphical Programming Language)
ซงมความแตกตางจากภาษาโปรแกรมทวไปทเขยนดวยขอความ (Text Programming Language) โดย
จดเรมตนของ LabVIEW ถกสรางขนมาเพอตอบโจทยพฒนาแอพพลเคชนเพอควบคมอปกรณเครองมอวด
และประมวลผลในในงานวศกรรม โดยมไอเดยวาใหโปรแกรม LabVIEW เปรยบไดกบเครองมอวดเสมอน
บนคอมพวเตอร (Virtual Instruments) โดยผใชงานสามารถควบคมการท างานเครองมอวดไดจาก
คอมพวเตอร จากจดเดนทเปนภาษากราฟฟกในยคแรกๆ จงมการพฒนาอยางตอเนอง จนท าใหมการใช
งานแพรหลายในหลายๆอตสาหกรรม จนไปถงการพฒนาในระบบสมองกลฝงตวในฮารดแวรขนาดเลก
อาท Arduino ซงเราจะเจาะลกวธการใชงานพรอมตวอยางแอพพลเคชน Data Logger ในงาน
อตสาหกรรมเพอใชงานจรงในบทความน
ในบทความนผ เขยนใชซอรฟแวร LabVIEW เปนซอรฟแวรหลกรวมกบ Toolkit ของบรษท
Aledyne-TSXperts ชอวา “Arduino™ Compatible Compiler for LabVIEW” (ชอยอคอ ACC4LV) ซง
เปนซอรฟแวรยอยทท าหนาทแปลงโคด LabVIEW ใหเปนภาษาระดบลางทสามารถโปรแกรมลงบน
ฮารดแวร Arduino ไดโดยตรง ซงโปรแกรมเมอรไมตองมความรดานภาษา C/C++ เลยแมแตนอย ถอไดวา
เปนการปฎวตวงการนกพฒนา LabVIEW ในงานระบบสมองกลฝงตวขนาดเลก ทท าใหนกพฒนาเรยนร
LabVIEW เพยงภาษาเดยวกสามารถพฒนาแอพพลเคชนในงานระบบ Embedded-Based และ PC-
Based ไดพรอมๆกน
หนาตางโปรแกรม “Arduino™ Compatible Compiler for LabVIEW”
รายการฮารดแวร และอปกรณทใชในบทความน ประกอบไปดวย
บอรด Arduino-Compatible Uno R3 ไมโครคอนโทรลเลอร
บอรด Data Logger Shield ประกอบดวย SD Card และ Real-Time Clock (RTC)
บอร LCD Display 16x2 เชอมตอแบบ I2C
บอรด MAX6675 Thermocouple Type-K Module
รายการซอรฟแวรทใชพฒนาโปรแกรมในบทความน ประกอบไปดวย
LabVIEW เวอรชน 2014
NI-VISA Driver เวอรชน 14.0.1
Arduino™ Compatible Compiler for LabVIEW เวอรชน 1.0.0.15
Arduino IDE เวอรชน 1.6.4
โดยซอรสโคดของโปรแกรมทงหมดในบทความน ผอานสามารถดาวนโหลดฟร จากเวบไซต
http://support.qwavesys.com หรอ FB: “LabVIEW Embedded for Arduino” เปนชมชนนกพฒนา
LabVIEW รวมกบฮารดแวรแพลตฟอรม Arduino ททางผ เขยนไดสรางขนมาเพอรองรบนกพฒนา
LabVIEW ในเมองไทยไดแลกเปลยนความรกนครบ
ท าความรจก Arduino Compatible Compiler for LabVIEW
Arduino Compatible Compiler for LabVIEW เปน Toolkit ทตดตงในโปรแกรม LabVIEW โดยมฟงกชนพนฐานของ LabVIEW และฟงกชนพเศษ มากกวา 100+ ฟงกชนทเรยกใชงานได และสามารถคอมไพลโคด LabVIEW และโปรแกรมลงฮารดแวร Arduino รนทซพพอรตไดโดยตรง ขนตอนการเขยนโปรแกรมท าไดโดยงาย และใชงานไดจากหนาตางหลกของ LabVIEW มเพยง 3 ขนตอนดงตอไปน
ขนตอนการเขยนโปรแกรมดวย Arduino Compatible Compiler for LabVIEW
โดยแอพพลเคชนทพฒนาดวย “Arduino compatible compiler for LabVIEW” จะท างานบนฮารดแวร Arduino แบบ Standalone เหมอนกบการพฒนาแบบทวไป ทเขยนโคดดวยภาษา C/C+ ผานทาง Arduino IDE ดงนนการเขยน LabVIEW ในวธนจะเหมาะกบงานในระบบ Embedded System เพราะพฒนาดวยภาษาทเรยนรไดงาย มฟงกชนการประมวลผลมากมายซงเปนจดเดนของ LabVIEW อยแลว จงเหมาะกบนกพฒนามอใหม ทตองการเรยนรการเขยนโปรแกรมดวย LabVIEW รวมกบฮารดแวร
ราคาไมแพงนก ส าหรบผ ทมพนฐาน LabVIEW มาบางแลวกจะท าใหพฒนาแอพพลเคชนในงาน Embedded System ไดรวดเรวขน
ถายอนไปหลายปกอน บรษท National Instruments ซงเปนบรษทแมของโปรแกรม LabVIEW ก
เคยพฒนา Toolkit ทชอวา “NI LabVIEW Embedded Module for ARM Microcontrollers” เวอรชนสดทายคอ 2012 ออกมาจ าหนาย แตกไมไดรบความนยมใชงานแพรหลายนก เพราะตดปญหาทนกพฒนาตองจายคา License Software ซ าซอน อาท LabVIEW , RealView MDK Keil uVision และตองมฮารดแวร Keil ULINK2 USB-JTAG adaptor เพอท าการโปรแกรม ประกอบกบมขอจ ากดเรองบอรด Microcontroller ทรองรบมจ านวนนอย และราคาสง จงไมเหมาะกบพฒนามอใหม นกเรยน นกศกษาทตองการศกษาเรยนร
ขอดของการเขยนโปรแกรม LabVIEW รวมกบบอรด Arduino
ภาษา LabVIEW เรยนรไดงาย ท าความเขาใจไดรวดเรว ท าใหลดเวลา และตนทนในการพฒนาได
ดวยความทเปนภาษาแบบกราฟฟก สามารถปรบแตง อพเดจโปรแกรมไดงาย ท าใหลดตนทนการ Maintenance Code ในระยะยาวได
ตนทนฮารดแวรต า เพราะสามารถใชงานรวมกบบอรด Arduino และรองรบ Arduino™ Shields ทกประเภท
สามารถพฒนาฮารดแวร Arduino-Compatible ของตนเองทรองรบ LabVIEW ได
มฟงกชน LabVIEW API และฟงกชนยอย ตางๆ ใหเรยกใชงานไดทนทมากวา 100+ VIs พรอมตวอยางทสามารถน าไปงานไดทนท
ม LabVIEW ไลบารทตดตอกบฮารดแวร Arduino โดยตรง เชน Digital I/O, PWM, Analog I/O, SPI,I2C,SD Card และอนๆ
โคด LabVIEW หลงการคอมไพลเพอโปรแกรมลง Arduino กนพนท Memory บนบอรดนอยมาก เทยบเทากบการเขยนดวยภาษา C/C++ เพราะตวคอมไพเลอรมอลกอรทมจดการ Memory ทมความฉลาดปรบเปลยนไปตามสเปกของบอรด Arduino ทใชงาน
ตนทนราคาซอรฟแวร LabVIEW และ Arduino compatible compiler for LabVIEW มราคาต ามาก ประมาณ 3 พนบาท โดยเฉพาะเวอรชน Home Edition
ฮารดแวร Arduino ทรองรบการคอมโพลและดาวนโหลดโปรแกรม
ในเวอรชนแรกๆของคอมไพเลอรรองรบฮารดแวรตางๆ ตามรายการดงตอไปน แตเนองจากวา
บอรดรนตางๆของ Arduino สวนใหญใชชฟ AVR รนเดยวกน จงท าใหนกพฒนาสามารถทดลองคอมไพล
โคดเพอทดสอบทรพยากรทใชได แตยงไมรองรบการโปรแกรมลงบนบอรดอนๆนอกเหนอจากรายการ
ดานลาง ซงในอนาคตจะตองมการรองรบฮารดแวรเพมเตมขนเรอยๆอยางแนนอน
Arduino™ Uno
Arduino™ Mega
Arduino™ Due
Arduino™ Nano
Arduino™ Yun
Arduino™ Leonard
บอรด Arduino เวอรชนตางๆ ทรองรบโดย Arduino compatible compiler for LabVIEW
การตดตง Arduino compatible compiler for LabVIEW
รายการซอรฟแวรและไดรเวอรเวอรชนตางๆทจ าเปนตองใชควบคกบ Arduino compatible compiler for LabVIEW มดงตอไปน
1. LabVIEW 2014 หรอสงกวา 2. NI-VISA Driver เวอรชนลาสด 3. Arduino™ IDE version 1.5.7 หรอสงกวา 4. Windows ทใชในการพฒนารองรบ Windows 7 ขนไป ไมรองรบ Windows XP
โดยเมอลงโปรแกรม LabVIEW เรยบรอยแลว ใหเปดโปรแกรมยอยทชอวา “VI Package Manager”
ขนมาเพอคนหา Toolkit ทชอวา “Arduino compatible compiler for LabVIEW” โดยผใชงานสามารถทดลองใชฟร 7 วน โดยม 2 เวอรชนคอ Home Edition ส าหรบการศกษา และ Standard Edition ส าหรบการใชงานเชงพาณชย แสดงดงรปดานลาง
การตดตงโปรแกรม Arduino compatible compiler for LabVIEW
เมอตดตงเปนทเรยบรอย สามารถเรยกใชงานไดจาก “Tools>Arduino compatible compiler for LabVIEW” แสดงดงรป
การเรยกใชงาน Arduino compatible compiler for LabVIEW
เมอเปดโปรแกรมขนมาเราสามารถเลอกบอรด Arduino ทตองการใชงานไดจาก “Tools>Board”
จากรปดานลางผ เขยนทดลองเลอก Arduino Uno เชอมตอทพอรต COM1
การเลอกบอรด Arduino ทตองการใชงาน
เมอเปด Block Diagram ใหคลกขวา จากนนเลอก “Addons > Arduino compatible compiler
for LabVIEW” กจะพบฟงกชนตางๆมากมาย ทสามารถเขยนและโปรแกรมลงบอรด Arduino แสดงดงรป
ฟงกชนตางๆของ Arduino compatible compiler for LabVIEW
เราลองมาดตวอยางของโปรแกรม LabVIEW กนครบ ในกรณนเปนโปรแกรมไฟกระพรบท Digital
Output Port 13 ทกๆ 100 ms ซงจะเหนไดวา ลกษณะโคดโปรแกรม LabVIEW กสามารถอานเขาใจได
ทนท ถงแมวาผอานจะไมเคยมพนฐาน LabVIEW มากอน แสดงดงรปดานลางครบ
ตวอยางโปรแกรมไฟกระพรบท Digital Out Port 13
การจดการพนทหนวยความจ าบนฮารดแวร Arduino
เนองดวยการเขยนโปรแกรม LabVIEW บน PC โดยทวไป นกพฒนาแทบจะไมตองค านงถงการ
จดการ Memory Allocation เลยแมแตนอย เพราะวา LabVIEW มความฉลาดและท าหนาทจดสรร
ต าแหนงพนทในหนวยความจ าบนฮารดแวรใหทงหมด ยงถาใชงาน PC Based ทมประสทธภาพสงอยแลว
ยงไมคอยเจอปญหาเกยวกบ Memory มากนก แตถาเปนภาษา Text Programming ทวไปเชน ภาษา
C/C++ สวนใหญแลวโปรแกรมเมอรตองระบต าแหนงการอางอง Address ของทกตวแปรทกตววาอยใน
ต าแหนงใดของ Memory เรยกวาตอง Memory Allocation เองทงหมด
จงท าใหการพฒนาโปรแกรม LabVIEW แบบ PC Based และ Embedded Based นนแตกตาง
เปนอยางมาก เพราะมขอจ ากดดานประสทธภาพของฮารดแวร ยงถาเปน Embedded Target บน
แพลตฟอรม Arduino แลว ยงท าใหการจดการหนวยความจ าบนฮารดแวร Memory Allocation เปนเรอง
ส าคญทตองค านงถงเปนอนดบตนๆ
ลองนกภาพดสครบ ปกตเขยน LabVIEW บน PC ทม CPU Intel i7 4GHz รนบน Windows
32/64-bit เปรยบเทยบกบการเขยนโปรแกรมบน Arduino Embedded Target ทม CPU AVR 8-bit
16MHz ไมม OS บนฮารดแวร เหนไหมครบวาตางกนราวฟากบเหว ดงนนการพฒนาโดยใชภาษา
LabVIEW ซงเปน Graphical System Design บน Arduino เรอง Memory Management &Memory
Optimization เปนเรองทนกพฒนาจ าเปนตองรและเขาใจครบ
การจดการหนวยความจ าบน Arduino แพลตฟอรม
หนวยความจ าบน Microcontroller Arduino แบงออกเปน 4 สวนดงน
1. พนทเกบโคดของโปรแกรม Code Area ซงขนาดของหนวยความจ าทตองใชขนอยกบ ความ
ซบซอนของโปรแกรมทเขยน โดยจะเกบอยในหนวยความจ าถาวรแบบ Flash Memory ซงสามารถ
ลบและโปรแกรมซ าๆได ยกตวอยางบอรด Arduino Uno ม Flash Memory จ านวน 32 KB (*ม
ขนาดใหญกวาหนวยความจ าแบบ RAM หลายเทาตว)
2. พนทหนวยความจ าแบบ Global Area อยใน RAM จะเกบตวแปรทประกาศแบบ Global ซงมการ
เรยกใชงานซ าๆได ประกาศตวแปรครงเดยว สามารถเรยกใชงานไดทกสวนของโปรแกรม โดยทไม
ตองจบจองพนทในหนวยความจ าใหม ท าใหขนาดของพนทใน Global Area นนไมเพมขนขณะ
Rum-time แตจะเพมตามจ านวนของตวแปรทประกาศเทานน โดยเราสามารถรไดอยางแนชดจาก
ผล Compiled Code วาจะตองใชพนทใน Global Area เปนจ านวนเทาใด ดงแสดงในรปทถดไป
3. พนทหนวยความจ าแบบ Stack อยใน RAM เปนพนทในหนวยความจ าทซงเกบตวแปรชนด Local
Variable ทประกาศใชงานในโปรแกรมทงหมด และเปนหนวยความจ าทใชตอน Calling Sub-
Function หรอ SubVIs ทงหมดของโปรแกรม โดยในขณะทเรยกใชงานกจะมขนาดเพมขน (*แตไม
เกนกวาพนททจบจองไว) หลงจากใชงานกจะคนคา (Released) หนวยความจ ากลบไป เพอ
ประหยดพนทในหนวยความจ า โดยทเราสามารถขนาดของ Stack ไดหลงจากการ Compiled
Code เพราะตว Complier จะทราบวาในโปรแกรมของเรานนม Local Variable หรอ SubVIs เปน
จ านวนเทาใด จากนนกค านวณพนททใชงานเพอจ าจบจองไวใน RAM แสดงดงรปถดไป
4. พนทหนวยความจ าแบบ Heap อยใน RAM เปนพนทหนวยความจ าทเกบตวแปรแบบ Array และ
Sting ซงตองใชพนทมาก โดย Heap เปนพนททไมสามารถทราบไดแนชดวามขนาดเทาใด
เนองจากเปน Rum-time Memory จดสรรแบบ Dynamic ซงจะสรางพนท และคนคากลบเมอ
สนสดการใชงาน พนท Heap นท าใหโปรแกรมเมอรปวดหวกนมานกตอนก โดยถาเขยนโปรแกรม
ไมดจะท าใหพนทหนวยความจ าใน Heap มจ านวนมากขนเรอยๆ จนกอใหเกดอาการ Crash หรอ
Hang ในระหวางท างานโดยทไมทราบสาเหต ทส าคญ Debug หาตนตอของปญหาไดยากมาก
ตวอยางผลการคอมไฟล VI เพอโปรแกรมลงบน Arduino
ปกตนกพฒนาไมคอยจะมปญหากบหนวยความจ าแบบ Flash มากนก เพราะเปนพนทขนาดใหญ
สามารถเขยนโคดไดมากตามทตองการ เนองดวยขอจ ากดตามสถาปตยกรรม Microcontroller AVR เราจง
มกพบปญหาเกยวกบหนวยความจ าแบบ RAM อยบอยครง ซงเปนพนทจ ากด ระดบไมก KB เทานน แตถา
เปนบอรด Arduino Due ซงเปน ARM Cortex-M3 จะมพนท RAM สงมาก เหมาะกบการใชงานในระดบ
แอพพลเคชนสงๆ ไดเลย ทนเราลองมาดตารางเปรยบเทยบ Memory บนบอรด Arduino แตละรนเพอ
เลอกใชงานตามความเหมาะสมกนครบ
ตารางเปรยบเทยบหนวยความจ าของบอรด Arduino แตละรน
จะเหนไดวาการเขยนโปรแกรม LabVIEW ซงเปน Graphic Programming จ าท าใหกนพนทใน
หนวยความจ ามากกวา การพฒนาดวยภาษา C/C++ ทวไปอยนดหนอย แตเนองดวยขอจ ากดเรอง
Memory ของฮารดแวร Arduino โดยเฉพาะ SRAM ท าใหนกพฒนาตองท าความเขาใจการจดการ
หนวยความจ า (Memory Allocation) เพอปรบปรงโปรแกรมใหกนพนทในหนวยความจ านอยทสด วธการ
หนงกคอ ลดการใชตวแปรชนด Array และ String ซงกนพนทหนวยความจ าใน Heap เยอะมาก หรอไมก
ตองเลอกใชงานบอรด Arduino Due ทม SRAM สงถง 96 KB ครบ
การเขยนโปรแกรม LabVIEW เพอตดตอกบฮารดแวร Arduino เบองตน
ใบงานท 1. การใชงานพอรต Digital I/O แสดงผลทาง LED และ Buzzer
การเชอมตอ LED และ Buzzer เขาทพอรต Digital Out
ไลบารทใชงานรวมกบ Digital I/O
ตวอยางโปรแกรมไฟกระพรบ หรอสงสญญาเสยงออก Buzzer อยางงาย
การท างานของโปรแกรมสามารถอธบายไดดงน ซงวธการอานโคดจะอานจากซายไปขวาครบ
1. ก าหนด Port ทตองการเชอมตอ กรณนคอ Digital Output Port 13 (หรอพอรตอนๆทเชอมตอไว) 2. ก าหนดใหโปรแกรม ท างานตอเนอง รนแบบ Loop Continuously 3. เขยน Logic High “5V” ไปท Digital Out Port 4. Timing VI ก าหนดให Wait หรอ Delay 100ms 5. เขยน Logic Low “0V” ไปท Digital Out Port 6. Timing VI ก าหนดให Wait หรอ Delay 100ms
ใบงานท 2. การใชงานพอรต Analog Port อานคาอณหภมจาก LM35
การเชอมตอกบเซนเซอรอณหภม LM35 เขาทพอรต Analog
ไลบารทใชงานรวมกบ Analog I/O
ตวอยางโปรแกรมอานคาอณหภมทางพอรต A0 มฟงกชนเปรยบเทยบ และแสดงผลทาง COM Port
การท างานของโปรแกรมอธบายไดดงน
1. ก าหนด Port ทตองการเชอมตอ กรณนคอ Digital Output Port 13 (หรอพอรตอนๆทเชอมตอไว) 2. เรยกฟงกชน “Analog Read” เพออานคาสญญาณ Analog ทพอรต A0 จากนนท าการแปลงคา
ไปเปนอณหภมตามสตร (Temp C = ((5/1024)*Analog Input*1000)10)) 3. สรางเงอนไขเปรยบเทยบอยางงาย โดยก าหนดวา ถาอณหภมสงกวาคา “Temp Threshold” ท
ก าหนดไว (ในกรณนทดลองก าหนดไวท 30 องศา) ใหสงคาออกท Digital Out
4. แปลงคาอณหภมจากตวเลขไปเปนตวอกษรเพอแสดงผลออกทาง COM Port ดวย “Debug Tool.vi”
5. เขยนคา Digital Output ออกท Port 13 ทสรางเงอนไขทเปรยบเทยบ 6. ก าหนดใหโปรแกรม ท างานตอเนอง รนแบบ Loop Continuously ไมมวนสนสด
ใบงานท 3.การใชงานรวมกบ LCD 16x2 ผานพอรต I2C Interface
การเชอมตอ LCD 16x2 (I2C) เขากบบอรด Arduino Uno
ตวอยางนจะแสดงการเขยนโปรแกรม LabVIEW เพอแสดงผลออกทาง LCD โดยจะน าไลบาร
LCD ทตดตงมาใหเรยบรอยแลวมาใชงาน โดยปกตแลว LCD 16x2 จะมพอรตเชอมตอแบบ Parallel ซงจะ
ท าใหการตอสายกบบอรด Arduino เปนเรองยงยาก คณผอานสามารถหาบอรด LCD I2C Adapter มา
แปลงการเชอมตอจาก Parallel เปน I2C ซงจะท าใหสายสญญาณเหลอเพยง 2 เสน SDL และ SCA ซง
การใชงานตองระบ Address ของบอรด I2C ปกตจะใช Address มาตราฐานคอ 0x27 (39)
ไลบาร I2C_LCD พรอมใชงาน
การเชอมตอ LCD เขากบบอรด Arduino ท าไดโดย อนดบแรกตอแหลงจายไฟ +5V และ GND
เขากบบอรด จากนนตอสาย SDA เขากบพอรต A4 และตอสาย SCL เขากบพอรต A5
โคดโปรแกรม LabVIEW ทใชตดตอกบ LCD 16x02 ตดตอผาน I2C Interface
การท างานของโปรแกรมอธบายไดดงน
1. เรยก “LiquidCrystal_I2C.vi” ขนมาเพอ Initial LCD ดวยคาเรมตน โดยปกตผใชจะก าหนด
Address ของ I2C บอรดเทานน สวนคาอนๆ ทเปน Pin Configuration ใหคงไวตามคาเรมตน
และก าหนด Characters = 16 และ Lines =2 ซงตรงกบชนดของ LCD คอ 16 ตวอกษร จ านวน 2
แถว
2. เรยก “LiquidCrystal_I2C set backlight pin.vi” เพอก าหนดพอรต backlight ของ LCD
โดยทวไปจะก าหนดไวท Pin=3
3. เรยก “LiquidCrystal_I2C set backlight.vi” ขนมาเพอจากนนก าหนด “True” เพอเปดการใชงาน
backlight บนบอรด LCD
4. เรยก “LiquidCrystal_I2C home.vi” เพอก าหนดการแสดงผลเรมตนทต าแหนง Home ของ LCD
ซงกคอ ทางซายสด แถวแรกบนจอ LCD
5. เรยก “LiquidCrystal_I2C write String.vi” เพอเขยนคาตวอกษรท LCD ตามต าแหนงทก าหนดไว
ในทนทดลองเขยนค าวา “LabVIEW-Arduino” ไปทบรรทดบนสดของจอ LCD
6. เรยก “LiquidCrystal_I2C set cursor.vi” เพอก าหนดต าแหนงการแสดงผลใหอยทตวอกษรแรก
แถวทสองของ LCD เพราะในโปรแกรมนจะท าการอพเดจคาการนบของ Loop การท างานไปท
บรรทดลางของ LCD
7. เรยก “LiquidCrystal_I2C write String.vi” ขนมาอกครงหนง เพอเขยนคา “Count:” + “จ านวน
Loop ทโปรแกรมท างาน” โดยจะสงเกตเหนวามฟงกชน “Number To Fractional String” เพอ
แปลงตวเลข (Integer) ไปเปนตวอกษร (String) ในกรณนก าหนดจดทศนยม 3 ต าแหนง เพอให
แสดงผลบน LCD
โดยโคดของโปรแกรมทอยใน “While Loop” จะวน Loop การท างานไปเรอย โดยก าหนดเวลาการ
ท างานแตละ Loop ไวท 100ms และจะท างานแบบตอเนองไมสนสด เพราะก าหนดคา “False” ใหกบ
Loop Condition ทมมลางซายของโปรแกรม
ผลการทดสอบการเขยนโคด LabVIEW แสดงผลท LCD 16x2 (I2C)
ใบงานท 4.ขนตอนการ Compile Code และ Download ลงบอรด Arduino
1. เลอกบอรด Arduino ทตองการเชอมตอ ในกรณนผมเลอกเปน Arduino Uno
2. เลอกพอรตทเชอมตอ ในกรณนผมเชอตอไวท COM4 (*ถาผอานไมสามารถเลอกพอรตใชงานได
ในขนตอนนแสดงวา บอรด Arduino ยงไมไดลง USB-Driver หรอยงไมไดลง NI-VIA Driver)
3. เปดโคดโปรแกรม VI ทตองการใชงานกบคอมไพเลอร โดยเลอก “Load a VI”
4. คลกทป ม “Compile (Verify) Only” เพอทดสอบการคอมไพลโคด วาโปรแกรมทเขยนนนกนทรพ
ยาการบน Flash และ RAM เปนจ านวนเทาใด และม Error เกดขนหรอไม
5. เมอผลการคอมไฟลผานแลว กใหคลกเลอกท “Compile and Download” รอสกคร คอมไพเลอรก
จะโปรแกรมโคด LabVIEW ลงบนบอรด Arduino Uno ตามพอรตทก าหนดไว
โดยผลการคอมไพลแสดงผลดานลาง ในกรณนจะเหนวา โปรแกรมแสดงผลทาง LCD ทเขยน
ขนมานน จะใชพนทบน Flash ประมาณ 7.6kB คดเปน 23% จากทงหมด 32 KB ของบอรด Uno และ
พนทบน RAM ใชงานเพยง 289 bytes คดเปน 14% จากทงหมด 2 KB บนบอรด Arduino Uno
ใบงานท 5.การใชงานฟงกชน Debug Tool และตรวจสอบทรพยากร (RAM)
การ Debug โปรแกรมเปนสงส าคญส าหรบนกพฒนา เพราะวาปญหาสวนใหญมกเกดขนในขณะ
Run-time ซงถอวาเปนการ Debug ทยากทสด ถาเขยนโปรแกรมไมด จะท าใหไมไดผลลพธตามทก าหนด
ดงนนภาษาโปรแกรม หรอ IDE ทด ตองมเครองมอบางอยางทจะชวยใหนกพฒนาสามารถ Debug
โปรแกรมในขณะ Runtime ไดครบ
ในบทนเราจะใชฟงกชนการ Debug Tool ทสามารถสงคาทก าหนด ออกมาท COM พอรตได ซง
ท าใหเราทราบไดวา ขณะ Run-time โปรแกรมท างานอยางไร คลายๆ กนฟงกชน printf() ในภาษา C/C++
ของ Arduino IDE ครบ เราสามารถเลอกฟงกชนนไดจาก “Utilities>Debug Tool” ตามภาพ
ไลบารเกยวกบการ Debug และการจดการทวไป
วธการใชงานเราจะตองแทรก “Debug Tool.vi” ไปทโคดทเราตองการ Debug โดยคาทตองการ
แสดงผลออกทาง COM port จะตองเปนตวแปรชนดตวอกษร (String) เทานน และสามารถเลอกไดดวยวา
ตองการใหแสดงผล หนวยความจ า RAM ทเหลออยในขณะนนหรอไม (หนวยเปน Bytes) ในกรณนผ เขยน
แกไข ดเลยภาพใน Loop ใหเปน 1 วนาท เพอใหเราสามารถเหนการเปลยนแปลงไดงายขนครบ แสดงดง
ภาพ
ตวอยางโปรแกรมเขยนขอมลไปแสดงผลทจอ LCD
จากนนกลบมาท IDE เพอเลอก “Serial Monitor” ขนมาใชงาน แสดงดงภาพ
การเปดโปรแกรมยอย Serial Monitor”
เมอเปดโปรแกรม “Serial Monitor” ขนมาจะเหนไดวาบอรด Arduino จะท าการอพเดจคาทเรา
ก าหนดไวทกๆ 1 วนาท เชน “Count: 15.000:1348” หมายความวา ขณะนโปรแกรมก าลงท างานท Loop
ท 15 และหนวยความจ า RAM ทเหลอ (Free Memory) ขณะนคอ 1.348 KB
ผลการอานคาแสดงผลออกทาง COM Port
ใบงานท 6. การใชงานรวมกบ Real-Time Clock (RTC) ดวย I2C Interface
บอรด Data Logger Shiled และพอรตทเชอมตอกบ Arduino Uno
ตวอยางนจะแสดงการเขยนโปรแกรมเพอตงคา และอาน Real-Time Clock เบอร DS1307 ซงใน
บทความนผ เขยนใชฮารดแวรบอรด Data Logger Shield เวอรชน 1.0 ซงมราคาไมแพงนก และมาพรอม
กบ SD Card Slot เชอมตอทางพอรต (A4 และ A5 เพอใชงาน I2C Interface) และมพนทวางเพอสราง
วงจรของตวเอง จะเหมาะกบการท าแอพพลเคชนทตองเกบคาเวลาปจจบน และบนทกลง SD Card
ไลบารเกยวกบการตดตอผานทาง I2C
การใชเขยนโปรแกรมเพอตดตอกบ RTC นนจะใชไลบาล I2C ทตดตงมาพรอมกบ คอมไพเลอร
Toolkit สามารถใชงานไดทนท โดยการตงคา I2C Address ของ RTC ในบอรด Data Logger Shield จะ
ก าหนดไวท 0x68 โดยโปรแกรมเขยนขนเพอใชงานในใบงานนจะม 2 โปรแกรมคอ
1. SET DS1307 Real Time Clock.vi
2. READ DS1307 Real Time Clock.vi
โดยโปรแกรม “SET DS1307 Real Time Clock.vi” จะดาวนโหลดลงไปใน RTC เพยงครงแรก
ครงเดยวเพอก าหนดเวลาปจจบน หลงจากนนจะตองดาวนโหลดโปรแกรม “READ DS1307 Real
Time Clock.vi” เพอทดสอบการอานคา RTC ท COM Port
4.1 ก าหนดคาเวลาปจจบนให RTC (SET DS1307 Real Time Clock.vi)
การตงคาเวลาทตองการเขยนลงบน RTC ครงแรกครงเดยว
ในการใชงานครงแรก เราตองตงคาเวลาปจจบนใหกบ RTC โดยตองแปลงคา Date/Time ไปเปน
ตวเลขไบนาล เพอเขยนลงไปในรจตเตอรของ RTC ใหตงเวลาตามทก าหนด เราสามารถก าหนดเวลา
ปจจบนไดจากการตงคาตวเลขในหนา Front Panel ของโปรแกรม โดยตองรปแบบดงรป
โปรแกรมการตงคาเวลาใหกบ RTC DS1307 บนบอรด Data Logger Shield
การท างานของโปรแกรม “SET DS1307 Real Time Clock” อธบายไดดงน
1. เรยก “I2C Open.vi” เพอตงคาเรมตนการเชอมตอกบ RTC DS1307 ทางพอรต I2C
2. เรยก “I2C Write (Byte).vi” เพอเรมตนเขยนคา Date/Time ไปยงรจตเตอรของ RTC โดยตอง
ก าหนดต าแหนงเรมตนทตองการเขยนในทนคอ ใหเรมทรจตเตอร “0” ซงกคอคาคาวนาท
นนเอง
3. เรยก “I2C Write (Array).vi” เพอเรมตนตงคาเวลาปจจบนใหกบ RTC ในรปแบบ
‘MM/DD/YYYY HH:MM:SS”
4. เรยกฟงกชน “Binary to BCD” เพอแปลงคา Date/Time ไปเปนไบนาลท RTC เขาใจเพอตง
คาเวลา
4.2 การอานคาเวลาปจจบนจาก RTC (READ DS1307 Real Time Clock.vi)
ตวอยางโปรแกรมอานคาจาก RTC แสดงผลออกทาง COM Port อยางงาย
การท างานของโปรแกรม “READ DS1307 Real Time Clock” อธบายไดดงน
1. เรยก “I2C Open.vi” เพอตงคาเรมตนการเชอมตอกบ RTC DS1307 ทางพอรต I2C
2. เรยกฟงกชน “Read RTC Time and Format.vi” ซงเปน Sub-VI ทอานคาเวลาจากพอรต I2C
และแปลงคาเปนตวเลขทเราเขาใจใหอตโนมต โดยจะอยในรปแบบ ‘MM/DD/YYYY HH:MM:SS”
3. เรยกฟงกชน Debug Tool เพอท าการสงคาเวลาปจจบนออกทพอรต COM Port
4. ก าหนด Loop เวลาการอานคา ทกๆ 1 วนาท
5. ก าหนดให Loop ท างานแบบไมมสนสด โดยก าหนดคา “False” ใหกบ Conditional Terminal ท
มมลางขวาของ While Loop
ผลการแสดงผลทาง COM Port จะเหนวาเราสามารถอานคาไดถกตอง
จากนนเปด Serial Monitor กจะเหนวาคาเวลาปจจบนแสดงผลออกมาท COM Port ทกๆ 1 วนาท
(*ในกรณทเวลาไมตรง ตองกลบไปตงเวลาใหมดวย “SET DS1307 Real Time Clock”)
ใบงานท 7. การเขยนขอมล RTC ลง SD Card (SPI Interface)
บอรด Data Logger Shield ทม Slot SD Card มาใหพรอมใชงาน
ใบงานนจะเปนตวอยางการเขยนขอมลเวลาทอานมาจาก RTC บนทกลง SD Card โดยการ
เชอมตอกบ SD Card จะใช SPI Bus โดยพอรตทเชอมตอถกก าหนดไวแลวโดย Data Logger Shield
แสดงดงน
CK = D13
MISO = D12
MOSI =D11
CS = D10
การใชงานจะเรยกฟงกชนจาก SD Card ไลบาร แสดงดงรป *ซงจะรองรบ SD Card ท Format
แบบ FAT16 หรอ FAT32 เทานน
ไลบารเกยวกบ SD Card มฟงกชนใหเรยกใชงานไดทนท
โดย SD Card ไลบาร อางองจากมาตราฐาน “SD Library 8.3 Filename” หมายความวาสามารถ
ตงชอไฟลไดสงสด 8 ตวอกษร และนามสกลของไฟล 3 ตวอกษร เทานน และชอไฟลจะเปนตวอกษรตว
ใหญทงหมด ตวอยางเชน “DATALOG.CSV”
ตวอยางโปรแกรมอานคาจาก RTC จากนนบนทกขอมลลง SD Card และแสดงผลทาง COM Port
เราลองมาดตวอยางโปรแกรมแสดงดงรป โดยอธบายการท างานของโปรแกรมดงน
1. เรยก “I2C Open.vi” เพอตงคาเรมตนการเชอมตอกบ RTC DS1307 ทางพอรต I2C
2. เรยก “Read RTC Time and Format.vi” เพออานคาเวลาปจจบนจาก RTC
3. เรยก “SD Data Logger.vi” เพอบนทกขอมลลง SD Card การใชงานงายมาก เพยงก าหนด ชอ
ไฟล = “datalog”,CS Pin = 10 และก าหนดขอมลทตองการบนทกเปน Array ของตวเลข จากนน
ฟงกชนนจะบนทกขอมล เปนไฟล .CSV ใหอตโนมต
4. ทดลองสรางคาตวเลข ตามจ านวน Loop ทท างาน โดยจะเพมครงละ 1 ในแตละ Loop *เนองดวย
เปนคาตวเลขคงท DBL ท าใหตองใชฟงกชน Build Array เพอแปลงตวเลขเปนขอมล Array สง
ใหกบ SD Data Logger.vi
5. เรยกฟงกชน Debug Tool เพอท าการสงคาทบนทกลง SD Card ออกทาง COM Port เพอ
แสดงผล
ผลการแสดงผลท COM Port จะเหนวาชอมลจะอยใน CSV format เหมอนกบทเขยนลง SD Card
จากนนเปด Serial Monitor กจะเหนวาขอมลทบนทกแสดงผลออกมาท COM Port ทกๆ 1 วนาท (*
เนองจากวาการบนทกขอมลลง SD Card จะใชเวลาประมาณ 250ms ซงถอวาชาพอสมควร ดงนนตอง
ค านงถงการก าหนดเวลา Timing ในการบนทกขอมลดวย ควรหลกเลยงโคดทหนวงเวลาในการบนทก และ
อาจจะตองก าหนดเวลา Delay ของ Loop ใหนอยลง แตแอพพลเคชนสวนใหญทบนทกขอมลทกๆ 1 วนาท
กใชงานไดปกต)
ใบงานท 8. เขยนโปรแกรมอานคาอณหภมจาก Thermocouple จาก MAX6675 ผาน
พอรต SPI
บอรด MAX667 ส าหรบอานคาอณหภมจาก Thermocouple ชนด K-Type
ในใบงานนเราจะเขยนโปรแกรมเพออานคาอณหภมจาก MAX6675 ซงเปน Thermocouple K-Type
ไลบาร SPI ส าหรบตดตอกบอปกรณตางๆ ไดทนท
โปรแกรมอานคาอณหภมจาก MAX6675 ผานบส SPI
การท างานของโปรแกรมอธบายไดดงน
1. เรยก “SPI Open Express.vi” เพอเรมตนการตดตอกบ SPI Bus โดยตองก าหนด CS Pin ในกรณ
นผมเชอมตอ CS Pin ไวกบ Digital Pin = “9” และในตวอยางนใช SPI Clock Speed = 2MHz
ดงนนตองก าหนด Clock Divider = 5 หมายถง จะน า Clock บนบอรดหารดวย 8 ในกรณนผมใช
บอรด Arduino Uno ทมสญญาณนาฟกา 16MHz ดงนน Clock ในการใชงาน SPI จงเทากบ 16/8
= 2MHz
2. (การก าหนดคา Clock Divider อางองจาก Help อธบายไดดงตอไปน = 0 หารดวย 4, =1 หาร
ดวย 16, =2 หารดวย 64, =3 หารดวย 128, =4 หารดวย 2, =5หารดวย 8 และ = 6 หารดวย 32,
คาเรมตนจะก าหนดไวท Clock Divider = 0 ซงจะก าหนด Clock ใชงานไวท 4MHz ดงนนใน
บอรด Uno 16MHz/4 = 4MHz)
3. เรยก “SPI Transfer.vi” เพออานขอมลจ านวน 1 ไบต (8 บต) คาเรมตนจะก าหนดใหอานจาก
MSB
4. เรยก “SPI Transfer.vi” อกครงหนง เพออานขอมลจ านวน 1 ไบต (8 บต) ในครงนก าหนดใหอาน
LSB
5. ท าการแปลงคาขอมลใหเปนคาอณหภมตาม Format ใน Datasheet ของ MAX6675 ซงอธบาย
เพมเตมไดดงรป
6. ท าการแปลงคาอณหภมทอานมาไดใหอยในรปขอความ เชน 36.75’C จะแสดงผล = “Temp:
36.75C,”
7. เรยกฟงกชน Debug Tool เพอท าการสงแสดงผลออกทาง COM Port
8. ก าหนดเวลาการท างานของ Loop = 250ms เนองจาก MAX6675 จะใชเวลาในการอานขอมล
220ms ตามทก าหนดใน Datasheet
ผลทดสอบการอานคาแสดงผลทาง COM Port จะไดขอมลอณหภมสามารถแสดงไดถกตอง
ใบงานท 9. การสราง Thermocouple Data Logger ฉบบสมบรณ
จากใบงานกอนหนาน คณผอานคงไดเรยนรการใชเขยนโปรแกรมรวมกบ Arduino และอปกรณ
ตางๆในเบองตนเรยบรอยแลว ในบทนเราจะมาสราง Data Logger ทสมบรณโดยการน าความรจากการ
เขยนโปรแกรมสวนตางๆมาประกอบกนใหเปนแอพพลเคชน Thermocouple Data Logger โดยมฟงกชน
Alarm เมออณหภมสงกวาคาทก าหนดไว แสดงผลออกทาง LED บนบอรด และสงสญญาณเสยงเตอน
ออกทาง Buzzer รายการฮารดแวรและอปกรณทใชในใบงานนประกอบไปดวย
บอรด Arduino-Compatible Uno R3 ไมโครคอนโทรลเลอร
บอรด Data Logger Shield ประกอบดวย SD Card และ Real-Time Clock (RTC)
บอร LCD Display 16x2 เชอมตอแบบ I2C
บอรด MAX6675 Thermocouple Type-K Module
บอรด Data Logger Shield ทตดตง MAX6675 และ Buzzer บน Prototype Area
โดยโปรแกรมทพฒนาขนจะแบงเปน 2 สวนหลกๆ คอ สวนแรกคอ การตงคาเรมตนตางๆใหพรอม
ใชงาน และสวนทสองคอ โคดทอยใน Loop ซงจะท างานวนซ าๆไปเรอย เพออานคาและแสดงผลทาง LCD
หนาตางการตงคา Address และคาคงทตางๆ ของ Front Panel
ผลการคอมไพลโปรแกรมจะกนพนทบน Flash ประมาณ 25KB (78%) และกนพนท RAM ประมาณ 1.11
KB (54%) เมอเทยบกบหนวยความจ าทงหมดบนบอรด Arduino Uno
โปรแกรมในสวนของ Initial Haradware ทงหมด
โปรแกรมในสวนหลกทอานคา บนทก แสดงผล และเปรยบเทยบกบ Temp Alarm
ตวอยางการแสดงผลออกทาง LCD ซงจะมคาเวลา อณหภม และ Alarm (*ในกรณน 45 คอ อณหภม
Alarm ทก าหนดไว ถาอณหภมปจจบนสงกวานจะมเสยงแจงเตอนทาง Buzzer)
อปกรณ Arduino-Based Embedded Data Logger ฉบบสมบรณ
เมอน า SD Card ไปเปดในคอมพวเตอรจะแสดงคาขอมลทบนทกไว ซงม 3 ขอมล คอเวลา อณหภม และ
สถานะ Alarm Status
ผลการพลอตกราฟในโปรแกรม Excel จากขอมลใน SD Card
บทสรป
ผ เขยนมงหวงใหบทความนน าเสนอการพฒนา Embedded Data Logger ดวยภาษา LabVIEW
ซงเปนภาษาทางเลอกนอกเหนอจากภาษา C/C++ ทนยมใชงานกนในปจจบน ผ เขยนเลงเหนวา
LabVIEW เปนภาษาทพฒนาไดงาย และท าความเขาใจโคดไดรวดเรว ท าใหผพฒนาสามารถมงเนนไปท
การเพมประสทธภาพของแอพพลเคชน มากกวาจะตองกงวลเรองเครองมอ หรอภาษาในการพฒนา
ในสวนของ “Arduino compatible compiler for LabVIEW (ACC4LV)” ถอวาเปนโปรแกรมทท า
ใหความฝนของนกพฒนา LabVIEW เปนความจรง เนองจากสามารถโปรแกรมโคด LabVIEW ลง
ฮารดแวรราคาถกอยาง Arduino ได และไลบารกยดหยนใหเขยนเพอเชอมตอกบบอรดเสรม Shields
ภายนอกได อาท ผานบส UART,I2C หรอ SPI ได โดยในปจจบนแพลตพอรม Arduino มบอรด Shields
จ านวนมากหลายหลายชนด ท าใหการพฒนาแอพพลเคชนดวย LabVIEW สามารถน าไปใชงานได
หลากหลายตงแต Home Application ไปจนถงงานในอตสาหกรรม ประกอบกบผพฒนากอพเดจ
ความสามารถของคอมไพเลอรอยเรอยๆ ถาคณผอานเรมตนศกษา ณ วนน ในอนาคตผ เขยนมองวาจะท า
ใหสามารถพฒนาแอพพลเคชนตางๆไดอยางรวดเรวแนนอน
ในสวนของ Hardware อปกรณทกชนในบทความนจดท าขนเพอประกอบการเรยนรเทานน ผ เขยน
มไดปรบแตงเพอใชงานในสภาพแวดลอมจรง อาท ลดสญญาณรบกวน ปรบความถกตองของอณหภมท
อานได และฟงกชนอนๆ ดงนน ถาผอานตองการน าเอาอปกรณ Data Logger และโคด LabVIEW ทเขยน
ขนในบทความนไปใชงานจรง ผอานตองปรบปรงเพอใหเหมาะกบสภาพแวดลอมในการน าไปใชดวยตนเอง
บทสงทาย
ขอควรรกอนเขยนโปรแกรมดวย Arduino Compatible Compiler for LabVIEW
โดยปกตการเขยน LabVIEW มกจะใชพฒนาแอพพลเคชนในลกษณะ PC Based Application ท
รนบน Windows ตดตอกบฮารดแวรผาน Bus ตางๆ อาท RS-232, USB, GPIB หรอ Ethernet ซงมกจะไม
พบปญหาขอจ ากดดาน Hardware เทาใดนก เนองจาก PC เปน Hardware ทมประสทธภาพสง เชน CPU
มความเรว ระดบ GHz และ หนวยความจ า RAM สงถงระดบ GB
แตการเขยน LabVIEW เพอใชงานแบบ Embedded Application นนแตกตางอยางมาก
โดยเฉพาะอยางยงถาใชงานรวมกบ Arduino Platform ซงมขอจ ากดดานฮารดแวรจ านวนมาก เพราะเปน
Microcontroller ขนาดเลก มขอจ ากดดาน CPU และ หนวยความจ า ยกตวอยางเชน บอรด Arduino Uno
ม CPU 8-bit ท างานท 16MHz มหนวยความจ าแบบ Flash 32kB และ มหนวยความจ า RAM เพยง 2kB
เทานน ซงถอวานอยมากๆ (*แต “Arduino Compatible Compiler for LabVIEW”
นนรองรบบอรดราคาถกอยาง Arduino Uno หมายความวา Compile มความฉลาดและจดการ
หนวยความจ าในระดบ Low Level ไดดเยยม)
ดงนนการพฒนา LabVIEW เพอใชงานรวมกบบอรด Arduino จงมขอแตกตางบางประการท
นกพฒนาจ าเปนตองร กอนทจะการเรมตนเขยนโปรแกรม ผมจงสรปมาใหเปน 10 หวขอ ดงตอไปนครบ
1.การเรยกใชงาน “Arduino Compatible Compiler for LabVIEW”
ในหนาตาง “Block Diagram ใหคลกขวา > เลอก Addons > Arduino Compatible Compiler
sub-palette” แสดงดงรป จะเหนไดวาทกฟงกชนทอยใน “Arduino Compatible Compiler” สามารถ
โปรแกรมลงใน Arduino ไดทก VIs (*ซงอาจจะมฟงกชนเพมเตมอกในอนาคต) แตฟงกชนอนๆ
นอกเหนอจากหนาตางน จะใชงานไดเฉพาะการเขยนโปรแกรมส าหรบ Host PC เทานน และการเขยน
โปรแกรมสามารถสรางจาก Main VI ไดเลย ไมตองสรางเปน Project เพราะวาเราไมตอง Build .exe ไฟล
ในหนาตาง Project Explorer
Arduino Compatible Compiler for LabVIEW sub-Palette
2.ยงใช Concept การเขยนโปรแกรมแบบ Dataflow Programming
ความแตกตางหลกของ LabVIEW เมอเทยบกบภาษาอนๆกคอ การท างานแบบ “Dataflow” ซงม
ขอดทสามารถอานโคด และ Debug โปรแกรมไดงาย ปกตโปรแกรมจะท างานแบบซาย-ไปขวา โดยม
Error In-Out เปนตวก าหนดล าดบการท างานของโคด จากรป จะเหนวามการใช “Error In” และ “Error
Out” ในทกๆ ฟงกชน
รปแบบการเขยนโปรแกรมแบบ Dataflow Programming
ส าหรบฟงกชนทไมม Error In-Out ใหเชอมตอ กตองสรางขนมาเอง อาท ในกรณนเราตองการ
ก าหนด Error In-Outให “Wait 100 ms” ดงนนเราตองสราง “Flat Sequence Structure” เพอใหม Node
เชอมตอ Error In-Out ดงรป
การสราง Error In-Out ใหกบ “Wait 100 ms
3.Error Cluster ใชเพอก าหนดล าดบการท างาน (Dataflow) เทานน (*ไมมการสงคาพารามเตอรใดๆผาน
Error Cluster)
ขอดของการเชอมตอ Error In-Out กคอการท า “Error Handling” หมายความวา ถา Sub-VI ใดๆ
เกด Error ขน คา “Status” ของ “Error Out” กจะสงคาเปน “True” เพอบอก Process ถดไปวา กอนหนาน
ม Error เกดขน ท าให Process ถดไปไมตองเสยเวลาในการรนโคด (*ซงจะเสยเวลาโดยใชเหต) เพราะถา
จดใด จดหนงของโปรแกรม Error ดงนนโปรแกรมทงหมดกควรจะหยดการท างาน เพอแจงใหกบ User
ทราบโดยเรวทสด
ตวอยางคา พารามเตอรใน Error Cluster
ปกตถาเราเขยนโคด LabVIEW บน PC เรามกจะท าการ “Error Handing” โดยสราง “Case
Structure” รวมกบ “Error In-Out” ดงรป (*Case Structure กรอบสเขยว และสแดง) แตโคดลกษณะนจะ
ไมสามารถรนไดในฮารดแวร Arduino โดยในระหวางการ Compile กจะม Error เกดขน
กลาวโดยสรปกคอ Error Cluster (In-Out) ใชเพอก าหนด Flow การท างานของโปรแกรมเทานน ไม
สามารถใชงานเพอเปน “Error Handling” ไดในฮารดแวร Arduino ได
เพมเตม “Error Cluster” เปน Cluster ชนดเดยวททางโปรแกรมยอมใหสรางได นอกเหนอจากน
เชน User Define Cluster ทสรางขนมาเอง จะท าให Compile โปรแกรมไมผาน
การเขยน “Error Handling”โดยสราง Case ทชอวา “Error” และ “No Error”
การเขยนเชนนจะท าให Compile ไมผาน
4.ไมซพพอรต Control Typedefs (.ctrl) ทสรางขนมาเองทกชนด (*ยกเวนแต Typedefs ทเปน Input คา
เรมตนของฟงกชนทใหมาใน Arduino API)
ตวอยางการสราง Typedefs ซงไมอนญาตใหใชใน Arduino Compatible Compiler for LabVIEW
(*ถาน ามาใชงานในโปรแกรมจะท าให Compile ไมผาน)
การสราง Control Typedefs ทเปนคาเรมตนของ Arduino API ซงใชงานได
เพราะเปนขอยกเวนของ Compiler
5.ไมรองรบการท างานแบบ Parallel Loops และ Multi Threading
จดเดนของ LabVIEW ทมเหนอกวาภาษาอนๆอกหนงอยาง กคอการท างานแบบ Parallel Loops
ถงขนทวา CPU ทเปนแบบ Multi-Core โปรแกรม LabVIEW กยงสามารถก าหนดไดวา Loop ใดท างานบน
Processor Core ใดๆไดอกดวย
แตการพฒนาแอพพลเคชนแบบ Embedded Systems โดยเฉพาะบนฮารดแวร Arduino ซงเปน
Microcontroller ขนาดเลก และไมมระบบปฏบตการรนอยบนฮารดแวร จงท าใหท างานแบบ Parallel
Loops เปนไปแทบจะไมไดเลย (*ไมแนนะครบ ในอนาคตตว Compiler อาจจะฉลาดพอ และ Optimize
Low level โคดใหเราใชงานได)
เราลองมาดตวอยางประกอบความเขาใจกนครบ ถาเราเขยนโปรแกรมซงม While Loop จ านวน 2
Loop ดงรปท ซงเหนไดวาการท างานของทงสอง Loop จะท าหนาทเพม/ลด จ านวนนบ (+1 และ -1)ไป
เรอยๆ และ Loop จะรนแบบตอเนองไมสนสด (Infinite Loop)
ตวอยางโปรแกรมแบบ Parallel Loops ซงไมรองรบคอมไพเลอรเวอรชนปจจบน
เนองจากวา “Arduino Compatible Compiler for LabVIEW” ไมซพพอรต Multi Threading แต
การเขยนโปรแกรมเชนนจะสามารถ Compile ผาน แตเมอ Download และรนบนฮารดแวร โปรแกรมจะ
ท างานแบบคาดเดาไมไดครบ เพราะไมรวา Loop ไหนจะท างานกอนหลง จาก Concept การท างานแบบ
Dataflow ดงนน Loop แรกทท างาน จะตองรนจนเสรจสนกอน แลว Loop ทสองถงจะเรมตนท างาน แต
จากโปรแกรมนเราทราบอยแลววา แตละ Loop จะท างานแบบไมมสนสด ดงนน Loop ทสองจะไมมโอกาส
ไดท างานเลยครบ
สรปกคอ ควรหลกเลยงการเขยนโปรแกรมแบบ Parallel Loops เพราะตว Compiler ยงไมรองรบ
การท างานแบบ Multi Threading บน Arduino (*ผมเชอวาในเวอรชนตอๆไปจะไดรบการพฒนาจน
สามารถเขยนโปแกรมแบบ Multiple Loop ได)
6. หามใช สญลกษณ "/" และ "\" ในชอของ Controls และ Indicators
เพราะเปนเครองหมายทใชงานเฉพาะของ “Arduino Compatible Compiler for LabVIEW” ใน
ระหวางการ Compile โปรแกรม ถาใชงานในโปรแกรมทสรางขนจะท าใหคอมไพลไมผาน
7. หามใช Case Structure Default Values
ถาใครทเคยใช LabVIEW เวอรชนใหมๆ จะทราบดวาถาเราม “Cases” หลายๆเคส เราไมตองเขา
ไปในทกเคส เพอ Wiring จดเชอมตอ Output เราสามารถคลกขวา ท Node เชอมตอ แลวเลอก “Use
Default if Unwired” แสดงดงรปท ซงการท าลกษณะนจะเปนขอหามของ “Arduino Compiler for
LabVIEW” ซงจะท าให Compile ไมผานนะครบ
การก าหนด “Use Default if Unwired” ใหกบ Case ซงคอมไพเลอรไมรองรบ
วธทถกตองกคอ เราตองก าหนดคาเรมตน อาจจะเปน Constant เชน “Initial value = 0” ใหกบ
Node Output ของเคส แสดงดงรปตอไป
วธการทถกตอง ในก าหนดคา “Initial value” ใหกบ Case Output Node
8. ไมซพพอรต การก าหนด Password ใน SubVIs
ถาใครคดจะตง Password ใน SubVIs หรอแมแต Main จะท าให Compile ไมผานครบ
9. หามเชอมตอ Array Type ทไมตรงกน (*ซงจะท าใหเปลอง RAM มากใรระหวางรนโปรแกรม)
ถาใครเคยเขยนโปรแกรม LabVIEW มากอน บางครงนาจะเคยเหนจดแดงๆ (Coersion Dot) ตรง Node Input หรอ Output ซงมความหมายวา การเชอมตอระหวาง Data Type ทงสองตวเปนคนละชนดกนครบ เชน ถาเราเชอมตอตวแปรจ านวนเตม “Integer I32 -> ตวแปรจ านวนเตม DBL” กจะมจดสแดงๆ เกดขน
ซงปกต LabVIEW ยนยอมใหเราเขยนโปรแกรมเชนนครบ เพราะ LabVIEW จะแปลง Datatype ใหตรงกนใน Background ครบ
ส าหรบ “Arduino Compiler for LabVIEW” จะไมยนยอมใหเราท าเชนนกบ ตวแปรทเปน Array ครบ ซงจะท าให Compile Error แตส าหรบตวแปรทเปน Scalar หรอ ตวเลข (Integer), ตวอกษร (String) หรอ Boolean ทไมใช Array สามารถใชงานไดครบ เพราะ Compiler จะแปลง Datatype ใหตรงกนตอนทเรา Compile โคดครบ
แสดง จดแดงๆ (Coersion Dot) เนองจากเชอมตอ Array Datatype คนละชนดกน
ถาเปนตวแปร Array ตองแกไข Datatype ใหตรงกนเทานน แสดงดงรปไมเชนนนจะ Compile ไมผาน
10. หลกเลยงการใช Array และ String Data type มากเกนความจ าเปน
เพราะ Data Type สองชนดน จะกนหนวยความจ าเยอะมากครบ ซงจะใชงานหนวยความจ าใน RAM ทมจ ากดอยแลว (*โดยเฉพาะบอรด Arduino Uno ทม RAM เพยง 2 kBytes) อาจจะท าใหโปรแกรม Crash ระหวาง Run-Time ไดครบ
สดทายนหวงวาบทความนจะเปนประโยชนกบผอานไดบาง
แลวพบกนใน FB: “LabVIEW Embedded for Arduino”