Arduino IDE151
วิธีการที่สองคอื ใชก ระบวนการทางซอฟตแวรเขา มาชวย ซึ่งมีขั้นตอนโดยสรปุ ดังนี้
(1) อา นคาการกดสวติ ชคร้ังแรกเขามากอน
(2) หนว งเวลาประมาณ 0.1 ถงึ 1 วนิ าที
(3) อา นคาของการกดสวติ ชอกี ครง้ั
ถาหากคาทอ่ี านไดเ หมือนกับการอานคร้ังแรก
แสดงวา มีการกดสวติ ชเกิดข้ึนจรงิ
ถาคาที่อา นไดไ มเ หมือนกับการอานครั้งแรก
แสดงวา สญั ญาณทเ่ี กิดขึ้นอาจเปน เพยี งพลั สแคบๆ อาจตีความไดวา
เปนสญั ญาณรบกวน จึงยังไมม ีการกดสวติ ชเกดิ ขึ้นจรงิ
9.2 ฟง กช นั่ โปรแกรมภาษา C/C++ ในไลบรารี ipst.h ท่ีใชในการทดลอง
สาํ หรบั คําส่ังหรอื ฟงกชน่ั ของโปรแกรมภาษา C/C++ ท่ีใชในการทดลองทั้งหมดในบทนี้ ได
รบั การบรรจไุ วในไฟลไ ลบรารี ipst.h คือ คําส่งั in, sw_OK และ sw1
9.2.1 in
เปนฟง กช่ันอา นคาสถานะลอจกิ ของพอรต ท่ีกําหนด
รูปแบบ
char in(x)
พารามเิ ตอร
x - กําหนดขาพอรต ท่ีตอ งการอา นคา มีคาตงั้ แต 0 ถงึ 50 สาํ หรบั IPST-SE ใชไ ดถงึ 30
หมายเหตุ : ไมแนะนําใหใชฟ งกช่ันนก้ี ับจุดตอ 19 และ 20 บนแผงวงจร IPST-SE
การคนื คา
เปน 0 หรอื 1
ตัวอยา งที่ 9-1 // ประกาศตัวแปร x เพอื่ เกบ็ คาผลลัพธจ าการอา นคาระดบั สญั ญาณ
// อานคาดจิ ติ อลจากพอรต หมายเลข 16 แลวเกบ็ คาไวท ตี่ ัวแปร x
char x;
x = in(16);
152 Arduino IDE
9.2.2 sw_OK()
เปน ฟง กช นั่ ตรวจสอบสถานะสวติ ช OK บนแผงวงจร IPST-SE โดยใหส ถานะ “เปนจรงิ ” เมอ่ื
มีการกดสวติ ชและ “เปนเท็จ” เมื่อไมม ีการกดสวติ ช
รูปแบบ
unsigned char sw_ok()
การคนื คา
1 (เปน จริง) เมื่อมีการกดสวติ ช
0 (เปน เทจ็ ) เมอื่ ไมม ีการกดสวติ ช
ตวั อยางท่ี 9-2 // ผนวกไฟลไลบรารหี ลกั
#include <ipst.h> // ตรวจสอบการกดสวติ ช OK
void setup() // เปลยี่ นสีพน้ื เปน สเี หลอื ง
{ // แสดงสีพนื้ ใหมน าน 3 วนิ าที
// เคลยี รห นาจอแสดงผล กาํ หนดพนื้ หลงั เปนสดี าํ
glcdClear();
}
void loop()
{
if (sw_OK())
{
glcdFillScreen(GLCD_YELLOW);
delay(3000);
}
glcdClear();
}
9.2.3 sw_OK_press()
เปน ฟง กช่ันวนตรวจสอบการกดสวติ ช OK บนแผงวงจร IPST-SE ตองรอจนกระทั่งสวติ ชถ กู
ปลอยหลงั จากการกดสวติ ชจงึ จะผา นฟง กช่นั นี้ไปกระทําคําส่งั อน่ื ๆ
ตัวอยา งที่ 9-3 // รอจนกระท่งั เกดิ กดสวติ ช OK
............
sw_OK_press();
............
Arduino IDE153
9.2.4 sw1_press
เปน ฟง กช่ันวนตรวจสอบการกดสวติ ช SW1 บนแผงวงจร IPST-SE ตองรอจนกระท่ัง SW1
ถกู ปลอยหลงั จากมีการกดสวติ ช จงึ จะผานพน การทํางานของฟงกชน่ั นไี้ ป
รูปแบบ
void sw1_press()
ตัวอยา งท่ี 9-4
............
sw1_press(); // รอจนกระทงั่ สวติ ช SW1 ถูกกดและปลอ ย
................
9.2.5 sw1
เปน ฟง กช่นั ตรวจสอบการกดสวติ ช SW1 ในขณะใดๆ
รูปแบบ
char sw1()
การคนื คา
เปน “0” เมือ่ สวิตช SW1 ถกู กด และ เปน “1” เมื่อไมมีการกดสวิตช SW1
ตัวอยางที่ 9-5 // ประกาศตวั แปร x เพอื่ เกบ็ คาผลลพั ธจ ากการอา นคาดจิ ติ อล
// อา นคาสถานะของสวติ ช SW1 มาเกบ็ ไวท ตี่ ัวแปร x
char x;
x = sw1();
154 Arduino IDE
ปฏบิ ัตกิ ารท่ี 4-1 ควบคมุ LED ดวยการกดสวิตช OK
การเชอื่ มตอ ทางฮารด แวร
ตอ แผงวงจร ZX-LED กบั จุดตอ พอรต 17 ของแผงวงจรหลัก IPST-SE
ข้ันตอนการทดลอง
4.1.1 เปดซอฟตแ วร Wiring 1.0 สรา งไฟลใหม พิมพโปรแกรมที่ L1-1 บันทึกในชื่อ microbox_OKtest.ino
4.1.2 เปดสวิตชจายไฟแกแ ผงวงจร IPST-SE แลว เช่ือมตอ สาย USB เขา กบั คอมพิวเตอร
4.1.3 คอมไพลและอัปโหลดโปรแกรมไปยงั แผงวงจร IPST-SE โดยคลิกท่ีปุม
28 A4 25 A1 8 SCL 9 SDA
29 A5 26 A2 USB
ZX-LED 24 A0 30 A6 27 A3
D
+S ON
Hello0World0000000000
G
000000000000000000000 6V
12
Press OK000000000000000000000 G
6V
000000000000000000000 13
000000000000000000000 G
000000000000000000000 6V
000000000000000000000 14
000000000000000000000 G
000000000000000000000 6V
000000000000000000000 15
000000000000000000000
000000000000000000000 SERVO
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
S
+
DC MOTORO
15 SV0 14 SV1 13 SV2 12 SV3
KNOB
OK
SW1
16 18 UART1 LOW 12
17 19 +5
20 RESET 2 RxD1 3 TxD1
รปู ที่ L4-1 การตอ วงจรเพ่ือทําการทดลองสาํ หรบั ปฏบิ ัตกิ ารท่ี 4
Arduino IDE155
#include <ipst.h> // ผนวกไฟลไ ลบรารหี ลกั
void setup()
{ // กาํ หนดขนาดตวั อักษร 2 เทา
// แสดงขอ ความออกหนา จอแสดงผล
setTextSize(2); // วนรอจนกระท่ังกดสวติ ช OK
glcd(1,1,"Press OK"); // เคลยี รหนาจอแสดงผล กาํ หนดพน้ื หลงั เปนสดี าํ
sw_OK_press();
glcdClear(); // ตรวจสอบการกดสวติ ช OK
} // ดบั LED ทจี่ ดุ ตอ พอรต 17
void loop() // นาน 2 วนิ าที
{ // ขบั LED ทจ่ี ุดตอ พอรต 17 ใหต ิดสวา ง
if (sw_OK())
{
out(17,0);
delay(2000);
}
out(17,1);
}
คําอธบิ ายโปรแกรม
การทํางานของโปรแกรมเรมิ่ ตน ดว ยการแสดงขอ ความแจงใหกดสวิตช OK บนแผงวงจร IPST-SE เมอื่
กดแลว จะเขาสูลูปการทาํ งานหลักในฟงกชั่น loop() เพ่ือตรวจสอบตอ ไปวา มกี ารกดสวติ ช OK หรอื ไม ถา ไม
มี จะสงขอ มลู “1” ออกไปยังจุดตอพอรต 17 ทําให LED ที่ตอ อยตู ดิ สวา ง และยงั คงสวางอยเู ชน นัน้ จนกวาจะ
มกี ารกดสวติ ช OK
เม่อื สวิตช OK ถกู กด จะทําใหเงอื่ นไขการตรวจสอบเปนจรงิ เกิดการตอบสนองดว ยการสงขอ มลู “0”
ไปท่ีจุดตอ พอรต 17 ทําให LED ท่ีตอ อยดู บั ลงเปน เวลา 2 วินาที ตามการทํางานของฟงกช ่ัน delay จากนั้นก็
จะหลุดออกจากการตรวจสอบ มาพบฟงกช ั่น out เพ่อื ขบั ให LED กลบั มาตดิ อกี ครั้ง แลว วนรอการกดสวติ ช
OK ในรอบใหม
โปรแกรมท่ีL4-1 : ไฟลmicrobox_OKtest.ino โปรแกรมภาษา C/C++ สาํ หรบั ทดลองควบคมุ LED ดว ยสวติ ช
4.1.4 รนั โปรแกรม
ที่จอแสดงผลกราฟก LCD จะแจงใหกดสวิตช OK ทันทีที่กดสวิตช OK บนแผงวงจร IPST-SE จะทําให
LED ของแผงวงจร ZX-LED ท่ีตอ กบั จุดตอ พอรต 17 ตดิ สวาง
4.15 กดสวติ ช OK อีก 1 คร้ัง แลว ปลอย สงั เกตการทาํ งานของ LED
LED ของแผงวงจร ZX-LED จะดบั ลงนาน 2 วินาที จากนั้นจะกลับมาตดิ สวางใหมอ ีกครงั้ และจะทํา
งานในลักษณะนี้ไปตลอด จนกวา จะมกี ารรเี ซตระบบ หรอื ปดเปดจายไฟเลี้ยงใหม
156 Arduino IDE
ปฏบิ ัตกิ ารท่ี 4-2 ควบคมุ LED ดวยการกดสวิตช SW1
ในการทดลองนจ้ี ะเพมิ่ เตมิ สวติ ชเ ขา มาอกี 1 ตวั คอื SW1 โดยสวติ ช SW1 ถกู ตดิ ตงั้ ไวพ รอ มใชง านบนแผง
วงจร IPST-SE อยแู ลว โดยในปฏบิ ัตกิ ารน้ีตอ งการนําสวิตช SW1 มาควบคมุ การเปดปด LED ในแบบท็อกเกลิ
(toggle) น่ันคือ เม่อื กดสวติ ชหนง่ึ ครั้ง LED ตดิ และเมือ่ กดซา้ํ LED จะดบั สลับกันเชนน้ี
การเชื่อมตอ ทางฮารด แวร
ตอ แผงวงจร ZX-LED กบั จุดตอ พอรต 17 ของแผงวงจรหลัก IPST-SE
ขั้นตอนการทดลอง
4.2.1 เปดซอฟตแ วร Wiring 1.0 สรา งไฟลใหม พิมพโปรแกรมที่ L1-1 บันทึกในช่ือ microbox_SW1test.ino
4.2.2 คอมไพลแ ละอปั โหลดโปรแกรมไปยงั แผงวงจร IPST-SE โดยคลิกทป่ี ุม
4.2.3 รนั โปรแกรม
ที่จอแสดงผลกราฟก LCD จะแจงใหกดสวติ ช OK
4.2.4 กดสวติ ช OK อีก 1 ครัง้ แลว ปลอย
4.2.5 ทดลองกดสวิตช SW1 แลวปลอย 3 ครงั้ สังเกตการทํางานของ ZX-LED
LED ของแผงวงจร ZX-LED จะตดิ และดบั กลบั สถานะกนั ในทกุ ครงั้ ทม่ี กี ารกดสวติ ช SW1 นน่ั คอื จากเดมิ
ดบั จะกลายเปน ติดสวา ง และจากตดิ สวา งจะกลายเปนดับ
4.2.6 กดสวติ ช SW1 คา งไวครูหน่งึ แลว จึงปลอย สงั เกตการทํางานของ LED
เมื่อสวิตชยงั ถูกกดคา ง สถานะของ LED จะไมม กี ารเปล่ียนแปลง จนกวา สวิตชจะถกู ปลอย
Arduino IDE157
#include <ipst.h> // ผนวกไฟลไลบรารหี ลกั
int i=0;
void setup() // กาํ หนดขนาดตวั อกั ษร 2 เทา
{ // แสดงขอ ความออกหนาจอแสดงผล
// วนรอจนกระทั่งกดสวติ ช OK
setTextSize(2); // เคลยี รห นาจอแสดงผล กาํ หนดพน้ื หลงั เปนสดี าํ
glcd(1,1,"Press OK");
sw_OK_press(); // ตรวจสอบการกดสวติ ช OK
glcdClear(); // ดบั LED ทจ่ี ดุ ตอ พอรต 17
}
void loop()
{
if (sw1())
{
out(17,i^=1);
while(sw1())
delay(5);
}
}
คําอธบิ ายโปรแกรม
โปรแกรมจะมตี วั อยา งการรบั คา สวติ ช 2 ตวั คอื สวติ ช OK (ใชฟ ง กช นั่ sw_OK_press()) และสวติ ช SW1
(ใชฟงกช ่ัน sw1()) โดยตวั แรกจะอยใู นฟงกช ่ัน setup เพือ่ วนรอการกดสวติ ช OK เพอ่ื เรมิ่ ตน การทํางาน
หลังจากมกี ารกดสวติ ช OK จะเขา สูลูปการทํางานของฟงกช ่ัน loop เพือ่ วนรอการกดสวติ ช SW1 เมื่อ
สวิตช SW1 ถกู กด จะทําการสงสัญญาณออกมายงั พอรต 17 โดยคา ที่สงออกมาจะไดม าจากการเอ็กคลซู ีฟ
ออรค า ของตวั แปร i กบั 1 จากคาํ ส่ัง i^=1 ทําใหคา ที่ไดมกี ารกลบั สถานะทกุ ครั้งท่มี กี ารเรยี กใหทํางาน ซ่ึงการ
ทํางานในลักษณะน้ีสามารถใชคําสั่ง i=~i ก็ได แตเนื่องจากในคอมพิวเตอรบางเครื่อง (โดยเฉพาะเครื่อง
คอมพิวเตอร Macintosh) ไมม คี ยี ~ ใหใช จึงตอ งเขยี นคาํ สั่งดว ยการทําเอก็ คลูซีฟ-ออรแ ทน
ดงั น้ันเมอื่ มกี ารกดสวติ ช SW1 ทุกครง้ั กจ็ ะมกี ารกลบั สถานะลอจิกเดมิ ทจี่ ุดตอพอรต 17 ทําให LED
ของแผงวงจร ZX-LED ที่ตอ อยเู กดิ การตดิ และดบั สลับกนั ในทุกครง้ั ที่กดสวิตช
สาํ หรบั คาํ สงั่ while(sw1()) และ dealy(5); ทาํ หนา ทลี่ ดสญั ญาณรบกวนทเี่ กดิ จากการกดสวติ ช ทาํ ใหก
ารกดสวติ ช SW1 ในแตล ะครัง้ มคี วามแนนอนมากขึน้
โปรแกรมท่ี L4-2 : ไฟล microbox_SW1test.ino โปรแกรมภาษา C/C++ สาํ หรบั ทดลองควบคุม LED
ดว ยสวติ ช SW1 ในลกั ษณะกลบั สถานะการทาํ งานในทกุ ครงั้ ทม่ี กี ารกดสวติ ช SW1
158 Arduino IDE
การเชื่อมตอ ทางฮารด แวร
ตอ แผงวงจร ZX-SWITCH01 กบั จุดตอ พอรต 16 ของแผงวงจรหลัก IPST-SE
ขน้ั ตอนการทดลอง
5.1 เปดซอฟตแ วร Wiring 1.0 สรา งไฟลใหม พิมพโปรแกรมท่ี L1-1 บันทึกในชื่อ microbox_CounterSwitch.ino
5.2 เปด สวติ ชจ า ยไฟแกแ ผงวงจร IPST-SE แลว เชอื่ มตอ สาย USB เขา กบั คอมพวิ เตอร
5.3 คอมไพลแ ละอปั โหลดโปรแกรมไปยงั แผงวงจร IPST-SE โดยคลกิ ทปี่ มุ
5.4 รนั โปรแกรม
ท่ีจอแสดงผลกราฟก LCD แสดงขอ ความ Start ใหกดสวติ ช OK
5.5 กดสวติ ช OK 1 คร้ัง แลว ปลอย
ทจี่ อแสดงผลกราฟก LCD แสดงขอ ความ COUNTER ใหเ รมิ่ การนบั ดว ยการกดสวติ ชท ตี่ อ กบั พอรต 16
5.6 กดสวิตชท่ีแผงวงจร ZX-SWITCH01 ท่ีตอ กบั พอรต 16 สังเกตการทํางานท่ีจอแสดงผลของแผงวงจร IPST-SE
ท่ีจอแสดงผลจะเรมิ่ ตนแสดงคา การนับจํานวนการกดสวติ ช โดยเรม่ิ จาก 0 คา จะเปล่ียนทันทีท่ ่ีมกี ารกด
สวิตชท่ีพอรต 16 และจะทําการบั คา ตอไปได กต็ อ เม่ือมีการปลอยสวติ ช แลว กดใหม หากสวิตชยงั ถกู กดคาง
คา การนับจะไมม กี ารเปล่ียนแปลง จนกวา สวิตชจะถกู ปลอย และกดเขา มาใหม
28 A4 25 A1 8 SCL 9 SDA
29 A5 26 A2 USB
ZX-Switch01 24 A0 30 A6 27 A3
D D
ON
+S Hello0World0000000000
G
000000000000000000000 6V
12
COUNTER000000000000000000000 G
6V
000000000000000000000 13
000000000000000000000 G
000000000000000000000 6V
000000000000000000000 14
000000000000000000000 G
000000000000000000000 6V
15
27000000000000000000000
SERVO
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
S
+
DC MOTORKNOB
15 SV0 14 SV1 13 SV2 12 SV3
OK
SW1
16 18 UART1 LOW 12
17 19 +5
20 RESET 2 RxD1 3 TxD1
รปู ที่ L5-1 การตอ วงจรเพ่ือทําการทดลองสาํ หรบั ปฏบิ ัตกิ ารท่ี 5
Arduino IDE159
#include <ipst.h> // ผนวกไฟลไลบรารหี ลกั
int i=0; // ประกาศตวั แปรเกบ็ คาการนับ
void setup()
{ // กาํ หนดขนาดตวั อักษร 2 เทา
// แสดงขอ ความ Start ออกหนา จอแสดงผล
setTextSize(2); // วนรอจนกระท่งั กดสวติ ช OK
glcd(1,3,"Start"); // เคลยี รห นาจอแสดงผล กาํ หนดพนื้ หลงั เปน สดี าํ
sw_OK_press(); // แสดงขอ ความ COUNTER เพอื่ แจงชื่อการทดลอง
glcdClear(); // กาํ หนดขนาดตวั อักษร 3 เทา
glcd(1,2,"COUNTER"); // กาํ หนดคา เรม่ิ ตนเปน 0
setTextSize(3);
glcd(3,3,"0"); // ตรวจสอบการกดสวติ ชทพี่ อรต 16
}
void loop() // เพมิ่ คาตัวนับ
{ // แสดงคา การนับ
if (in(16)==0) // ตรวจสอบการปลอ ยสวติ ช
{
i=i++;
glcd(3,3,"%d",i);
while(in(16)==0)
delay(5);
}
}
คําอธบิ ายโปรแกรม
โปรแกรมนใี้ ชฟ ง กช น่ั in ในการตรวจจบั และอา นคา จากการกดสวติ ชท พ่ี อรต 16 โดยตรงสอบวา ทพ่ี อรต
16 เปน ลอจกิ “0” หรอื ไม ถา ใชแ สดงวา มกี ารกดสวิตชเปดขน้ึ จากนนั้ จะทําการเพมิ่ คา ตวั นบั แลว นํามาแสดง
ผลท่ีจอแสดงผลกราฟก LCD ของแผงวงจร IPST-SE
คาํ สั่ง while(in(16)==0) และ dealy(5); ทําหนา ที่ลดสัญญาณรบกวนท่ีเกิดจากการกดสวติ ช โดยจะ
ตรวจสอบวา มกี ารปลอยสวติ ชแลว หรอื ไม ถา ไม กจ็ ะวนทํางานอยทู ่ีคาํ สั่งน้ัน ชวยใหไมเกิดการนับคา โดยไม
ตง้ั ใจขึน้ ดงั นั้นการกดสวิตชท่ีพอรต 16 ในแตล ะครงั้ จึงมคี วามแนนอนสูง
โปรแกรมท่ี L5-1 : ไฟล microbox_CounterSwitch.ino โปรแกรมภาษา C/C++ สาํ หรบั ทดลองใชง านสวติ ช
ในการสรา งเครอ่ื งนบั จาํ นวนอยา งงา ย
จากทง้ั สองปฏิบตั กิ ารผพู ฒั นาสามารถนาํ ไปประยุกตใชง านสวติ ชหลายๆ ตวั พรอ มกันและมี
ความสามารถทแ่ี ตกตางกันไปแลว แตจุดประสงค เชน สวติ ชบางตัวสามารถกําหนดใหเม่ือกดสวติ ช
คา งแลว สามารถเพม่ิ คา หรอื ลดคา ขอ มลู ทกี่ าํ หนดได ในขณะทส่ี วติ ชบ างตวั อาจกาํ หนดใหไ มส ามารถ
กดคางได เปนตน
160 Arduino IDE
Arduino IDE161
สัญญาณทางไฟฟา แบง ออก 2 แบบหลกั คอื สญั ญาณอะนาลอก (analog) และดจิ ติ อล (digital)
สญั ญาณอะนาลอกก็คือ สญั ญาณไฟฟา ทีม่ ีการเปล่ียนแปลงสัมพนั ธก ับคาเวลา โดยการเปลี่ยนแปลง
นนั้ จะเพมิ่ ขน้ึ หรอื ลดลงกไ็ ด และมรี ะดบั แรงดนั เทา ใดกไ็ ด สว นสญั ญาณดจิ ติ อลเปน สญั ญาณทมี่ กี าร
เปลี่ยนแปลงเพยี ง 2 ระดบั ทแ่ี ตกตางกัน กลาวคอื มรี ะดบั สัญญาณสงู และตํ่า (เกือบหรอื เทา กับ 0V)
โดยปกตจิ ะมรี ะดบั แรงดนั เทา กบั +5V สาํ หรบั ระดบั แรงดนั สงู หรอื เรยี กวา ลอจกิ “1” และ 0V สาํ หรบั
ระดบั แรงดนั ต่ํา หรอื เรยี กวา ลอจกิ “0” แตในปจจุบนั ระดับแรงดนั ของลอจกิ “1” อาจเทา กับ +3.3V
หรอื 1.8V ข้ึนอยกู ับเทคโนโลยขี องอปุ กรณด ิจติ อล อยา งไรก็ตาม สาํ หรบั การเรยี นรโู ดยพนื้ ฐานนี้จะ
อธบิ ายระดบั ลอจกิ “1” ดว ยคา แรงดนั +5V เปน หลกั ในรปู ท่ี 10-1 แสดงความแตกตา งระหวา งสญั ญาณ
อะนาลอกกับดิจติ อล
V Data
Vp 1
tt
0010110
V
Data
Vp
1
t
t
V 1101001
Vp Data
t1
t
101010
(ก) ตวั อยางสัญญาณอะนาลอก (ข) ตัวอยางสัญญาณดจิ ิตอล จะเห็นวา
ระดับของสญั ญาณเปลยี่ นแปลง มเี พยี ง 2 ระดบั สญั ญาณเทา นั้นคอื
สัมพันธก บั คา เวลา ระดับสงู ("1") และระดับตาํ่ ("0")
รปู ท่ี 10-1 ตวั อยา งของสญั ญาณอะนาลอกและดจิ ติ อล
162 Arduino IDE
10.1 สัญญาณอะนาลอก
แบง ได 3 แบบ คอื แบบสญั ญาณไฟตรง (analog DC signals), แบบเปลยี่ นคา ตามเวลา (time-
domain) และ แบบเปลย่ี นคา ตามความถ่ี (frequency-domain)
สัญญาณอะนาลอกไฟตรง มักเปนคาที่ไดจากการวัดขนาดหรือระดับของสัญญาณ ซึ่งมีการ
เปลย่ี นแปลงคา สญั ญาณในเวลาทไี่ มเ รว็ มากนกั อาทิ คา อณุ หภมู ,ิ ระดบั ของไหล, ความดนั , อตั ราการ
ไหล, นาํ้ หนกั เปน ตน สามารถใชว งจรแปลงสญั ญาณอะนาลอกเปน ดจิ ติ อล (ADC : Analog to Digital
Converter) ทม่ี ีอตั ราการสมุ สัญญาณไมเ ร็วมากได
สญั ญาณอะนาลอกแบบเปลยี่ นคา ตามเวลา เปน สญั ญาณทวี่ ดั เพอ่ื พจิ ารณาลกั ษณะรปู สญั ญาณ
เปน หลกั อาทิ สญั ญาณคลนื่ หวั ใจมนษุ ย (ECG) ซงึ่ มคี วามจาํ เปน ตอ งใชว งจรแปลงสญั ญาณอะนาลอก
เปน ดิจติ อลที่มีความเรว็ ในการสมุ สญั ญาณสงู
สัญญาณอะนาลอกแบบเปลี่ยนคาตามความถ่ี ไดแ ก สัญญาณความถว่ี ทิ ยุ (radio frequency :
RF) และสญั ญาณคลนื่ เสยี ง เปน ตน ในการวเิ คราะหจ าํ เปน ตอ งมฮี ารด แวรพ เิ ศษเพอื่ ชว ยวเิ คราะหอ ยา ง
DSP (digital signal processing) ทํางานรว มกบั วงจรแปลงสญั ญาณอะนาลอกเปน ดจิ ิตอลดว ย
10.2 ทําไมไมโครคอนโทรลเลอรตอ งอา นคา สญั ญาณอะนาลอก
สาเหตุหลักที่ไมโครคอนโทรลเลอรตองติดตอกับสัญญาณอะนาลอกคือ ตองการอานคา
ปรมิ าณทางฟส ิกสในรูปของสัญญาณไฟฟา เพอ่ื นําไปประมวลผลและควบคมุ ระบบตอ ไป
ในรูปท่ี 10-2 แสดงไดอะแกรมการทํางานเบ้ืองตนของการอานคาสัญญาณอะนาลอกของ
ไมโครคอนโทรลเลอร มีสว นประกอบสาํ คัญ 4 สว นคอื
1. สว นตรวจจบั สญั ญาณกายภาพ (Transducer/Sensor/Detector)
2. วงจรปรบั สภาพสัญญาณ (Signal conditioning)
3. วงจรแปลงสญั ญาณอะนาลอกเปนดิจติ อล (Analog to Digital Converter : ADC)
4. ไมโครคอนโทรลเลอร
10.2.1 สวนชดุ ตรวจจับสัญญาณกายภาพ
ชดุ ตรวจจบั สญั ญาณกายภาพหรอื ทรานสดวิ เซอร(transducer)คอื ตวั แปลงสญั ญาณทางกายภาพ
เชน อณุ หภมู ิความดนั ระดบั ของไหลความยาวตาํ แหนง การเคลอื่ นท่ีฯลฯใหเ ปน ในรปู สญั ญาณทางไฟฟา
นน่ั เองหรอื บางครง้ั เรยี กอปุ กรณเ หลา นว้ี า ตวั ตรวจจบั (sensor)ซง่ึ มดี ว ยกนั หลากหลายรปู แบบอาทิเทอรโ ม
คปั เปล (thermocouple) , เทอรม สิ เตอร (thermistor), ตวั ตรวจจบั การไหล (flow sensor) เปน ตน
Arduino IDE163
oC
10001000
01110110
00011101
11100110
11111010
รปู ท่ี 10-2 แสดงกระบวนการอา นคาสญั ญาณอะนาลอกของไมโครคอนโทรลเลอร
10.1.2 สวนปรบั สภาพสัญญาณ
หนา ทหี่ ลกั ของสว นปรบั สภาพสญั ญาณนค้ี อื ปรบั ปรงุ คณุ ภาพของสญั ญาณไฟฟา ทไี่ ดจ ากชดุ
ตรวจจบั กอ นสง สญั ญาณตอ ไปยงั ฮารด แวรท เี่ ชอ่ื มตอ กบั ไมโครคอนโทรลเลอร ซง่ึ อาจมคี วามจาํ เปน
ตองปรับสเกลสัญญาณ, ขยายขนาดสัญญาณ, แปลงรปู สญั ญาณใหเปนเชิงเสน (linearization), กรอง
คลนื่ สัญญาณและแยกกราวดของสญั ญาณ (common-mode rejection)
หนา ทเี่ ดน ของสว นปรบั สภาพสญั ญาณคอื ขยายขนาดสญั ญาณ (amplifly) เพราะโดยสว นใหญ
สัญญาณที่ไดจากชุดตรวจจับจะมีขนาดสัญญาณที่ต่ํามาก มีขนาดแรงดันไฟฟาในหนวยมิลลิโวลต
(millivolt : mV) หรอื 1/1000V และมักมีสัญญาณรบกวนจากแหลง จา ยไฟปะปนมา ซึ่งอาจรบกวน
สัญญาณดา นอนิ พตุ ในขณะทส่ี ญั ญาณเขาสรู ะบบ ทําใหคาสญั ญาณท่ีวดั ไมถ กู ตอ งและไมเ ท่ียงตรง
นอกจากนั้นวงจรปรับสภาพสัญญาณยังใชในการแปลงสัญญาณไฟฟาท่ีไมไดอยูในรูปของ
แรงดนั ไฟฟา เชน กระแสไฟฟา หรอื ความตา นไฟฟา มาอยใู นรปู ของแรงดนั ไฟฟา ใหเ หมาะสมกบั วงจร
แปลงสญั ญาณอะนาลอกเปนดจิ ิตอล อาทิ แปลงคา กระแสไฟฟา 4 ถึง 20mA จากตัวตรวจจบั ท่ใี ห
ผลแบบกระแสไฟฟาเปนแรงดนั ไฟตรง 0 ถึง +5V เปนตน
164 Arduino IDE
10.1.3 วงจรแปลงสญั ญาณอะนาลอกเปนดจิ ติ อล
วงจรนี้ทําหนา รบั สัญญาณอะนาลอกที่ผานมาจากวงจรปรบั สภาพสัญญาณ เพอ่ื ทําการแปลง
เปน ขอ มลู ทางดจิ ติ อลเพอื่ สง ไปยงั ประมวลผลยงั ไมโครคอนโทรลเลอรต อ ไป จดุ ทต่ี อ งใหค วามสนใจ
ในสวนนี้คือ ความละเอยี ดในการแปลงสญั ญาณ วงจรแปลงสัญญาณอะนาลอกเปนดจิ ิตอลทเี่ หมาะ
สมในการนาํ มาใชใ นการทดลองวทิ ยาศาสตรค วรมคี วามละเอยี ดไมน อ ยกวา 8 บติ ซงึ่ ใหค วามแตกตา ง
ของขอมูล 256 คา และถา ยิ่งมีความละเอียดสูงเทาใดย่ิงดี เพราะจะใหผ ลการแปลงที่แมนยํามากข้ึน
แตนน่ั จะทําใหตนทุนของระบบสูงขึ้นตามไปดว ย
10.1.4 ไมโครคอนโทรลเลอร
ไมโครคอนโทรลเลอรเ ปน หนง่ึ ในอปุ กรณข องระบบดจิ ติ อล ดงั นนั้ การอา นคา สญั ญาณอะนา
ลอกโดยตรงจงึ ตอ งใชอ ปุ กรณช ว ยเพมิ่ เตมิ นน่ั คอื วงจรแปลงสญั ญาณอะนาลอกเปน ดจิ ติ อล (analog
to digital converter) ไมโครคอนโทรลเลอรใ นอดตี จะไมม ีวงจรแปลงสญั ญาณอะนาลอกเปนดจิ ติ อล
บรรจุอยูภายในตัวชิป จึงตองใชไอซีแปลงสัญญาณอะนาลอกเปนดิจิตอลเขามาชวย โดยไอซีแปลง
สญั ญาณนจี้ ะใหผ ลลพั ธอ อกมาเปนขอมูลดจิ ิตอลทมี่ คี วามละเอยี ดของขอ มลู ตางกันไป แลว แตค วาม
สามารถของไอซี โดยจะเริ่มต้ังแต 8, 10, 12, 16 บติ หรอื สงู กวา
ในปจ จบุ นั ไมโครคอนโทรลเลอรไ ดร วมเอาวงจรแปลงสญั ญาณอะนาลอกเปน ดจิ ติ อลเขา มา
ไวภ ายในชปิ ทงั้ นเ้ี พอ่ื ลดขนาดของระบบโดยรวมลง ทาํ ใหก ารประมวลผลสญั ญาณทาํ ไดเ รว็ ขน้ึ และ
ตนทนุ รวมของระบบลดลงตามไปดวย
ขอมูลดิจิตอลที่ไดมาจากวงจรแปลงสัญญาณอะนาลอกเปนดิจิตอล ไมวาจะเปนแบบไอซี
แปลงสญั ญาณภายนอก หรอื จากโมดลู ทอ่ี ยภู ายในไมโครคอนโทรลเลอรจ ะถกู สง เขา มาในระบบบสั
ขอมลู เพอ่ื ทาํ การประมวลผลและนาํ ไปใชในการตัดสินใจเพอ่ื ควบคุมการทาํ งานของระบบตอไป
สาํ หรบั ในชดุ IPST-MicroBOX (SE) ไดเ ลอื กใชไ มโครคอนโทรลเลอร ATmega644P อนั เปน
ไมโครคอนโทรลเลอรท ม่ี วี งจรแปลงสญั ญาณอะนาอลกเปน ดจิ ติ อล 8 ชอ งอยภู ายในชปิ แลว จงึ ทาํ ให
การนําแผงวงจรควบคุมไปใชใ นการเชอื่ มตอกับตัวตรวจจับแบบตางๆ เพอื่ อา นคากระทําไดง า ยและ
สะดวกขึ้น
Arduino IDE165
10.2 การแปลงสญั ญาณอะนาลอกเปน ดิจิตอล (ADC)
การแปลงสัญญาณอะนาลอกเปนดิจิตอล สัญญาณจะไดร ับการแปลงเปนจํานวนทางดิจิตอล
โดยการสมุ หรอื แซมปลง้ิ (sampling) ดงั ในรปู ที่10-3 ถา หากวงจรแปลงสญั ญาณอะนาลอกเปน ดจิ ติ อล
มีความละเอยี ด 8 บิต จะมีความแตกตา งทางผลลัพธเ ลขฐานสองทง้ั หมด 28 หรอื 256 คา และถาหาก
มคี วามละเอยี ด 10 บิต ก็จะใหผ ลลัพธข องขอมลู เลขฐานสองสงู ถงึ 210 หรอื 1,024 คา
คาความละเอียดของตัวแปลงสัญญาณอะนาลอกเปนดิจิตอลถูกอธิบายเปนระยะหางท่ีนอย
ที่สุดของคาแรงดันทางอินพุตท่ีเพิ่มขึ้น ซ่ึงถูกกําหนดโดยตัวแปลงสัญญาณน้ัน ระยะหางยิ่งนอย
เทาไหร คาความละเอยี ดย่ิงสูงขึ้น โดยคาความละเอยี ดแปรผันตรงกับจํานวนของบติ เอาตพุต ยกตัว
อยางเชน ถาวงจรแปลงสัญญาณมีความละเอียด 10 บิต ทําใหเกิดผลลัพธที่แทนคาสัญญาณมากถึง
1,024 ระดบั สัญญาณอนิ พตุ ถูกแทนเปนรหสั เลขฐานสองจาก 0000000000 ถงึ 1111111111 ถา ยาน
อนิ พตุ เรมิ่ ตนจาก 0 ถึง +5 V ดังนั้นความละเอยี ดเทากับ (คาโดยประมาณ)
5 0.005V
1024
ถาเอาตพ ตุ รหสั เลขฐานสองเปน 0000000001 แทนแรงดนั 0.005 V ดังนนั้ ขอมลู ของแรงดัน
3V จะมีคาเทากับ
3 600 10
0 .005
ทําการแปลงเปนเลขฐานสองจะไดค าเทากับ 10010110002
ขอมลู ดจิ ติ อล
1101100111
0101101111
สัญญาณ
อะนาลอกอนิ พุต
ระยะหา งของการสุม
รปู ที่ 10-3 การสมุ สญั ญาณอะนาลอกเพื่อกาํ หนดขอมลู ดจิ ติ อล
166 Arduino IDE
10.3 ฟง กช นั่ ของโปรแกรมภาษา C/C++ ทใ่ี ชอ า นคา สญั ญาณอะนาลอกของ
IPST-MicroBOX (SE)
เพอื่ อาํ นวยความสะดวกในการเขียนโปรแกรมภาษา C/C++ เพอ่ื ควบคุมกลอ งสมองกล IPST-
MicroBOX (SE) เพอื่ ใหอ า นคาสญั ญาณอะนาลอกจากตัวตรวจจบั ตางๆ ในไฟลไ ลบรารี ipst.h จึงได
บรรจฟุ ง กช่ันสําหรบั อา นคาสญั ญาณอะนาลอกโดยเฉพาะ 2 ฟง กช่ันคือ analog() และ knob();
การอา นคาผานฟง กชั่น analog() และ knob() จะไดผ ลลัพธค ืนคากลับมาในชวง 0 ถึง 1,023
ของเลขฐานสิบ หรือ 0x0000 ถึง 0x03FF ของเลขฐานสิบหก เนื่องจากความละเอียดในการแปลง
สัญญาณอะนาลอกเปน ดจิ ติ อลเทากับ 10 บติ (เกิดคาได 1,024 คา)
10.3.1 analog
เปน ฟง กช น่ั อา นคา จากการแปลงสญั ญาณอะนาลอกของแผงวงจร IPST-SE ทจี่ ดุ ตอ A0 ถงึ A6
รูปแบบ
unsigned int analog(unsigned char channel)
พารามเิ ตอร
channel - กําหนดชอ งอินพุตที่ตอ งการ มีคา 0 ถงึ 6 ซ่งึ ตรงกับขาพอรต A0 ถงึ A6
การคนื คา
เปน ขอ มลู ทไ่ี ดจ ากการแปลงสญั ญาณไฟฟา 0 ถงึ +5V จากชอ งอนิ พตุ ทก่ี าํ หนด มคี า 0 ถงึ 1,023
10.3.2 knob( )
เปน ฟง กช นั่ อา นคา ขอ มลู ทไี่ ดจ ากการแปลงสญั ญาณไฟฟา ทข่ี าพอรต A7 ซงึ่ ตอ กบั ตวั ตา นทาน
ปรบั คาไดท ตี่ ําแหนง KNOB
รูปแบบ
unsigned int knob()
การคนื คา
เปน ขอ มลู ทไี่ ดจ ากการแปลงสญั ญาณไฟฟา ทมี่ าจากการปรบั คา ทป่ี มุ KNOB บนแผงวงจร IPST-
SE มคี า 95 ถงึ 1,023
Arduino IDE167
ในปฏิบัตกิ ารน้ีเปนการแนะนําการเชื่อมตอ ชุดกลองสมองกล IPST-MicroBOX (SE) กบั อุปกรณท ี่ใหผล
การทาํ งานเปน แรงดนั ไฟตรง เพอื่ ทดสอบการอา นคา สญั ญาณอะนาลอกหรอื สญั ญาณไฟตรงมาแสดงผลเปน ตวั
เลขทเ่ี ขา ใจไดง า ยขนึ้ ซง่ึ การทาํ งานของอปุ กรณแ บบนจ้ี ะแตกตา งกนั ไปตามลกั ษณะและจดุ ประสงค เชน ตวั ตรวจ
จับอุณหภูมิที่ใหผลการเปล่ียนแปลงอุณหภูมิสัมพันธกับแรงดันทางเอาตพุต, ตัวตานทานแปรคาตามแสงที่
สามารถใหแรงดนั ไฟตรงเอาตพ ุตเปล่ียนแปลงตามความเขม ของแสงท่ีมาตกกระทบตัวมนั เปนตน ตวั แทนของ
อุปกรณใ นลักษณะน้ีในขั้นพ้ืนฐานท่ีสุดคอื ZX-POTV แผงวงจรตัวตานทานปรบั คา ได (Potentiometer) โดยใน
ปฏิบัตกิ ารน้ีจะแสดงใหเห็นถงึ การอา นคา และนําผลลัพธม าประยกุ ตใ ชงานรว มกบั แผงวงจรหลัก IPST-SE
ปฏบิ ัตกิ ารที่ 6-1 อา นคา ตวั ตรวจจับมาแสดงผล
ในปฏบิ ตั กิ ารนน้ี าํ เสนอการเขยี นโปรแกรมภาษา C/C++ เพอื่ อา นคา สญั ญาณไฟฟา แบบอะนาลอกจาก
แผงวงจรตวั ตา นทานปรบั คา ไดท ตี่ อ กบั จดุ ตอ พอรต A1 มาแสดงผลทจ่ี อแสดงผลกราฟก LCD สบี นแผงวงจรหลกั
IPST-SE
การเช่ือมตอทางฮารด แวร
ตอ เอาตพ ตุ หรอื เอาตพ ตุ ปรบั แรงดนั เพมิ่ เมอ่ื หมนุ ตามตามเขม็ นาฬกิ าของแผงวงจร ZX-POTV กบั จดุ ตอ A1
ของแผงวงจรหลัก IPST-SE
ZX-POTV28 A4 25 A1 8 SCL 9 SDA
29 A5 26 A2 USB
24 A0 A30 A6 27 A3
DC MOTORD
KNOB ON
OK 15 SV0 14 SV1 13 SV2 12 SV30 0000000000
SW1 G
Analog000000000000000000000 6V
12
000000000000000000000 G
000000000000000000000 6V
13
583000000000000000000000 G
6V
000000000000000000000 14
000000000000000000000 G
000000000000000000000 6V
000000000000000000000 15
000000000000000000000
SERVO
Volts000000000000000000000
000000000000000000000
2.847000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
16 18 UART1 LOW 12
17 19 +5
20 RESET 2 RxD1 3 TxD1
รปู ที่ L6-1 การตอ วงจรเพ่ือทําการทดลองสาํ หรบั ปฏบิ ัตกิ ารที่ 6
168 Arduino IDE
ขั้นตอนการทดลอง
6.1.1 เปดซอฟตแ วร Wiring 1.0 สรา งไฟลใหม พิมพโปรแกรมที่ L6-1 บันทึกในชื่อ microbox_AnalogTest.ino
6.1.2 คอมไพลแ ละอปั โหลดโปรแกรมไปยงั แผงวงจร IPST-SE โดยคลกิ ทปี่ มุ
#include <ipst.h> // ผนวกไฟลไลบรารหี ลกั
int val = 0;
float volts = 0.0; // เลอื กขนาดตัวอกั ษรใหญเ ปน 2 เทา จากขนาดปกติ
void setup() // แสดงขอ ความท่ีจอแสดงผล
{ // อานคาของสัญญาณชอง A1 มาเก็บไวท ต่ี ัวแปร val
// เลอื กขนาดตัวอักษรใหญเ ปน 3 เทา จากขนาดปกติ
glcdClear(); // แสดงคา ที่อา นไดจ ากจดุ ตอ A1 ทหี่ นาจอแสดงผล
setTextSize(2); // เลอื กขนาดตัวอักษรใหญเ ปน 2 เทา จากขนาดปกติ
} // แสดงขอ ความ Volts
void loop() // แปลงขอ มูลเปน หนวยแรงดนั
{ // เลอื กขนาดตัวอกั ษรใหญเ ปน 3 เทา จากขนาดปกติ
glcd(0,2,"Analog"); // แสดงคา แรงดันความละเอยี ดทศนยิ ม 3 ตําแหนง
val = analog(1); // เลอื กขนาดตัวอกั ษรใหญเ ปน 2 เทา จากขนาดปกติ
setTextSize(3);
glcd(1,2,"%d ",val);
setTextSize(2);
glcd(5,3,"Volts");
volts = (float(val)*5)/1024;
setTextSize(3);
glcd(4,1,"%f",volts);
setTextSize(2);
}
คําอธบิ ายโปรแกรม
คา ของแรงดนั ไฟตรงที่ไดจ ากตวั ตรวจจับหรอื ตวั ตา นทานปรบั คา ไดท ่ีจุดตอ A1 ของแผงวงจร IPST-SE
จะถกู แปลงเปน ขอ มลู ดจิ ติ อลและจดั รปู แบบเปน เลขฐานสบิ ไดค า ในชว ง 0 ถงึ 1023 จากการทาํ งานของฟง กช นั่
analog() จากนนั้ ขอ มลู นนั้ ไดร บั การสง ตอ ไปแสดงทจ่ี อแสดงผลกราฟก LCD สดี ว ยฟง กช นั่ glcd อยา งตอ เนอื่ ง
นอกจากนน้ั ในโปรแกรมยงั นาํ ขอ มลู ทไ่ี ดจ ากการแปลงสญั ญาณมาคาํ นวณกลบั เพอื่ ใหไ ดเ ปน คา แรงดนั
ไฟตรง โดยใชสมการ volts = (val x 5) / 1024 แลว ใชตวั แปร volts ที่เปนตวั แปรแบบทศนิยมมารบั คาที่ไดจ าก
คาํ นวณเพอื่ นาํ ไปแสดงผลทจ่ี อกราฟก LCD สี โดยแสดงเปน คา แรงดนั ในหนว ยโวลต ดว ยความละเอยี ดทศนยิ ม
3 ตาํ แหนง
ในโปรแกรมมกี ารกาํ หนดขนาดของตวั อกั ษรทใ่ี ชแ สดงผลตา งกนั เนอื่ งจากตอ งการแยกขอ ความและขอ มลู
ออกจากกนั ใหช ดั เจน
โปรแกรมที่L6-1:ไฟลmicrobox_AnalogTest.inoโปรแกรมภาษาC/C++สาํ หรบั อา นคา สญั ญาณอะนาลอกของ
แผงวงจรIPST-SE
Arduino IDE169
6.1.3 รันโปรแกรม ทดลองหมนุ แกนของตวั ตา นทานบนแผงวงจรตวั ตา นทานปรบั คา ได ZX-POTV สงั เกตผลการ
ทํางานผานทางจอแสดงผลของแผงวงจร IPST-SE
ท่ีจอแสดงผลกราฟก LCD ชวงบนแสดงคา ขอ มลู ท่ีไดจากการแปลงสัญญาณที่จุดตอ A1 ซึ่งตอ กบั แผง
วงจรตวั ตา นทานปรบั คา ได ZX-POTV โดยมคี า ระหวาง 0 ถงึ 1023 (เทียบกบั แรงดนั 0 ถงึ +5V)
ทชี่ ว งลา งของจอแสดงผลกราฟก LCD สแี สดงคา แรงดนั ไฟตรงในหนว ย โวลต (Volts) ทไ่ี ดจ ากการปรบั
คา ของตวั ตา นทานบนแผงวงจรตวั ตา นทานปรบั คา ได ZX-POTV โดยมคี า ระหวาง 0.000 ถงึ 4.995 (เทียบกบั
ขอ มลู 0 ถงึ 1023)
ZX-POTV
A
28 A4 25 A1 8 SCL 9 SDA
29 A5 26 A2 USB
24 A0 30 A6 27 A3
D
ON
KNOB 0 0000000000 DC MOTOR
OK G
SW1 Analog000000000000000000000 15 SV0 14 SV1 13 SV2 12 SV36V
12
000000000000000000000 G
000000000000000000000 6V
13
0000000000000000000000 G
6V
000000000000000000000 14
000000000000000000000 G
000000000000000000000 6V
000000000000000000000 15
000000000000000000000
SERVO
Volts000000000000000000000
000000000000000000000
0.000000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
16 18 UART1 LOW 12
17 19 +5
20 RESET 2 RxD1 3 TxD1
ZX-POTV
A
28 A4 25 A1 8 SCL 9 SDA
29 A5 26 A2 USB
24 A0 30 A6 27 A3
D
ON
KNOB 0 0000000000 DC MOTOR
OK G
SW1 Analog000000000000000000000 15 SV0 14 SV1 13 SV2 12 SV36V
12
000000000000000000000 G
000000000000000000000 6V
13
1023000000000000000000000 G
6V
000000000000000000000 14
000000000000000000000 G
000000000000000000000 6V
000000000000000000000 15
000000000000000000000
SERVO
Volts000000000000000000000
000000000000000000000
4.995000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
16 18 UART1 LOW 12
17 19 +5
20 RESET 2 RxD1 3 TxD1
170 Arduino IDE
ปฏบิ ัตกิ ารที่ 6.2 ควบคมุ การเปด /ปด LED ดว ยแผงวงจรตวั ตา นทานปรับคา ได
ในปฏิบัตกิ ารนี้เปนการนําขอ มลู ที่ไดจ ากการแปลงสัญญาณไฟฟาซึ่งมาจากการปรบั คาของ ZX-POTV
แผงวงจรตวั ตา นทานปรบั คาไดม ากาํ หนดเงอ่ื นไขในการเปด /ปด LED เพ่อื ใหเห็นแนวทางในการประยกุ ตใ ชงาน
เบอ้ื งตน
การเช่ือมตอทางฮารด แวร
เชอ่ื มตอ แผงวงจร ZX-LED เขา กบั จดุ ตอ พอรต 17 ของแผงวงจรหลกั IPST-SE
ตอ เอาตพุต หรอื เอาตพ ุตปรบั แรงดนั เพิ่มเมอ่ื หมนุ ตามตามเขม็ นาฬิกาของแผงวงจร ZX-POTV กบั จุดตอ
พอรต A1 ของแผงวงจรหลัก IPST-SE
ขั้นตอนการทดลอง
6.2.1 เปด ซอฟตแ วร Wiring 1.0 สรา งไฟลใ หม พมิ พโ ปรแกรมที่ L6-1 บนั ทกึ ในชอื่ microbox_AnalogSwitch.ino
6.2.2 คอมไพลแ ละอปั โหลดโปรแกรมไปยงั แผงวงจร IPST-SE โดยคลกิ ทป่ี มุ
ZX-POTV
A
28 A4 25 A1 USB 8 SCL 9 SDA
29 A5 26 A2 D
24 A0 30 A6 27 A3
Analog0 0000000000
ZX-LED KNOB DC MOTOR ON
OK 000000000000000000000
15 SV0 14 SV1 13 SV2 12 SV3 G
control000000000000000000000 6V
12
000000000000000000000 G
6V
Switch000000000000000000000 13
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
108000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
+ S SW1 G
6V
+ S
14
O
16 18 UART1 LOW 12 G
+5 6V
15
17 19 20 RESET 2 RxD1 3 TxD1 SERVO
รปู ที่ L6-2 การตอ วงจรเพ่ือทําการทดลองสาํ หรบั ปฏบิ ัตกิ ารท่ี 6-2
Arduino IDE171
#include <ipst.h> // ผนวกไฟลไ ลบรารหี ลกั
int val=0; // กาํ หนดตวั แปรเกบ็ คาท่ีไดจากการแปลงสญั ญาณแลว
void setup()
{ // เลอื กขนาดตัวอกั ษรใหญเปน 2 เทา จากขนาดปกติ
// แสดงขอ ความที่จอแสดงผล
glcdClear();
setTextSize(2); // อา นคาของสญั ญาณชอ ง A1 มาเกบ็ ไวท ต่ี ัวแปร val
glcd(1,2,"Analog"); // ตรวจสอบวาคาท่ีอานไดมากกวา 512 หรอื ไม
glcd(2,2,"control"); // เลอื กขนาดตัวอักษรใหญเ ปน 4 เทา จากขนาดปกติ
glcd(3,2,"Switch"); // เปลยี นเปนสแี ดง
} // แสดงคา ที่อานไดจากจดุ ตอ A1 ทห่ี นาจอแสดงผล
void loop() // ถา คา val มากกวา 512 ทาํ การขับ LED ทพี่ อรต 17
{
val = analog(1); // เลอื กขนาดตัวอกั ษรใหญเ ปน 4 เทา จากขนาดปกติ
if(val>512) // แสดงตัวอักษรสีขาว
{ // แสดงคา ที่อานไดจ ากจดุ ตอ A2 ทห่ี นาจอแสดงผล
// ถาคา val นอ ยกวา 512 ทาํ การปด LED ทพี่ อรต 17
setTextSize(4); // เลอื กขนาดตัวอกั ษรใหญเปน 2 เทา จากขนาดปกติ
setTextColor(GLCD_RED);
glcd(3,1,"%d ",val);
out(17,1);
}
else
{
setTextSize(4);
setTextColor(GLCD_WHITE);
glcd(3,1,"%d ",val);
out(17,0);
}
setTextSize(2);
}
คําอธบิ ายโปรแกรม
สญั ญาณไฟฟาจากแผงวงจรตวั ตา นทานปรบั คาไดจะถกู อา นดวยคาํ สั่ง analog() เก็บไวท่ีตวั แปร val
เพื่อนําไปตรวจสอบและสง ไปแสดงผลยังจอแสดงผลกราฟก LCD สี หากคา ท่ีได นอยกวา 512 ตวั เลขทแี่ สดง
ผลยังเปนสีขาว และสง ขอ มลู “0” ไปยังพอรต 17 ทําให LED ทต่ี อ อยไู มทํางาน
เม่ือคา ของ val มากกวา 512 ตวั เลขแสดงผลจะเปล่ียนเปนสีแดง และมกี ารสงขอ มลู “1” ไปยงั พอรต
17 ทําให LED ทตี่ อ อยตู ดิ สวา ง
โปรแกรมท่ีL6-2 : ไฟล microbox_AnalogSwitch.ino โปรแกรมภาษา C/C++ สาํ หรบั อา นคา สญั ญาณไฟฟา
เพอ่ื นาํ มาควบคมุ อปุ กรณเ อาตพ ตุ
172 Arduino IDE
6.2.3 รนั โปรแกรม ทดลองปรบั คา ทแี่ กนหมนุ ของตวั ตา นทานปรบั คา ไดบ นแผงวงจร ZX-POTV สงั เกตการทาํ งาน
ของจอแสดงผลบนแผงวงจร IPST-SE และ LED บนแผงวงจร ZX-LED
เมอื่ ปรบั คา ทแ่ี กนของตวั ตา นทาน สงั เกตผลลพั ธท จ่ี อแสดงผล มนั จะแสดงคา 0 ถงึ 1023 เมอ่ื ปรบั คา ท่ี
แผงวงจร ZX-POTV ถา มคี า นอ ยกวา 512 ตัวเลขจะเปนสีขาว และ LED ดบั เมือ่ ใดปรบั คาจนไดมากกวา 512
คา ตวั เลขทจ่ี อแสดงผลจะเปลี่ยนเปนสีแดง และ LED ทตี่ อ กบั พอรต 17 ตดิ สวา ง
ZX-POTV
A
28 A4 25 A1 USB 8 SCL 9 SDA
29 A5 26 A2 D
24 A0 30 A6 27 A3
Analog0 0000000000
ON
000000000000000000000
control000000000000000000000
000000000000000000000
Switch000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
ZX-LED 000000000000000000000
000000000000000000000 GDC MOTOR
000000000000000000000
6V 15 SV0 14 SV1 13 SV2 12 SV3
420 000000000000000000000
+S KNOB 12
OK 000000000000000000000
SW1 000000000000000000000 G
000000000000000000000 6V
16 18 000000000000000000000
17 19 13
ZX-POTV S G
6V
A O
+ 14
UART1 LOW 12 G
+5 6V
15
20 RESET 2 RxD1 3 TxD1 SERVO
28 A4 25 A1 USB 8 SCL 9 SDA
29 A5 26 A2 D
24 A0 30 A6 27 A3
Analog0 0000000000
000000000000000000000
control000000000000000000000
ON
000000000000000000000
Switch000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
ZX-LED 000000000000000000000
000000000000000000000 DC MOTORG
520 000000000000000000000
KNOB 15 SV0 14 SV1 13 SV2 12 SV36V
OK 000000000000000000000 12
+S SW1 000000000000000000000
000000000000000000000 G
16 18 000000000000000000000 6V
17 19 000000000000000000000
13
+ S G
6V
O
14
UART1 LOW 12 G
+5 6V
15
20 RESET 2 RxD1 3 TxD1 SERVO
Arduino IDE173
ปฏบิ ตั กิ ารที่ 6.3 ควบคมุ การเปด /ปด LED ดว ยแผงวงจรตรวจจบั แสง
ในปฏบิ ตั กิ ารนเี้ ปน การตอ ยอดจากปฏบิ ตั กิ ารท่ี 6.2 โดยเปลย่ี นจากการปรบั คา ของ ZX-POTV แผงวงจรตวั
ตา นทานปรบั คา ไดเ ปนการตรวจจับแสงโดยใชแผงวงจรตวั ตา นทานแปรคา ตามแสดงหรอื ZX-LDR โดยยงั คงใช
เงอ่ื นไขในการเปด /ปด LED ในแบบเดยี วกนั
การเช่ือมตอทางฮารด แวร
เชอื่ มตอ แผงวงจร ZX-LED เขา กบั จดุ ตอ พอรต 17 ของแผงวงจรหลกั IPST-SE
ตอ เอาตพุต + หรอื เอาตพ ุตแรงดนั แปรคา ตามแสงของแผงวงจร ZX-LDR กบั จุดตอ พอรต A1 ของแผง
วงจรหลัก IPST-SE
ขน้ั ตอนการทดลอง
6.3.1 เขยี นโปรแกรมท่ี L6-3 บันทึกในชื่อ microbox_NightSwitch.ino
6.3.2 คอมไพลแ ละอปั โหลดโปรแกรมไปยงั แผงวงจร IPST-SE โดยคลกิ ทปี่ มุ
ZX-LDR ++
Light sensor
A
Potentiometer +28 A4 25 A18 SCL 9 SDA
DC MOTOR29 A5 26 A2USB
24 A0 30 A6 27 A3
15 SV0 14 SV1 13 SV2 12 SV3D
ON
Night0 0000000000
ZX-LED KNOB G
OK 000000000000000000000 6V
SW1 000000000000000000000 12
G
16 18 Switch000000000000000000000 6V
17 19 13
000000000000000000000 G
000000000000000000000 6V
000000000000000000000 14
000000000000000000000 G
000000000000000000000 6V
000000000000000000000 15
000000000000000000000
000000000000000000000 SERVO
98000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
+S
S
O
UART1 LOW 12
+5
20 RESET 2 RxD1 3 TxD1
รปู ท่ี L6-3 การตอ วงจรเพอ่ื ทดสอบการทาํ งานของแผงวงจรตรวจจบั แสงเพอื่ ใชก าํ หนดเงอื่ นไขในการ
เปด -ปด อุปกรณเ อาตพ ุต
174 Arduino IDE
#include <ipst.h> // ผนวกไฟลไ ลบรารหี ลกั
int val=0; // กาํ หนดตวั แปรสําหรบั เก็บคาท่ีไดจ ากการแปลงสญั ญาณ
void setup()
{
glcdClear();
setTextSize(2); // เลอื กขนาดตัวอักษรใหญเ ปน 2 เทา จากขนาดปกติ
setTextColor(GLCD_YELLOW);
glcd(1,2,"Night"); // แสดงขอ ความท่ีจอแสดงผล
glcd(2,2,"Switch");
}
void loop()
{
val = analog(1); // อานคาของสัญญาณชอ ง A1 มาเกบ็ ไวท ตี่ ัวแปร val
if(val<100) // ตรวจสอบวาคาท่ีอา นไดม ากกวา 512 หรอื ไม
{
setTextSize(4); // เลอื กขนาดตัวอักษรใหญเ ปน 4 เทา จากขนาดปกติ
setTextColor(GLCD_WHITE); // เปลยี นเปนสขี าว
glcd(3,1,"%d ",val); // แสดงคา ท่ีอา นไดจากจดุ ตอ A1 ทห่ี นาจอแสดงผล
} out(17,1); // ถาคา val นอยกวา 100 ทาํ การขับ LED ทพ่ี อรต 17
else
{
setTextSize(4); // เลอื กขนาดตัวอักษรใหญเปน 4 เทา จากขนาดปกติ
setTextColor(GLCD_BLUE); // แสดงตัวอกั ษรสนี ํ้าเงนิ
glcd(3,1,"%d ",val); // แสดงคา ท่ีอา นไดจ ากจดุ ตอ A1 ทห่ี นาจอแสดงผล
} out(17,0); // ถาคา val มากกวา 100 ทาํ การปด LED ทพ่ี อรต 17
setTextSize(2); // เลอื กขนาดตัวอกั ษรใหญเ ปน 2 เทา จากขนาดปกติ
}
คําอธบิ ายโปรแกรม
ในโปรแกรมนจี้ ะตรวจสอบคา จากแผงวงจรตรวจจบั แสงทอี่ า นดว ยคาํ สง่ั analog(1); เกบ็ ไวท ตี่ วั แปร val
หากคา ท่ีไดมากกวา 100 ตวั เลขทแี่ สดงผลเปนสีน้ําเงนิ และสงขอ มลู “0” ไปยงั พอรต 17 ทําให LED ท่ีตอ อยู
ไมท ํางาน
เมื่อคา ของ val นอยกวา 100 ตวั เลขแสดงผลจะเปล่ียนเปนสีขาว และมกี ารสงขอ มลู “1” ไปยงั พอรต
17 ทําให LED ท่ตี อ อยตู ดิ สวา ง
โปรแกรมที่L6-3:ไฟลmicrobox_NightSwitch.inoโปรแกรมภาษาC/C++สาํ หรบั ควบคมุ การเปด ปด อปุ กรณ
เอาตพ ตุ ดว ยแสง
Arduino IDE175
6.3.3 รนั โปรแกรม ทดลองใชม อื หรอื แปน กระดาษโปรง แสงบงั แสงทสี่ อ งมายงั ตวั ตา นทานแปรคา ตามแสงหรอื LDR
บนแผงวงจร ZX-LDR สังเกตการทํางานของจอแสดงผลบนแผงวงจร IPST-SE และ LED บนแผงวงจร ZX-LED
หาก ZX-LDR ไดร บั แสงมาก สังเกตไดจ ากคา ท่ีแสดงบนจอแสดงผล นั่นคอื มคี า มากกวา 100 (ตวั เลข
เปน สีนํ้าเงิน) จะสมมตสิ ถานการณว า เปนตอนกลางวัน จึงไมม เี ปดไฟสองสวาง ซึ่งในท่ีน้ีใช LED บนแผงวงจร
ZX-LED ทําหนาที่แทน
แตถ าั หาก ZX-LDR ไดร บั แสงลดลงจนตาํ่ กวา 100 จะถอื วา เปนตอนกลางคนื ระบบจะทํางานสั่งให
LED ท่ีพอรต 17 ตดิ สวาง จนกวา ZX-LDR จะไดร บั แสงมากเพียงพอ ซ่ึงอาจตคี วามวา เปนตอนเชาแลว วงจร
ขบั LED หยุดทํางาน ทําให LED ที่พอรต 17 ดบั
ดงั นั้น จึงอาจเรยี กการทาํ งานของปฏบิ ัตกิ ารนี้วา สวิตชสนธยา (Twilight Switch) หรอื สวิตชกลางคนื
(Night Switch) กไ็ ด
176 Arduino IDE
ในปฏิบัติการนี้เปนการนําไอซีวัดอุณหภูมิท่ีใหผลการทํางานเปนแรงดันไฟฟามาเช่ือมตอกับชุดกลอง
สมองกล IPST-MicroBOX (SE) เพ่ือสรา งเปนเครอื่ งวัดอุณหภมู ริ ะบบตวั เลขอยา งงาย
รูจักกับ MCP9701 ไอซวี ัดอุณหภมู ิ
เปน อปุ กรณต รวจจบั และวดั อณุ หภมู ทิ ใี่ หผ ลการทาํ งานเปน แรงดนั ไฟฟา แบบเชงิ เสน รบั รกู ารเปลย่ี นแปลง
ของอณุ หภูมภิ ายในเวลาไมถ งึ 2 วินาที เช่ือมตอ กบั อนิ พุตอะนาลอก A0 ถงึ A6 ของแผงวงจรหลัก IPST-SE ได
คณุ สมบัตทิ างเทคนิคของ MCP9701 ท่ีควรทราบ
เปนไอซีวัดอณุ หภมู ใิ นกลุมเทอรม สิ เตอรแ บบแอกตีฟทใ่ี หผลการทํางานแบบเชงิ เสน
ยา นวัด -40 ถงึ +125 องศาเซลเซียส
ผลการวดั อา งอิงกับหนวยขององศาเซลเซียสโดยตรง
ความผดิ พลาดเฉล่ีย 2 องศาเซลเซียส
ยา นไฟเล้ียง +3.1 ถงึ +5.5V กนิ กระแสไฟฟาเพยี ง 6uA ใชแบตเตอรเ่ี ปนแหลงจายไฟได
คา แรงดนั เอาตพ ุต 500mV (ที่ 0๐C) ถงึ 2.9375V (ที่ 125๐)
คา แรงดนั เอาตพ ตุ ตอ การเปลย่ี นแปลงอณุ หภมู ิ 19.5mV/๐C ใชง านกบั วงจรแปลงสญั ญาณอะนาลอก
เปน ดิจิตอลความละเอียดตงั้ แต 8 บิตได โดยมีความคลาดเคล่ือนตํ่า
รปู ที่ L7-1 การจดั ขาของ MCP9701, หนาตาเมอื่ ตอ สายสญั ญาณพรอ มใชงานและกราฟคุณสมบัติ
Arduino IDE177
28 A4 25 A1 8 SCL 9 SDA
29 A5 26 A2 USB
24 A0 30 A6 27 A3
KNOB D
DC MOTOR ON
OK Digital0 0000000000
15 SV0 14 SV1 13 SV2 12 SV3 G
SW1 000000000000000000000 6V
000000000000000000000 12
000000000000000000000 G
6V
THERMO000000000000000000000 13
METER000000000000000000000 G
6V
000000000000000000000 14
000000000000000000000 G
6V
26.740000000000000000000000 15
000000000000000000000 SERVO
000000000000000000000
000000000000000000000
Celsius000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
16 18 UART1 LOW 12
17 19 +5
20 RESET 2 RxD1 3 TxD1
รปู ท่ี L7-2 การตอ วงจรเพอ่ื ใชง านชดุ กลอ งสมองกล IPST-MicroBOX (SE) กบั ไอซวี ดั อณุ หภมู ิ MCP9701
การเช่ือมตอทางฮารด แวร
ตอ สายวัดอณุ หภูมทิ ่ีเช่ือมตอ กบั ไอซี MCP9701 เขา กบั จุดตอ A3 ของแผงวงจรหลัก IPST-SE
ขน้ั ตอนการทดลอง
7.1 เขยี นโปรแกรมท่ี L7-1 บันทึกในชื่อ microbox_Thermometer.ino
7..2 คอมไพลแ ละอปั โหลดโปรแกรมไปยงั แผงวงจร IPST-SE โดยคลกิ ทป่ี มุ
7.3 รนั โปรแกรม ทดลองใชมอื จับทตี่ วั ไอซีวัดอณุ หภมู ิ หรอื นําหัววัดอณุ หภมู ไิ ปแชในน้ําแขง็ สังเกตการทาํ งานท่ี
จอแสดงผลบนแผงวงจร IPST-SE
แผงวงจร IPST-SE แสดงขอ ความแจงหนาท่ีการทํางาน และแสดงคา อณุ หภมู ิในหนวยองศาเซลเซียส
(Celsius) ดว ยความละเอียดทศนิยม 3 ตาํ แหนง โดยทค่ี า ของอณุ หภมู จิ ะแสดงดว ยตวั เลขสเี หลืองขนาดใหญ
(3x)
178 Arduino IDE
#include <ipst.h> // ผนวกไฟลไลบรารหี ลกั
int val,i; // กาํ หนดตวั แปรเกบ็ คาท่ีอานไดจาก MCP9701
float Temp; // ประกาศตัวแปรคา อณุ หภมู ใื นแบบทศนยิ ม
void setup() // เคลยี รจอแสดงผล
{ // เลอื กขนาดตัวอกั ษร 2 เทา
glcdClear(); // แสดงขอ ความเรม่ิ ตน
setTextSize(2);
} // กาํ หนดรอบการอา นคาจาก MCP9701 รวม 20 ครงั้
void loop() // อานคาจากอินพุต A3
{ // หาคา เฉลยี่ จากการอา นคา 20 ครงั้
glcd(1,2,"Digital");
glcd(2,2,"THERMO");
glcd(3,3,"METER");
val=0;
for (i=0;i<20;i++)
{
val = val+analog(3);
}
val = val/20;
Temp = (float(val)*0.25) - 20.51 ; // แปลงคา เปน อณุ หภมู ิในหนว ยองศาเซลเซยี ส
setTextSize(3); // เปลยี่ นขนาดตวั อกั ษรเปน 3 เทา
setTextColor(GLCD_YELLOW); // เปลยี นสีตัวอักษรเปน สเี หลอื ง
glcd(3,1,"%f",Temp); // แสดงคา อณุ หภมู ิดว ยความละเอยี ดทศนยิ ม 3 ตําแหนง
setTextColor(GLCD_WHITE); // เปลยี นสีตัวอักษรเปน สขี าว
setTextSize(2); // เปล่ยี นขนาดตวั อักษรเปน 2 เทา
glcd(6,2,"Celsius"); // แสดงหนวยองศาเซลเซยี ส
delay(500); // หนวงเวลากอ นเรม่ิ ตนการอานคาในรอบใหม
}
คาํ อธบิ ายโปรแกรม
ในโปรแกรมน้ีหัวใจสําคญั คอื การคํานวณเพ่ือเปล่ียนขอมูลดิจิตอลที่ไดจ ากการแปลงแรงดนั เอาตพ ุต
ของไอซี MCP9701 เปนคา อณุ หภูมใิ นหนว ยองศาเซลเซยี ส กระบวนการจะเรม่ิ จากการอา นและแปลงคา ของ
แรงดนั ไฟตรงทจี่ ดุ ตอ A3 ซงึ่ ไดม าจากการทาํ งานของไอซี MCP9701 มาเกบ็ ไวใ นตวั แปร val จากนนั้ นาํ ขอ มลู
ท่ีไดม าคาํ นวณดว ยสูตร Temp = (val x 0.25) - 20.51 จากนั้นนําคา อณุ หภมู ไิ ดม าแสดงผลดว ยความละเอียด
ทศนิยม 3 ตาํ แหนง
โปรแกรมที่ L7-1 : ไฟล microbox_Thermometer.ino โปรแกรมภาษา C/C++ สาํ หรบั พฒั นากลอ งสมองกล
IPST-MicroBOX(SE)เปน เครอ่ื งวดั อณุ หภมู ริ ะบบตวั เลขอยา งงา ย