Arduino IDE101
6.3.3 color[ ]
เปน ตวั แปรอะเรยท ใี่ ชก าํ หนดสจี าํ นวน 8 สที เ่ี ปน สพี นื้ ฐาน ผพู ฒั นาโปรแกรมสามารถเรยี กใช
ตัวแปร color[] หรอื เรยี กใชชื่อสตี รงๆ ก็ได
รูปแบบ
unsigned int color[]= { GLCD_RED,
GLCD_GREEN,
GLCD_BLUE,
GLCD_YELLOW,
GLCD_BLACK,
GLCD_WHITE,
GLCD_SKY,
GLCD_MAGENTA};
พารามเิ ตอร
GLCD_RED - ใชกาํ หนดสีแดง
GLCD_GREEN - ใชก าํ หนดสเี ขยี ว
GLCD_BLUE - ใชกาํ หนดสนี ้ําเงนิ
GLCD_YELLOW - ใชกาํ หนดสเี หลอื ง
GLCD_BLACK - ใชกาํ หนดสดี าํ
GLCD_WHITE - ใชกาํ หนดสขี าว
GLCD_SKY - ใชกาํ หนดสฟี า
GLCD_MAGENTA - ใชก าํ หนดสบี านเยน็
ตัวอยางท่ี 6-4
glcdFillScreen(color[5]); // กาํ หนดใหพ นื้ หลงั เปน สขี าว
ตัวอยางท่ี 6-5
glcdFillScreen(GLCD_BLUE); // กาํ หนดใหพ น้ื หลงั เปน สนี ํ้าเงนิ
102 Arduino IDE
6.3.4 glcdSetColorWordBGR
เปนฟง กชน่ั กําหนดการเรยี งบิตขอมูลสีใหเ ปนแบบ BGR (5-6-5) นน่ั คือ คาของสนี ้าํ เงิน 5 บิต
ตอดว ยสเี ขียว 6 บติ และปด ทา ยดวยคา ของสแี ดง 5 บติ ทั้งนเ้ี น่ืองจากผูผลิตจอแสดงผลกราฟก LCD
สมี กี ารผลติ จอแสดงทม่ี ีคุณสมบตั ิเหมอื นกนั ออกมา 2 รนุ แตมีการเรียงบิตขอมลู สตี างกัน คือ เรียง
แบบ BGR และเรียงแบบ RGB
อยา งไรก็ตาม คาตั้งตนของไฟลไ ลบรารี ipst_glcd.h เลือกใชการเรียงบิตขอ มลู สีใหเปนแบบ
BGR น่นั คือ มกี ารเรียกใชฟง กช่นั นีต้ ั้งแตตน จงึ ไมต องเขียนฟง กช่นั นล้ี งในโปรแกรม
รูปแบบ
glcdSetColorWordBGR()
ตัวอยางท่ี 6-6
#include <ipst.h>
void setup()
{
glcdSetColorWordBGR(); // เขยี นฟง กช ั่นนลี้ งไปหรอื ไมก ไ็ ด
}
void loop()
{}
6.3.5 glcdSetColorWordRGB( );
เปนฟง กช่นั กําหนดการเรยี งบิตขอมลู สใี หเ ปนแบบ RGB (5-6-5) นัน่ คือ คาของสีแดง 5 บิต
ตอดวยสีเขียว 6 บิต และปดทายดวยคาของสีน้ําเงิน 5 บิต ทั้งน้ีเนื่องจากผูผลิตจอแสดงผลกราฟก
LCD สมี กี ารผลิตจอแสดงผลแบบน้ี 2 รนุ โดยมีการเรียงบิตขอ มลู สแี บบ BGR และแบบ RGB
หากผูใชงานแผงวงจร IPST-SE และทดลองกําหนดสขี องภาพหรอื ตัวอกั ษรแลวพบวา สีท่ีได
ไมถ ูกตอง จะตอ งเรยี กใชฟง กชนั่ นี้ โดยบรรจไุ วใน setup() ท่ตี อนตนของโปรแกรม
รูปแบบ
glcdSetColorWordRGB()
ตัวอยางที่ 6-7
#include <ipst.h>
void setup()
{
glcdSetColorWordBGR(); // เลอื กรปู แบบการเรยี งบติ สเี ปน แบบ RGB
}
void loop()
{}
Arduino IDE103
6.3.6 setTextColor
เปนการกําหนดคาสีของตัวอักษรที่แสดงดวยฟงกชั่น glcd() โดยคาต้ังตนกําหนดเปนสีขาว
รูปแบบ
void setTextColor(unsigned int newColor)
พารามเิ ตอร
newColor คอื สีทต่ี องการ เปน ตัวเลข 16 บติ หรอื เปน คา ตัวแปรทกี่ าํ หนดคา ไวแ ลวจากตวั แปร color[]
ตัวอยางท่ี 6-8
#include <ipst.h>
int colors;
void setup()
{
int colors;
colors=colorRGB(31,0,0); // สงคา สี 16 บิตของสีแดงใหต ัวแปร colors
setTextColor(colors); // กาํ หนดใหส ขี องตวั อักษรเปน สแี ดง
glcd(1,0,"Text color is Red"); // กาํ หนดขอความ
}
void loop()
{
setTextColor(GLCD_YELLOW); // กาํ หนดใหส ีของตวั อกั ษรเปน สเี หลอื ง
glcd(3,0,"Text color is Yellow"); // กาํ หนดขอ ความ
}
28 A4 25 A1 8 SCL 9 SDA
29 A5 26 A2 USB
24 A0 30 A6 27 A3
D
KNOB ON14 SV1 13 SV2 12 SV3
Textocolordis0red0000
OK 000000000000000000000 G
Textocolordis0yellow0 6V
SW1 000000000000000000000 12
000000000000000000000 G
000000000000000000000 6V
000000000000000000000 13
000000000000000000000 G
000000000000000000000 6V
000000000000000000000 14
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
104 Arduino IDE
6.3.7 setTextBackgroundColor
เปนฟง กช่นั กําหนดสขี องพ้นื หลงั ตัวอกั ษร โดยคาต้ังตนเปนสดี าํ สขี องพื้นหลงั ตัวอกั ษรจะ
เปน คนละสว นกบั สขี องพนื้ จอภาพ (screen background) ซงึ่ ตอ งกาํ หนดคา ผา นฟง กช นั่ glcdFillScreen
รูปแบบ
void setTextBackgroundColor(unsigned int newColor)
พารามเิ ตอร
newColor คอื สที ต่ี อ งการ เปน ตัวเลข 16 บติ หรอื เปน คา ตัวแปรทก่ี าํ หนดคา ไวแ ลวจากตัวแปร color[]
ตวั อยา งที่ 6-9
#include <ipst.h>
void setup() // กาํ หนดใหส ีพนื้ หลงั ตวั อักษรเปน สแี ดง
{
// กาํ หนดใหส ีของตวั อกั ษรเปน สเี หลอื ง
setTextBackgroundColor(GLCD_RED); // กาํ หนดขอ ความ
} // กาํ หนดขอ ความ
void loop() // กาํ หนดขอ ความ
{
setTextColor(GLCD_YELLOW);
glcd(3,0,"Text color is Yellow.");
glcd(5,0,"Text background color");
glcd(6,0,"is Red.");
}
28 A4 25 A1 8 SCL 9 SDA
29 A5 26 A2 USB
24 A0 30 A6 27 A3
D
KNOB ON 14 SV1 13 SV2 12 SV3
Hello0World0000000000
OK 000000000000000000000 G
Textocolordis0Yellow0 6V
SW1 000000000000000000000 12
G
Text0background0color 6V
is0Red000000000000000 13
G
000000000000000000000 6V
000000000000000000000 14
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
Arduino IDE105
6.3.8 glcdClear
เปน การเคลยี รห นา จอแสดงผล โดยสขี องพนื้ หลงั จะเปน สพี นื้ หลงั ของตวั อกั ษรลา สดุ โดยถา ไม
ไดก าํ หนดดว ยคาํ สง่ั setTextBackGroundColor() มากอ นหนา น้ี หลงั จากทาํ คาํ สงั่ glcdClear()แลว
พน้ื หลงั จะเปน สดี าํ
รูปแบบ
void glcdClear()
ตัวอยางท่ี 6-10
glcdClear(); // เคลยี รหนาจอแสดงผล
IPST-SE
106 Arduino IDE
6.3.9 glcdFillScreen
เปนการเคลียรหนาจอแสดงผล แลว เปลี่ยนสีพนื้ หลังของจอแสดงผลดวยสีทีร่ ะบุ
รูปแบบ
void glcdFillScreen(unsigned int color)
พารามเิ ตอร
Color คอื สีทตี่ องการ เปน ตัวเลข 16 บิต หรอื เปน คาตัวแปรทีก่ าํ หนดคา ไวแ ลว จากตัวแปร color[]
ตวั อยางที่ 6-11
glcdFillScreen(GLCD_YELLOW); // กาํ หนดสพี น้ื หลงั ของจอภาพเปน สเี หลอื ง
6.3.10 glcdMode
เปนการกาํ หนดทศิ ทางแสดงผลของจอกราฟก LCD สี โดยกําหนดใหขอความหรอื ภาพหนา
จอใหแสดงภาพต้ังฉากตรงหนา (โหมด 0), หมนุ ขวา 90 องศา (โหมด 1), หมนุ 180 องศาหรอื กลบั
หวั (โหมด 2) และหมนุ 270 องศา (โหมด 3)
รูปแบบ
glcdMode(unsigned int modeset)
พารามเิ ตอร
modeset คือคาทิศทางของการหมุนมีคา 0 ถึง 3 โดยใชแทนทิศทาง 0, 90, 180 หรือ 270 องศา
โดยมีคา เรมิ่ ตนคือ 0 องศา ทาํ งานอยใู นแนวต้ัง
Arduino IDE107
IPST-SE IPST-SE
IPST-SE IPST-SE
ตัวอยา งที่ 6-12
#include <ipst.h>
void setup()
{
setTextSize(2); // ขนาดตวั อกั ษร 2 เทา
}
void loop()
{
glcdClear(); // เคลยี รห นาจอ
glcdMode(0); // โหมด 0 องศา
glcd(0,0,"IPST-SE"); // แสดงขอ ความ
sw_ok_press(); // รอกดสวติ ชเ ขา โหมดตอ ไป
glcdClear();
glcdMode(1);
glcd(0,0,"IPST-SE");
sw_ok_press();
glcdClear();
glcdMode(2);
glcd(0,0,"IPST-SE");
sw_ok_press();
glcdClear();
glcdMode(3);
glcd(0,0,"IPST-SE");
sw_ok_press();
}
108 Arduino IDE
6.3.11 setTextSize
เปน การกาํ หนดขนาดตวั อกั ษรโดยระบเุ ปน จาํ นวนเทา ของขนาดปกติ คา ตง้ั ตน เมอ่ื เรม่ิ ทาํ งาน
ทุกคร้ังคือ ขนาดตัวอักษรปกติ ใชพ้ืนท่ีรวมระยะชองไฟคอื 6 x 10 พกิ เซลตอ 1 ตัวอักษร จงึ แสดง
ได 21 ตัวอักษร 16 บรรทดั ในแนวต้ัง
รูปแบบ
setTextSize(unsigned int newSize)
พารามเิ ตอร
newSize คอื คา ขนาดจํานวนเทา ของขนาดปกติ มีคา 1 ถึง 16 เพอื่ ใหต ัวอักษรทแ่ี สดงไมล น หนาจอ
ถาหากกําหนดเปน 1 เทา แสดงตัวอกั ษรได 21 ตัว 16 บรรทดั
ถาหากกําหนดเปน 2 เทา แสดงตัวอักษรได 10 ตัว 8 บรรทดั
ถาหากกําหนดเปน 3 เทา แสดงตัวอกั ษรได 7 ตัว 5 บรรทดั
ถาหากกําหนดเปน 4 เทา แสดงตัวอักษรได 5 ตัว 4 บรรทดั
ถาหากกําหนดเปน 5 เทา แสดงตัวอกั ษรได 4 ตัว 3 บรรทดั
ถาหากกําหนดเปน 6 และ 7 เทา แสดงตัวอักษรได 3 ตัว 2 บรรทดั
ถาหากกําหนดเปน 8 เทา แสดงตัวอักษรได 2 ตัว 2 บรรทดั
ถาหากกําหนดเปน 9 และ 10 เทา แสดงตัวอกั ษรได 2 ตัว 1 บรรทดั
ถาหากกําหนดเปน 11 ถึง 16 เทา แสดงตัวอักษรได 1 ตัว 1 บรรทดั (แบบไมล น จอแสดงผล)
Arduino IDE109
ตัวอยางที่ 6-13 // กาํ หนดขนาดขอ ความ 1 เทา
// สีตัวอักษรเปน สเี ขยี ว
#include <ipst.h> // แสดงขอ ความ
void setup() // กาํ หนดขนาดขอ ความ 2 เทา
{ // กาํ หนดขนาดขอ ความ 3 เทา
// กาํ หนดขนาดขอ ความ 4 เทา
setTextSize(1);
setTextColor(GLCD_GREEN);
glcd(0,0,"Size1");
setTextSize(2);
glcd(1,0,"Size2");
setTextSize(3);
glcd(2,0,"Size3");
setTextSize(4);
glcd(3,0,"Size4");
}
void loop()
{}
6.3.12 getTextColor
เปนคําส่ังคืนคาสีปจจุบันของตัวอักษร
รูปแบบ
unsigned int getTextColor()
การคืนคา
textColor เปน คาสแี สดงอยใู นรปู ของตวั เลข 16 บิต ดรู ปู แบบไดจากฟง กช ั่น colorRGB()
ตัวอยางที่ 6-14 // นาํ คา สขี องตวั อกั ษรเกบ็ ไวท ตี่ วั แปร color
unsigned int color;
color=getTextColor();
110 Arduino IDE
6.3.13 getTextBackgroundColor
เปนคําสั่งคืนคาสีพื้นหลังของตัวอักษรในปจจุบัน
รูปแบบ
unsigned int getTextBackgroundColor()
การคืนคา
textBackgroundColor เปน คา สแี สดงอยใู นรปู ของตวั เลข 16 บติ ดรู ปู แบบไดจ ากฟง กช นั่ colorRGB()
ตวั อยา งที่ 6-15
unsigned int color;
color=getTextBackgroundColor(); // นาํ คา สพี นื้ หลงั ของตวั อกั ษรเกบ็ ในตวั แปร color
6.3.14 getTextSize
คืนคาขนาดของตัวอักษรออกมาเปนจํานวนเทาของคาปกติ
รูปแบบ
unsigned int getTextSize()
การคืนคา
textSize เปน คาจาํ นวนเทา ของขนาดตวั อักษร
ตวั อยางที่ 6-16
unsigned int textSize;
textSize=getTextSize(); // นําคา จาํ นวนเทาของขนาดของตวั อกั ษรเกบ็ ในตัวแปร textSize
6.3.15 glcdGetMode
เปนคําส่ังคืนคาของโหมดทิศทางการแสดงผลในปจจุบัน
รูปแบบ
unsigned int glcdGetMode()
การคืนคา
mode เปน คาของโหมดทศิ ทางการแสดงผล เปน ตัวเลข 0 ถึง 3 เพอ่ื แสดงผลในทศิ ทาง 0 องศา, หมุน 90
องศา, หมุน 180 องศา และหมุน 270 องศาตามลาํ ดบั
ตวั อยางท่ี 6-17
unsigned int Mode;
Mode=glcdGetMode(); // คนื คาทิศทางการแสดงผลของหนา จอ GLCD
Arduino IDE111
6.3.16 glcdPixel
เปนคําสั่งพล็อตจุดบนจอภาพตามพิกัดท่ีกําหนด โดยอางอิงถึงตําแหนงของพิกเซลหรือจุด
ของจอแสดงผลท่ีความละเอียด 128 x 160 จดุ ดังรปู ท่ี 6-2
รูปแบบ
void glcdPixel(unsigned int x,unsigned int y,unsigned int color)
พารามเิ ตอร
x คอื คา พิกดั ในแนวนอนหรอื แกน x มีคา ระหวาง 0 ถึง 127
y คอื คา พิกดั ในแนวตงั้ หรือแกน y มีคา ระหวาง 0 ถึง 159
color คอื คา ของสที ต่ี องการ เปน ตัวเลข 16 บิต หรอื เปน คาตัวแปรที่กาํ หนดคา ไวแ ลว จากตัวแปร color[]
รปู ที่ 6-2 แสดงการกาํ หนดตาํ แหนง ของพกิ เซลหรอื จดุ ของจอแสดงผลกราฟก LCD สที ใ่ี ชบ นแผงวงจร
IPST-SEในชดุ กลอ งสมองกล IPST-MicroBOX (SE)
112 Arduino IDE
ตวั อยา งท่ี 6-18 // พลอ็ ตจดุ ทกุ ๆ 4 พกิ เซลในแนวแกน x กลางจอ
// พลอ็ ตจดุ ทกุ ๆ 4 พกิ เซลในแนวแกน y กลางจอ
#include <ipst.h>
int i;
void setup()
v}{ oid{ff{}}oolorro((piigg==(ll)cc00dd;;iiPP<<ii11xxee26ll80((6i;;,ii84++0,==i,,44GG))LLCCDD__RREEDD));;
{}
28 A4 25 A1 8 SCL 9 SDA
29 A5 26 A2 USB
24 A0 30 A6 27 A3 D
Hello0World0000000000
000000000000000000000
ON
KNOB 000000000000000000000 G 14 SV1 13 SV2 12 SV3
000000000000000000000 6V
OK 000000000000000000000 12
000000000000000000000
SW1 000000000000000000000 G
000000000000000000000 6V
000000000000000000000 13
000000000000000000000
000000000000000000000 G
6V
14
Arduino IDE113
6.3.1.17 glcdRect
เปน ฟง กช นั่ ลากเสน จากพกิ ดั ทก่ี าํ หนดมายงั พกิ ดั ปลายทาง โดยอา งองิ ถงึ ตาํ แหนง ของพกิ เซล
หรือจุดของจอแสดงผลที่ความละเอยี ด 128 x 160 จดุ ตามรปู ท่ี 6-2
รูปแบบ
void glcdRect(unsigned int x1,unsigned int y1,unsigned int width,unsigned int
height,unsigned int color)
พารามเิ ตอร
x1 คอื คา ตําแหนง เร่ิมตนของรปู สี่เหลย่ี มในแกน x มีคา ระหวา ง 0 ถึง 127
y1 คอื คา ตําแหนง เร่มิ ตนของรูปส่เี หลยี่ มในแกน y มีคา ระหวาง 0 ถึง 159
width คอื คา ความกวางของรปู สี่เหลยี่ ม (แนวนอน) มีคา ระหวาง 1 ถึง 128
height คอื คา ความสงู ของรูปสเี่ หลย่ี ม (แนวตงั้ ) มีคา ระหวา ง 1 ถึง 158
color คอื สขี องเสน เปน คาตัวเลข 16 บิต หรอื เปน คาตัวแปรท่กี าํ หนดคา ไวแ ลวจากตัวแปร color[]
ตัวอยางท่ี 6-19
#include <ipst.h>
void setup()
{
glcdRect(32,40,64,80,GLCD_RED); // วาดรปู สเี่ หลย่ี มเสนสแี ดง ขนาด 64 x 80 พกิ เซล
}
void loop()
{}
300000000000000000000
400000000000000000000
500000000000000000000
600000000000000000000
700000000000000000000
800000000000000000000
900000000000000000000
a00000000000000000000
b00000000000000000000
c00000000000000000000
d00000000000000000000
e00000000000000000000
f00000000000000000000
114 Arduino IDE
6.3.18 glcdFillRect
เปน การระบายสพี นื้ ของรปู สเี่ หลยี่ ม โดยกาํ หนดจดุ เรมิ่ ตน และความกวา งยาวของรปู สเี่ หลย่ี ม
ทตี่ องการ ฟง กชน่ั น้ีเปนการสรางรปู ส่ีเหลี่ยมที่มสี พี น้ื แตไมม ีเสนกรอบ ในขณะทฟ่ี ง กช่นั glcdRect
เปนการวาดรปู กรอบสเี่ หลยี่ มที่กําหนดสขี องเสน กรอบได แตภายในกรอบไมม สี ี
รูปแบบ
void glcdFillRect(unsigned int x1, unsigned int y1, unsigned int width, unsigned
int height,unsigned int color)
พารามเิ ตอร
x1 คอื คา ตําแหนง เรม่ิ ตนของรปู สเี่ หลย่ี มในแกน x มีคา ระหวาง 0 ถึง 127
y1 คอื คา ตําแหนง เรมิ่ ตนของรูปส่เี หลย่ี มในแกน y มีคา ระหวาง 0 ถึง 159
width คอื คา ความกวางของรูปสีเ่ หลย่ี ม (แนวนอน) มีคา ระหวาง 1 ถึง 128
height คอื คา ความสงู ของรปู สเ่ี หลยี่ ม (แนวตง้ั ) มีคา ระหวา ง 1 ถึง 158
color คอื สขี องเสน เปน คาตัวเลข 16 บิต หรอื เปน คาตัวแปรท่กี าํ หนดคา ไวแ ลวจากตัวแปร color[]
ตวั อยางที่ 6-20
#include <ipst.h>
void setup()
{
glcdFillRect(32,40,64,80,GLCD_RED);
// สรา งภาพสเ่ี หลยี่ มพนื้ สแี ดง ขนาด 64 x 80 พกิ เซล
}
void loop()
{}
300000000000000000000
400000000000000000000
500000000000000000000
600000000000000000000
700000000000000000000
800000000000000000000
900000000000000000000
a00000000000000000000
b00000000000000000000
c00000000000000000000
d00000000000000000000
e00000000000000000000
f00000000000000000000
Arduino IDE115
6.3.19 glcdLine
เปนฟง กชั่นลากเสน จากจุดหนงึ่ ไปยงั อกี จุดหนงึ่ กําหนดเปน พกิ ัดในแนวแกนนอน (x) และ
แกนตง้ั (y)
รูปแบบ
void glcdLine(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int
y2,unsigned int color)
พารามเิ ตอร
x1 คอื คา ตําแหนง เรมิ่ ตนของเสน บนแกน x มีคา ระหวาง 0 ถึง 127
y1 คอื คา ตําแหนง เร่ิมตนของเสน บนแกน y มีคา ระหวาง 0 ถึง 159
x2 คอื คา ตําแหนง ส้นิ สดุ ของเสนบนแกน x มีคา ระหวาง 0 ถึง 127
y2 คอื คา ตําแหนง ส้นิ สดุ ของเสน บนแกน y มีคา ระหวาง 0 ถึง 159
color คอื คา สขี องเสน เปน ตัวเลข 16 บิต หรอื เปน คาตัวแปรท่ีกาํ หนดคา ไวแ ลวจากตัวแปร color[]
ตัวอยางที่ 6-21
#include <ipst.h>
void setup()
{
glcdLine(0,0,127,159,GLCD_RED); // ลากเสน สแี ดงทะแยงมมุ จากดา นบนซา ยลงมาดา นลา งขวา
}
void loop()
{}
0
43 0
0000000000000000
0000000000000000
500000000000000000000 43
600000000000000000000
700000000000000000000
800000000000000000000
900000000000000000000
a00000000000000000000
b00000000000000000000
c00000000000000000000
d00000000000000000000
e00000000000000000000
f00000000000000000000
0
0
116 Arduino IDE
6.3.20 glcdCircle
เปน ฟง กช น่ั วาดเสน รปู วงกลมจากการกาํ หนดจดุ กง่ึ กลางของวงกลมและความยาวของรศั มี
รูปแบบ
void glcdCircle(unsgined int x, unsgined int y, unsgined int radius,unsgined int color)
พารามเิ ตอร
x คอื พกิ ดั จุดศนู ยก ลางของวงกลมบนแกน x มีคา ระหวาง 0 ถึง 127
y คอื พกิ ดั จดุ ศนู ยก ลางของวงกลมบนแกน y มีคา ระหวาง 0 ถึง 159
radius คอื คา รศั มีของวงกลม
color คอื คา สขี องเสน เปน ตัวเลข 16 บิต หรอื เปน คาตัวแปรทกี่ าํ หนดคา ไวแ ลวจากตัวแปร color[]
ตวั อยา งที่ 6-22
#include <ipst.h>
void setup()
{
glcdCircle(32,120,31,GLCD_RED);// สรางเสน วงกลมสแี ดง มีรศั มี 31 พกิ เซล
}
void loop()
{}
0000000000000000
0000000000000000
500000000000000000000
600000000000000000000
700000000000000000000
800000000000000000000
900000000000 00000000
a000000000 0000000000
b00000000000000000000
c00000000000000000000
d00000000000000000000
e00000000000000000000
f00000000000000000000
Arduino IDE117
6.3.21 glcdFillCircle
เปนฟงกชั่นวาดรูปวงกลมท่ีมีสีพื้นจากการกําหนดจุดศูนยกลางของวงกลม และความยาว
ของรศั มี ฟง กชน่ั นเ้ี ปนการสรา งรปู วงกลมท่มี สี ีพนื้ แตไมม เี สนกรอบ ในขณะทฟ่ี ง กชัน่ glcdCircle
เปนการวาดรูปวงกลมท่ีกําหนดสีของเสนรอบวงได แตภายในวงกลมไมมีสี
รูปแบบ
void glcdFillCircle(unsigned int x,unsigned int y,unsigned int radius,unsigned int color)
พารามเิ ตอร
x คอื พกิ ดั จดุ ศนู ยก ลางของวงกลมบนแกน x มีคา ระหวา ง 0 ถึง 127
y คอื พกิ ดั จุดศนู ยก ลางของวงกลมบนแกน y มีคา ระหวาง 0 ถึง 159
radius คอื คา รศั มีของวงกลม
color คอื คา สขี องเสน เปน ตัวเลข 16 บิต หรอื เปน คาตัวแปรทก่ี าํ หนดคา ไวแ ลวจากตัวแปร color[]
ตัวอยางที่ 6-23
#include <ipst.h>
void setup()
{
glcdFillCircle(32,120,31,GLCD_RED); // สรา งรปู วงกลมพน้ื สแี ดง รศั มี 31 พกิ เซล
}
void loop()
{}
0000000000000000
0000000000000000
500000000000000000000
600000000000000000000
700000000000000000000
800000000000000000000
900000000000 00000000
a000000000 0000000000
b00000000000000000000
c00000000000000000000
d00000000000000000000
e00000000000000000000
f00000000000000000000
118 Arduino IDE
6.3.22 glcdArc
เปน ฟง กช น่ั วาดสว นโคง ของวงกลม โดยระบตุ าํ แหนง จดุ กงึ่ กลาง รศั มี ตาํ แหนง จดุ เรม่ิ จดุ สนิ้
สดุ และสขี องเสน
รูปแบบ
void glcdArc(unsigned int x,unsigned int y,unsigned int r,int start_angle,int
end_angle,uint color)
พารามเิ ตอร
x คอื ตําแหนง จดุ กง่ึ กลางในแนวแกน x
y คอื ตําแหนง จดุ กงึ่ กลางในแนวแกน y
r คอื รศั มีของเสน โคง
start_angle คอื ตาํ แหนง มมุ ของจดุ เรม่ิ ตน ของวงกลม
end_angle คอื ตาํ แหนง มมุ จดุ สนิ้ สดุ ของวงกลม
color คอื สขี องเสน วงกลม
ตวั อยา งที่ 6-24
#include <ipst.h>
void setup()
{
glcdArc(48,80,16,30,150,GLCD_RED);
glcdCircle(48,75,5,GLCD_YELLOW);
glcdCircle(80,75,5,GLCD_YELLOW);
glcdArc(80,80,16,30,150,GLCD_RED);
glcdFillCircle(64,90,7,GLCD_GREEN);
glcdArc(64,100,30,220,320,GLCD_RED);
}
void loop()
{}
Arduino IDE119
7.1 LED คอื อะไร
LED (Light Emiting Diode) หรอื ไดโอดเปลงแสงเปนอปุ กรณเ อาตพตุ สําหรบั การแสดงผล
ซ่ึงสามารถติดสวา งไดเ ม่ือไดรบั แรงดนั กระตนุ อยา งเหมาะสม โดย LED มีใหเลือกใชงานไดห ลายสี
อาทิ สแี ดง, เหลอื ง, เขียว, นํ้าเงิน, ขาว, สม, มวง เปนตน
LED สามารถกําเนิดแสงออกมาไดเ ม่ือไดร บั จา ยไฟอยา งถกู ตอ ง การจายไฟให LED ทํางาน
เรียกวา การไบแอส (bias) และการไบแอสท่ีทําให LED ทํางาน เรียกวา การไบแอสตรง (forward
bias) โดยปกติแรงดันทใี่ ชในการขับหรอื ไบแอสให LED ทาํ งานจะมีคาอยูระหวา ง 1-4.5 V ขึ้นอยูกับ
สารทนี่ าํ มาใชท าํ LED และขนึ้ อยกู บั ปรมิ าณกระแสทไ่ี หลผา น กลา วคอื ถา กระแสไหลผา น LED มาก
มผี ลทําใหแรงดนั ที่ตกครอม LED มคี ามากและแสงที่ LED กําเนิดออกมากจ็ ะสวา งมากขึน้ ดว ย โดย
ปกติมักจะกําหนดใหแ รงดันไบแอสตรงของ LED เทากับ 2V ในรปู ที่ 7-1 เปนสญั ลักษณ, โครงสรา ง
และการจัดขาของ LED
LED สามารถเปลง แสงออกไดห ลายสขี ้ึนอยกู ับวา นาํ สารก่ึงตัวนาํ ชนดิ ใดมาสรางเปน LED
ถาหากเปนสีแดงและเหลืองทํามาจากแกลเลี่ยมอารเซไนดฟอสไฟด (GaAsP) สวนสีเขียวทํามาจาก
แกลเลี่ยมฟอสไฟด (GaP) และ LED ท่ีใหแสงอินฟาเรดซงึ่ ทํามาจากแกลเลี่ยมอารเ ซไนด (GaAs)
R1
AK ขาแคโทด ขาแอโนด Vs + LED1
(ก) สญั ลักษณข อง LED (ข) โครงสรา งภายในของ LED I1
รปู ที่ 7-1 แสดงสญั ลกั ษณ, โครงสรา งและการจดั ขาของไดโอด รปู ท่ี 7-2 การตอ ตวั ตา นทานเพื่อ
เปลง แสงหรอื LED จาํ กดั กระแสใหแ ก LED
120 Arduino IDE
7.2 การใชง าน LED
LEDตอ งการแรงดนั ไบแอสตรงประมาณ2Vและยอมใหก ระแสไฟฟา ไหลผา นไดไ มเ กนิ 40mA
แตป รมิ าณกระแสไฟฟา ทเี่ หมาะสมคอื 10 ถงึ 20mA ดงั นน้ั การใชง าน LED จงึ ตอ งมตี วั ตา นทานจาํ กดั
กระแสไฟฟา ตออนุกรมรวมอยูดวย ดังในรูปท่ี 7-2
การหาคาของตัวตา นทานทีใ่ ชในการจาํ กัดกระแสไฟฟา ให LED ทําไดโ ดยใชสตู ร
Vcc VF
RS
IF
โดยที่ VCC คอื ไฟเลยี้ ง
VF คอื แรงดนั ไบแอสตรงทตี่ กครอ ม LED
IF คอื กระแสไฟฟาทไ่ี หลผา น LED เม่ือไดรับไบแอสตรง
ในทางตรงกนั ขา ม หากจา ยแรงดนั ไบแอสกลบั แก LED นอกจาก LED จะไมท าํ งานแลว อาจ
ทาํ ให LED เสยี หายเนอ่ื งจาก LED มอี ตั ราการทนแรงดนั ยอ นกลบั ไดไ มส งู นกั เพยี ง 3 ถงึ 10V เทา นนั้
7.3 การควบคมุ LED ดวยไมโครคอนโทรลเลอรแ ละโปรแกรมภาษา C
การควบคมุ การตดิ /ดบั ของ LED นนั้ ผพู ฒั นาสามารถใชสัญญาณจากจุดตอพอรต ใดๆ ของแผง
วงจรIPST-SE กไ็ ดโดยในการเขยี นโปรแกรมควบคมุ การตดิ /ดบั ของ LEDนนั้ ใชก ลมุ คาํ สง่ั เอาตพ ตุ เพอ่ื
ควบคมุ สถานะของจดุ ตอพอรต ทเ่ี ชอ่ื มตอ กบั LED
ฟง กช นั่ หรอื คาํ สง่ั หลกั ของโปรแกรมภาษา C/C++ สาํ หรบั ชดุ กลอ งสมองกล IPST-MicroBOX
(SE) ที่นาํ มาใชควบคุมการทํางานของ LED คือ out ซ่งึ บรรจอุ ยใู นไลบรารี ipst_in_out.h ในการใช
งานจึงตองผนวกไฟลไ บรารี ipst_in_out.h หรอื ipst.h ดวยคาํ ส่งั #include ทส่ี วนหวั ของโปรแกรม
กอนเสมอ ฟง กช่นั out มรี ปู แบบและการเรยี กใชดงั น้ี
out เปนฟง กชน่ั กาํ หนดระดบั สัญญาณหรือขอมลู ดจิ ติ อลไปยังขาพอรต ทกี่ าํ หนด
รูปแบบ
out(char _bit,char _dat)
พารามเิ ตอร
_bit - กาํ หนดขาพอรต ทต่ี องการ มีคา 0 ถึง 50 สาํ หรบั IPST-SE ใชไดถ ึง 30
_dat - กาํ หนดขอ มูลทต่ี องการสงออก มีคา เปน 0 หรอื 1
ตวั อยางที่ 7-1
out(17,1); // กาํ หนดใหข าพอรต 17 เปน “1”
out(18,0); // กาํ หนดใหข าพอรต 18 เปน “0”
Arduino IDE121
เพ่ือใหเ ครือ่ งมอื และอปุ กรณอยใู นสภาพทพี่ รอ มทาํ งานตลอดเวลา ส่ิงทคี่ วรกระทําทุกครั้ง
ทใี่ ชง านชดุ กลองสมองกล IPST-MicroBOX คอื
1. ปดสวติ ชไ ฟเล้ยี งทกุ คร้ังทม่ี กี ารถอดหรือตอ สายเขากบั คอมพิวเตอรและชดุ โปรแกรม
2. ปดสวิตชไฟเล้ียงทุกคร้ังท่ีมีการตอหรือปลดสายของแผงวงจรตรวจจับสัญญาณหรือ
อปุ กรณใดๆ เขากบั แผงวงจรควบคมุ IPST-SE
3. หลงั จากทที่ ดลองเสรจ็ ในแตล ะการทดลอง ควรปด สวติ ชไ ฟเลย้ี งกอ นทจี่ ะทาํ การปลดสาย
สัญญาณเพื่อตอแผงวงจรใหมเ ขาไปเพ่ือทําการทดลองในหวั ขอใหม
4. ไมค วรปลดหรือตอ สายสญั ญาณของแผงวงจรใดๆ เขากบั แผงวงจร IPST-SE ในขณะที่
แผงวงจรกาํ ลงั ทาํ งาน เวน แตม ขี น้ั ตอนการปฏบิ ตั อิ น่ื ใดทร่ี ะบเุ จาะจงวา ตอ งสายสญั ญาณในขณะ
ทํางานของการทดลองนน้ั ๆ
5. หากมคี วามผดิ พลาดใดๆ เกดิ ข้ึน ตอ งปดสวติ ชไ ฟเลี้ยงทนั ที
6. ไมใ ชอ ะแดปเตอรไฟตรงทมี่ แี รงดนั ขาออกเกิน +9V กับแผงวงจร IPST-SE
7. หลงั จากเสร็จสนิ้ การทดลอง ใหป ลดสายเชอ่ื มตอ คอมพิวเตอรและสายของอะแดปเตอร
หรือแหลงจา ยไฟออกจากแผงวงจร IPST-SE เสมอ
122 Arduino IDE
ปฏบิ ัตกิ ารที่ 1-1 สัง่ การให LED ตดิ สวา ง
การเชื่อมตอทางฮารด แวร
เชื่อมตอ แผงวงจร ZX-LED เขา กบั จุดตอ พอรต 17 ของแผงวงจรหลัก IPST-SE
28 A4 25 A1 USB 8 SCL 9 SDA
29 A5 26 A2 D
24 A0 30 A6 27 A3
ZX-LED Hello0World0000000000
000000000000000000000
000000000000000000000
000000000000000000000 ON
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
+ S 000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
S+ G
6V
O 12
DC MOTOR
15 SV0 14 SV1 13 SV2 12 SV3KNOBG
6V
OK
000000000000000000000 13
SW1 G
6V
14
16 18 UART1 LOW 12 G
+5 6V
15
17 19 20 RESET 2 RxD1 3 TxD1 SERVO
#include <ipst.h> // ผนวกไฟลไ ลบรารหี ลกั คําอธบิ ายโปรแกรม
void setup()
{} โปรแกรมจะส่ังใหสงสัญญาณ “1” ออกมา
void loop() ทางจุดตอ พอรต 17 สัญญาณ “1” มแี รงดนั
{ ไฟฟา +5V จึงทําให LED ติดสวางได และ
out(17,1); // สง่ั ให LED ทจ่ี ุดตอ พอรต 17 ติดสวา ง กาํ หนดใหต ดิ นาน 0.5 วินาที จากนน้ั จงึ ส่ังให
delay(500); // หนวงเวลา 0.5 วนิ าที ดบั ดว ยการสง สญั ญาณ “0” ซง่ึ มแี รงดนั ไฟฟา
out(17,0); // ส่ังให LED ท่ีจดุ ตอ พอรต 17 ดบั 0V ทาํ ใหไ มม แี รงดนั และกระแสไฟฟา สง ไปขบั
delay(500); // หนวงเวลา 0.5 วนิ าที LED ได LED ที่แผงวงจร ZX-LED จึงดบั ลง
}
โปรแกรมท่ี L1-1 : ไฟล microbox_LedTest01.ino โปรแกรมภาษา C สาํ หรบั ทดลองขบั LED เบอ้ื งตน
Arduino IDE123
ขน้ั ตอนการทดลอง
1.1.1 เปดซอฟตแ วร Wiring 1.0 สรา งไฟลใหม พิมพโปรแกรมท่ี L1-1 บันทึกในชื่อ microbox_LEDtest01
1.1.2 เปด สวติ ชจ า ยไฟแกแ ผงวงจร IPST-SE แลว เชอื่ มตอ สาย USB เขา กบั คอมพวิ เตอร
2
1 3
28 A4 25 A1 USB 8 SCL 9 SDA
29 A5 26 A2 D
24 A0 30 A6 27 A3 ON
000000000000000000000
KNOB 000000000000000000000 DC MOTOR G
4 OK 000000000000000000000 6V
SW1 000000000000000000000 15 SV0 14 SV1 13 SV2 12 SV312
000000000000000000000 G
6V
000000000000000000000 13
000000000000000000000 G
000000000000000000000 6V
14
000000000000000000000 G
000000000000000000000 6V
000000000000000000000 15
000000000000000000000 SERVO
000000000000000000000
000000000000000000000
000000000000000000000
000000000000000000000
16 18 UART1 LOW 12
17 19 +5
20 RESET 2 RxD1 3 TxD1
1.1.3 เลอื กชนดิ หรอื รนุ ของฮารด แวรใ หถ กู ตอ ง โดยเลอื กทเ่ี มนู Tools > Board > IPST-SE > ATmega644P ดงั รปู
124 Arduino IDE
1.1.4 เลือกพอรต ตดิ ตอ กบั แผงวงจร IPST-SE โดยเลือกที่เมนู Tools > Serial Port ดงั รปู (ตาํ แหนงของพอรต ท่ี
ใชเ ชอื่ มตอ อาจแตกตา งกนั ในคอมพวิ เตอรแ ตล ะเครอ่ื ง)
1.1.5 คอมไพลแ ละอปั โหลดโปรแกรมไปยงั แผงวงจร IPST-SE โดยคลกิ ทปี่ มุ หรอื เลอื กทเี่ มนู File > Upload
to Wiring Hardware
1.1.6 รนั โปรแกรม สังเกตการทาํ งานของ LED
LED ท่ีตอ กบั จุดตอ พอรต 17 ตดิ -ดบั ทุกๆ 0.5 วนิ าที
เพม่ิ เตมิ ผพู ฒั นาสามารถกาํ หนดอตั ราในการตดิ -ดบั หรอื อตั ราการกะพรบิ ของ LED ได ดว ยการ
ปรบั คา เวลาในฟงกช ั่น delay(); ภายในโปรแกรมที่ L1-1
1.1.7 ทดลองแกไ ขโปรแกรมที่ L1-1 ให LED มคี วามเรว็ ในการตดิ -ดบั ชาลง
1.1.8 ทดลองแกไ ขโปรแกรมท่ี L1-1 ให LED มคี วามเรว็ ในการตดิ -ดบั เรว็ ขนึ้
1.1.9 ทดลองแกไ ขโปรแกรมท่ี L1-1 เพ่ือเปลียนจุดตอ พอรต จากเดมิ พอรต หมายเลข 17 เปนพอรต อน่ื ๆ เชน 18,
19 และ 20
Arduino IDE125
ปฏบิ ัตกิ ารท่ี 1-2 ควบคมุ LED ดวยเวลา
การเชอ่ื มตอ ทางฮารด แวร
เชอ่ื มตอ แผงวงจร ZX-LED กบั จดุ ตอ พอรต 17 ของแผงวงจรหลกั IPST-SE
ขนั้ ตอนการทดลอง
1.2.1 เปดซอฟตแ วร Wiring 1.0 สรา งไฟลใหม พิมพโปรแกรมที่ L1-2 บันทึกในช่ือ microbox_LEDtimer
1.2.2 ¤Í Áä¾Åáì ÅÐÍÑ» âËÅ´ â» Ãá¡ ÃÁä» Â§Ñἧǧ¨ ÃIPST-SE ⴠ¤šԷèÕ»èØÁ หรอื เลอื กทเ่ี มนู File > Upload
to Wiring Hardware
1.2.3 รนั โปรแกรม สังเกตการทาํ งานของ LED
LED จะตดิ นาน 4 วินาที หลังจากน้ันจงึ ดบั ลง
1.2.4 แกไ ขโปรแกรมท่ี L1-2 ให LED ตดิ สวางนานขน้ึ
1.2.5 แกไ ขโปรแกรมท่ี L1-2 ให LED ดบั เรว็ ขน้ึ
#include <ipst.h> // ผนวกไฟลไลบรารหี ลกั
void setup()
{}
void loop()
{
out(17,1); // ส่งั ให LED ทจ่ี ดุ ตอ พอรต 17 ติดสวา ง
delay(4000); // หนวงเวลา 4 วินาที
out(17,0); // ส่ังให LED ทจ่ี ดุ ตอ พอรต 17 ดบั
while(1); // วนทาํ งานทค่ี าํ สง่ั นี้
}
คําอธบิ ายโปรแกรม
ในโปรแกรมจะกาํ หนดใหเ ขยี นขอ มลู “1” ไปยงั ขาพอรต 17 ซงึ่ ตอ กบั ZX-LED ทาํ ให LED ตดิ สวางนาน
ประมาณ 4 วนิ าทกี อ นทจี่ ะดบั ลง เนอื่ งจากเมอื่ สง่ั ให LED ตดิ สวา งจากการสงั่ ขบั สญั ญาณเอาตพ ตุ เปน “1”แลว
ตอ ดว ยการหนว งเวลาดว ยฟง กช น่ั delay หรอื sleep โปรแกรมจะทาํ งานอยทู ค่ี าํ สง่ั นนี้ านเปน เวลาประมาณ 4000
มลิ ลวิ นิ าที หรือ 4 วนิ าที หลงั จากครบรอบเวลา จงึ สง สญั ญาณ “0” เพอ่ื ควบคมุ ให LED ดบั และวนอยูท่ีคาํ สั่ง
while(); ทําใหไมมกี ารทํางานใดๆ LED จึงดบั จนกวาจะมกี ารกดสวติ ช RESET หรอื ปดเปดไฟเล้ียงใหม
โปรแกรมที่ L1-2 : ไฟล microbox_Ledtimer.c โปรแกรมภาษา C สาํ หรบั ทดลอง
ควบคมุ การทาํ งานของ LED ดว ยเวลา
126 Arduino IDE
Arduino IDE127
ในบทที่ผานมาเปนการนาํ เสนอการควบคุม LED ดวยกระบวนการทางซอฟตแวร แต LED
ทคี่ วบคุมนน้ั มเี พยี งชองเดยี ว ในบทนี้นําเสนอการควบคมุ LED ในจํานวนมากชอ งขน้ึ ถงึ 8 ชอ งใน
เวลาเดยี วกัน
อปุ กรณเ อาตพตุ ทนี่ ํามาใชใ นการเรยี นรคู ือ แผงวงจร ZX-LED8 ซึ่งมี LED 8 ดวงพรอ มวงจร
ประกอบ การควบคุม LED ทง้ั 8 ดวงใหท ํางานพรอมกนั หรอื ทาํ งานแยกกนั ตองใชค วามรเู กี่ยวกับ
ระบบเลขฐานสองและโครงสรา งของขอ มลู ทงั้ แบบบติ และไบตใ นการกาํ หนดรปู แบบของขอ มลู ทนี่ าํ
มาแสดงผล
8.1 เลขฐานสอง
ในระบบตัวเลขฐานสองนม้ี ีตัวเลขเพยี ง 2 ตัวคอื “0” และ “1” ซึ่งสามารถใชแทนสถานะตํ่า
สูง, เปด-ปด, ไมตอ-ตอ, ดับ-ติด เปนตน แตถาหากนําตัวเลขฐานสองมากกวา 1 หลักมาพิจารณา
เชน 2 หลกั จะทาํ ใหเ กดิ จาํ นวนของการเปลยี่ นแปลงเปน 4 สถานะ หากแทนดว ยการตดิ -ดบั ของหลอด
ไฟ จะได ดับ-ดับ, ดบั -ติด, ติด-ดับ และติด-ติด ถา หากมี 3 หลักก็จะเกิดการเปลีย่ นแปลง 8 สถานะ
จงึ สามารถสรปุ เปน สมการคณติ ศาสตรแ ละความสมั พนั ธข องจาํ นวนหลกั และสถานะของการเปลย่ี น
แปลงไดดงั น้ี
จํานวนของการเปลี่ยนแปลง = 2 จาํ นวนหลกั
ถา มี 2 หลกั จะไดจ าํ นวนของการเปลี่ยนแปลง 22 = 4
ถา มี 3 หลกั จะไดจ าํ นวนของการเปลี่ยนแปลง 23 = 8
ถา มี 4 หลกั จะไดจ ํานวนของการเปล่ียนแปลง 24 = 16
128 Arduino IDE
8.1.1 การนับจาํ นวนของระบบเลขฐานสอง
เนอ่ื งจากเลขฐานสองมตี วั เลขเพยี ง 2 ตวั คอื 0 และ 1 เมอื่ มกี ารนบั จาํ นวนขนึ้ จงึ ตอ งมกี ารเพมิ่
จาํ นวนหลกั ดงั นน้ั เพอ่ื ใหเ หน็ การเปลย่ี นแปลงอยา งชดั เจนจะใชเ ลขฐานสบิ เปน ตวั เปรยี บเทยี บดงั น้ี
เลขฐานสอง เลขฐานสบิ
00 0
01 1
10 2
11 3
100 4
101 5
110 6
111 7
1000 8
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15
8.1.2 ตวั แปรของเลขฐานสอง (bit variables)
เมอ่ื เลขฐานสองถกู นาํ มาใชง านมากขนึ้ จาก 1 หลกั เปน 2, 3 จนถงึ 8 หลกั ทาํ ใหเกดิ ตวั แปรใหมๆ ดงั นี้
(1) บติ (bit) หมายถึง หนง่ึ หลกั ของเลขฐานสอง (binary digit) มีเลข 0 กับ 1 เทานนั้
(2) ไบต (byte) หมายถงึ เลขฐานสองจาํ นวน 8 หลกั หรอื เทา กบั 8 บติ ไบตม คี วามสาํ คญั
มากเพราะในระบบคอมพวิ เตอรจ ะประมวลขอ มลู เลขฐานสองครงั้ ละ8บติ หรอื 1ไบตเ ปน อยา งนอ ยเสมอ
(3) LSB : Least Significant Bit หรอื บติ นยั สาํ คญั ตาํ่ สดุ หมายถงึ บติ ทอี่ ยใู นตาํ แหนง
ขวาสดุ ของเลขฐานสอง มคี านํ้าหนกั ประจําหลกั ต่าํ สุดคือ 20 ถา เปน “1” คาของหลกั สุดทายเทากับ 1
x 20 = 1 x 1 = 1 แตถาบติ สุดทา ยนี้เปน “0” คาของหลกั สุดทา ยจะเทากับ 0 x 20 = 0 x 1= 0
Arduino IDE129
(4) การกําหนดชือ่ หลักของเลขฐานสอง บิตท่ีอยขู วามอื สดุ จะถูกเรยี กวา บิตศูนย (bit
0 : b0) หรอื บติ LSB บติ ถัดมาเรียกวา บติ หน่ึง (bit 1 : b1) ไลไ ปทางซา ยจนครบ สามารถสรปุ ชอื่ หลกั
ของเลขฐานสองไดค ือ b7 b6 b5 b4 b3 b2 b1 b0 โดยตัวเลขแสดงตําแหนง 0-7 ตองเขียนเปนตัวหอ ย
เสมอ แตเพ่ือความสะดวกจงึ ขอเขียนในระดบั เดยี วกนั เปน b7 b6 b5 b4 b3 b2 b1 b0
(5) MSB : Most Significant Bit หรอื บติ นยั สําคญั สงู สดุ หมายถงึ บติ ทอ่ี ยใู นตําแหนง
ซา ยมือสดุ ของเลขฐานสองจาํ นวนนนั้ ๆ หากเลขฐานสองมจี าํ นวน 8 บิต บติ MSB คือบติ 7 (bit 7 :
b7) มคี านาํ้ หนกั ประจําหลกั เทากับ 27 หรอื 128 แตถาหากจํานวนบติ มีนอ ยกวา น้นั เชน 6 บติ , 5 บิต
หรอื 4 บิต บิต MSB จะมีคานาํ้ หนกั ประจําหลกั เปลี่ยนเปน 25, 24 และ 23 ตามลําดับ
8.1.3 คา นาํ้ หนักประจําหลัก
ในเลขฐานสิบจะมีคานาํ้ หนกั ประจําหลกั โดยคิดจากจํานวนสบิ ยกกําลงั โดยในหลักหนวยมี
คานํา้ หนกั ประจําหลกั เปน 100 หรอื 1 หลกั สิบมคี านาํ้ หนกั ประจําหลกั เปน 101 หรอื 10 ในหลักรอย
มีคานํ้าหนกั ประจําหลกั เปน 102 หรอื 100 เปนตน
ในเลขฐานสองกม็ คี า นา้ํ หนกั ประจาํ หลกั เชน กนั แตจ ะคดิ จากจาํ นวนสองยกกาํ ลงั โดยในหลกั
ขวาสดุ คือ บติ 0 หรอื บติ LSB มคี านํ้าหนกั ประจําหลกั เปน 20 หรอื เทา กับ 1 หลกั ถัดมาคือบติ 1 มีคา
น้ําหนกั เปน 21 หรอื 2 ถดั มาเปนบิต 2 มคี านา้ํ หนกั เปน 22 หรอื 4 เมื่อพจิ ารณาทีเ่ ลขฐานสอง 8 บิต
คาน้ําหนกั ประจําหลกั สามารถสรปุ ไดด ังน้ี
บติ คาน้ําหนกั ประจาํ หลัก เลขฐานสบิ
0 20 1
1 21 2
2 22 4
3 23 8
4 24 16
5 25 32
6 26 64
7 27 128
จากคา นา้ํ หนกั ประจาํ หลกั จงึ สามารถแปลงเลขฐานสองเปน ฐานสบิ หรอื แปลงฐานสบิ เปน ฐาน
สองได
130 Arduino IDE
8.2 การแปลงเลขฐานสองและฐานสบิ
8.2.1 การแปลงเลขฐานสองเปนฐานสบิ
เรม่ิ ตนดวยการกําหนดคา นํ้าหนกั ประจําหลกั ของเลขฐานสองแตล ะหลัก แลว คณู ดว ยคาของ
เลขฐานสองในหลกั น้ันๆ สดุ ทา ยนําผลคูณทงั้ หมดมารวมกัน ก็จะไดเ ปนเลขฐานสิบที่ตองการ
ตัวอยางท่ี 8-1
จงแปลงเลขฐานสอง 1011 เปนฐานสบิ
(1) กาํ หนดคา นํ้าหนกั ประจําหลกั
หลัก b3 b2 b1 b0
คา น้ําหนักประจําหลักคอื 23 22 21 20
เลขฐานสอง 1011
(2) จากนนั้ นาํ คา นา้ํ หนกั ประจาํ หลกั คณู กบั คา ของเลขฐานสองประจาํ บติ นนั้ แลว นาํ ผลคณู ของทกุ หลกั
มารวมกนั
เลขฐานสบิ = (1x23) + (0x22) + (1x21) + (1x20)
= (1x8) + (0x4) + (1x2) + (1x1)
= 8+0+2+1
= 11
8.2.2 การแปลงเลขฐานสิบเปนเลขฐานสอง
จะใชว ธิ กี ารหารเลขฐานสบิ จาํ นวนนนั้ ดว ย2แลว เกบ็ คา ของเศษทไ่ี ดจ ากการหารเปน เลขฐานสอง
ในแตล ะหลกั โดยเศษทไ่ี ดจ ากการหารครงั้ แรกไมว า จะเปน “0” หรอื “1” จะเปน หลกั ทม่ี นี ยั สาํ คญั ตา่ํ สดุ
หรอื บติ LSB หรอื บติ 0 (b0) และเศษตวั สดุ ทา ยจะเปน เลขฐานสองหลกั ทมี่ นี ยั สาํ คญั สงู สดุ หรอื บติ MSB
ตัวอยา งท่ี 8-2
จงแปลงเลขฐานสิบ 13 เปน เลขฐานสอง
(1) หาร 13 ดว ย 2 ได 6 เศษ 1 เศษที่ไดจะเปน บติ ศูนย (bo) หรอื บิต LSB น่ันคือ บิต LSB = 1
(2) หาร 6 ดว ย 2 ได 3 เศษ 0 เศษที่ไดจะเปน บติ หนึ่ง (b1) ซึ่งกค็ อื 0
(3) หาร 3 ดว ย 2 ได 1 เศษ 1 เศษท่ีไดจะเปนบิตสอง (b2) ซึ่งก็คอื 1
(4) หาร 1 ดว ย 2 ได 0 เศษ 1 เศษท่ีไดจะเปน บติ สาม (b3) และเปนบิต MSB ซงึ่ กค็ อื 1
ดงั น้ันจะไดเ ลขฐานสองเทา กบั 1101
Arduino IDE131
8.3 เครื่องหมายของเลขฐานสอง
ในเลขฐานสองสามารถทจี่ ะมที ง้ั คา ตวั เลขทเ่ี ปน บวกและลบเชน เดยี วกบั เลขฐานอน่ื ๆ โดยจะ
ใชบิต MSB เปนตัวกําหนดเครื่องหมายของเลขฐานสอง ถากําหนดบิต MSB เปน “0” เลขจาํ นวน
นัน้ จะมีคาเปนบวก และหากกาํ หนดบติ MSB เปน “1” เลขจํานวนนน้ั จะมีคาเปนลบ
ขอ มลู ตอ ไปนจ้ี ะเปน การแสดงคา ของจาํ นวนเลขฐานสอง เมอื่ คดิ เครอื่ งหมายและไมค ดิ เครอ่ื ง
หมายโดยไดท าํ การแปลงเปนเลขฐานสิบเปรยี บเทียบเพอ่ื ใหเ ห็นความแตกตางอยา งชดั เจน
เลขฐานสอง เลขฐานสบิ
0000 คดิ เคร่ืองหมาย ไมคดิ เครื่องหมาย
0001 0 0
0010 1 1
0011 2 2
0100 3 3
0101 4 4
0110 5 5
0111 6 6
1000 7 7
1001 -8 8
1010 -7 9
1011 -6 10
1100 -5 11
1101 -4 12
1110 -3 13
1111 -2 14
-1 15
ในกรณีคิดเคร่ืองหมาย เมื่อนบั ถอยหลงั จาก 0000 ก็จะเปน 1111 นั่นคือเกิดการถอยหลงั หนงึ่
จาํ นวนหรอื -1 นับถอยหลงั ตอไปจะเปน 1110 ซ่ึงก็คือ -2 เมื่อเปน เชนน้ีการแปลงเลขฐานสองทีค่ ิด
เครอื่ งหมายเปน ฐานสบิ จงึ ไมส ามารถใชว ธิ กี ารแปลงแบบเดมิ ได แตก พ็ อมเี ทคนคิ ในการพจิ ารณา โดย
ใชหลกั เกณฑค านาํ้ หนกั ประจําหลกั ยกตัวอยาง เลขฐานสอง 1000 เลข 1 ท่อี ยหู นา สดุ มคี านา้ํ หนกั
ประจําหลกั เทา กับ 23 หรอื 8 จากการกําหนดวา ถาคิดเครื่องหมาย เมื่อบติ MSB เปน “1” จะตองเปน
คาลบ ดงั นน้ั จึงเปน -8 สว นอกี 3 หลกั ท่ีเหลือจะเปนเลขบวกจงึ กลายเปน -8+0 = -8 มาพจิ ารณาที่เลข
ฐานสอง 1101 บติ แรกเปน ลบเทากับ -8 สว น 3 บิตหลังเปน บวกมคี า +5 จงึ ได -8+5= -3 เปนตน
132 Arduino IDE
8.4 สวนประกอบของขอมลู
ขอ มลู ทใี่ ชใ นการประมวลผลของไมโครคอนโทรลเลอรน นั้ สามารถกระทาํ ไดต งั้ แต1 บติ ขน้ึ ไป
สาํ หรบั ไมโครคอนโทรลเลอร ATmega644 ในชดุ IPST-MicroBOX จะทาํ งานกบั ขอ มลู 1 ถงึ 16 บติ
โดยมกี ารกาํ หนดโครงสรา งสว นประกอบของขอ มลู ทเ่ี ปน มาตรฐานเดยี วกบั ไมโครคอนโทรลเลอรต วั อนื่
ทว่ั โลกและเหมอื นกบั ในคอมพวิ เตอรด ว ย ดงั น้ี
เวิรด
ไบตส ูง (8 บติ บน) ไบตต ่ํา (8 บติ ลาง)
MSB LSB
บิต 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ขอ มลู * 1 1 1 0 1 1 1 0 0 0 1 1 1 0 0 1
คา นา้ํ หนกั 215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20
* สามารถเปลีย่ นแปลงได
บติ -นบิ เบลิ -ไบต- เวริ ด เปน ชอื่ หนว ยของขอ มลู ทใ่ี ชใ นการประมวลผลของไมโครคอนโทรลเลอร
บิต (bit) เปนขนาดของขอมลู เลขฐานสองทเ่ี ล็กท่ีสุด เทากับ 1 หลกั ของเลขฐานสอง
นิบเบลิ (nibble) มีขนาดเทากับ 4 บติ
ไบต (byte) มีขนาดเทากับ 8 บิต
เวริ ด (word) มขี นาดเทากับ 16 บิต หรอื 2 ไบต
8.5 แผงวงจรไฟแสดงผล 8 ดวง : ZX-LED8
เปน แผงวงจรทมี่ ี LED ขนาด 3 มลิ ลเิ มตรสาํ หรบั แสดงผล 8 ดวง พรอ มจดุ ตอ พว งเอาตพ ตุ เพอ่ื
นาํ ไปใชใ นการขบั รเี ลยไ ดด ว ย โดยแผงวงจร ZX-LED8 นจ้ี ะตอ เขา กบั ขาพอรต ใดของแผงวงจร IPST-
SE กไ็ ด โดยใชข าพอรต เพยี งขาเดยี วในการควบคมุ และขบั LED ใหต ดิ ดบั ตามทตี่ อ งการไดพ รอ มกนั
ถึง 8 ดวง มีหนาตาและวงจรทางไฟฟา ของแผงวงจร ZX-LED8 แสดงในรปู ที่ 8-1
ในแผงวงจร ZX-LED8 ใชการติดตอกับแผงวงจรหลัก IPST-SE ในแบบสอ่ื สารขอมลู อนุกรม
รว มกับคําส่งั ทางซอฟตแวร ผูพฒั นาโปรแกรมสามารถเขียนโปรแกรมให ZX-LED8 ติดดับไดต ั้งแต
1 ถึง 8 ตัว หรอื จะเขียนโปรแกรมใหท าํ งานเปนไฟวง่ิ ไดต ้ังแต 1 ถงึ 8 ดวงเชน กัน
Arduino IDE133
MSB LSB
D7 D6 D5 D4 D3 D2 D1 D0
76543210
+5V
47 47 47 47 47 47 47 47
76543210
510 510 510 510 510 510 510 510
9 8 5 6 7 14 15 16
D7 D6 D5 D4 D3 D2 D1 D0
ZX-LED controller 17
PIC18F14K50 with firmware VDDU
UART 9600 bps. to 8 bit parallel outputs
XT1 XT2 RXD VDD RST VSS PGD PGC 0.1F
2 3 63V
12 +5V 1 4 20 19 18
Ceramic 4k7 4k7
Resonator
(Option)
47F 0.1F
6.3V 63V
ICSP
GND
RxD
+5V
รปู ที่ 8-1 ลกั ษณะและวงจรทางไฟฟา ของแผงวงจรไฟแสดงผล ZX-LED8 ทใี่ ชใ นชดุ กลอ งสมองกล IPST-
MicroBOX (SE)
134 Arduino IDE
7 6 5 4 3 2 1 0
76 5 4 3 2 10
MSB LSB
LED8
+5V
Serial LED-8 RxD
GND
UART communication DC MOTOR
9600 bps. Baud 15 SV0 14 SV1 13 SV2 12 SV3
Secondary Education
28 A4 25 A1 8 SCL 9 SDA
29 A5 26 A2 USB
24 A0 30 A6 27 A3
D
KNOB ON
OK Rowl00World0000000000
SW1 0Row01000000000000000 G
00Row0200000000000000 6V
000Row030000000000000 12
0000Row04000000000000 G
00000Row0500000000000 6V
000000R00060000000000 13
0000000R0007000000000 G
00000000Row0800000000 6V
000000000Row090000000 14
0000000000Row01000000 G
00000000000Row0110000 6V
000000000000Row012000 15
0000000000000Row01300
00000000000000Row0140 SERVO
000000000000000Row015
16 18 UART1 LOW 12
17 19 +5
20 RESET 2 RxD1 3 TxD1
รปู ท่ี 8-2 แนวทางการตอ ใชงานแผงวงจรไฟแสดงผล ZX-LED8 กบั แผงวงจรหลกั IPST-SE ในชุดกลอ ง
สมองกล IPST-MicroBOX (SE)
ท่ีดา นบนของแผงวงจร ZX-LED8 มีจุดตอ JST ซึง่ ตอพว งมาจาก LED ทาํ งานท่ลี อจกิ “1” มี
ระดบั แรงดันไฟตรงขาออกประมาณ +5V ดังแสดงในรปู ที่ 8-3 จึงสามารถใชสัญญาณเอาตพตุ จากจดุ
นไ้ี ปตอ กบั วงจรขบั โหลดกระแสไฟฟา สงู อาทิ แผงวงจรขบั รเี ลย ไดท นั ที โดยไมต อ งเขยี นโปรแกรม
ควบคมุ เพม่ิ เตมิ
8.6 กลมุ คาํ สงั่ โปรแกรมภาษา C/C++ ของไลบรารี ipst.h ท่ีใชค วบคมุ LED
8 ดวงบนแผงวงจร ZX-LED8
pinLED8(); ใชก ําหนดจุดตอ พอรต ของแผงวงจร IPST-SE ท่ีตอ กับแผงวงจร ZX-LED8
LED8 ใชกําหนดคาการแสดงผลของ LED 8 ดวงบนแผงวงจร ZX-LED8
Arduino IDE135
+5V +5V +5V +5V
7 6 5 4 3 2 1 0
7 6 5 4 3 2 1 0
MSB LSB
LED8
+5V
Serial LED-8 RxD
GND
UART communication DC MOTOR
15 SV0 14 SV1 13 SV2 12 SV3
9600 bps. Baud
Secondary Education
28 A4 25 A1 8 SCL 9 SDA
29 A5 26 A2 USB
24 A0 30 A6 27 A3
D
KNOB ON
OK Rowl00World0000000000
SW1 0Row01000000000000000 G
00Row0200000000000000 6V
000Row030000000000000 12
0000Row04000000000000 G
00000Row0500000000000 6V
000000R00060000000000 13
0000000R0007000000000 G
00000000Row0800000000 6V
000000000Row090000000 14
0000000000Row01000000 G
00000000000Row0110000 6V
000000000000Row012000 15
0000000000000Row01300
00000000000000Row0140 SERVO
000000000000000Row015
16 18 UART1 LOW 12
+5
17 19 20 RESET 2 RxD1 3 TxD1
รปู ที่ 8-3 แสดงความสมั พันธของการตดิ ดบั ของ LED กบั ระดบั แรงดนั ไฟฟา ท่ีจดุ ตอ เอาตพ ุต 0 ถึง 7
ของแผงวงจรไฟแสดงผล ZX-LED8
136 Arduino IDE
ปฏบิ ัตกิ ารท่ี 2-1 ควบคมุ LED ดวยขอมลู เลขฐานสอง
ในการทดลองนเี้ ปน การเขยี นโปรแกรมภาษา C เพอื่ ควบคมุ ให LED 8 ดวงบนแผงวงจร ZX-LED8 ตดิ หรอื
ดบั ดวยขอมลู ที่กาํ หนดไว
การเช่ือมตอทางฮารด แวร
เชื่อมตอ สัญญาณจากจุดตอ 20 ของแผงวงจรหลัก IPST-SE เขา กบั จุดตอ RXD ของแผงวงจร ZX-LED8 ดว ย
สายสัญญาณ JST3AA-8
ขนั้ ตอนการทดลอง
2.1.1 เปดซอฟตแ วร Wiring 1.0 สรา งไฟลใหม พิมพโปรแกรมท่ี L2-1 บันทึกในช่ือ microbox_LED8test.ino
2.1.2 คอมไพลและอปั โหลดโปรแกรมไปยงั แผงวงจร IPST-SE โดยคลิกทปี่ มุ
76543210
76543210
MSB LSB
LED8
Serial LED-8
UART communication
9600 bps. Baud
Secondary Education
+5V
RxD 28 A4 25 A1 8 SCL 9 SDA
GND 29 A5 26 A2 USB
DC MOTOR24 A030 A6 27 A3
15 SV0 14 SV1 13 SV2 12 SV3D
KNOB ON
OK Rowl00World0000000000
SW1 0Row01000000000000000 G
00Row0200000000000000 6V
000Row030000000000000 12
0000Row04000000000000 G
00000Row0500000000000 6V
000000R00060000000000 13
0000000R0007000000000 G
00000000Row0800000000 6V
000000000Row090000000 14
0000000000Row01000000 G
00000000000Row0110000 6V
000000000000Row012000 15
0000000000000Row01300
00000000000000Row0140 SERVO
000000000000000Row015
16 18 UART1 LOW 12
+5
17 19 20 RESET 2 RxD1 3 TxD1
รปู ท่ี L2-1 การตอ วงจรเพ่ือทําการทดลองสาํ หรบั ปฏบิ ัตกิ ารท่ี 2 และ 3
Arduino IDE137
#include <ipst.h> // ผนวกไลบรารหี ลกั
void setup() // เช่ือมตอ ZX-LED8 ผา นทางจดุ ตอพอรต 20
{
pinLED8(20);
}
void loop() // LED บิต 7 และ 0 ติดสวา ง ท่ีเหลอื ดบั หมด
{
LED8(0b10000001);
}
คําอธบิ ายโปรแกรม
การทํางานของโปรแกรมน้ี ขอ มลู เลขฐานสอง 10000001 ถกู สงไปยงั แผงวงจร ZX-LED8 ผานฟงกช ่ัน
LED8 โดยใชจุดตอ พอรต 20 ซ่ึงประกาศไวดว ยฟงกช ่ัน pinLED8 ท่ีสวนของ setup()
ขอ มลู 8 บิตท่ีสงไปในรูปของเลขฐานสองสามารถเทียบเคียงไดกบั ตาํ แหนงหลักของ LED ท้ัง 8 ดวง
น่ันเอง โดยคาของหลักขอ มลู ใดเปน “1” LEDประจําหลกั นั้นจะตดิ สวา ง ในทางกลับกันถามคี า เปน “0” LED
กจ็ ะดบั ดงั นน้ั ถาทําการแกไขโปรแกรมเพ่ือสงคา ใหมจ ะไดผลลัพธท ่ีแตกตา งกันไป
โปรแกรมที่ L2-1 : ไฟล microbox_LED8test.ino โปรแกรมภาษา C สาํ หรบั ทดลองควบคมุ LED 8 ดวง
2.1.3 สังเกตผลการทํางานที่แผงวงจร ZX-LED8
LED ที่หลัก 0 และ 7 ของแผงวงจร ZX-LED8 ตดิ สวาง จากผลของขอ มูล 10000001 ท่ีกาํ หนดใน
โปรแกรม
76 5 4 3 2 1 0
2.1.4 ทดลองแกไ ขขอ มลู แสดงผลเปน LED8(0b11110000); ทาํ การคอมไพลแ ละอปั โหลดโปรแกรมไปยงั แผงวงจร
IPST-SE
ไดผลการทํางานดงั น้ี
76 5 4 3 2 1 0
2.1.5 ทดลองแกไขขอมูลแสดงผลเปน led8(0b00011000); ทําการคอมไพลไฟลโปรเจก็ ตใ หม แลว ดาวนโหลด
โปรแกรมไปยงั แผงวงจร IPST-SE
ไดผลการทํางานดงั น้ี
76 5 4 3 2 1 0
138 Arduino IDE
#include <ipst.h> // ผนวกไลบรารหี ลกั
void setup()
{}
void loop()
{
unsigned char i=0;
while(1)
{
LED8(20,i++); // กาํ หนดใหใ ชจุดตอพอรต 20 ในการควบคมุ ZX-LED8
// โดยแสดงผลดว ยคา ของ i ทเ่ี ปลี่ยนแปลงจาก 00000000 ถึง 11111111
delay(300);
}
}
คําอธบิ ายโปรแกรม
การทาํ งานของโปรแกรมน้ี ขอ มลู เลขฐานสองทกี่ าํ หนดโดยตวั แปร i ถกู สง ออกไปยงั แผงวงจร ZX-LED8
ผานฟงกชั่น LED8 ท่ีเขยี นในแบบใหม ใหเหลือเพียงบรรทัดเดยี ว โดยกําหนดพอรต ท่ีใชในการตดิ ตอ แลว ตอ
ดว ยขอมลู ที่ตอ งการแสดงผล ทําใหโปรแกรมกระชับขน้ึ
โดยขอมลู 8 บิตท่ีสงไปในรูปของเลขฐานสองน้นั มีคา 00000000 ถงึ 11111111 ตามชนดิ ของตวั แปร i
ท่ีกาํ หนดใหเ ปน แบบ char ซ่ึงมขี นาด 8 บิต
โปรแกรมท่ี L2-2 : ไฟล microbox_LED8binary.ino โปรแกรมภาษา C/C++ สาํ หรบั ทดลองควบคมุ LED 8
ดวง ใหแ สดงผลตามคา ของเลขฐานสองขนาด 8 บติ จาก 00000000 ถงึ 11111111
2.1.6 เขยี นโปรแกรมท่ี L2-2 บันทึกไฟลเปน microbox_LED8binary.ino จากน้ันทําการคอมไพลและอปั โหลด
โปรแกรมไปยงั แผงวงจร IPST-SE โดยคลกิ ทปี่ มุ
2.1.6 สังเกตผลการทํางานท่ีแผงวงจร ZX-LED8
LED ท้ัง 8 ดวงแสดงเปนรหัสเลขฐานสอง 8 บิต เรมิ่ จาก 00000000 ถงึ 11111111 แลว กลบั มาเรมิ่ ตน
ท่ี 00000000 ใหมอ กี ครง้ั โดยมีอัตราการเปลี่ยนขอ มลู ทุกๆ 0.3 วินาที
Arduino IDE139
ปฏบิ ัตกิ ารที่ 2-2 ไฟกะพรบิ LED 8 ดวง
ในการทดลองนเ้ี ปน การเขยี นโปรแกรมแกรมควบคมุ ให LED 8 ดวงบนแผงวงจร ZX-LED8 ตดิ หรอื ดบั ดว ย
ขอ มลู ท่ีกาํ หนด โดยในการทดลองนี้จะสงขอ มลู 11111111 ไปแสดงผลในแบบไฟกะพริบ
การเช่ือมตอ ทางฮารด แวร
เช่ือมตอ สัญญาณจากจุดตอ 20 ของแผงวงจรหลัก IPST-SE เขา กบั จุดตอ RXD ของแผงวงจร ZX-LED8 ดว ย
สายสัญญาณ JST3AA-8
ขนั้ ตอนการทดลอง
2.2.1 เปดซอฟตแ วร Wiring 1.0 สรา งไฟลใหม พิมพโปรแกรมที่ L2-3 บันทึกในช่ือ microbox_LED8blink.ino
2.2.2 คอมไพลและอปั โหลดโปรแกรมไปยงั แผงวงจร IPST-SE โดยคลิกทป่ี มุ
2.2.3 รนั โปรแกรม สังเกตการทํางานของ LED 8 ดวงบนแผงวงจร ZX-LED8
LED ทั้ง 8 ดวงของแผงวงจร ZX-LED8 ตดิ กะพรบิ ในทุกๆ 1 วินาที โดยประมาณ
#include <ipst.h> // ผนวกไลบรารหี ลกั
void setup()
{} // กาํ หนดให LED ทง้ั 8 ดวงตดิ หมด
void loop() // หนวงเวลา 0.5 วนิ าที
{ // กาํ หนดให LED ทง้ั 8 ดวงดับหมด
// หนวงเวลา 0.5 วนิ าที
LED8(20,0b11111111);
sleep(500);
LED8(20,0b00000000);
sleep(500);
}
คําอธบิ ายโปรแกรม
การทํางานของโปรแกรมนี้ มขี อ มลู เลขฐานสอง 2 ชุดท่ีสงออกไปยงั แผงวงจร ZX-LED8 ดว ยฟงกช่ัน
LED8 ที่เขียนในแบบกําหนดพอรตท่ีใชในการติดตอแลวตอดวยขอมูลที่ตองการแสดงผล โดยชุดแรกคือ
11111111 ทําให LED 8 ดวงตดิ สวา งทง้ั หมด สวนชดุ ท่ี 2 คอื 00000000 ทําให LED ท้ังหมดดบั
อตั ราการตดิ ดบั หรอื กะพรบิ ถูกกาํ หนดโดยฟง กช่ัน sleep() ซ่ึงมกี ารทํางานเหมอื นกับ delay() โดยใน
โปรแกรมน้ีกาํ หนดใหเ ทากบั 500 มลิ ลิวินาทีหรอื 0.5 วินาที
โปรแกรมที่ L2-3 : ไฟล microbox_LED8blink.ino โปรแกรมภาษา C/C++ สาํ หรบั ควบคุม LED กะพรบิ
พรอ มกนั 8 ดวง
140 Arduino IDE
ปฏบิ ัตกิ ารที่ 3-1 ไฟวง่ิ LED 8 ดวง
ในการทดลองนเ้ี ปน การเขยี นโปรแกรมภาษา C เพอื่ ควบคมุ ให LED 8 ดวงบนแผงวงจร ZX-LED8 ทาํ งาน
ในลักษณะไฟวิ่งทางซา ยและขวา
การเชื่อมตอทางฮารด แวร
เชื่อมตอ สัญญาณจากจุดตอ 20 ของแผงวงจรหลัก IPST-SE เขา กบั จุดตอ RXD ของแผงวงจร ZX-LED8 ดว ย
สายสัญญาณ JST3AA-8 (รปู ท่ี L2-1 ในปฏบิ ัตกิ ารที่ 2 ของบทท่ี 8)
ขน้ั ตอนการทดลอง
3.1.1 เปดซอฟตแ วร Wiring 1.0 สรา งไฟลใหม พิมพโปรแกรมท่ี L3-1 บันทึกในช่ือ microbox_LED8running.ino
3.1.2 คอมไพลและอัปโหลดโปรแกรมไปยงั แผงวงจร IPST-SE โดยคลิกท่ีปุม
3.1.3 รนั โปรแกรม สังเกตการทํางานของ LED 8 ดวงบนแผงวงจร DSP-4
LED จะตดิ ครงั้ ละ 1 ดวงจากตาํ แหนงทอ่ี ยทู างขวาสดุ (บิต 0) ไลม าตามลาํ ดบั ในลกั ษณะไฟว่ิงจาก
ขวาไปซายจนสุดทางขวา (บิต 7) จากน้ันจะไลกลบั ทิศทางเปนติดจากดวงซายสดุ (บิต 7) กลบั มายงั ดวงขวา
สุด (บิต 0) ในลักษณะไฟว่ิงจากซายมาขวา วนทํางานเชน นี้ไปตลอด
76 5 4 3 2 1 0
76 5 4 3 2 1 0
7 6 5 4 3 2 1 0
76 5 4 3 2 1 0
76 5 4 3 2 1 0
Arduino IDE141
#include <ipst.h> // ผนวกไฟลไลบรารหี ลกั
void setup()
{
// แสดงขอ ความของการทดลอง
glcdClear();
glcd(0,0,"Example: LED8_02");
glcd(2,0,"connect LED8 to (20)");
glcd(4,0,"LED running LEFT");
glcd(5,0," and RIGHT");
pinLED8(20); // ใชจุดตอ พอรต 20 ในการเช่ือมตอ
}
void loop() // กาํ หนดใหเ ลอ่ื นขอ มูลไปทางซาย
{ // เลอ่ื นบิตไปทางซายแลว สง ไปแสดงที่ ZX-LED8 โดยมีคา ต้ังตน ท่ี 00000001
// หนวงเวลา 0.3 วนิ าที
int i; // กาํ หนดใหเ ลอ่ื นขอ มูลไปทางขวา
for (i=0;i<8;i++) // เลอ่ื นบิตไปทางขวาแลว สงไปแสดงที่ ZX-LED8
{ // หนวงเวลา 0.3 วนิ าที
LED8(0x01<<i);
delay(300);
}
for (i=6;i>0;i--)
{
LED8(0x01<<i);
delay(300);
}
}
คําอธบิ ายโปรแกรม
โปรแกรมนท้ี าํ งานโดยอาศยั การสง ขอ มลู ผา นฟง กช น่ั LED8 เพอ่ื ให LED ตดิ ครง้ั ละ 1 ดวงนานประมาณ
0.3 วินาที โดยไลลําดบั จากบิต 0 ไปยงั บิต 7 และวนกลับจากบิต 7 กลบั มายงั บิต 0 เปน เชนนอี้ ยา งตอ เนอื่ ง
การทํางานของ LED ในลักษณะไฟวิ่งนี้ของโปรแกรมนี้เกิดจากการเล่ือนบติ ขอมลู ทั้งทางซา ยและขวา
โดยหลังจากเล่ือนขอ มลู 1 ครั้งกจ็ ะสงไปแสดงผลนาน 0.3 วินาที จากน้นั จงึ เล่ือนขอ มลู ในครง้ั ตอ ไป
ดา นอตั ราเรว็ ในการแสดงผลของ LED จะขน้ึ อยกู บั คา หนว งเวลาของฟง กช น่ั delay (หรอื อาจใช sleep
กไ็ ด) ถา กาํ หนดใหม คี า นอยกวา 300 กจ็ ะทําให LED แสดงผลการเปลี่ยนแปลงไดเ รว็ มากขน้ึ นั่นคือ ไดเหน็
ไฟวงิ่ เรว็ ขน้ึ นน่ั เอง
โปรแกรมที่ L3-1 : ไฟล microbox_LED8running.ino โปรแกรมภาษา C/C++ สาํ หรบั ทดลองควบคมุ ไฟวงิ่
LED 8 ดวง
142 Arduino IDE
ปฏบิ ัตกิ ารท่ี 3-2 ขับ LED 8 ดวง ดวยรปู แบบขอมลู ท่ีกาํ หนดลว งหนา
ในการทดลองนเ้ี ปน การเขยี นโปรแกรมภาษา C เพอื่ ควบคมุ ให LED 8 ดวงบนแผงวงจร ZX-LED8 ทาํ งาน
ในลักษณะไฟวงิ่ ตามรปู แบบขอ มลู ทก่ี าํ หนดไวลว งหนา โดยใชต วั แปรแบบอะเรยใ นการเกบ็ ตารางรปู แบบขอ มลู
การเช่ือมตอทางฮารด แวร
เช่ือมตอ สัญญาณจากจุดตอ 20 ของแผงวงจรหลัก IPST-SE เขา กบั จุดตอ RXD ของแผงวงจร ZX-LED8 ดว ย
สายสัญญาณ JST3AA-8 (รปู ท่ี L2-1 ในปฏิบัตกิ ารที่ 2 ของบทที่ 8)
ขั้นตอนการทดลอง
3.2.1 เปดซอฟตแ วร Wiring 1.0 สรา งไฟลใหม พิมพโปรแกรมที่ L3-2 บันทึกในช่ือ microbox_LED8pattern.ino
3.2.2 คอมไพลและอปั โหลดโปรแกรมไปยงั แผงวงจร IPST-SE โดยคลิกทปี่ มุ
3.2.3 รนั โปรแกรม สังเกตการทํางานของ LED 8 ดวงบนแผงวงจร ZX-LED8
LED จะตดิ ตามขอมลู ท่ีกาํ หนด ซ่ึงมดี ว ยกนั 4 แบบ โดยเรมิ่ จากแบบท่ี 1 ไปถงึ 4 แลว ทํางานยอ นกลับ
จากแบบท่ี 4 มายงั แบบท่ี 1 วนทํางานเชนน้ีไปตลอด
76543210
76543210
76543210
1 0
7 6 5 4 3 2
76543210
76543210
76543210
7 6 5 43 210
Arduino IDE143
#include <ipst.h> // ผนวกไลบรารหี ลกั
int pattern[]={ // กาํ หนดรูปแบบขอ มูลแสดงผล
0b00011000, // รปู แบบขอ มูล #1
0b00111100, // รปู แบบขอ มูล #2
0b01111110, // รปู แบบขอ มูล #3
0b11111111}; // รปู แบบขอ มูล #4
void setup()
{
// แสดงขอ ความของการทดลอง
glcdClear();
glcd(0,0,"Example: LED8_pattern");
glcd(2,0,"connect LED8 to (20)");
glcd(4,0,"Pattern LED demo");
pinLED8(20); // ใชจุดตอ พอรต 20 ในการเชื่อมตอ
}
void loop() // เปลี่ยนรปู แบบขอ มูลแสดงผล
{ // แสดงผลตามรูปแบบขอ มูลจาก 1 ถึง 4
int i; // เปลี่ยนรูปแบบขอ มูลแสดงผล
for (i=0;i<4;i++) // แสดงผลตามรปู แบบขอ มูลจาก 4 ถึง 1
{
LED8(pattern[i]);
delay(300);
}
for (i=2;i>0;i--)
{
LED8(pattern[i]);
delay(300);
}
}
คําอธบิ ายโปรแกรม
ขอ มลู สาํ หรบั การแสดงผลของโปรแกรมจะแตกตา งไปจากตวั อยา งทผ่ี า นๆ มา ในโปรแกรมมกี ารกาํ หนด
ตารางรปู แบบขอมลู ไวลวงหนาเก็บไวในตวั แปร pattern ที่เปน ตัวแปรแบบอะเรย 4 ชุด จากน้นั โปรแกรมจะ
ใชตวั แปร i เปน ตัวช้ีขอ มลู ของ pattern ออกมาแสดงผลโดยผา นฟง กช ั่น LED8 ขอ มลู แตละชุดจะไดร บั การ
แสดงผลนานประมาณ 0.3 วินาที
โปรแกรมท่ี L3-2 : ไฟล microbox_LED8pattern.ino โปรแกรมภาษา C/C++ สาํ หรบั ควบคมุ ไฟวง่ิ LED 8
ดวง ในแบบกาํ หนดรปู แบบการแสดงผลดว ยตวั แปรชนดิ อะเรย
144 Arduino IDE
ปฏบิ ัตกิ ารที่ 3-3 ขบั LED 8 ดวง แสดงผลในแบบกราฟแทง
ในการทดลองนเ้ี ปน การเขยี นโปรแกรมภาษา C เพอ่ื ควบคมุ ให LED 8 ดวงบนแผงวงจร ZX-LED8 ทาํ งาน
ในลักษณะไฟวง่ิ ตามรูปแบบขอ มลู ทกี่ าํ หนดไวลว งหนา โดยใชต วั แปรแบบอะเรยใ นการเกบ็ ตารางรปู แบบขอ มลู
การเช่ือมตอ ทางฮารด แวร
เช่ือมตอ สัญญาณจากจุดตอ 20 ของแผงวงจรหลัก IPST-SE เขา กบั จุดตอ RXD ของแผงวงจร ZX-LED8 ดว ย
สายสัญญาณ JST3AA-8 (รปู ที่ L2-1 ในปฏบิ ัตกิ ารท่ี 2 ของบทที่ 8)
ข้ันตอนการทดลอง
3.3.1 เปด ซอฟตแ วร Wiring 1.0 สรา งไฟลใ หม พมิ พโ ปรแกรมที่ L3-3 บนั ทกึ ในชอ่ื microbox_LED8bargraph.ino
3.3.2 คอมไพลและอปั โหลดโปรแกรมไปยงั แผงวงจร IPST-SE โดยคลิกทป่ี มุ
3.3.3 รนั โปรแกรม สังเกตการทํางานของ LED 8 ดวงบนแผงวงจร ZX-LED8
LED จะเรมิ่ ติดจากดวงซายสุด (บิต 0) ตามดว ยบิต 1 โดยที่ LED ของบิต 0 ยงั ตดิ อยู จากนน้ั จะทยอย
คดิ สวา งเพิ่มข้นึ ทลี ะดวง จนครบ 8 ดวง จากน้ันจะเรม่ิ ดบั ลงทีละดวงจาก LED บิต 7 ไลตามลําดบั จนถึงบิต 1
จากน้นั วนกลบั LED บิต 1 ตดิ สวา ง ตามดว ยบิต 2 วนทาํ งานเชนน้ไี ปตลอด ทําใหดแู ลว คลา ยกราฟแทงที่มกี าร
เพ่ิมคาและลดคาตลอดเวลา
76543210
76543210
7 6 5 4 3 2 1 0
76543210
76543210
76543210
ตอ ยอด
ผูพัฒนาโปรแกรมสามารถนําเทคนิคน้ีไปใชในการเขียนโปรแกรมเพ่ือแสดงคาของสัญญาณไฟฟาท่ีได
จากตัวตรวจจบั แบบอะนาลอก โดยเมอ่ื คา ของสญั ญาณไฟฟามคี า ตา้ํ LED จะตดิ ดวงเดยี ว และคดิ เพิ่มขึน้ เมอื่
ระดบั สญั ญาณไฟฟา มคี า สูงขน้ึ
Arduino IDE145
#include <ipst.h> // ผนวกไลบรารหี ลกั
void setup()
{
// แสดงขอ ความของการทดลอง
glcdClear();
glcd(0,0,"Example: LED8_bar");
glcd(2,0,"connect LED8 to (20)");
glcd(4,0,"Solid bargraph demo");
pinLED8(20); // ใชจดุ ตอ พอรต 20 ในการเช่ือมตอ
}
void loop() // สรา งขอ มูลแสดงผลดว ยการออรบ ิต
{
int i,n;
n=0;
for (i=0;i<8;i++)
{
n|=(0x01<<i);
LED8(n);
delay(300);
}
for (i=7;i>0;i--) // สรา งขอ มูลแสดงผลดว ยการแอนดบ ิต
{
n&=0xff^(0x01<<i);
LED8(n);
delay(300);
}
}
คําอธบิ ายโปรแกรม
ขอ มลู สาํ หรบั การแสดงผลของโปรแกรมนจ้ี ะใชต วั ดาํ เนนิ การตรรกะหรอื ลอจกิ ในระดบั บติ ทง้ั การออร (|)
และการแอนด (&) โดยการออรบ ติ ในโปรแกรมทาํ ใหบ ติ ขอ มลู ทเ่ี ปน “1” อยแู ตเ ดมิ ไมเ ปลย่ี น จงึ นาํ มาใชใ นการ
เพิ่มจํานวนบิตที่ทําให LED ตดิ สวา ง สวนการแอนดบิตในโปรแกรมนีจ้ ะทําใหบิตที่มนี ัยสาํ คญั สูงเปลี่ยนเปน
“0” ทลี ะบิต ทําใหจํานวนของ LED ท่ีตดิ สวา งลดลง
โปรแกรมที่ L3-3 : ไฟล microbox_LED8bargraph.ino โปรแกรมภาษา C/C++ สาํ หรบั ทดลองควบคมุ ไฟวงิ่
LED 8 ดวง ในแบบกราฟแทง
146 Arduino IDE
Arduino IDE147
ในบทน้ีเปนการนําแผงวงจรสวิตชเขามาตอทํางานรวมกับไมโครคอนโทรลเลอรของแผง
วงจร IPST-SE อนั เปน การเรยี นรกู ารอา นคาจากอนิ พตุ มาประมวลผลเพอ่ื สงสัญญาณออกไปควบคุม
อปุ กรณท างเอาตพตุ อยางงา ยน่ันเอง
ปฏบิ ตั กิ ารทงั้ หมดทนี่ าํ เสนอในบทน้ีผพู ฒั นาสามารถนาํ ความรไู ปใชส รา งระบบควบคมุ อยา งงา ย
ทม่ี กี ารตรวจจบั อนิ พตุ จากการกดสวติ ช แลว กาํ หนดใหโ ปรแกรมทอี่ อกแบบนนั้ มกี ารตอบสนองอะไร
บางอยา งออกมา เชน เมอ่ื มกี ารกดสวติ ช ระบบตอบสนองดว ยการเปด /ปด ไฟ, ควบคมุ มอเตอร หรอื สง
ขอ มลู อณุ หภมู ไิ ปแสดงผลยงั คอมพวิ เตอรท เ่ี ชอ่ื มตอ อยู เปน ตน
9.1 ความรเู บ้ืองตน เกี่ยวกบั การทาํ งานของสวติ ช
สวติ ชเปนอปุ กรณพ น้ื ฐานที่มบี ทบาทและใชประโยชนอยา งมากในวงจรอเิ ล็กทรอนกิ ส โดย
เฉพาะอยางยิ่งในการใชงานเปนอุปกรณตัดตอหรืออุปกรณสําหรับสรางสัญญาณอินพุตใหแกวงจร
โดยเฉพาะอยา งยงิ่ กับวงจรดิจติ อล
9.1.1 สวิตชก ดตดิ ปลอยดบั (Push-button switch/Tact switch)
เปน อปุ กรณส าํ หรบั ตดั ตอ วงจรไฟฟา ทน่ี ยิ มใชอ ยา งมากในระบบไมโครคอนโทรลเลอร โดย
สวติ ชแ บบนปี้ กตเิ มอ่ื ไมม กี ารกดหนา สมั ผสั ของสวติ ชจ ะแยกออกจากกนั หรอื เรยี กวา เปด วงจรเมอื่ มกี าร
กดลงบนปมุ ดา นบนซงึ่ ทาํ มาจากยางสงั เคราะหห รอื พลาสตกิ ทาํ ใหห นา สมั ผสั ตวั นาํ ภายในสวติ ชต อ ถงึ
กนั กระแสไฟฟา กจ็ ะสามารถไหลผา นไปได
รปู รา งของสวิตชกดติดปลอยดบั มดี ว ยกันหลายแบบ ทงั้ แบบบดั กรีตอสาย แบบลงแผน วงจร
พมิ พ แบบติดหนา ปด และในบางแบบมีไฟแสดงในตัว สวนขาตอใชง านมีต้ังแต 2 ขาข้ึนไป ในการ
ใชงานกับไมโครคอนโทรลเลอรน้ันมักใชสวิตชเปนอุปกรณสรางสัญญาณอินพุตแบบหนึ่ง โดยตอ
ปลายขา งหนง่ึ กบั ตวั ตา นทาน และปลายของตวั ตา นทานนน้ั ตอ กบั ไฟเลย้ี งหรอื ทเ่ี รยี กวา “พลู อปั ” ทจ่ี ดุ
148 Arduino IDE
ปมุ ยางสําหรับกด +5V
R1
4k7
เอาตพุต = +5V เปนลอจกิ "1"
S1 ไมมีกระแสไฟฟา ไหล
เนื่องจากเปด วงจร
(ก) รูปรางของสวติ ชก ดตดิ ปลอยดบั
+5V
R1 เอาตพตุ = 0V เกิดลอจิก "0"
4k7
ทิศทางการไหลของ
กดสวติ ช กระแสไฟฟา
(ข) วงจรสมมูลของสวติ ชก ดติดปลอยดบั เกดิ การตอ วงจร S1
(ค) สัญลักษณที่ใชในวงจร (ง) แสดงวงจรการนาํ สวติ ชก ดตดิ ปลอ ยดบั ไปใชใ น
การสรา งสญั ญาณลอจกิ ใหแ กไ มโครคอนโทรลเลอร
รปู ท่ี 9-1 แสดงรปู รา งและสญั ลกั ษณข องสวิตชแบบกดตดิ ปลอ ยดบั ท่ีใชในการทดลอง
ตอวงจรระหวางสวิตชกับตัวตานทานจะเปนจุดที่ตอเขากับไมโครคอนโทรลเลอรเพื่ออานคาลอจิก
ของการกดสวติ ชด งั แสดงในรปู ท่ี2-1 (ง) ถา หากไมม กี ารกดสวติ ช สถานะลอจกิ ขอสวติ ชต วั นนั้ จะเปน
“1” อนั เน่ืองจากการตอ ตัวตา นทานพลู อปั และเมื่อมกี ารกดสวติ ช จะเกิดสถานะลอจกิ เปน “0” เน่ือง
จากจุดตอสัญญาณน้ันถกู ตอลงกราวด
9.1.2 การตอ สวติ ชเพ่ือกาํ หนดลอจกิ ทางอินพตุ
ในรปู ที่ 9-2 เปนการตอสวติ ชก ดติดปลอยดับเพอ่ื สรา งสญั ญาณอนิ พตุ ลอจิก “0” ใหแ กวงจร
โดยเมื่อกดสวติ ช S1 จะเปนการตอ ขาอนิ พตุ ลงกราวด อยา งไรก็ตาม การตอสวติ ชเพยี งตวั เดยี วอาจ
ทาํ ใหส ถานะลอจกิ ทางอนิ พตุ ในขณะทไี่ มม กี ารกดสวติ ชม คี วามไมแ นน อน จงึ ควรตอ ตวั ตา นทานเขา
กับไฟเลย้ี งหรอื ลงกราวดเ พอื่ กําหนดสถานะทางลอจกิ ในขณะทไ่ี มม กี ารกดสวติ ชใ หแกวงจร
S1 เอาตพ ตุ ตอ กบั
ขาพอรต อินพตุ ของ รปู ท่ี 9-2 การเชอื่ มตอ สวติ ชก ดตดิ ปลอ ยดบั เขา
ไมโครคอนโทรลเลอร กบั อนิ พตุ ของไมโครคอนโทรลเลอรอ ยา งงา ย
Arduino IDE149
+5V +5V S1 เอาตพุตตอ กบั
ขาพอรต อินพตุ ของ
R1 R1 ไมโครคอนโทรลเลอร
100k
S1 10k เอาตพ ุตตอกับ
ขาพอรตอนิ พุตของ
ไมโครคอนโทรลเลอร
รปู ท่ี 9-3 การเชื่อมตอ สวิตชกดตดิ ปลอ ยดบั เขา รูปท่ี 9-4 การเชื่อมตอสวิตชกดติดปลอยดับเขา
กบั อนิ พตุ ของไมโครคอนโทรลเลอรแ บบมตี วั ตา นทาน กบั อนิ พตุ ของไมโครคอนโทรลเลอรแ บบมตี วั ตา นทาน
ตอ พลู อปั ทาํ ใหส ถานะลอจกิ เมอ่ื ไมม กี ารกดสวติ ช ตอ พลู ดาวน ทาํ ใหส ถานะลอจกิ เมอ่ื ไมก ดสวติ ชเ ปน
เปน ลอจิก "1" ลอจกิ "0"
ในรปู ที่9-3 เปน การตอ สวติ ชเ ขา กบั อนิ พตุ ของไมโครคอนโทรลเลอร โดยมกี ารตอ ตวั ตา นทาน
เขา ทข่ี าอนิ พตุ ของวงจรและไฟเลย้ี ง +5V เรยี กการตอ ตวั ตา นทานแบบนว้ี า การตอ ตวั ตา นทานพลู อปั
(pull-up)ดว ยการตอ ตวั ตา นทานในลกั ษณะนท้ี าํ ใหเ มอ่ื ยงั ไมม กี ารกดสวติ ช สถานะลอจกิ ทอ่ี นิ พตุ ตอ ง
เปนลอจกิ “1” อยา งแนน อน
สว นในรปู ท่ี 9-4 เปน การตอ สวติ ชเ ขา กบั อนิ พตุ ในอกี ลกั ษณะหนงึ่ ทม่ี กี ารตอ ตวั ตา นทานเขา ท่ี
ขาอนิ พตุ ของวงจรและกราวด จะเรียกการตอตัวตานทานแบบนวี้ า การตอ ตวั ตานทานพลู ดาวน (pull-
down) ดว ยการตอ ตวั ตา นทานในลกั ษณะนที้ าํ ใหเ มอื่ ยงั ไมม กี ารกดสวติ ชส ถานะลอจกิ ทข่ี าอนิ พตุ เปน
ลอจกิ “0”
9.1.3 สัญญาณรบกวนของการกดสวิตช
ในทางทฤษฎี เมอ่ื สวติ ชม กี ารเปด ปด วงจร สญั ญาณไฟฟา จะถกู ปลดหรอื ตอ เขา ไปในวงจรและ
สามารถวเิ คราะหผ ลการทาํ งานได แตใ นความเปน จรงิ เมอ่ื มกี ารกดและปลอ ยสวติ ช หนา สมั ผสั ของสวติ ช
จะเกดิ การสนั่ และกวา ทจี่ ะตอ หรอื เปด วงจรอยา งสมบรู ณน นั้ จะตอ งใชเ วลาชว่ั ขณะหนง่ึ ซง่ึ มนษุ ยไ มส ามารถ
มองเหน็ ภาวะนนั้ ได แตว งจรอเิ ลก็ ทรอนกิ สจ ะตรวจจบั ความไมค งทนี่ นั้ ได และมองเปน สญั ญาณรบกวน
สัญญาณรบกวนที่เกิดขึ้นนั้นเรียกวา สัญญาณรบกวนจากการสั่นของหนาสัมผัสสวิตช หรอื
การเบาซ (bounce) ถา หากนาํ สวติ ชน น้ั ไปใชเ ปน อปุ กรณเ พอื่ ปอ นสญั ญาณอนิ พตุ ใหแ กว งจรนบั ใน
ทางอดุ มคตเิ ม่ือกดสวติ ช 1 ครงั้ จะไดส ญั ญาณพลั สเพยี ง 1 ลูกเพอ่ื สง ไปยงั วงจรเพอื่ เปลย่ี นคาหนง่ึ คา
แตทางปฏบิ ัติ จะมีสญั ญาณพลั สส งออกไปอาจจะมเี พยี ง 1 ลกู ตามตองการหรอื มากกวา นนั้ ก็ได ซ่งึ
ไมอ าจคาดเดาได โดยสญั ญาณพลั สทเี่ กิดขึ้นนั้นจะเกดิ ขึ้นเมื่อสวติ ชเริม่ ตอวงจร และเมื่อสวติ ชกําลัง
เปดวงจรเน่อื งจากการปลอยสวติ ช ในรปู ท่ี 9-5 แสดงปรากฏการณด ังกลา ว
150 Arduino IDE
+5V +5V +5V
R1 R1 R1
10k 10k
S1 10k
OUTPUT S1 OUTPUT S1
+5V +5V +5V
0V 0V 0V
สัญญาณรบกวนทเี่ กดิ ข้นึ สญั ญาณรบกวนทเ่ี กิดขึ้น
จากการกดสวติ ช จากการปลอยสวติ ช
รปู ท่ี 9-5 แสดงการเกดิ สญั ญาณรบกวนเมอ่ื มกี ารกดและปลอ ยสวิตชในวงจรดจิ ติ อล
9.1.4 การแกไ ขสญั ญาณรบกวนของการกดสวติ ชเ มอ่ื ใชง านกบั ไมโครคอนโทรลเลอร
หลกั การแกไ ขสญั ญาณรบกวนแบบนค้ี อื หนว งเวลาการเกดิ ขน้ึ ของสญั ญาณพลั สเ ลก็ นอ ย เพอื่ ให
วงจรไมส นใจสญั ญาณทเี่กดิ ขน้ึ ในชว งเรม่ิ ตน กดสวติ ชเรยี กการแกไ ขสญั ญาณรบกวนนว้ี า ดเีบาซ(debounce)
วธิ กี ารแรก ทาํ ไดโ ดยใชอ ปุ กรณอ เิ ลก็ ทรอนกิ สพ นื้ ฐานอยา งตวั ตา นทานและตวั เกบ็ ประจุโดยตอ
กนั ในลกั ษณะวงจร RC อนิ ตเิ กรเตอร ดงั ในรปู ที่ 9-6 ดว ยวธิ กี ารนจ้ี ะชว ยลดผลของสญั ญาณรบกวนที่
เกดิ ขนึ้ จากการกดสวติ ชไ ดใ นระดบั หนงึ่ โดยประสทิ ธภิ าพของวงจรจะขนึ้ กบั การเลอื กคา ของตวั ตา นทาน
และตวั เกบ็ ประจุ หากเลอื กคา ของตวั เกบ็ ประจนุ อ ยเกนิ ไป อาจไมส ามารถลดสญั ญาณรบกวนได แตถ า
เลอื กคา มากเกนิ ไปจะทาํ ใหค วามไวในการตรวจจบั การกดสวติ ชล ดลง นน่ั คอื อาจตอ งกดสวติ ชม ากกวา
1 ครง้ั เพอื่ ใหไ ดส ญั ญาณท่ตี องการ
+5V
R1
10k
S1 R3 OUTPUT
R2
C1
วงจร RC อนิ ติเกรเตอร
รปู ท่ี 9-6 การตอ วงจร RC อินตเิ กรเตอรเ พ่ือแกไ ขปญหาสญั ญาณรบกวนจากการกดสวิตช