Robo-CreatorXT : ATX2 1
ATX2
2Robo-CreatorXT : ATX2
ATX2 สงวนลิขสิทธิ์ตาม พ.ร.บ. ลิขสิทธิ์ พ.ศ. 2537 หามการลอกเลียนไมวาสวนหนึงส ่ วนใดของหนังสือเลมนี้ นอกจากจะไดรับอนุญาต
ใครควรใชหนังสือเลมนี้ 1. นักเรียน นิสิต นักศึกษา และบุคคลทัวไปที ่ มี่ ความสนใจในการนําไมโครคอนโทรลเลอรไปประยุกต ใชในการทดลองเกี่ยวกับการทํางานของระบบอัตโนมัติ หรือสนใจในการเรียนรูและทดลองไมโคร คอนโทรลเลอรในแนวทางใหมทีใช ่ กิจกรรมหุนยนต อัตโนมัติเปนสื่อ 2. สถาบันการศึกษา โรงเรียน วิทยาลัย มหาวิทยาลัย ทีมี่ การเปดการเรียนการสอนวิชาอิเล็กทรอนิกส หรือภาควิชาวิศวกรรมอิเล็กทรอนิกสและคอมพิวเตอร 3. คณาจารยทีมี่ ความตองการศึกษา และเตรียมการเรียนการสอนวิชาไมโครคอนโทรลเลอร รวมถึงวิทยา ศาสตรประยุกตทีต่ องการบูรณาการความรูทางอิ เล็กทรอนิกส-ไมโครคอนโทรลเลอร-การเขียนโปรแกรม คอมพิวเตอร--การทดลองทางวิทยาศาสตร ในระดับมัธยมศึกษา อาชีวศึกษา และปริญญาตรี
ดําเนินการจัดพิมพและจําหนายโดย บริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด 108 ซ.สุขุมวิท 101/2 ถ.สุขุมวิท แขวงบางนา เขตบางนา กรุงเทพฯ 10260 โทรศัพท 0-2747-7001-4 โทรสาร 0-2747-7005 รายละเอียดทีปรากฏในหนั ่ งสือเลมนี้ไดผานการตรวจทานอยางละเอียดและถวนถี่ เพื่อใหมีความสมบูรณและ ถูกตองมากทีสุ่ ดภายใตเงือนไขและเวลาที ่ พึ่ งมีกอนการจัดพิมพเผยแพร ความเสียหายอันอาจเกิดจากการนําขอมูล ในหนังสือเลมนีไปใช ้ ทางบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด มิไดมีภาระในการรับผิดชอบแตประการใด ความผิดพลาดคลาดเคลือนที ่ อาจมี ่ และไดรับการจัดพิมพเผยแพรออกไปนัน้ ทางบริษัทฯ จะพยายามชีแจงและแก ้ ไข ในการจัดพิมพครังต ้ อไป
Robo-CreatorXT : ATX2 3
การนําเสนอขอมูลเกียวกั ่ บขอมูลทางเทคนิคและเทคโนโลยีในหนังสือเลมนี้ เกิดจากความตอง การทีจะอธิ ่ บายกระบวนการและหลักการทํางาน ของอุปกรณในภาพรวมดวยถอยคําทีง่ ายเพือสร ่ าง ความเขาใจแกผูอ าน ดังนันการแปลคํ ้ าศัพททางเทคนิคหลายๆ คําอาจไมตรงตามขอบัญญัติของราช บัณฑิตยสถาน และมีหลายๆ คําที่ยังไมมีการบัญญัติอยางเปนทางการ คณะผูเขี ยนจึงขออนุญาต บัญญัติศัพทขึนมาใช ้ ในการอธิบาย โดยมีขอจํากัดเพืออ ่ างอิงในหนังสือเลมนีเท ้ านัน้ ทังนี ้ สาเหตุ ้ หลักของขอชีแจงนี ้ มาจาก ้ การรวบรวมขอมูลของอุปกรณในระบบสมองกลฝงตัว และเทคโนโลยีหุนยนต สําหรับการศึกษาเพือนํ ่ ามาเรียบเรียงเปนภาษาไทยนันทํ ้ าไดไมงายนัก ทางคณะ ผูเขี ยนตองทําการรวบรวมและทดลองเพือให ่ แนใจวา ความเขาใจในกระบวนการทํางานตางๆ นันมี ้ ความ คลาดเคลือนน ่ อยทีสุ่ ด เมือต ่ องทําการเรียบเรียงออกมาเปนภาษาไทย ศัพททางเทคนิคหลายคํามีความหมายทีทั่ บซอน กันมาก การบัญญัติศัพทจึงเกิดจากการปฏิบัติจริงรวมกับความหมายทางภาษาศาสตร ดังนันหากมี ้ ความ คลาดเคลือนหรื ่ อผิดพลาดเกิดขึน้ ทางคณะผูเขี ยนขอนอมรับและหากไดรับคําอธิบายหรือชีแนะจากท ้ าน ผูรู จะได ทําการชีแจงและปรั ้ บปรุงขอผิดพลาดทีอาจมี ่ เหลานันโดยเร็ ้ วทีสุ่ ด ทังนี ้ เพื ้ อให ่ การพัฒนาสือทางวิ ่ ชาการ โดยเฉพาะอยางยิ่งกับความรูของเทคโนโลยี สมัยใหม สามารถดําเนินไปไดอยางตอเนือง ่ ภายใตการมีสวนรวมของผูรู ในทุ กภาคสวน บริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด
4Robo-CreatorXT : ATX2
บทที่ 1 แนะนําแผงวงจรควบคุมอเนกประสงค ATX2..........................................................5 บทที่ 2 Arduino ซอฟตแวรพัฒนาโปรแกรมภาษา C/C++ สําหรับแผงวงจรควบคุมอเนกประสงค ATX2.......................................................... 13 บทที่ 3
อัตโนมัติควบคุมดวยโปรแกรมภาษา C/C++...............25 Robo-Creator XT หุนยนต
บทที่ 4 โครงสรางโปรแกรมของ Arduino.............................................................................31 บทที่ 5 ฟงกชั่นพืนฐานของ ้ Arduino และตัวอยางคําสังสํ ่ าหรับการพัฒนาโปรแกรม.....................................................65 บทที่ 6 ไลบรารีสําหรับพัฒนาโปรแกรมของแผงวงจร ATX2............................................91
Robo-CreatorXT : ATX2 5
ATX2 เปนแผงวงจรแบบโปรแกรมไดที่ขับมอเตอรไฟตรงได 6 ตัว และเซอรโวมอเตอรอีก 8 ตัวพรอมกัน ทั้งยังมีจุดตออินพุตเอาตพุตเพื่อเชือมต ่ อกับแผงวงจรตัวตรวจจับแบบตางๆ ทั้งอะนา ลอกและดิจิตอลจํานวนมาก จึงนําไปใชเป นแผงวงจรควบคุมของหุนยนตอัตโนมัติเพื่อการศึกษา ขนาดกลาง และนําไปใชสรางโครงงานวิทยาศาสตรและเทคโนโลยีที่สอดคลองกับการเรียนรูสะเต็ ม ศึกษาไดเปนอยางดี ดานการพัฒนาโปรแกรม แผงวงจร ATX2 รองรับโปรแกรมที่พัฒนาดวยภาษา C/C++ โดย เฉพาะอย างยิ่ งกั บซอฟตแวรในโครงการพัฒนาระบบควบคุมขนาดเล็กเพื่อประยุกตใชงานดาน ซอฟตแวรและฮารดแวรในแบบโอเพนซอรสที่ชือ่ Arduino (www.arduino.cc)
6Robo-CreatorXT : ATX2
1.1 คุณสมบัติของแผงวงจรควบคุมหลัก ในรูปที่ 1-1 แสดงสวนประกอบของแผงวงจร ATX2 มีคุณสมบัติทางเทคนิคที่สําคัญดังนี้ การควบคุมหลักใชไมโครคอนโทรลเลอร 8 บิตเบอร ATmega644P มีหนวยความจํา โปรแกรมแบบแฟลช 64 กิโลไบต โปรแกรมใหมได 10,000 ครัง้ มีหนวยความจําขอมูลอีอีพรอม 4 กิโล ไบต และหนวยความจําขอมูลแรม 4 กิโลไบต สัญญาณนาฬิกา 20MHz จากคริสตอล
ในสวนของอุปกรณอินพุตเอาตพุตเสริมใชไมโครคอนโทรลเลอร8 บิตเบอร ATmega88A ของ Atmel ทําหนาทีจั่ ดการอินพุตเอาตพุตเพิมเติ ่ มใหกับแผงวงจร
กําหนดชือขาพอร ่ ตในการติดตออุปกรณตามขอกําหนดของฮารดแวร Arduino มาตรฐาน
มีจุดตอพอรต 3 ขา (ขาไฟเลี้ยง, สัญญาณ และกราวด) แบบโปรแกรมไดจํานวน 18 จุด แบงเปนขาพอรตแบบดิจิตอลหรืออะนาลอก (กําหนดได) 8 จุด (พอรต 24 หรือ A0 ถึงพอรต 31 หรือ A7), จุดตออินพุตอะนาลอกอยางเดียว 5 จุด (A8 ถึง A12), จุดตออินพุตเอาตพุตแบบดิจิตอล ที่รองรับการอินเตอรรัปต 1 จุด (พอรต 18 หรือ INT2), จุดตอขาพอรตสําหรับบัสสือสารข ่ อมูล 2 สาย (TWI) 1 ชุด (2 จุดคือ พอรต 9-SCL และพอรต 9-SDA) และจุดตอบัสสือสารข ่ อมูลอนุกรมหรือ UART
รูปที่ 1-1 แสดงสวนประกอบทีควรทราบของแผงวงจรควบคุ ่ มอเนกประสงค ATX2
Robo-CreatorXT : ATX2 7
1 ชุด (2 จุด ประกอบดวย พอรต 2-RXD1 และพอรต 3-TXD1) สําหรับจุดตอพอรต TWI และ UART สามารถกําหนดใหเปนขาพอรตอินพุตเอาตพุตดิจิตอลสําหรับงานทั่วไปได นอกจากนั้นที่จุด UART ยังใชงานเปนอินพุตดิจิตอลทีรองรั ่ บการอินเตอรรัปตไดอีก 2 จุดดวย นันคื ่ อ RXD1 คืออินพุตอินเตอร รัปตชอง 0 หรือ INT0 และ TXD1 คืออินพุตอินเตอรรัปตชอง 1 หรือ INT1 จุดตอพอรตอินพุตอะนาลอกทัง ้ 13 จุด (A0 ถึง A12) รองรับแรงดันไดตังแต ้ 0 ถึง +5V มีความละเอียดในการแปลงสัญญาณเปนขอมูลดิจิตอล 10 บิต ใหผลการทํางานในชวง 0 ถึง 1,023 มี ตั วต านทานปรั บค าได หรือ KNOB สําหรับทดลองการทํางานของวงจรแปลง สัญญาณอะนาลอกเปนดิจิตอลได โดยไมตองตออุปกรณภายนอก มี สวิ ตช OK เปนสวิตชแบบกดติดปลอยดั บที่ มีการตอตัวต านทานพูลอัปไวแลว สําหรับทดสอบการอานคาอินพุตดิจิตอลอยางงาย มีลําโพงเปยโซสําหรับขับเสียง มี จอแสดงผลแบบกราฟก LCD สี ความละเอียด 128 x 160 จุด แสดงตัวอักษรได 21 ตัว 16 บรรทัด ่ อมูลอนุกรม UART 1 ชุด สําหรับติดตอกับอุปกรณอนุกรม มีจุดตอพอรตสือสารข อาทิ โมดูล กลอง Pixy, โมดูลบลูทูธ BlueStick, โมดูลสื่อสาร XBEE และ XBEE PRO, โมดูล WiFi, แผงวงจรขับเซอรโวหลายชองแบบอนุกรม, โมดูล LCD แบบอนุกรม เปนตน มีวงจรขับมอเตอรไฟตรง 6 ชอง พรอมไฟแสดงการทํางาน รองรับมอเตอรไฟตรง ขนาด 4.5 ถึง 9V (ขึ้นกับไฟเลียงของแผงวงจร ้ แรงดันสูงสุดที่ใชไดคือ +11.1V) ขับกระแสไฟฟาได สูงสุด 3A และ 1.2A หากเปนการขับตอเนือง ่ มีจุดตอ RC เซอรโวมอเตอรขนาดเล็ก 8 ชอง รองรับเซอรโวมอเตอรขนาด 4.8 ถึง 7.2V มี LED แสดงสภาวะไฟเลี้ยงของวงจรขับมอเตอรและเซอรโวมอเตอร ปกติจะติด สวาง และดับลงหากมอเตอรมีการลัดวงจร มีวงจรตรวจสอบระดับไฟเลียงของระบบแสดงผลด ้ วย LED เมือไฟเลี ่ ยงตํ ้ ่ากวา 6V ่ อมูลกับคอมพิวเตอรผานพอรต USB มีไฟแสดงการทํางาน ดาวนโหลดและสือสารข มีสวิตช RESET สําหรับรีเซตการทํางาน รองรับการขยายพอรตผานจุดตอพอรตบัส 2 สายหรือ TWI โดยใชอุปกรณเพิ่มเติม ้ +6 ถึง +9V กระแสไฟฟา 1100mA (เปนอยางนอย หากใชกับมอเตอร 4 ตัว) ใชไฟเลียง มีวงจรควบคุมแรงดันคงที่ +5V สําหรับไมโครคอนโทรลเลอร และควบคุมแรงดันคงที่ +6V สําหรับวงจรขับเซอรโวมอเตอร ทังนี ้ เพื ้ อป ่ องกันความเสียหายกรณีจายไฟเกินแกเซอรโวมอเตอร
INT2
A0
A2
A4
A6
18
24
26
28
30
15 0
10k
KNOB
+5V
+5V
A12
+5V
A3
A5
A7
27
29
31
OK
1k
100/16V
A1
25
Speaker
10F
A11
A10
RESET
10k
+5V
1k
4k7
+BATT
LOW BATT.
1k
A9
A8
0.1F
PA7
PA6
PA5
PA4
PA3
PA2
PA1
PA0
PB2
A14
A13
A12
A11
A10
A9
A8
GND GND AGND
VDD VDD AVDD
+BATT
KNOB
30
31
32
33
34
35
36
37
42
6 18 39 28
31
30
29
28
27
26
25
24
18
A7
A6
A5
A4
A3
A2
A1
19
8
2k2 x2
+5V
+5V
14
5
PD6
6
PWM1
PD5 5
6
KRC102
29
DIR1
15
ATX2 ISP
10k
RST
22
2
16
0.1F
+5V
13
4
KRC102
7
SCK
23
3
17
16
MOSI MISO
21
1
15
SCK
1
2
150
10
21
16
40
10 1
+5V +5V
2 3
GND
9 0
11 2
12 3
TXD1
PD3
4k7
+5V
0.1 F
+5V
41
17
KRC102
44
20
TXD0 RXD0 RXD1 TXD1
KRC102
DC. MOTOR OUTPUT (MAIN)
PB3
19
PWM2 PWM3 7 PD7
16
PB0
DIR3
DIR2 4
43
19
+5V
VCC
GND
RST
D/C
DAT
CLK
CS
3V3
2k2
10k
0.1F
1 F
PD4
4k7
+5V
11
22
12 13 32 31 30 10 11 2 9
1 TXD RXD 5 DTR 2
SV8 SV7 SV6 SV5 SV4 PWM6 DIR6 DIR5 PWM5
FT232RL
MOSI MISO
4k7
+5V
GND GND GND AGND TEST
14 PWREN 22 RXLED TXLED 23 17 3V3
DATA
USB
3
4
8
4k7
+5V
SV3 SV2 SV1
PWM4 PB4
DIR4 20
26 25 24
17
PB1
13
15 14
X2 X1
7
1
CR 20MHz
470/16V
+BATT
1
Vout
Vout
3
4k7
+5V
13
15 14
0.1F
SV8 SV7 SV6 SV5 SV4 SV3 SV2 SV1
1k
6 DC. MOTOR OUTPUT (XIO)
5
4k7
+5V
PC6 PC5
PC7
RC. SERVO MOTOR OUTPUT
KRC102
+5V 0.1 F
DC 7-9V Adapter Input
+VSRV
470/16V
+VSRV
+5V
100/16V
INH GND 4 3
Vin
2
DC 7-9V
278R06
KRC102
INH GND 4 2
Vin
S7V7F5 5V DC-DC Converter
0.47R
ON
SW-POWER
KSB772
FDS6675
1k
TWI (I2C)
SDA
PC1
SCL
PC0
0.1F
7 18 21 25 26
ATX2 XIO EXPANSION
MAIN CONTROLLER
A0
9
20
12
23
14
SS
20
0.1 F
4 VIO 20 VDD
+5V
ATMega88 (TQFP32)
AREF
ATMega644PA (TQFP44)
RST
INT2
GND GND GND AGND
VDD VDD VDD AREF AVDD
4
10k
+5V
1 SPK. 23 LOW BATT.
22
19
24
25
26
27
28
3 5 21
5 17 38 29 27
+5V
0.1 F 0.1 F x4
4 6 18
470/16V
15 16 D+ D-
TB6612FNG
+5V
+5V
GND 8 GND 9
0.1 F
GND ID D+ DVUSB 24 23 22 21 20 19 18 17 16 15 14 13 +VM PWMA AIN2 AIN1 Vcc STB GND BIN1 BIN2 PWMB +VM +VM A1 A1 PG PG A2 A2 B2 B2 PG PG B1 B1
-+
1 2 3 4 5 6 7 8 9 10 11 12
-+
+5V
470/16V
LCD ITDB02-1.8SP Connector 0.1 F
+5V
TB6612FNG
PD2
470/16V
RXD1
0.1 F
GN D
24 23 22 21 20 19 18 17 16 15 14 13 +VM PWMA AIN2 AIN1 Vcc STB GND BIN1 BIN2 PWMB +VM +VM A1 A1 PG PG A2 A2 B2 B2 PG PG B1 B1
-+
1 2 3 4 5 6 7 8 9 10 11 12
-+
SERIAL1
+BATT
+V
2k2
2k2
+BATT +VSRV
TB6612FNG
470/16V 24 23 22 21 20 19 18 17 16 15 14 13 +VM PWMA AIN2 AIN1 Vcc STB GND BIN1 BIN2 PWMB +VM +VM A1 A1 PG PG A2 A2 B2 B2 PG PG B1 B1 1 2 3 4 5 6 7 8 9 10 11 12
-+
รูปที่ 1-2 วงจรของแผงวงจรอเนกประสงค ATX2 -+
USB
8Robo-CreatorXT : ATX2
1k
1k
1k
1k
Robo-CreatorXT : ATX2 9
1.2 ขอมูลของสายสัญญาณทีใช ่ กับแผงวงจรควบคุมอเนกประสงค ATX2 1.2.1 สาย JST3AA-8 : สายเชื่อมตอระหวางแผงวงจร
สาย JST3AA-8 ใชเชือมต ่ อระหวางแผงวงจรควบคุม IPST-SE กับแผงวงจรตรวจจับและแผง วงจรอุปกรณตางๆ เปนสายแพ 3 เสน ยาว 8 นิ้ว ปลายสายทั้งสองดานติดตังคอนเน็ ้ กเตอรแบบ JST 3 ขา ตัวเมีย ระยะหางระหวางขา 2 มิลลิเมตร มีการจัดขาดังนี้ ระยะหางระหวางขา 2 มม.
ระยะหางระหวางขา 2 มม.
GND S +5V
1.2.2 สาย USB-miniB เปนสายสัญญาณสําหรับเชือมต ่ อระหวางพอรต USB ของคอมพิวเตอรกับแผงวงจร IPST-SE
10 Robo-CreatorXT : ATX2
1.3 เกียวกั ่ บแหลงจายไฟ 1.3.1 กะบะถาน แนะนําใหใชแผงวงจร ATX2 กับกะบะถาน AA 6 กอน มีสายตอขั้วบวกและลบสําหรับตอ กับแผงวงจร ATX2 (มีในชุด)
1.3.2 อะแดปเตอรไฟตรง แผงวงจร ATX2 ยังใชงานไดกับอะแดปเตอรไฟตรงทีมี่ แแรงดันเอาตพุตตังแต ้ 6 ถึง 9V กระแส ไฟฟา 2A (เปนอุปกรณเสริม)
Robo-CreatorXT : ATX2 11
1.4 แนวทางการพัฒนาโปรแกรมสําหรับแผงวงจรควบคุมอเนกประสงค ATX2 การพัฒนาโปรแกรมภาษา C/C++ สําหรับใชงานแผงวงจรควบคุมอเนกประสงค ATX2 มีขั้น ตอนโดยสรุปดังแผนภาพในรูปที่ 1-3 ติดตั้งซอฟตแวร - Arduino 1.0.7 ซอฟตแวร เขี ยนโปรแกรมภาษา C/C++ - ไดรเวอร USB ของแผงวงจร ATX2 ----------------------------------------------
ตรวจสอบชองเชื่อมตอคอมพิวเตอร ของแผงวงจร ATX2 - เชื่ อมตอแผงวงจร ATX2 เขากับพอรต USB - เลือกเปด Control panel > System > Hardware > Device Manager > Ports ดูที่หัวขอ USB serial port (COMx) - จําตําแหนงของ USB serial port (COMx) โดย x เปนตัวเลข ใดๆ ปกติมคี ามากกวา 3 เพื่ อเลือกชองติดตอสื่อสารระหวาง คอมพิวเตอร กบั แผงวงจร ATX2
เตรียมการสรางโปรแกรมควบคุม 1. เปดซอฟตแวร Arduino 1.0.7 สรางไฟลใหม 2. เลือกชนิดของแผงวงจร ที่เมนู Tools > Board > ATX2 > ATmega644P@16MHz 3. เลือกชองตอคอมพิวเตอร ที่เมนู Tools > Serial port > COMx โดย x เปนเลขใดๆ ไดมาจากการตรวจสอบตําแหนงที่ Device manager
เขียนโปรแกรมภาษา C/C++ แลวบันทึกไฟล คอมไพล อัปโหลดโปรแกรม โปรแกรมที่แผงวงจร ATX2 เริม่ ทํางาน
รูปที่ 1-3 แผนภาพแสดงขันตอนและกระบวนการเรี ้ ยนรูเพื อใช ่ งาน ATX2 แผงวงจรควบคุมอเนกประสงค เริ่มจากดานซายตั้งแตการติดตั้งโปรแกรมและการตรวจสอบการเชื่อมตอระหวางแผงวงจร ATX2 กับคอมพิวเตอร ไลมาทางขวา เริมจากขั ่ ้นตอนเตรียมการสรางโปรแกรมควบคุม, เขียนโปรแกรม, คอมไพลหรือการแปลโปรแกรมภาษา C/C++ เปนภาษาเครือง, ่ อัปโหลดหรือ สงโปรแกรมไปยังแผงวงจร ควบคุมอเนกประสงค ATX2 จากนันจึ ้ งรันโปรแกรมเพือตรวจสอบการทํ ่ างาน
12 Robo-CreatorXT : ATX2
Robo-CreatorXT : ATX2 13
ในบทนีจะอธิ ้ บายสวนประกอบและรายละเอียดของซอฟตแวร Arduino1.0.7 IDE ทีใช ่ ในการ เขียนโปรแกรม คอมไพลโปรแกรม และอัปโหลดโปรแกรมไปยังแผงวงจรควบคุมอเนกประสงค ATX2 โดยซอฟตแวร Arduino1.0.7 IDE ทํางานบนระบบปฏิบัติการไดทุกแบบ ไมวาจะเปนวินโดวส ที่รองรับตั้งแตวินโดวส XP ขึนไป, ้ MAC OS และ Linux
2.1 ติดตั้งซอฟตแวร Arduino 2.1.1 ขันตอนติ ้ ดตั้งซอฟตแวรและไดรเวอร USB ชุดของซอฟตแวรที่ใชงานกับแผงวงจร ATX2 และชุดหุนยนต Robo-Creator XT ประกอบ ดวย ซอฟตแวร Arduino 1.0.7 IDE ที่บรรจุไดรเวอรและขอมูลสําหรับติดตอกับแผงวงจร ATX2 ของหุนยนต Robo-Creator XT, ไฟลไลบรารีของแผงวงจร ATX2 ที่ชือ่ atx2.h และโปรแกรมตัวอยาง มีขั้นตอนการติดตังดั ้ งนี้ (.1) นําแผนซีดีรอมทีมากั ่ บชุดหุนยนต Robo-Creator X T หรือแผงวงจร ATX2 ใสเขาไปใน ซีดีรอมไดรฟของคอมพิวเตอร คนหาและดับเบิลคลิ ้ กทีไฟล ่ Arduino1.0.7.1070_ReleaseSetup150123.exe จะปรากฎหนาตางตอนรับสูการติ ดตังให ้ คลิก Next หนาตางติดตังจะสอบถามตํ ้ าแหนงการติดตังโปรแกรม ้ ใหกด Next ขามขันตอนนี ้ ไป ้
14 Robo-CreatorXT : ATX2
(2) คลิกตอบรับการติดตังในแต ้ ละขั้นตอน จนกระทั่งการติดตังเสร็ ้ จสิ้น (3) จากนั้นจะเขาสูการติ ดตังไดรเวอร ้ USB ตัวที่ 1 ใหคลิกปุม Next เพื่อตอบรับ เมือการติ ่ ด ตังเสร็ ้ จสิ้น คลิกปุม Finish เพื่อเขาสูขั ้นตอนถัดไป
(4) ตอไปเปนการติดตังไดรเวอร ้ USB ตัวที่สอง ซึ่งเปนไดรเวอรสําหรับแผงวงจร ATX2 คลิกปุม Install เพื่อทําการติดตังไดรเวอร ้ และคลิก Finish เมือการติ ่ ดตังเสร็ ้ จสมบูรณ
Robo-CreatorXT : ATX2 15
(5) หนาตางสําหรับเลือกฮารดแวรตังต ้ นปรากฏขึนมา ้ คลิกเลือก ATX2 จากนันจะปรากฏไดอะ ้ ล็อกบ็อกใหคลิกปุม OK เพือยื ่ นยันอีกครัง้
(6) ซอฟตแวร Arduino IDE เริมทํ ่ างาน หนาตางหลักแสดงขึ้นมา
(ก) ทีบรรทั ่ ดแรก มีคําสังผนวกไฟล ่ ไลบรารี ATX2.h ซึงเป ่ นไฟลไลบรารีหลัก (ข) ชือของฮาร ่ ดแวรหลักจะแสดงอยูทีมุ่ มขวาดานลางของหนาตางโปรแกรม ในที่นี้ á Ê´ §à»ç¹ ATX2.ATmega644@20MHz on COMx (x เปนเลขตําแหนงของ COM port หรือ USB serial port)
16 Robo-CreatorXT : ATX2
2.1.2 ตรวจสอบตําแหนงของพอรตคอมพิวเตอรทีใช ่ เชื่อมตอกับแผงวงจร ATX2 (1) ตอสาย miniB-USB เขากับพอรต USB ของคอมพิวเตอรและแผงวงจร ATX2 เปดไฟเลี้ยง และรอจนกระทั่ง LED สีฟาที่ตําแหนง USB ติดสวาง เพื่อยืนยันการเชือมต ่ อถูกตอง (2) คลิกปุม Start แลวเลือก Control Panel. (3) ดับเบิลคลิกที่ System (4) เลือกที่แท็บ Hardware ตามดวยคลิกปุม Device Manager
(5) ตรวจสอบที่รายการ Port จะตองพบรายการ USB Serial port . ดูหมายเลขของพอรต โดยปกติมีคาตังแต ้ COM3 ขึ้นไป (จากตัวอยางเปน COM10). ตองใชหมายเลขพอรตนีในการตั ้ ้งคา ในซอฟตแวร Arduino 1.0.7 IDE
Robo-CreatorXT : ATX2 17
2.2 ทดสอบใชงานแผงวงจร ATX2 กับ Arduino IDE เบื้องตน (1) เปดซอฟตแวร Arduino IDE (2) เลือกฮารดแวรที่ตองการเชือมต ่ อ โดยไปที่เมนู Tools > Board > ATX2; ATmega644 @16MHz
(3) เลือกพอรตเชื่อมตอกับแผงวงจร ATX2 โดยไปที่เมนู Tools > Serial Port ในที่นี้เลือก เปน COM3
จะตองกระทําขันตอนนี ้ ทุ้ กครังที ้ เริ ่ มต ่ นทํางานใหม หรือมีการปลดและตอสายระหวาง แผงวงจร ATX2 กับคอมพิวเตอร ขณะนีแผงวงจร ้ ATX2 พรอมใชงานรวมกับซอฟตแวร Arduino 1.0.7 IDE ซึงเป ่ นเวอร ชันที่ทําขึนมาสํ ้ าหรับแผงวงจร ATX2 โดยเฉพาะ
18 Robo-CreatorXT : ATX2
(4) พิมพโคดตอไปนี้ แลวบันทึกในชือ่ atx2_hello.ino #include <ATX2.h> void setup() { OK(); glcdClear(); } void loop() { glcd(1,0,"Hello World"); }
// Wait for OK button // Clear screen
// Show message
(5) อัปโหลดไปยังแผงวงจร ATX2 เมือเสร็ ่ จสิ้น แผงวงจร ATX2 จะทํางานทันที แผงวงจร ATX2 แสดงขอความตอนรับ แลวรอใหกดสวิตช OK เมื่อกดสวิตช OK หนาจอแสดงผลจะเปลี่ยนการแสดงขอความเปน Hello World
Robo-CreatorXT : ATX2 19
2.4 สวนประกอบของซอฟตแวร Arduino1.0.7 เมือเรี ่ ยกใหโปรแกรมทํางาน จะมีหนาตาดังรูปที่ 2-1 ตัวโปรแกรมประกอบดวยสวนตางๆ ดังนี้ เมนู (Menu)
แถบเครืองมื ่ อ (Tools bar)
แถบเลือกโปรแกรม (Tab) พืนที ้ ่สําหรับเขียนโปรแกรม (Text Editor)
Serial Monitor คลิกเพื่อเปดหนาต าง สําหรับรับและสงขอมูล อนุกรมระหวางฮารดแวร Arduino กับคอมพิวเตอร
พืนที ้ ่แสดงสถานะการทํางาน (Message area)
รูปที่ 2-1 แสดงสวนประกอบของโปรแกรม Arduino1.0.7
เมนู (Menu) ใชเลือกคําสังต ่ างๆ ในการใชงานโปรแกรม
แถบเครืองมื ่ อ (Toolbar) เปนการนําคําสังที ่ ่ใชงานบอยๆ มาสรางเปนปุมเพื่อใหเรียกใชคํา สั่ งไดรวดเร็วขึ้น
แถบเลือกโปรแกรม (Tabs) เป นแถบที่ ใช เลื อกไฟลโปรแกรมแตละตัว (กรณีที่เขียน โปรแกรมขนาดใหญประกอบดวยไฟลหลายตัว)
พื้นทีเขี ่ ยนโปรแกรม (Text editor) เปนพืนที ้ ่สําหรับเขียนโปรแกรมภาษา C/C++
พืนที ้ แสดงสถานะการทํ ่ างาน (Message area) เปนพืนที ้ ่โปรแกรมใชแจงสถานะการทํางาน ของโปรแกรม เชน ผลการคอมไพลโปรแกรม
พื้นทีแสดงข ่ อมูล (Text area) ใชแจงวาโปรแกรมที่ผานการคอมไพลแลวมีขนาดกี่ไบต
20 Robo-CreatorXT : ATX2
ปุมสํ าหรับเปดหนาตาง Serial Monitor ปุมนี จะอยู ้ ทางมุ มบนดานขวามือ คลิกปุมนี เมื ้ อต ่ อง การเปดหนาตางสื่อสารและแสดงขอมูลอนุกรม โดยตองมีการตอฮารดแวร Arduino และเลือกพอรต การเชือมต ่ อใหถูกตองกอน
หนาตาง Serial Monitor มีบทบาทคอนขางมากในการใชแสดงผลการทํางานของ โปรแกรมแทนการใชอุปกรณแสดงผลอืนๆ ่ เนื่องจาก Arduino ไดเตรียมคําสั่งสําหรับใชแสดงคาของ ตัวแปรที่ตองการดูผลการทํางานไวแลว นั่นคือ Serial.print สวนการสงขอมูลจากคอมพิวเตอรไป ยังฮารดแวร Arduino หรือแผงวงจรควบคุมใหพิมพขอความและคลิกปุม Send ในการรับสงขอมูล ต องกําหนดอั ตราเร็วในการถายทอดขอมูลหรือบอดเรต (baud rate) ใหกับโปรแกรมในคําสั่ง Serial.begin กรณีทีใช ่ งานกับคอมพิวเตอร Mcintosh หรือคอมพิวเตอรทีติ่ ดตังระบบปฏิ ้ บัติการ Linux ตัวฮารดแวรของ Arduino จะรีเซ็ตเมือเริ ่ มเป ่ ดใชงาน Serial monitor
Robo-CreatorXT : ATX2 21
2.4.1 แถบคําสั่งหรือเมนูบาร เปนสวนที่แสดงรายการ (เมนู) ของคําสังต ่ างๆ ของโปรแกรม ประกอบดวย
2.4.1.1 เมนู File ใน Arduino จะเรียกโปรแกรมที่พัฒนาขึนว ้ า สเก็ตช (Sketch) และในโปรแกรมของผูใชงาน อาจมีไฟลโปรแกรมหลายตัว จึงเรียกรวมวาเปน สเก็ตชบุก (Sketchbook) ในเมนูนี้จะเกี่ยวของกับ การเปด-บันทึก-ปดไฟลดังนี้
New : ใชสรางไฟลสเก็ตชตัวใหม เพือเริ ่ มเขี ่ ยนโปรแกรมใหม
Open ใชเปดสเก็ตชที่บันทึกไวกอนหนานี้
Sketchbook : ใชเปดไฟลสเก็ตชลาสุดที่เปดใชงานเสมอ
Example : ใชในการเลือกเปดไฟลสเก็ตชตัวอยางที่บรรจุและรวบรวมไวในโฟลเดอร ของโปรแกรม Arduino1.0
Save : ใชในการบันทึกไฟลสเก็ตชปจจุบัน
Save as : ใชบันทึกไฟลสเก็ตชโดยเปลี่ยนชือไฟล ่
Upload to I/O board : ใชอัปโหลดโปรแกรมไปยังแผงวงจร ATX2
Page setup : ตังค ้ าหนากระดาษของไฟลสเก็ตชปจจุบัน
Print : สั่งพิมพโคดของไฟลสเก็ตชปจจุบันออกทางเครืองพิ ่ มพ
Preference : ใชกําหนดคาการทํางานของโปรแกรม
Quit : ใชจบการทํางานและออกจากโปรแกรม
22 Robo-CreatorXT : ATX2
2.4.1.2 เมนู Edit ในขณะทีพิ่ มพโปรแกรม ผูพัฒนาโปรแกรมสามารถใชคําสังในเมนู ่ นี้ในการสังยกเลิ ่ กคําสังที ่ ่ แลว ทําซํา้ ฯลฯ มีเมนูตางๆ ดังนี้
Undo : ยกเลิกคําสังหรื ่ อการพิมพครั้งสุดทาย
Redo : ทําซําคํ ้ าสังหรื ่ อการพิมพครั้งสุดทาย
Cut : ตัดขอความที่เลือกไวไปเก็บในคลิปบอรดของโปรแกรม
Copy : คัดลอกขอความที่เลือกไวมาเก็บในคลิปบอรด
Paste : นําขอความที่อยูในคลิปบอรดมาแปะลงในตําแหนงที่เคอรเซอรชีอยู ้
Select All : เลือกขอความทั้งหมด
Comment/Uncomment : ใชเติมเครืองหมาย ่ // เพือสร ่ างหมายเหตุหรือคําอธิบายลงใน โปรแกรมหรือยกเลิกหมายเหตุดวยการนําเครื่องหมาย // ออก
Find : คนหาขอความ
Find Next : คนหาขอความถัดไป
2.4.1.3 เมนู Sketch เปนเมนูทีบรรจุ ่ คําสังที ่ ใช ่ ในการคอมไพลโปรแกรม เพิมไฟล ่ ไลบรารี ฯลฯ โดยมีเมนูยอยดังนี้
Verify/Compile : ใชคอมไพลแปลโปรแกรมภาษาซีใหเปนภาษาเครื่อง
Stop : หยุดการคอมไพลโปรแกรม
Add file : เพิ่มไฟลใหกับสเก็ตชบุกปจจุบัน เมือใช ่ คําสังนี ่ ้โปรแกรม Arduino จะทําการ คัดลอกไฟลที่เลือกไวมาเก็บไวในโฟลเดอรเดียวกันกับโปรแกรมที่กําลังพัฒนา
Import Library : เปนคําสังเรี ่ ยกใชไลบรารีเพิมเติ ่ ม เมื่อคลิกเลือกคําสังนี ่ แล ้ ว โปรแกรม Arduino IDE จะแสดงไลบรารีใหเลือก เมือเลื ่ อกแลว โปรแกรมจะแทรกบรรทัดคําสัง่ #include ลง ในสวนตนของไฟล
Show Sketch folder : สั่งเปดโฟลเดอรที่เก็บโปรแกรมของผูใช
Robo-CreatorXT : ATX2 23
2.4.1.4 เมนู Tools ใชจัดรูปแบบของโคดโปรแกรม, เลือกรุนของฮารดแวรไมโครคอนโทรลเลอร Arduino หรือเลือกพอรตเชื่อมตอ เมนูที่ใชงานกับแผงวงจร ATX2 มีดังนี้ Auto Format : จัดรูปแบบของโคดโปรแกรมใหสวยงาม Archive Sketch : สั่ งบี บอัดไฟลโปรแกรมทั้งโฟลเดอร หลั กและโฟลเดอรย อยของ ไฟลสเก็ตชปจจุบัน ไฟลที่สรางใหมจะมีชือเดี ่ ยวกับไฟลสเก็ตชปจจุบันตอทายดวย -510123.zip Export Folder : สั่งเปดโฟลเดอรที่เก็บสเก็ตชบุกปจจุบัน Board : เลือกฮารดแวรของบอรไมโครคอนโทรลเลอร Arduino สําหรับแผงวงจร ATX2 หรือหุนยนต Robo-Creator XT ใหเลือก ATX2 Serial Port : เลือกหมายเลขพอรตของคอมพิวเตอรที่ใชติดตอกับแผงวงจร ATX2
2.4.1.5 เมนู Help เมื่อตองการความชวยเหลือ หรือขอมูลเกียวกั ่ บโปรแกรมใหเลือกเมนูนี้ เมื่อเลือกเมนูยอย ตัวโปรแกรมจะเปดไฟลเว็บเพจ (ไฟลนามสกุล .html) ที่เกียวข ่ องกับหัวขอนั้นๆ โดยไฟลจะเก็บใน เครืองของผู ่ ใชภายในโฟลเดอรที่เก็บ Arduino IDE
2.4.2 แถบเครืองมื ่ อ (ทูลบาร : Tools bar) สําหรับคําสังที ่ มี่ การใชบอยๆ จะนํามาสรางเปนปุมบนแถบเครืองมื ่ อ เพือให ่ คลิกเลือกไดทันที ปุมตางๆ บนแถบเครืองมื ่ อมีดังนี้ Verfy/Compile ใชตรวจสอบการเขียนคําสังในโปรแกรมว ่ า มีถูกตองตามหลักไว ยกรณหรือไม และคอมไพลโปรแกรม Upload to I/O Board ใชอัปโหลดโปรแกรมที่เขียนขึนไปยั ้ งบอรดหรือฮารดแวร Arduino กอนจะอัปโหลดไฟล ตองแนใจวาไดบันทึกไฟลและคอมไพลไฟลสเก็ตชเรียบรอยแลว New ใชสรางสเก็ตไฟล (ไฟลโปรแกรม) ตัวใหม Open ใชแทนเมนู File > Sketchbook เพือเป ่ ดสเก็ตช (ไฟลโปรแกรม) ทีมี่ ในเครือง ่ Save ใชบันทึกไฟลสเก็ตชบุกที่เขียนขึน้
24 Robo-CreatorXT : ATX2
Robo-CreatorXT : ATX2 25
Robo-Creator X T เปนชุดหุนยนตอัตโนมัติเพื่อการศึกษาที่สามารถพัฒนาโปรแกรมควบ คุมดวยภาษา C/C++ ในแบบโอเพนซอรสที่เขากันไดกับซอฟตแวรในโครงการพัฒนาระบบควบคุม ขนาดเล็กเพื่อประยุกตใชงานดานซอฟตแวรและฮารดแวรที่ชื่อ Arduino (www.arduino.cc) Robo-Creator XT มีแผงวงจรควบคุมที่ชื่อวา ATX2 ซึ่งขับมอเตอรไฟตรงได 6 ตัว และเซอร โวมอเตอรอีก 8 ตัวพรอมกัน จัดไดวา เปนชุดหุนยนต อัตโนมัติเพือการศึ ่ กษาขนาดกลางสําหรับเรียน รูการพั ฒนาโปรแกรมทีมี่ ความซับซอนเพิมขึ ่ น้ ตลอดจนการติดตอกับอุปกรณทีมี่ ความพิเศษมากขึน้ อาทิ โมดูลเข็มทิศอิเล็กทรอนิกส, ตัวตรวจจับแสงอินฟราเรดแบบหลายทิศทาง และโมดูลกลองแบบ อนุกรม, โมดูลสื่อสารขอมูลไรสายทั้งแบบคลื่นวิทยุมาตรฐาน, บลูทูธ และ WiFi
26Robo-CreatorXT : ATX2
ดานการนําไปใชในการแขงขันหุนยนต Robo-Creator XT ยังรองรับการพัฒนาเปนหุนยนต เพือ่ แขงขันในระดับนานาชาติไดในทุกเวที ไมวาจะเปน World RoboCup Junio),World Robot Games (WRG), International Robot Olympiad (IRO) และอืนๆ ่ นอกจากนัน้ ยังนําชุดหุนยนต Robo-Creator XT ไปใชสรางโครงงานวิทยาศาสตรและเทคโนโลยี ทีสอดคล ่ องกับการเรียนรูด านสะเต็มศึกษา (STEM Education) ไดอยางมีประสิทธิภาพ
3.1 อุปกรณที่มีในชุดหุนยนต Robo-Creator XT ประกอบดวย 5 สวนหลักๆ คือ
3.1.1 แผงวงจรและอุปกรณอิเล็กทรอนิกส 1. แผงวงจรควบคุมอเนกประสงค ATX2 2. แผงวงจรตรวจจับแสงสะทอนอินฟราเรด ZX-03 จํานวน 3 ชุด 3. แผงวงจรตรวจจับวัตถุและวัดระยะทางดวยคลื่นอัตลตราโซนิก 4. แผงวงจรสวิตช จํานวน 4 ชุด 5. แผงวงจรตรวจจับรหัสลอพรอมแผนรหัสลอพลาสติก
3.1.2 อุปกรณเอาตพุต 5. มอเตอรไฟตรงพรอมเฟองขับ 2 แกน อัตราทด 48:1 จํานวน 4 ชุด 6. เซอรโวมอเตอร VSD-22CMD ภายในใชเฟองโลหะ มีแรงบิดสูง 7. เซอรโวมอเตอรมาตรฐาน
3.1.3 ชินส ้ วนและอุปกรณทางกล 8. แผนฐานโลหะ ATX 9. ลอและยางขนาดเสนผานศูนยกลาง 50 มม. จํานวน 4 ชุด 10. ชิ้นสวนสําหรับประกอบเปนกลไกมือจับ 11. ชุดชิ้นตอพลาสติก 3 แบบ (แนวตรง, มุมฉาก และมุมปาน) รวม 6 ชิ้น 12. ชุดแทงตอพลาสติกแบบมีรู 3 ขนาด (3, 5 และ 12 รู) 13. ชุดเสารองพลาสติด 4 ขนาด (3, 10, 15 และ 25 มม.) 14. เสารองโลหะ 15. ชุดนอตและสกรู 16. ชุดฉากโลหะแบบมีรู
Robo-CreatorXT : ATX2 27
3.1.4 อุปกรณและเครืองมื ่ อประกอบ 17. กะบะถาน AA 6 กอนมีสายและหัวตออะแดปเตอร 18. ไขควง 19. แผนโฟมสําหรับชิ้นสวนมือจับ
3.1.5 สายสัญญาณ 20. สาย miniB-USB 21. สาย JST3AA-8 (จะตอไวกับแผงวงตรตัวตรวจจับทั้งหมด) 22. สาย JST3AC-8 สําหรับแผงวงจรตรวจจับรหัสลอ
3.2 ตัวอยางหุนยนต อัตโนมัติ อุปกรณทีมี่ ในชุดหุนยนต Robo-Creator XT รองรับการสรางหุนยนต ไดหลากหลาย เนืองจาก ่ แผงวงจรควบคุม ATX2 มีจุดตอสัญญาณตางๆ ที่เปนอิสระและมีเอาตพุตขับมอเตอรไดทั้งมอเตอร ไฟตรงและเซอรโวมอเตอร รวมถึงการมีชิ้นสวนและอุปกรณทางกลจํานวนมาก จึงทําใหผูใชงาน สามารถสรางกลไกของหุนยนตไดหลายรูปแบบ และยังใชงานไดกับชิ้นสวนสําหรับตกแตงเพิมเติ ่ ม อาทิ แผนพลาสติกลูกฟูก, ลอแบบหลายทิศทาง, ลอประคอง, ชุดประกอบหุนยนต ของ Tamiya หรือ กระทั่งตัวตอ Lego และ Fischertechnik
3.2.1 คุณสมบัติทางเทคนิคของ RQ-Bot นี่คือตัวอยางของหุนยนตที่ประกอบขึ้นจากชิ้นสวนและอุปกรณในชุด Robo-Creator XT มี ª× èÍ ÇèÒ RQ-BOT (ResQ-BOT) มีคุณสมบัติทางเทคนิคที่นาสนใจดังนี้
28Robo-CreatorXT : ATX2
ใชแผงวงจร ATX2 ควบคุมการทํางาน
ใชไฟเลี้ยงจากแบตเตอรี่ Li-Po 7.4V 1100mA ขับเคลือนด ่ วยมอเตอรไฟตรงพรอมชุดเฟองขับอัตราทด 48:1 จํานวน 4 ชุด เพือให ่ ขับเคลือน ่
แบบ 4 ลอหรือ 4-Wheel Drive (4WD) ได
มีแขนจับวัตถุที่จับ, ปลอย, ยก และวางได ทํางานดวยเซอรโวมอเตอร 2 ตัว สําหรับยก วัตถุในการทําภารกิจหุนยนตกูภัย
ติดตั้งแผงวงจรตรวจจับรหัสลอ ทําใหควบคุมระยะทางในการเคลื่อนทีได ่ แมนยําขึ้น โดย ไมขึ้นกับระดับไฟเลี้ยงของหุนยนต ใชในการเคลื่อนที่บนพื้นที่โลงที่ไมมีเสน เพื่อใหการกําหนด ตําแหนงของหุนยนตคาดการณไดอยางแมนยํามากขึ้น
Robo-CreatorXT : ATX2 29
้ บแสงสะทอนอินฟราเรดใตหุนยนต เพือใช ่ ในการตรวจจับเสนไดทัง้ ติดตังแผงวงจรตรวจจั เสนสีขาวและสีดํา รวมถึงการตรวจจับขอบเขตเพื่อใหหุนยนตเคลื่อนที่ภายในพื้นที่ที่กําหนดได
ตรวจจับวัตถุและสิ่งกีดขวางไดทั้งแบบสัมผัส (ดวยการใชแผงวงจรสวิตช) และแบบไม สัมผัส (ดวยแผงวงตรวจจับวัตถุและวัดระยะทางดวยคลื่นอัลตราโซนิก) ใชในการตรวจจับกําแพง และสิ่งกีดขวางในภารกิจของหุนยนตกูภัย
อัปโหลดและสื่อสารขอมูลกับคอมพิวเตอรผานพอรต USB
รองรับการติดตอกับจอยสติ๊กไรสาย PS2, สมารตโฟนหรือแท็บเล็ตผานบลูทูธดวยโมดูล BlueStick หรือผาน WiFi ดวยโมดูล ESP-01 (ใชชิป ESP8266)
รองรับการติดตอกับ Pixy โมดูลตรวจจับสีและภาพระยะไกลผานทางบัส I2C และ UART
30Robo-CreatorXT : ATX2
3.2.2 การจัดการสัญญาณของหุนยนต RQ-BOT หุนยนต RQ-BOT ออกแบบมาเพือใช ่ ในการแขงขันหุนยนต กูภัยหรือ Rescue Robot จึงตองมี ตัวตรวจจับ, อุปกรณเอาตพุต และกลไกมากพอสมควร ในรูปที่ 3-1 แสดงภาพรวมและการเชื่อมตอ อุปกรณตางๆ ของหุนยนต RQ-BOT
RQ-Bot (ResQ Robot) Robo-Creator XT
ATX2
รูปที่ 3-1 ภาพรวมของหุนยนต RQ-BOT สําหรับการทําภารกิจหุนยนต กูภั ยยุวชน RQ-BOT เปนเพียงหนึงในตั ่ วอยางของหุนยนต อัตโนมัติสําหรับการเรียนรูและ ใชในการแขงขันหุนยนต กูภัยในระดับยุวชน ในชุด Robo-Creator XT ยังมีอุปกรณ อีกมากทีผู่ ใช งานสามารถนํามาดัดแปลงหรือประดิษฐหุนยนต ไดอีกหลากหลาย ทังนี ้ ้ ขึ้นกับภารกิจ ความรู จินตนาการ และความคิดสรางสรรคของผูใชงาน
Robo-CreatorXT : ATX2 31
ในการเขียนโปรแกรมสําหรับแผงวงจร ATX2 และหุนยนต Robo-Creator XT จะตองเขียน โปรแกรมโดยใชภาษา C/C++ ของ Arduino (Arduino programming language) เวอรชัน 1.0 ขึ้นไป ซึงตั ่ วภาษาของ Arduino เองก็นําเอาโอเพนซอรสโปรเจ็กตชือ่ wiring มาพัฒนาตอ ภาษาของ Arduino แบงไดเปน 2 สวนหลักคือ 1. โครงสรางภาษา (structure) ตัวแปรและคาคงที่ 2. ฟงกชัน่ (function) ภาษาของ Arduino จะอางอิงตามภาษา C/C++ จึงอาจกลาวไดวาการเขียนโปรแกรมสําหรับ Arduino ก็คือการเขียนโปรแกรมภาษา C โดยเรียกใชฟงกชันและไลบรารี ่ ที่ทาง Arduino ไดเตรียม ไวใหแลว ซึ่งสะดวก และทําใหผูที่ไมมีความรูด านไมโครคอนโทรลเลอรอยางลึกซึ้งสามารถเขียน โปรแกรมสังงานได ่ ในบทนีจะอธิ ้ บายถึงโครงสรางโปรแกรมของ Arduino เปนหลัก สวนฟงกชันโปรแกรมภาษา ่ C ของ Arduino จะอธิบายในบทที่ 5
4.1 โครงสรางโปรแกรมของ Arduino โปรแกรมของ Arduino แบงไดเปนสองสวนคือ void setup()
และ void loop()
โดยฟงกชัน่ setup() เมือโปรแกรมทํ ่ างานจะทําคําสั่งของฟงกชันนี ่ ้เพียงครังเดี ้ ยว ใชในการ กําหนดคาเริ่มตนของการทํางาน สวนฟงกชั่น loop() เป นสวนทํางาน โปรแกรมจะทําคําสังใน ่ ฟงกชันนี ่ ้ตอเนืองกั ่ นตลอดเวลา โดยปกติใชกําหนดโหมดการทํางานของขาตางๆ กําหนดการสือสาร ่ แบบอนุกรม ฯลฯ สวนของ loop()เปนโคดที่ทํางานจริงอยางตอเนือง ่ เชน อานคาอินพุต ประมวล ผล สังงานเอาต ่ พุต ฯลฯ โดยสวนกําหนดคาเริมต ่ นเชนตัวแปร จะตองเขียนที่สวนหัวของโปรแกรม กอนถึงตัวฟงกชัน่ นอกจากนันยั ้ งตองคํานึงถึงตัวพิมพเล็ก-ใหญของตัวแปรและชื่อฟงกชันให ่ ถูกตอง
32 Robo-CreatorXT : ATX2
4.1.1 สวนของฟงกชั่น setup() ฟงกชันนี ่ ้จะเขียนที่สวนตนของโปรแกรม ทํางานเมื่อโปรแกรมเริมต ่ นเพียงครั้งเดียว ใชเพื่อ กําหนดคาของตัวแปร, โหมดการทํางานของขาตางๆ หรือเริมต ่ นเรียกใชไลบรารี ฯลฯฯ ตัวอยางที่ 4-1 int buttonPin = 3; void setup() { beginSerial(9600); pinMode(buttonPin, INPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) serialWrite('H'); else serialWrite('L'); delay(1000); }
ในขณะทีโปรแกรมภาษา ่ C มาตรฐานทีเขี ่ ยนบน AVR GCC (เปนโปรแกรมภาษา C ทีใช ่ คอมไพเลอรแบบ GCC สําหรับไมโครคอนโทรลเลอร AVR) จะเขียนไดดังนี้ int main(void) { init(); setup();
ตรงกับ void
setup()
ตรงกับ void
loop()
for (;;) loop(); return ; }
Robo-CreatorXT : ATX2 33
4.1.2 สวนของฟงกชั่น loop() หลังจากทีเขี ่ ยนฟงกชัน่ setup()ทีกํ่ าหนดคาเริมต ่ นของโปรแกรมแลว สวนถัดมาคือฟงกชัน่ loop() ซึ่งมีการทํางานตรงตามชื่อคือ จะทํางานตามฟงกชันนี ่ ้วนตอเนื่องตลอดเวลา ภายในฟงกชันนี ่ ้ จะมีโปรแกรมของผูใช เพื่อรับคาจากพอรต ประมวล แลวสั่งเอาตพุตออกขาตางๆ เพื่อควบคุมการ ทํางานของบอรด ตัวอยางที่ 4-2 int buttonPin = 3; void setup()
//
กําหนดชือตั ่ วแปรใหขาพอรต 3 และชนิดของตัวแปร
{ beginSerial(9600); pinMode(buttonPin, INPUT); }
// ลูปตรวจสอบการกดสวิตชทีขาพอร ่ ตซึงถู ่ กประกาศดวยตัวแปร buttonPin void loop() { if (digitalRead(buttonPin) == HIGH) serialWrite('H'); else serialWrite('L'); delay(1000); }
โปรแกรมจะวนทํางานในฟงกชั่น loop() ตลอดเวลา หลังจากทํางานใน ฟ งก ชั่ น setup() จึงอาจสรุปได วา ฟ งกชั่ น setup() คื อ สวนตนของ โปรแกรมที่ใชในการประกาศ หรือตั้งคาการทํางานในตอนเริ่มตนทํางาน ในขณะที่ ฟ งก ชั่ น loop() เปนเสมื อนสวนของโปรแกรมหลักที่ ต องวน ทํางานอยางตอเนื่องตลอดเวลา
34 Robo-CreatorXT : ATX2
4.2 คําสังควบคุ ่ มการทํางาน 4.2.1 คําสั่ง if ใชทดสอบเพือกํ ่ าหนดเงือนไขการทํ ่ างานของโปรแกรม เชน ถาอินพุตมีคามากกวาคาทีกํ่ าหนด ไวจะใหทําอะไร โดยมีรูปแบบการเขียนดังนี้ if (someVariable > 50) { // do something here }
ตัวโปรแกรม จะทดสอบวาถาตัวแปร someVariable มีคามากกวา 50 หรือไม ถาใช ใหทําอะไร ถาไมใชใหขามการทํางานสวนนี้ การทํางานของคําสังนี ่ ้จะทดสอบเงือนไข ่ ที่เขียนในเครื่องหมายวงเล็บ ถ าเงื่อนไขเปนจริง ทําตามคําสังที ่ ่เขียนในวงเล็บปกกา ถาเงือนไขเป ่ นเท็จ ขามการทํางานสวนนี้ไป สวนของการทดสอบเงือนไขที ่ เขี ่ ยนอยูภายในวงเล็ บ จะตองใชตัวกระทําเปรียบเทียบตางๆ ดังนี้ x == y (x เทากับ y) x != y (x ไมเทากับ y) x < y (x นอยกวา y) x > y (x มากกวา y) x <= y (x นอยกวาหรือเทากับ y) x >= y (x มากกวาหรือเทากับ y)
เทคนิคสําหรับการเขียนโปรแกรม ในการเปรียบเทียบตัวแปรใหใชตัวกระทํา = = เชน if (x==10) หามเขียนผิดเปน = เชน if(x=10) คําสังที ่ ่เขียนผิดในแบบนี้ ผลการทดสอบจะเปนจริงเสมอ เมื่อผานคําสังนี ่ ้แลว x จะมีคา เทากับ 10 ทําใหการทํางานของโปรแกรมผิดเพี้ยนไป ไมเปนตามที่กําหนดไว นอกจากนันยั ้ งใชคําสัง่ if ควบคุมการแยกเสนทางของโปรแกรม โดยใชคําสัง่ if..else ไดดวย
Robo-CreatorXT : ATX2 35
4.2.2 คําสั่ง
if...else
ใชทดสอบเพื่อกําหนดเงือนไขการทํ ่ างานของโปรแกรมไดมากกวาคําสั่ง if ธรรมดา โดย สามารถกําหนดไดวา ถาเงือนไขเป ่ นจริงใหทําอะไร ถาเปนเท็จใหทําอะไร เชน ถาคาอินพุตอะนาลอก ที่อานไดนอยกวา 500 ใหทําอะไร ถาคามากกวาหรือเทากับ 500 ใหทําอีกอยาง เขียนคําสังได ่ ดังนี้ ตัวอยางที่ 4-3 if (pinFiveInput < 500) {
// คําสั่งเพือทํ ่ างานอยางหนึ่ง เนื่องมาจาก pinFiveInput มีคานอยกวา 500 } else {
// คําสั่งเพือทํ ่ างานอีกอยางหนึง่ เนื่องมาจาก pinFiveInput มีคามากวาหรือเทากับ 500 }
หลังคําสัง่ else สามารถตามดวยคําสั่ง if ทําใหรูปแบบคําสั่งกลายเปน if...else...if เปนการทดสอบเงื่อนไขตางๆ เมือเป ่ นจริงใหทําตามที่ตองการ ดังตัวอยางตอไปนี้ ตัวอยางที่ 4-4 if (pinFiveInput < 500) {
// คําสังเพื ่ อทํ ่ างานอยางหนึ่ง เนื่องมาจาก pinFiveInput มีคานอยกวา 500 } else if (pinFiveInput >= 1000) {
// คําสังเพื ่ อทํ ่ างานอีกอยางหนึ่ง เนื่องมาจาก pinFiveInput มีคามากกวาหรือเทากับ 1000 } else {
// คําสังเพื ่ อกํ ่ าหนดใหทํางานตอไปในกรณีที่ pinFiveInput ไมไดมีคานอยกวา 500 // และมากกวาหรือเทากับ 1000 (นันคื ่ อ จะมีการกระทําคําสังในโปรแกรมย ่ อยนี้ // เมือตั ่ วแปรมีคาอยูระหวาง 501 ถึง 999 (ฐานสิบ) }
หลังคําสัง่ else ตามดวยคําสัง่ if ไดไมจํากัด (หรือใชคําสั่ง switch if...else...if สําหรับการทดสอบเงื่อนไขจํานวนมากๆ ได)
case
แทนคําสั่ง
เมื่อใชคําสัง่ if...else แลว ตองกําหนดดวยวา ถาทดสอบไมตรงกับเงื่อนไขใดๆ เลย ให ทําอะไร โดยใหกําหนดทีคํ่ าสัง่ else ตัวสุดทาย
36 Robo-CreatorXT : ATX2
4.2.3 คําสั่ง
for()
คําสังนี ่ ้ใชเพื่อสั่งใหคําสังที ่ ่อยูภายในวงเล็ บปกกาหลัง for มีการทํางานซํากั ้ นตามจํานวนรอบ ที่ตองการ คําสังนี ่ ้มีประโยชนมากสําหรับการทํางานใดๆ ที่ตองทําซํากั ้ นและทราบจํานวนรอบของ การทําซํ้ าที่แนนอน มักใชคูกับตัวแปรอะเรยในการเก็บสะสมคาที่อานไดจากขาอินพุตอะนาลอก หลายๆ ขาที่มีหมายเลขขาตอเนืองกั ่ น รูปแบบของคําสัง่ for() แบงได 3 สวนดังนี้ for (initialization; condition; increment) { //statement(s); }
เริมต ่ นดวย initialization ใชกําหนดคาเริมต ่ นของตัวแปรควบคุมการวนรอบ ในการทํางาน แตละรอบจะทดสอบ condition ถาเงือนไขเป ่ นจริงจะกระทําคําสังในวงเล็ ่ บปกกา แลวมาเพิมหรื ่ อลด คาตัวแปรตามทีสั่ งใน ่ increment แลวทดสอบเงือนไขอี ่ ก ทําซําจนกว ้ าเงือนไขเป ่ นเท็จ ตัวอยางที่ 4-5 for (int i=1; i <= 8; i++) {
// คําสังเพื ่ อทํ ่ างานโดยใชคาของตัวแปร i และวนทํางานจนกระทังค ่ าของตัวแปร i มากกวา 8; }
คําสัง่ for ของภาษา C จะยืดหยุนกว าคําสัง่ for ของภาษาคอมพิวเตอรอื่นๆ โดยอนุญาตให ละเวนบางสวนหรือทั้งสามสวนของคําสัง่ for ได อยางไรก็ตามยังคงตองมีเซมิโคลอน
4.2.4 คําสั่ง
switch-case
ใชทดสอบเงือนไขเพื ่ อกํ ่ าหนดการทํางานของโปรแกรม ถาตัวแปรที่ทดสอบตรงกับเงื่อนไข ใดก็ใหทํางานตามที่กําหนดไว พารามิเตอร var ตัวแปรที่ตองการทดสอบวาตรงกับเงือนไขใด ่ default ถาไมตรงกับเงือนไขใดๆ ่ เลยใหทําคําสังต ่ อทายนี้ break คําสังหยุ ่ ดการทํางาน ใชเขียนตอทาย case ตางๆ ถาไมไดเขียน โปรแกรมจะวนทํางาน ตามเงือนไขต ่ อไปเรื่อยๆ
Robo-CreatorXT : ATX2 37
ตัวอยางที่ 4-6 switch (var) { case 1:
// คําสังเพื ่ อทํ ่ างาน เมือค ่ าของตัวแปรเทากับ 1 break; case 2:
// คําสังเพื ่ อทํ ่ างาน เมือค ่ าของตัวแปรเทากับ 2 break; default:
// ถาหากคาของตัวแปรไมใช 1 และ 2 ใหกระทําคําสังในส ่ วนนี้ }
4.2.5 คําสั่ง while เปนคําสังวนรอบ ่ โดยจะทําคําสังที ่ เขี่ ยนในวงเล็บปกกาอยางตอเนือง ่ จนกวาเงือนไขในวงเล็ ่ บของ คําสัง่ while() จะเปนเท็จ คําสังที ่ ให ่ ทําซําจะต ้ องมีการเปลียนแปลงค ่ าตัวแปรทีใช ่ ทดสอบ เชน มีการ เพิมต ่ าตัวแปร หรือมีเงือนไขภายนอกเช ่ นอานคาจากเซ็นเซอรไดเรียบรอยแลวใหหยุดการอานคา มิฉะนัน้ เงือนไขในวงเล็ ่ บของ while() เปนจริงตลอดเวลา ทําใหคําสัง่ while ทํางานวนรอบ ไมรูจบ รูปแบบคําสั่ง while(expression) { // statement(s); }
พารามิเตอร expression เปนคําสังทดสอบเงื ่ อนไข ่ (ถูกหรือผิด) ตัวอยางที่ 4-7 var = 0; while(var < 200) {
// คําสังเพื ่ อทํ ่ างาน โดยวนทํางานทังสิ ้ น้ 200 รอบ var++; }
38 Robo-CreatorXT : ATX2
4.3 ตัวกระทําทางคณิตศาสตร ประกอบดวยตัวกระทํา 5 ตัวคือ + (บวก), - (ลบ), * (คูณ), / (หาร) และ % (หารเอาเศษ)
4.3.1 ตัวกระทําทางคณิตศาสตร บวก ลบ คูณ และหาร ใชหาคาผลรวม ผลตาง ผลคูณ และผลหารคาของตัวถูกกระทําสองตัว โดยใหคําตอบมีประเภท ตรงกับตัวถูกกระทําทั้งสองตัว เชน 9/4 ใหคําตอบเทากับ 2 เนืองจากทั ่ ้ง 9 และ 4 เปนตัวแปรเลข จํานวนเต็ม (int) นอกจากนี้ตัวกระทําทางคณิตศาสตรอาจทําใหเกิดโอเวอรโฟลว (overflow) ถาผลลัพธทีได ่ มี ขนาดใหญเกินกวาจะสามารถเก็บในตัวแปรประเภทนั้น ถาตัวทีถู่ กกระทําตางประเภทกันผลลัพธได เปนจะมีขนาดใหญขึ้นเทากับประเภทของตัวแปรที่ใหญที่สุด (เชน 9/4 = 2 หรือ 9/4.0 = 2.25) รูปแบบคําสั่ง result = value1 + value2; result = value1 - value2; result = value1 * value2; result = value1 / value2;
พารามิเตอร value1 : เปนคาของตัวแปรหรือคาคงทีใดๆ ่ value2: เปนคาของตัวแปรหรือคาคงทีใดๆ ่ ตัวอยางที่ 4-8 y = y + 3; x = x - 7; i = j * 6; r = r / 5;
เทคนิคสําหรับการเขียนโปรแกรม เลือกขนาดของตัวแปรใหใหญพอสําหรับเก็บคาผลลัพธที่มากที่สุดของการคํานวณ ตองทราบวา ที่คาใดตัวแปรที่เก็บจะมีการวนซํ้าคากลับ และวนกลับอยางไร เชน จาก 0 ไป 1 หรือจาก 0 ไป -32768 สําหรับการคําณวณทีต ่ องการเศษสวนใหใชตัวแปรประเภท float แตใหระวังผลลบ เชน ตัวแปรมีขนาดใหญ คํานวณไดชา ่ วแปรชัวคราวขณะ ่ ใชตัวกระทํา cast เชน (int)myfloat ในการเปลียนประเภทของตั ทีโปรแกรมทํ ่ างาน
Robo-CreatorXT : ATX2 39
4.3.2 ตัวกระทํา % หารเอาเศษ ใชหาคาเศษที่ไดของการหารเลขจํานวนเต็ม 2 ตัว ตัวกระทําหารเอาเศษใชงานกับตัวแปรเลข ทศนิยม (float) ไมได รูปแบบคําสั่ง result = value1 % value2;
พารามิเตอร value1 - เปนตัวแปรประเภท byte,char,int หรือ long value2 - เปนตัวแปรประเภท byte,char,int หรือ long ผลทีได ่ เศษจากการหารคาเลขจํานวนเต็ม เปนขอมูลชนิดเลขจํานวนเต็ม ตัวอยางที่ 4-9 x = 7 % 5;
// x now contains 2
x = 9 % 5;
// x now contains 4
x = 5 % 5;
// x now contains 0
x = 4 % 5;
// x now contains 4
ตัวกระทําหารเอาเศษนี้มักนําไปใชในงานที่ตองการใหเหตุการณเกิดขึ้นดวยชวงเวลาที่สมํ่า เสมอ หรือใชทําใหหนวยความที่เก็บตัวแปรอะเรยเกิดการลนคากลับ (roll over) ตัวอยางที่ 4-10 // ตรวจสอบคาของตัวตรวจจับ 10 ครั้งตอการทํางาน 1 รอบ void loop() { i++; if ((i % 10) == 0)
// หารคาของ i ดวย 10 แลวตรวจสอบเศษการหารเปน 0 หรือไม { x = analogRead(sensPin);
// อานคาจากตัวตรวจจับ 10 ครั้ง } }
ในตัวอยางนี้เปนการนําคําสัง่ % มาใชกําหนดรอบของการทํางาน โดยโปรแกรมวนทํางานเพื่อ อานคาจนกวาผลการหารเอาเศษของคําสัง่ i % 10 จะเทากับ 0 ซึงจะเกิ ่ ดขึนเมื ้ ่อ i = 10 เทานั้น
40 Robo-CreatorXT : ATX2
4.4 ตัวกระทําเปรียบเทียบ ใชประกอบกับคําสัง่ if() เพื่อทดสอบเงือนไขหรื ่ อเปรียบเทียบคาตัวแปรตาง โดยจะเขียน เปนนิพจนอยูภายในเครื่องหมาย () x == y (x เทากับ y) x != y (x ไมเทากับ y) x < y (x นอยกวา y) x > y (x มากกวา y) x <= y (x นอยกวาหรือเทากับ y) x >= y (x มากกวาหรือเทากับ y)
4.5 ตัวกระทําทางตรรกะ ใชในการเปรียบเทียบของคําสัง่ if() มี 3 ตัวคือ &&, || และ !
4.5.1 && (ตรรกะ และ) ใหคาเปนจริงเมือผลการเปรี ่ ยบเทียบทังสองข ้ างเปนจริงทั้งคู ตัวอยางที่ 4-11 if (x > 0 && x < 5) { // ... }
ใหคาเปนจริงเมื่อ x มากกวา 0 และนอยกวา 5 (มีคา 1 ถึง 4)
4.5.2 || (ตรรกะ หรือ) ใหคาเปนจริง เมือผลการเปรี ่ ยบเทียบพบวา มีตัวแปรใดเปนจริงหรือเปนจริงทั้งคู ตัวอยางที่ 4-12 if (x > 0 || y > 0) { // ... }
ใหผลเปนจริงเมื่อ x หรือ y มีคามากกวา 0
Robo-CreatorXT : ATX2 41
4.5.3 ! (ใชกลับผลเปนตรงกันขาม) ใหคาเปนจริง เมือผลการเปรี ่ ยบเทียบเปนเท็จ ตัวอยางที่ 4-13 if (!x) { // ... }
ใหผลเปนจริงถา x เปนเท็จ (เชน ถา x = 0 ใหผลเปนจริง)
4.5.4 ขอควรระวัง ระวังเรืองการเขี ่ ยนโปรแกรม ถาตองการใชตัวกระทําตรรกะและ ตองเขียนเครื่องหมาย && ถาลืมเขียนเปน & จะเปนตัวกระทําและระดับบิตกับตัวแปร ซึ่งใหผลที่แตกตาง เชนกันในการใชตรรกะหรือใหเขียนเปน || (ขีดตังสองตั ้ วติดกัน) ถาเขียนเปน | (ขีดตังตั ้ วเดียว) จะหมายถึงตัวกระทําหรือระดับบิตกับตัวแปร ตัวกระทํา NOT ระดับบิต (~) จะแตกตางจากตัวกลับผลใหเปนตรงขาม (!) ใหเลือกใชใหถูก ตอง ตัวอยางที่ 4-14 if (a >= 10 && a <= 20){}
// ใหผลการทํางานเปนจริงเมือ่ a มีคาอยูระหวาง 10 ถึง 20
42 Robo-CreatorXT : ATX2
4.6 ตัวกระทําระดับบิต ตัวกระทําระดับจะนําบิตของตัวแปรมาประมวลผล ใชประโยชนในการแกปญหาดานการเขียน โปรแกรมไดหลากหลาย ตัวกระทําระดับของภาษาซี (ซึงรวมถึ ่ ง Arduino) มี 6 ตัวไดแก & (bitwise AND), | (OR), ^ (Exclusive OR), ~ (NOT), << (เลือนบิ ่ ตไปทางขวา) และ >> (เลือนบิ ่ ตไปทางซาย)
4.6.1 ตัวกระทําระดับบิต AND (&) คําสัง่ AND ในระดับบิตของภาษาซีเขียนไดโดยใช & หนึงตั ่ ว โดยตองเขียนระหวางนิพจน หรือตัวแปรที่เปนเลขจํานวนเต็ม การทํางานจะนําขอมูลแตละบิตของตัวแปรทั้งสองตัวมากระทําทาง ตรรกะ AND โดยมีกฎดังนี้ ถาอินพุตทั้งสองตัวเปน “1” ทั้งคูเอาตพุตเปน “1” กรณีอื่นๆ เอาตพุตเปน “0” ดังตัวอยางตอ ไปนี้ ในการดูใหคูของตัวกระทําตามแนวตั้ง 0 0 1 1 0 1 0 1 —————————— 0 0 0 1
Operand1 Operand2 Returned result
ใน Arduino ตัวแปรประเภท int จะมีขนาด 16 บิต ดังนั้นเมือใช ่ ตัวกระทําระดับบิต AND จะมี การกระทําตรรกะและพรอมกันกับขอมูลทั้ง 16 บิต ดังตัวอยางในสวนของโปรแกรมตอไปนี้ ตัวอยางที่ 4-15 // เทากับ 0000000001011100 ฐานสอง int b = 101; // เทากับ 0000000001100101 ฐานสอง // ผลลัพธคือ 0000000001000100 ฐานสองหรือ 68 ฐานสิบ int c = a & b; ในตัวอยางนี้จะนําขอมูลทัง้ 16 บิตของตัวแปร a และ b มากระทําทางตรรกะ AND แลวนําผลลัพธทีได ่ ทัง้ 16 บิตไปเก็บที่ตัวแปร c ซึงได ่ คาเปน 01000100 ในเลขฐานสองหรือเทากับ 68 ฐานสิบ int a =
92;
นิยมใชตัวกระทําระดับบิต AND เพื่อใชเลือกขอมูลบิตที่ตองการ (อาจเปนหนึงบิ ่ ตหรือหลาย บิต) จากตัวแปร int ซึ่งการเลือกเพียงบางบิตนีจะเรี ้ ยกวา masking
Robo-CreatorXT : ATX2 43
4.6.2 ตัวกระทําระดับบิต OR (|) คําสั่ งระดับบิต OR ของภาษาซีเขียนไดโดยใชเครืองหมาย ่ |หนึ่ งตัว โดยตองเขียนระหวาง นิพจนหรือตัวแปรที่เปนเลขจํานวนเต็ม การทํางานจะนําขอมูลแตละบิตของตัวแปรทั้งสองตัวมากระ ทําทางตรรกะ OR โดยมีกฎดังนี้ ถาอินพุตตัวใดตัวหนึงหรื ่ อทังสองตั ้ วเปน “1” เอาตพุตเปน “1” กรณีทีอิ่ นพุตเปน “0” ทังคู ้ เอาต พุตจึงจะเปน “0” ดังตัวอยางตอไปนี้ 0 0 1 1 0 1 0 1 —————————— 0 1 1 1
Operand1 Operand2 Returned result
ตัวอยางที่ 4-16 สวนของโปรแกรมแสดงการใชตัวกระทําระดับบิต OR int a =
92;
int b = 101; int c = a | b;
// เทากับ 0000000001011100 ฐานสอง // เทากับ 0000000001100101 ฐานสอง // ผลลัพธคือ 0000000001111101 ฐานสอง หรือ 125 ฐานสิบ
ตัวอยางที่ 4-17 โปรแกรมแสดงการใชตัวกระทําระดับบิต AND และ OR ตัวอยางงานทีใช ่ ตัวกระทําระดับบิต AND และ OR เปนงานทีโปรแกรมเมอร ่ เรียกวา ReadModify-Write on a port สําหรับไมโครคอนโทรลเลอร 8 บิต คาที่อานหรือเขียนไปยังพอรตมีขนาด 8 บิต ซึงแสดงค ่ าอินพุตที่ขาทัง้ 8 ขา การเขียนคาไปยังพอรตจะเขียนคาครั้งเดียวไดทัง้ 8 บิต ตัวแปรชื่อ PORTD เปนคาที่ใชแทนสถานะของขาดิจิตอลหมายเลข 0,1,2,3,4,5,6,7 ถาบิต ใดมีคาเปน 1 ทําใหขานันมี ้ คาลอจิกเปน HIGH (อยาลืมกําหนดใหขาพอรตนั้นๆ ทํางานเปนเอาตพุตดวย คําสัง่ pinMode() กอน) ดังนันถ ้ ากําหนดคาให PORTD = B00110001; ก็คือตองการใหขา 2,3 และ 7 เปน HIGH ในกรณีนี้ไมตองเปลี่ยนคาสถานะของขา 0 และ 1 ซึ่งปกติแลวฮารดแวรของ Arduino ใชใน การสื่อสารแบบอนุกรม ถาไปเปลียนค ่ าแลวจะกระทบตอการสื่อสารแบบอนุกรม อัลกอริธึมสําหรับโปรแกรมเปนดังนี้ อานคาจาก PORTD แลวลางคาเฉพาะบิตทีต ่ องการควบคุม (ใชตัวกระทําแบบบิต AND) นําคา PORTD ที่แกไขจากขางตนมารวมกับคาบิตที่ตองการควบคุม (ใชตัวกระทําแบบ บิต OR) เขียนเปนโปรแกรมไดดังนี้
44 Robo-CreatorXT : ATX2
int i;
// counter variable
int j; void setup() { DDRD = DDRD | B11111100; // Serial.begin(9600);
กําหนดทิศทางของขาพอรต 2 ถึง 7 ดวยคา 11111100
} void loop() { for (i=0; i<64; i++) { PORTD = PORTD & B00000011; j = (i << 2);
// กําหนดขอมูลไปยังขาพอรต 2 ถึง 7
PORTD = PORTD | j; Serial.println(PORTD, BIN);
// แสดงคาของ PORTD ที่หนาตาง Serial montior delay(100); } }
4.6.3 คําสั่งระดับบิต Exclusive OR (^) เปนโอเปอรเตอรพิเศษทีไม ่ คอยไดใชในภาษา C/C++ ตัวกระทําระดับบิต exclusive OR (หรือ XOR) จะเขียนโดยใชสัญลักษณเครืองหมาย ่ ^ ตัวกระทํานีมี้ การทํางานใกลเคียงกับตัวกระทําระดับ บิต OR แตตางกันเมืออิ ่ นพุตเปน “1” ทั้งคูจะใหเอาตพุตเปน “0” แสดงการทํางานไดดังนี้ 0 0 1 1 0 1 0 1 —————————— 0 1 1 0
Operand1 Operand2 Returned result
หรือกลาวไดอีกอยางวา ตัวกระทําระดับบิต XOR จะใหเอาตพุตเปน “0” เมืออิ ่ นพุตทั้งสอง ตัวมีคาเหมือนกัน และใหเอาตพุตเปน “1” เมืออิ ่ นพุตทั้งสองมีคาตางกัน ตัวอยางที่ 4-18 int x = 12; int y = 10; int z = x ^ y;
// คาเลขฐานสองเทากับ 1100 // คาเลขฐานสองเทากับ 1010 // ผลลัพธเทากับ 0110 ฐานสองหรือ 6 ฐานสิบ
ตัวกระทําระดับบิต XOR จะใชมากในการสลับคาบางบิตของตัวตัวแปร int เชน กลับจาก “0” เปน “1” หรือกลับจาก “1” เปน “0”
Robo-CreatorXT : ATX2 45
เมือใช ่ ตัวกระทําระดับบิต XOR ถาบิตของ mask เปน “1” ทําใหบิตนันถู ้ กสลับคา ถา mask มีคาเปน “1” บิตนันมี ้ คาคงเดิม ตัวอยางตอไปนี้เปนโปรแกรมแสดงการสั่งใหขาดิจิตอล 5 มีการกลับ ลอจิกตลอดเวลา ตัวอยางที่ 4-19 void setup() { DDRD = DDRD | B00100000; }
// กําหนดขา 5 เปนเอาตพุต
void loop() { PORTD = PORTD ^ B00100000; delay(100);
// กลับลอจิกที่ขา 5
}
4.6.4 ตัวกระทําระดับบิต NOT (~) ตัวกระทําระดับบิต NOT จะเขียนโดยใชสัญลักษณเครืองหมาย ่ ~ ตัวกระทํานีจะใช ้ งานกับ ตัวถูกกระทําเพียงตัวเดียวที่อยูขวามือ โดยทําการสลับบิตทุกบิตใหมีคาตรงกันขามคือ จาก “0” เปน “1” และจาก “1” เปน “0” ดังตัวอยาง 0 1 ————— 1 0
Operand1 ~ Operand1
int a = 103; int b = ~a;
// binary: 0000000001100111 // binary: 1111111110011000
เมื่อกระทําแลว ทําใหตัวแปร b มีคา -104 (ฐานสิบ) ซึงคํ ่ าตอบทีได ่ ติดลบเนืองจากบิ ่ ตที่มีความ สําคัญสูงสุด (บิตซายมือสุด) ของตัวแปร int อันเปนบิตแจงวาตัวเลขเปนบวกหรือลบ มีคาเปน “1” แสดงวา คาทีได ่ นีติ้ ดลบ โดยในคอมพิวเตอรจะเก็บคาตัวเลขทังบวกและลบตามระบบทู ้ คอมพลีเมนต (2’s complement) การประกาศตัวแปร int ซึงมี ่ ความหมายเหมือนกับการประกาศตัวแปรเปน signed int ตองระวัง คาของตัวแปรจะติดลบได
46 Robo-CreatorXT : ATX2
4.6.5 คําสั่งเลือนบิ ่ ตไปทางซาย (<<) และเลือนบิ ่ ตไปทางขวา (>>) ในภาษา C/C++ มีตัวกระทําเลื่อนบิตไปทางซาย << และเลือนบิ ่ ตไปทางขวา >> ตัวกระทํา นี้จะสังเลื ่ ่อนบิตของตัวถูกกระทําที่เขียนดานซายมือไปทางซายหรือไปทางขวาตามจํานวนบิตที่ระบุ ไวในดานขวามือของตัวกระทํา รูปแบบคําสั่ง variable << number_of_bits variable >> number_of_bits
พารามิเตอร variable เปนตัวแปรเลขจํานวนเต็มทีมี่ จํานวนบิตนอยกวาหรือเทากับ 32 บิต (หรือตัวแปรประ เภท byte, int หรือ long) ตัวอยางที่ 4-20 int a = 5; int b = a << 3; int c = b >> 3;
// เทากับ 0000000000000101 ฐานสอง // ไดผลลัพธเปน 0000000000101000 ฐานสองหรือ 40 // ไดผลลัพธเปน 0000000000000101 ฐานสองหรือ 5 ฐานสิบ
ตัวอยางที่ 4-21 เมื่อสังเลื ่ ่อนคาตัวแปร x ไปทางซายจํานวน y บิต (x << y) บิตขอมูลที่อยูด านซายสุดของ x จํานวน y ตัวจะหายไปเนืองจากถู ่ กเลื่อนหายไปทางซายมือ int a = 5; int b = a << 14;
// เทากับ 0000000000000101ฐานสอง // ไดผลลัพธเปน 0100000000000000 ฐานสอง
การเลือนบิ ่ ตไปทางซาย จะทําใหคาของตัวแปรดานซายมือของตัวกระทําจะถูกคูณดวยคาสอง ยกกําลังบิตที่เลือนไปทางซ ่ ายมือ ดังนี้ 1 << 0 1 << 1 1 << 2 1 << 3 ... 1 << 8 1 << 9 1 << 10 ...
== == == ==
1 2 4 8
== 256 == 512 == 1024
เมือสั ่ งเลื ่ อนตั ่ วแปร x ไปทางขวามือจํานวน y บิต (x >> y) จะมีผลแตกตางกันขึนกั ้ บประเภท ของตัวแปร ถา x เปนตัวแปรประเภท int คาที่เก็บไดมีทั้งคาบวกและลบ โดยบิตซายมือสุดจะเปน sign bit หรือบิตเครืองหมาย ่ ถาเปนคาลบ คาบิตซายมือสุดจะมีคาเปน 1 กรณีนี้เมือสั ่ ่งเลื่อนบิตไปทาง
Robo-CreatorXT : ATX2 47
ขวามือแลว โปรแกรมจะนําคาของบิตเครืองหมายมาเติ ่ มใหกับบิตทางซายมือสุด ปรากฏการณนี้เรียก วา sign extension มีตัวอยางดังนี้ ตัวอยางที่ 4-22 int x = -16; int y = x >> 3;
// เทากับ 1111111111110000 ฐานสอง // เลือนบิ ่ ตของตัวแปร x ไปทางขวา 3 ครั้ง // ไดผลลัพธเปน 1111111111111110 ฐานสอง
ถาตองการเลือนบิ ่ ตไปทางขวามือแลวใหคา 0 มาเติมยังบิตซายมือสุด (ซึงเกิ ่ ดกับกรณีทีตั่ วแปร เปนประเภท unsigned int) ทําไดโดยใชการเปลี่ยนประเภทตัวแปรชัวคราว ่ (typecast) เพื่อเปลี่ยนให ตัวแปร x เปน unsigned int ชัวคราวดั ่ งตัวอยางตอไปนี้ ตัวอยางที่ 4-23 int x = -16; int y = unsigned(x) >> 3;
// เทากับ 1111111111110000 ฐานสอง // เลือนบิ ่ ตของตัวแปร x (แบบไมคิดเครื่องหมาย) // ไปทางขวา 3 ครั้ง // ไดผลลัพธเปน 0001111111111110 ฐานสอง
ถาหากระมัดระวังเรือง ่ sign extension แลว ก็จะใชตัวกระทําเลื่อนบิตไปทางขวามือสําหรับ หารคาตัวแปรดวย 2 ยกกําลังตางๆ ไดดังตัวอยาง ตัวอยางที่ 4-24 int x = 1000; int y = x >> 3;
// หารคาของ 1000 ดวย 8 (มาจาก 23) ทําให y = 125
48 Robo-CreatorXT : ATX2
4.7 ไวยากรณภาษาของ Arduino 4.7.1 ; (เซมิโคลอน - semicolon) ใชเขียนแจงวา จบคําสัง่ ตัวอยางที่ 4-25 int a = 13;
บรรทัดคําสั่งที่ลืมเขียนปดทายดวยเซมิโคลอน จะทําใหแปลโปรแกรมไมผาน โดยตัวแปร ภาษาอาจจะแจงใหทราบวา ไมพบเครืองหมายเซมิ ่ โคลอน หรือแจงเปนการผิดพลาดอื่นๆ บางกรณี ที่ตรวจสอบบรรทัดที่แจงวาเกิดการผิดพลาดแลวไมพบที่ผิด ใหตรวจสอบบรรทัดกอนหนานัน้
4.7.2 {
}
(วงเล็บปกกา - curly brace)
เครืองหมายวงเล็ ่ บปกกา เปนสวนสําคัญของภาษา C ใชกําหนดขอบเขตการทํางานในแตละชวง วงเล็บปกกาเปด { จะตองเขียนตามดวยวงเล็บปกกาปด } ดวยเสมอ หรือเรียกวา วงเล็บตองครบ คู ในซอฟตแวร Arduino IDE ทีใช ่ เขียนโปรแกรมจะมีความสามารถในการตรวจสอบการครบคูของ เครืองหมายวงเล็ ่ บ ผูใช งานเพียงแคคลิกทีวงเล็ ่ บ มันจะแสดงวงเล็บทีเหลื ่ อซึงเป ่ นคูของมั น สําหรับโปรแกรมเมอรมือใหมและโปรแกรมเมอรทีย่ ายจากภาษา BASIC มาเปนภาษา C มักจะ สับสนกับการใชเครืองหมายวงเล็ ่ บ แททีจริ ่ งแลวเครืองหมายป ่ กกาปดนีเที ้ ยบไดกับคําสัง่ RETURN ของ subroutine (function) หรือแทนคําสัง่ ENDIF ในการเปรียบเทียบ และแทนคําสัง่ NEXT ของคําสังวน ่ รอบ FOR เนืองจากมี ่ การใชวงเล็บปกกาไดหลากหลาย ดังนันเมื ้ อต ่ องการเขียนคําสังที ่ ต่ องใชเครืองหมายวง ่ เล็บ เมือเขี ่ ยนวงเล็บเปดแลวใหเขียนเครืองหมายวงเล็ ่ บปดทันที ถัดมาจึงคอยเคาะปุม Enter ในระหวาง เครืองหมายวงเล็ ่ บเพือขึ ่ นบรรทั ้ ดใหม แลวเขียนคําสังที ่ ต่ องการ ถาทําไดตามนีวงเล็ ้ บจะครบคูแน นอน สําหรับวงเล็บทีไม ่ ครบคู ทําใหเกิดความผิดพลาดในขณะคอมไพลโปรแกรม ถาเปนโปรแกรม ขนาดใหญจะหาทีผิ่ ดไดยาก ตําแหนงทีอยู ่ ของเครื องหมายวงเล็ ่ บแตละตัวมีผลอยางมากตอไวยากรณของ ภาษาคอมพิวเตอร การยายตําแหนงวงเล็บไปเพียงหนึงหรื ่ อสองบรรทัด ทําใหตัวโปรแกรมทํางานผิดไป ตําแหนงที่ใชวงเล็บปกกา ฟงกชัน่ (Function) void myfunction(datatype argument) { statements(s) }
Robo-CreatorXT : ATX2 49
คําสังวนรอบ ่ (Loops) while (boolean expression) { statement(s) } do { statement(s) } while (boolean expression); for (initialisation; termination condition; incrementing expr) { statement(s) }
คําสังทดสอบเงื ่ ่อนไข (condition) if (boolean expression) { statement(s) } else if (boolean expression) { statement(s) } else { statement(s) }
4.7.3
// และ /*...*/
หมายเหตุบรรทัดเดียวและหลายบรรทัด
เปนสวนของโปรแกรมทีใช ่ เขียนเพิมเติ ่ มวา โปรแกรมทํางานอยางไร โดยสวนทีเป ่ นหมายเหตุจะไม ถูกคอมไพล ไมนําไปประมวลผล มีประโยชนมากสําหรับการตรวจสอบโปรแกรมในภายหลังหรือใชแจง ใหเพือนร ่ วมงานหรือบุคคลอืนทราบว ่ า บรรทัดนีทํ้ าอะไร ตัวหมายเหตุของภาษา C มี 2 ประเภทคือ (1) หมายเหตุบรรรทัดเดียว เขียนเครื่องสแลช // 2 ตัวหนาบรรทัด (2) หมายเหตุหลายบรรทัด เขียนเครื่องหมายสแลช / คูกับดอกจัน * ครอมขอความทีเป ่ น หมายเหตุ เชน /* blabla */
50 Robo-CreatorXT : ATX2
4.7.4 #define เปนคําสังที ่ ใช ่ งานมากในการกําหนดคาคงทีให ่ กับโปรแกรม เนืองจากเป ่ นการกําหนดคาที่ไม ใชพืนที ้ ่หนวยความจําของไมโครคอนโทรลเลอรแตอยางใด เมือถึ ่ งขั้นตอนแปลภาษา คอมไพเลอร จะแทนที่ตัวอักษรดวยคาที่กําหนดไว ใน Arduino จะใช คําสัง่ #define ตรงกับภาษา C รูปแบบ #define constantName value
อยาลืมเครื่องหมาย # ตัวอยางที่ 4-26 // เปนการกําหนดใหตัวแปร ledPin เทากับคาคงที่ 3 ทายคําสั่ง #define ไมตองมีเครื่องหมายเซมิโคลอน
#define ledPin 3
4.7.5 #include ใชสั่งใหรวมไฟลอื่นๆ เขากับไฟลโปรแกรมของเรากอน แลวจึงทําการคอมไพลโปรแกรม รูปแบบคําสั่ง #include <file> #include “file”
ตัวอยางที่ 4-27 #include <stdio.h> #include "ATX2.h"
บรรทัดแรกจะสั่งใหเรียกไฟล stdio.h มารวมกับไฟลโปรแกรมที่กําลังพัฒนา โดยคนหาไฟลจากตําแหนง ทีเก็ ่ บไฟลระบบของ Arduino โดยปกติเปนไฟลมาตรฐานทีมาพร ่ อมกับ Arduino บรรทัดที่ 2 สั่งใหรวมไฟล ATX2.h มารวมกับไฟลโปรแกรมที่กําลังพัฒนา โดยหาไฟลจากตําแหนงที่อยู ของไฟลภาษาซีของเรากอน ปกติเปนไฟลทีผู่ ใชสรางขึนเอง ้
Robo-CreatorXT : ATX2 51
4.8 ตัวแปร ตัวแปรเปนตัวอักษรหลายตัวๆ ที่กําหนดขึนในโปรแกรมเพื ้ ่อใชในการเก็บคาขอมูลตางๆ เชน คาที่อานไดจากตัวตรวจจับที่ตออยูกั บขาพอรตอะนาลอกของ Arduino ตัวแปรมีหลายประเภทดังนี้
4.8.1 char : ตัวแปรประเภทตัวอักขระ เปนตัวแปรที่มีขนาด 1 ไบต (8 บิต) มีไวเพื่อเก็บคาตัวอักษร ตัวอักษรในภาษา C จะเขียนอยู ในเครื่องหมายคําพูดขีดเดียว เชน ‘A’ (สําหรับขอความ ที่ประกอบจากตัวอักษรหลายตัวเขียนตอกัน จะเขียนอยูในเครื องหมายคํ ่ าพูดปกติ เชน “ABC”) คุณสามารถสังกระทํ ่ าทางคณิตศาสตรกับตัวอักษร ได ในกรณีจะนําคารหัส ASCII ของตัวอักษรมาใช เชน ‘A’ +1 มีคาเทากับ 66 เนืองจากค ่ ารหัส ASCII ของตัวอักษร A เทากับ 65 รูปแบบคําสั่ง char sign = ' ';
ตัวอยางที่ 4-28 char var = 'x';
var คือชื่อของตัวแปรประเภท char ที่ตองการ x คือคาที่ตองการกําหนดใหกับตัวแปร ในทีนี่ ้เปนตัวอักษรหนึ่งตัว
4.8.2 byte : ตัวแปรประเภทตัวเลข 8 บิตหรือ 1 ไบต ตัวแปร byte ใชเก็บคาตัวเลขขนาด 8 บิต มีคาไดจาก 0 - 255 ตัวอยางที่ 4-29 byte b = B10010;
// แสดงคาของ b ในรูปของเลขฐานสอง (เทากับ 18 เลขฐานสิบ)
4.8.3 int : ตัวแปรประเภทตัวเลขจํานวนเต็ม ยอจาก interger ซึ่งแปลวาเลขจํานวนเต็ม int เปนตัวแปรพืนฐานสํ ้ าหรับเก็บตัวเลข ตัวแปร หนึ่งตัวมีขนาด 2 ไบต เก็บคาไดจาก -32,768 ถึง 32,767 ซึ่งมาจาก -215 (คาตําสุ ่ ด) และ 215- 1 (คาสูง สุด) ในการเก็บคาตัวเลขติดลบใชเทคนิคที่เรียกวา ทูคอมพลีเมนต (2’s complement) บิตสูงสุดบาง ครั้งเรียกวา บิตเครืองหมาย ่ หรือ sign bit ถามีคาเปน “1” แสดงวา เปนคาติดลบ รูปแบบคําสั่ง int var = val;
52 Robo-CreatorXT : ATX2
พารามิเตอร var คือชื่อของตัวแปรประเภท int ที่ตองการ val คือคาที่ตองการกําหนดใหกับตัวแปร ตัวอยางที่ 4-30 int ledPin = 13;
// กําหนดใหตัวแปร ledPIn มีคาเทากับ 13
เมือตั ่ วแปรมีคามากกวาคาสูงสุดที่เก็บได จะเกิดการ “ลนกลับ” (roll over) ไปยังคาตําสุ ่ ดที่เก็บ ได และเมือมี ่ คานอยกวาคาตําสุ ่ ดที่เก็บไดจะลนกลับไปยังคาสูงสุด ดังตัวอยางตอไปนี้ ตัวอยางที่ 4-31 int x x = -32,768; x = x - 1; x = 32,767; x = x + 1;
// เมือกระทํ ่ าคําสังแล ่ ว คาของ x จะเปลี่ยนจาก -32,768 เปน 32,767 // เมือกระทํ ่ าคําสังแล ่ ว คาของ x จะเปลี่ยนจาก 32,767 เปน -32,768
4.8.4 unsigned int : ตัวแปรประเภทเลขจํานวนเต็มไมคิดเครืองหมาย ่ ตัวแปรประเภทนี้คลายกับตัวแปร int แตจะเก็บเลขจํานวนเต็มบวกเทานัน้ โดยเก็บคา 0 ถึง 65,535 (216 -1) รูปแบบคําสั่ง unsigned int var = val;
พารามิเตอร var คือชื่อของตัวแปร int ที่ตองการ val คือคาที่ตองการกําหนดใหกับตัวแปร ตัวอยางที่ 4-32 unsigned int ledPin = 13;
// กําหนดใหตัวแปร ledPIn มีคาเทากับ 13 แบบไมคิดเครื่องหมาย
เมือตั ่ วแปรมีคาสูงสุดจะลนกลับไปคาตําสุ ่ ดหากมีการเพิมค ่ าตอไป และเมือมี ่ คาตําสุ ่ ดจะลน กลับเปนคาสูงสุดเมือมี ่ การลดคาตอไปอีก ดังตัวอยาง ตัวอยางที่ 4-33 unsigned int x x = 0; x = x - 1; x = x + 1;
// เมือกระทํ ่ าคําสังแล ่ ว คาของ x จะเปลี่ยนจาก 0 เปน 65535 // เมือกระทํ ่ าคําสังแล ่ ว คาของ x จะเปลี่ยนจาก 65535 กลับไปเปน 0
Robo-CreatorXT : ATX2 53
4.8.5 long : ตัวแปรประเภทเลขจํานวนเต็ม 32 บิต เปนตัวแปรเก็บคาเลขจํานวนเต็มที่ขยายความจุเพิ่มจากตัวแปร int โดยตัวแปร long หนึงตั ่ ว กินพืนที ้ ่หนวยความจํา 32 บิต (4 ไบต) เก็บคาไดจาก -2,147,483,648 ถึง 2,147,483,647 รูปแบบคําสั่ง long var = val;
พารามิเตอร var คือชื่อของตัวแปร long ที่ตองการ val คือคาที่ตองการกําหนดใหกับตัวแปร ตัวอยางที่ 4-34 // กําหนดใหตัวแปร time เปนแบบ long
long time;
4.8.6 unsigned long : ตัวแปรประเภทเลขจํานวนเต็ม 32 บิต แบบไมคิดเครืองหมาย ่ เปนตัวแปรเก็บคาเลขจํานวนเต็มบวก ตัวแปรหนึงตั ่ วกินพืนที ้ ่หนวยความจํา 32 บิต (4 ไบต) เก็บคาไดจาก 0 ถึง 4,294,967,295 หรือ 232 -1 รูปแบบคําสั่ง unsigned long var = val;
พารามิเตอร var คือชื่อของตัวแปร unsigned long ที่ตองการ val คือคาที่ตองการกําหนดใหกับตัวแปร ตัวอยางที่ 4-35 unsigned long time;
// กําหนดใหตัวแปร time เปนแบบ undigned long (ไมคิดเครืองหมาย) ่
54 Robo-CreatorXT : ATX2
4.8.7 float : ตัวแปรประเภทเลขทศนิยม เปนตัวแปรสําหรับเก็บคาเลขเลขทศนิยม ซึงนิ ่ ยมใชในการเก็บคาสัญญาณอะนาล็อกหรือคาที่ ตอเนือง ่ เนื่องจากสามารถเก็บคาไดละเอียดกวาตัวแปร int ตัวแปร float เก็บคาไดจาก 4.4028235 x 1038 ถึง -4.4028235 x 1038 โดยหนึ่งตัวจะกินพืนที ้ ่หนวยความจํา 32 บิต (4 ไบต) ในการคํานวณคณิตศาสตรกับตัวแปร float จะชากวาการคํานวณของตัวแปร int ดังนั้นจึง พยายามหลีกเลียงการคํ ่ านวณกับตัวแปร float ในกรณีกระทําคําสังวนรอบที ่ ต่ องทํางานดวยความเร็ว สูงสุ ดของฟงกชั่นทางเวลาที่ตองแมนยําอยางมาก โปรแกรมเมอรบางคนจะทําการแปลงตัวเลข ทศนิยมใหเปนเลขจํานวนเต็มกอนแลวจึงคํานวณเพือให ่ ทํางานไดเร็วขึ้น รูปแบบคําสั่ง float var = val;
พารามิเตอร var คือชื่อของตัวแปร float ที่ตองการ val คือคาที่ตองการกําหนดใหกับตัวแปร ตัวอยางที่ 4-36 float myfloat; float sensorCalbrate = 1.117;
ตัวอยางที่ 4-37 int x; int y; float z; x = 1;
// y เทากับ 0 ไมมีการเก็บคาของเศษทีได ่ จากการหาร z = (float)x / 2.0; // z เทากับ 0.5 เมือมี ่ การใชตัวแปรแบบ float ตัวเลขทีนํ่ ามากระทํากับตัวแปรแบบ float นีจะต ้ องเปนเลขทศนิยมดวย จากตัวอยางคือ เลข 2 เมือนํ ่ ามาทํางานกับตัวแปร x ทีเป ่ นแบบ float เลข 2 จึงตองเขียนเปน 2.0 y = x / 2;
4.8.8 double : ตัวแปรประเภทเลขทศนิยมความละเอียดสองเทา เปนตัวแปรทศนิยมความละเอียดสองเทา มีขนาด 8 ไบต คาสูงสุดทีเก็่ บไดคือ 1.7976931348623157 x 10308 ใน Arduino มีหนวยความจําจํากัด จึงไมใชตัวแปรประเภทนี้
Robo-CreatorXT : ATX2 55
4.8.9 string : ตัวแปรประเภทขอความ เปนตัวแปรเก็บขอความ ซึ่งในภาษาซีจะนิยามเปนอะเรยของตัวแปรประเภท char ตัวอยางที่ 4-38 ตัวอยางการประกาศตัวแปรสตริง char Str1[15]; char Str2[8] = {'a','r','d','u','i','n','o'}; char Str3[8] = {'a','r','d','u','i','n','o','\0'}; char Str4[ ] = "arduino"; char Str5[8] = "arduino"; char Str6[15] = "arduino";
Str1 เปนการประกาศตัวแปรสตริงโดยไมไดกําหนดคาเริ่มตน Str2 ประกาศตัวแปรสตริงพรอมกําหนดคาใหกับขอความทีละตัวอักษร หากไมครบตามจํานวนที่ประกาศ คอมไพเลอรจะเพิม่ null string ใหเองจนครบ (จากตัวอยางประกาศไว 8 ตัว แตขอความมี 7 ตัวอักษร จึงมีการเติม null string ใหอีก 1 ตัว ่ อ \0 Str3 ประกาศตัวแปรสตริงพรอมกําหนดคาใหกับขอความ แลวปดทายดวยตัวอักษรปด นันคื Str4 ประกาศตัวแปรสตริงพรอมกําหนคคาตัวแปรในเครืองหมายคํ ่ าพูด จากตัวอยาง ไมไดกําหนดขนาด ตัวแปร คอมไพเลอรจะกําหนดขนาดใหเองตามจํานวนตัวอักษร ่ าพูด และขนาดของตัวแปร จากตัวอยาง Str5 ประกาศตัวแปรสตริงพรอมกําหนคคาตัวแปรในเครืองหมายคํ ประกาศไว 8 ตัว ่ สําหรับขอความอื่นที่ยาวมากกวานี้ Str6 ประกาศตัวแปรสตริง โดยกําหนดขนาดเผือไว
4.8.9.1 การเพิ่มตัวอักษรแจงวาจบขอความ (null termination) ในตัวแปรสตริงของภาษา C กําหนดใหตัวอักษรสุดทายเปนตัวแจงการจบขอความ (null string) ซึ่งก็คือตัวอักษร \0 ในการกําหนดขนาดของตัวแปร (คาในวงเล็บเหลี่ยม) จะตองกําหนดใหเทากับ จํานวนตัวอักษร + 1 ดังในตัวแปร Str2 และ Str3 ในตัวอยางที่ 4-38 ที่ขอความ Arduino มีตัวอักษร 7 ตัว ในการประกาศตัวแปรตองระบุเปน [8] ในการประกาศตัวแปรสตริง ตองเผื่อพื้นที่สําหรับเก็บตัวอักษรแจงวาจบขอความ มิฉะนั้น คอมไพเลอรจะแจงเตือนวาเกิดการผิดพลาด ในตัวอยางที่ 4-38 ตัวแปร Str1 และ Str6 เก็บขอความ ไดสูงสุด 14 ตัวอักษร
4.8.9.2 เครื่องหมายคําพูดขีดเดียวและสองขีด ปกติแลวจะกําหนดคาตัวแปรสตริงภายในเครืองหมายคํ ่ าพูด เชน "Abc" ตัวอักษร (char) จะกําหนดคาภายในเครืองหมายคํ ่ าพูดขีดเดียว 'A'
สําหรับตัวแปร
56 Robo-CreatorXT : ATX2
4.8.10 ตัวแปรอะเรย (array) ตัวแปรอะเรยเปนตัวแปรหลายตัว ทีถู่ กเก็บรวมอยูในตั วแปรชือเดี ่ ยวกัน โดยอางถึงตัวแปรแตละ ตัวดวยหมายเลขดัชนีที่เขียนอยูในวงเล็ บสีเหลี ่ ยม ่ ตัวแปรอะเรยของ Arduino จะอางอิงตามภาษา C ตัวแปรอะเรยอาจจะดูซับซอน แตถาใชเพียงตัวแปรอะเรยอยางตรงไปตรงมาจะงายตอการทําความเขาใจ ตัวอยางที่ 4-39 ตัวอยางการประกาศตัวแปรอะเรย int myInts[6]; int myPins[] = {2, 4, 8, 3, 6}; int mySensVals[6] = {2, 4, -8, 3, 2}; char message[6] = “hello”;
ผูพัฒนาโปรแกรมสามารถประกาศตัวแปรอะเรยไดโดยยังไมกําหนดคาของตัวแปร myInts ่ วแปรแลว การประกาศตัวแปร myPins เปนการประกาศตัวแปรอะเรยโดยไมระบุขนาด เมือประกาศตั ตองกําหนดคาทันที เพื่อใหคอมไพเลอรนับวา ตัวแปรมีสมาชิกกี่ตัวและกําหนดคาไดถูกตอง จากตัวอยางมีทังสิ ้ น้ 5 ตัว ในการประกาศตัวแปรอะเรย ผูพัฒนาโปรแกรมสามารถประกาศและกําหนดขนาดของตัวแปรอะเรยได ในพรอมกันดังตัวอยางการประกาศตัวแปร mySensVals ทีประกาศทั ่ ้งขนาดและกําหนดคา ่ นแบบ char มีตัวอักษร 5 ตัวคือ hello ตัวอยางสุดทายเปนการประกาศอะเรยของตัวแปร message ทีเป แตการกําหนดขนาดของตัวแปรจะตองเผือที ่ ่สําหรับเก็บตัวอักษรแจงจบขอความดวย จึงทําใหคาดัชนีตองกําหนดเปน 6
4.8.10.1 การใชงานตัวแปรอะเรย การใชงานตัวแปรอะเรยทําไดโดยการพิมพชือตั ่ วแปร พรอมกับระบุคาดัชนีภายในเครืองหมายวง ่ เล็บสีเหลี ่ ยม ่ คาดัชนีของตัวแปรอะเรยเริมต ่ นดวยคา 0 ดังนันค ้ าของตัวแปร mySensVals มีคาดังนี้ mySensVals[0] == 2, mySensVals[1] == 4, ....
การกําหนดคาใหกับตัวแปรอะเรย ทําไดดังนี้ mySensVals[0] = 10;
การเรียกคาสมาชิกของตัวแปรอะเรย ทําไดดังนี้ x = mySensVals[4];
Robo-CreatorXT : ATX2 57
4.8.10.2 อะเรยและคําสั่งวนรอบ for โดยทั่วไปจะพบการใชงานตัวแปรอะเรยภายในคําสัง่ for โดยใชคาตัวแปรนับรอบของคําสัง่ for เปนคาดัชนีของตัวแปรอะเรย ดังตัวอยางตอไปนี้ ตัวอยางที่ 4-40 int i; for (i = 0; i < 5; i = i + 1) { Serial.println(myPins[i]);
// แสดงคาสมาชิกของตัวแปรอะเรยทีหน ่ าตาง Serial monitor }
ตัวอยางโปรแกรมการใชงานตัวแปรอะเรยทีสมบู ่ รณดูไดในตัวอยาง KnightRider ในหัวขอ Tutorials ในเว็บไซต www.arduino.cc
4.8.10.3 เทคนิคการเขียนโปรแกรมเกียวกั ่ บตัวแปรอะเรย ในการเรียกใชคาสมาชิกของตัวแปรอะเรย ตองระวังอยาอางถึงคาในวงเล็บทีเกิ ่ นทีกํ่ าหนด อาทิ ประกาศตัวแปร int x[3] ตัวแปรมี 3 ตัว คือ x[0], x[1] และ x[2] ถาอางถึง x[3]จะเปนการ อานคาจากหนวยความจําซึงกํ ่ าหนดไวใชงานอยางอื่น คาที่อานไดจะผิดพลาด การเขียนคาใหกับตัวแปรอะเรยที่ เกินกวากําหนดไว อาจทําใหโปรแกรมแฮงค (หยุดการทํา งาน) หรือทํางานผิดเพี้ยนไป การอานหรือเขียนคาเกินคาดัชนีของตัวแปรอะเรยนี้ ทําใหเกิดบัก (ขอผิดพลาด) ที่ยากตอการ คนหา
58 Robo-CreatorXT : ATX2
4.9 ขอบเขตของตัวแปร ตัวแปรในภาษา C ที่ใชใน Arduino จะมีคุณสมบัติที่เรียกวา “ขอบเขตของตัวแปร” (scope) ซึ่งแตกตางจากภาษา BASIC ซึ่งตัวแปรทุกตัวมีสถานะเทาเทียมกันหมดคือ เปนแบบ global
4.9.1 ตัวแปรโลคอลและโกลบอล ตัวแปรแบบโกลบอล (global variable) เปนตัวแปรที่ทุกฟงกชันในโปรแกรมรู ่ จัก โดยตอง ประกาศตัวแปร นอกฟงกชัน่ สําหรับตัวแปรแบบโลคอลหรือตัวแปรทองถิ่นเปนตัวแปรที่ประกาศ ตัวแปรอยูภายในเครื่องหมายวงเล็บปกกาของฟงกชัน่ และรูจักเฉพาะภายในฟงกชันนั ่ ้น เมือโปรแกรมเริ ่ ่มมีขนาดใหญและซับซอนมากขึ้น การใชตัวแปรโลคอลจะมีประโยชนมาก เนืองจากแน ่ ใจไดวามีแคฟงกชันนั ่ นเท ้ านันที ้ สามารถใช ่ งานตัวแปร ชวยปองกันการเกิดการผิดพลาด เมือฟ ่ งกชันทํ ่ าการแกไขคาตัวแปรที่ใชงานโดยฟงกชันอื ่ ่น ตัวอยางที่ 4-41 int gPWMval; void setup()
// ทุกฟงกชันมองเห็ ่ นตัวแปรนี้
{} void loop() { int i; float f;
// ตัวแปร i จะถูกมองเห็นและใชงานภายในฟงกชัน่ loop เทานัน้ // ตัวแปร f จะถูกมองเห็นและใชงานภายในฟงกชัน่ loop เทานัน้
}
4.9.2 ตัวแปรสแตติก (static) เปนคําสงวน (keyword) ที่ใชตอนประกาศตัวแปรที่มีขอบเขตใชงานแคภายในฟงกชันเท ่ านัน้ โดยตางจากตัวแปรโลคอลตรงที่ตัวแปรแบบโลคอลจะถูกสรางและลบทิ้งทุกครั้งที่เรียกใชฟงกชัน่ สําหรับตัวแปรสแตติกเมือจบการทํ ่ างานของฟงกชันค ่ าตัวแปรจะยังคงอยู (ไมถูกลบทิง)้ เปนการรักษา คาตัวแปรไวระหวางการเรียกใชงานฟงกชัน่ ตัวแปรที่ประกาศเปน static จะถูกสรางและกําหนดคาในครั้งแรกที่เรียกใชฟงกชัน่
Robo-CreatorXT : ATX2 59
Arduino-Note
การกําหนดคาคงทีเลขจํ ่ านวนเต็มเปนเลขฐานตางๆ ของ Arduino คาคงทีเลขจํ ่ านวนเต็มก็คือตัวเลขทีคุ่ ณเขียนในโปรแกรมของ Arduino โดยตรงเชน 123 โดยปกติแลวตัว เลขเหลานีจะเป ้ นเลขฐานสิบ (decimal) ถาตองการกําหนดเปนเลขฐานอืนจะต ่ องใชเครืองหมายพิ ่ เศษระบุ เชน ฐาน ตัวอยาง 10 (decimal) 123 2 (binary) B1111011 8 (octal) 0173 16 (hexadecimal) 0x7B Decimal ก็คือเลขฐานสิบ ซึงใช ่ ในชีวิตประจําวัน ตัวอยาง 101 = 101 มาจาก (1* 102) + (0 * 101) + (1 * 100) = 100 + 0 + 1 = 101 Binary เปนเลขฐานสอง ตัวเลขแตละหลักเปนไดแค 0 หรือ 1 ตัวอยาง B101 = 5 ฐานสิบ มาจาก (1 * 22) + (0 * 21) + (1 * 20) = 4 + 0 + 1 = 5 เลขฐานสองจะใชงานไดไมเกิน 8 บิต (ไมเกิน 1 ไบต) มีคาจาก 0 (B0) ถึง 255 (B11111111) Octal เปนเลขฐานแปด ตัวเลขแตละหลักมีคาจาก 0 ถึง 7 เทานัน้ ตัวอยาง 0101 = 65 ฐานสิบ มาจาก (1 * 82) + (0 * 81) + (1 * 80) = 64 + 0 +1 = 65 ขอควรระวังในการกําหนดคาคงที่ อยาเผลอใสเลข 0 นําหนา มิฉะนันตั ้ วคอมไพเลอรจะแปลความหมาย ผิดไปวาคาตัวเลขเปนเลขฐาน 8 Hexadecimal (hex) เปนเลขฐานสิบหก ตัวเลขแตละหลักมีคาจาก 0 ถึง 9 และตัวอักษร A คือ 10, B คือ 11 ไปจนถึง F ซึงเท ่ ากับ 15 ตัวอยาง 0x101 = 257 ฐานสิบ มาจาก (1 * 162) + (0 * 161) + (1 * 160) = 256 + 0 + 1 = 257
60 Robo-CreatorXT : ATX2
4.10 คาคงที่ (constants) คาคงที่เปน กลุมตัวอักษรหรือขอความที่ไดกําหนดคาไวลวงหนาแลว ตัวคอมไพเลอรของ Arduino จะรูจักกับคาคงที่เหลานีแล ้ ว ไมจําเปนตองประกาศหรือกําหนดคาคงที่
4.10.1 HIGH, LOW : ใชกําหนดคาทางตรรกะ ในการอานหรือเขียนคาใหกับขาพอรตดิจิตอล คาที่เปนไดมี 2 คาคือ HIGH หรือ LOW HIGH เปนการกําหนดคาใหขาดิจิตอลนันมี ้ แรงดันเทากับ +5V
สวนการอานคา ถาอาน ได +3V หรือมากกวา ไมโครคอนโทรลเลอรจะอานคาไดเปน HIGH คาคงที่ของ HIGH คือ “1” หรือ เทียบเปนตรรกะคือ จริง (true) เปนการกําหนดคาใหขาดิจิตอลนั้นมีแรงดันเทากับ 0V สวนการอานคา ถาอาน ได +2V หรือนอยกวา ไมโครคอนโทรลเลอรจะอานคาไดเปน LOW คาคงที่ของ LOW คือ “0” หรือ เทียบเปนตรรกะคือ เท็จ (false) LOW
4.10.2 INPUT, OUTPUT : กําหนดทิศทางของขาพอรตดิจิตอล ขาพอรตดิจิตอลทําหนาที่ได 2 อยางคือ เปนอินพุตและเอาตพุต เมื่อกําหนดเปน INPUT หมายถึง กําหนดใหขาพอรตนันๆ ้ เปนขาอินพุต เมื่อกําหนดเปน OUTPUT หมายถึง กําหนดใหขาพอรตนันๆ ้ เปนขาเอาตพุต
Robo-CreatorXT : ATX2 61
4.11 ตัวกระทําอื่นๆ ทีเกี ่ ่ยวของกับตัวแปร 4.11.1 cast : การเปลียนประเภทตั ่ วแปรชั่วคราว เปนตัวกระทําที่ใชสั่งใหเปลี่ยนประเภทของตัวแปรไปเปนประเภทอื่น และบังคับให คํานวณคาตัวแปรเปนประเภทใหม cast
รูปแบบคําสั่ง (type)variable
เมื่อ Type เปนประเภทของตัวแปรใดๆ (เชน int, float, long) Variable เปนตัวแปรหรือคาคงทีใดๆ ่
ตัวอยางที่ 4-42 int i; float f; f = 4.6; i = (int) f;
ในการเปลี่ยนประเภทตัวแปรจาก float เปน int คาที่ไดจะถูกตัดเศษออก ดังนั้น (int)4.6 จึงกลายเปน 4
4.11.2 sizeof : แจงขนาดของตัวแปร ใชแจงบอกจํานวนไบตของตัวแปรทีต่ องการทราบคา ซึงเป ่ นทังตั ้ วแปรปกติและตัวแปรอาเรย รูปแบบคําสั่ง เขียนไดสองแบบดังนี้ sizeof(variable) sizeof variable
เมื่อ Variable คือตัวแปรปกติหรือตัวแปรอะเรย (int, float, long) ทีต่ องการทราบขนาด
ตัวอยางที่ 4-43 ตัวกระทํา sizeof มีประโยชนอยางมากในการจัดการกับตัวแปรอะเรย (รวมถึงตัวแปรสตริง) ตัวอยางตอไปนีจะพิ ้ มพขอความออกทางพอรตอนุกรมครั้งละหนึ่งตัวอักษร char myStr[] = “this is a test”; int i; void setup() { Serial.begin(9600); } void loop() { for (i = 0; i < sizeof(myStr) - 1; i++) { Serial.print(i, DEC); Serial.print(“ = “); Serial.println(myStr[i], BYTE); } }
62 Robo-CreatorXT : ATX2
4.12 คําสงวนของ Arduino คําสงวนคือ คาคงที่ ตัวแปร และฟงกชันที ่ ได ่ กําหนดไวเปนสวนหนึงของภาษา ่ C ของ Arduino หามนําคําเหลานีไปตั ้ ้งชื่อตัวแปร สามารถแสดงไดดังนี้ # Constants
# Datatypes
# Methods/Fucntions
HIGH LOW INPUT OUTPUT SERIAL DISPLAY PI HALF_PI TWO_PI LSBFIRST MSBFIRST CHANGE FALLING RISING false true null
boolean byte char class default do double int long private protected public return short signed static switch throw try unsigned void
sw_ok sw_ok_press analog knob glcd glcdChar glcdString glcdMode glcdGetMode glcdFlip glcdGetFlip colorRGB setTextColor setTextBackgroundColor setTextSize getTextColor getTextBackgroundColor getTextSize glcdFillScreen glcdClear glcdPixel glcdRect glcdFillRect glcdLine glcdCircle glcdFillCircle
# Literal Constants GLCD_RED GLCD_GREEN GLCD_BLUE GLCD_YELLOW GLCD_BLACK GLCD_WHITE GLCD_SKY GLCD_MAGENTA # Port Constants DDRB PINB PORTB DDRC PINC PORTC DDRD PIND PORTD # Names
popxt ATX2
glcdArc getdist in out motor motor_stop fd bk fd2 bk2 tl tr
sl sr FD BK FD4 BK4 TL TR SL SR servo sound beep uart_set_baud uart_get_baud uart_putc uart_puts uart uart_available uart_getkey uart1_set_baud uart1_get_baud uart1_putc uart1_puts uart1 uart1_available uart1_getkey uart1_flush
Robo-CreatorXT : ATX2 63
# Other abs acos += + [] asin = atan atan2 & &= | |= boolean byte case ceil char char class , // ?: constrain cos {} —
default delay delayMicroseconds / /** . else == exp false float float floor for < <= HALF_PI if ++ != int << < <= log && ! || ^
^= loop max millis min % /* * new null () PII return >> ; Serial Setup sin sq sqrt = switch tan this true TWO_PI void
while Serial begin read print write println available digitalWrite digitalRead pinMode analogRead analogWrite attachInterrupts detachInterrupts beginSerial serialWrite serialRead serialAvailable printString printInteger printByte printHex printOctal printBinary printNewline pulseIn shiftOut
64 Robo-CreatorXT : ATX2
Robo-CreatorXT : ATX2 65
ทางผูจัดทําซอฟตแวร Arduino IDE (www.arduino.cc) ไดจัดเตรียมฟงกชั่นพื้นฐาน เชน ฟงกชันเกี ่ ยวกั ่ บขาพอรตอินพุตเอาตพุตดิจิตอล, อินพุตเอาตพุตอะนาลอก เปนตน ดังนั้นในการเขียน โปรแกรมจึงเรียกใชฟงกชันเหล ่ านีได ้ ทันที นอกจากฟงกชันพื ่ นฐานเหล ้ านีแล ้ ว นักพัฒนาทานอืนๆ ่ ทีร่ วมในโครงการ Arduino นี้ก็ไดเพิม่ ไลบรารีอื่นๆ เชน ไลบรารีควบคุมมอเตอร, การติดตอกับอุปกรณบัส I2C ฯลฯ ในการเรียกใชงานตอง เพิ่มบรรทัด #include เพือผนวกไฟล ่ ที่เหมาะสมกอน จึงจะเรียกใชฟงกชันได ่ ในบทนี้จะอธิบายถึงการเรียกใชฟงกชันและตั ่ วอยางโปรแกรมสําหรับทําการทดลอง โดยใช แผงวงจรควบคุมอเนกประสงค ATX2 เปนอุปกรณหลักในการทดลอง
5.1 ฟงกชันอิ ่ นพุตเอาตพุตดิจิตอล (Digital I/O) 5.1.1 คําอธิบายและการเรียกใชฟงกชั่น 5.1.1.1 pinMode(pin,mode) ใชกําหนดขาพอรตใดๆ ใหเปนพอรตดิจิตอล พารามิเตอร pin - หมายเลขขาพอรตของแผงวงจร POP-XT (คาเปน int) mode - โหมดการทํางานเปน INPUT (อินพุต) หรือ OUTPUT (เอาตพุต) (คาเปน int) ตองใชตัวพิมพใหญเทานัน้
ตัวอยางที่ 5-1 int ledPin = 4; void setup() { pinMode(ledPin, OUTPUT);
}
// ตอ ZX-LED ทีพอร ่ ตหมายเลข 4 // กําหนดเปนเอาตพุต
void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
// LED ติดสวาง // หนวงเวลา 1 วินาที // LED ดับ // หนวงเวลา 1 วินาที
66 Robo-CreatorXT : ATX2
5.1.1.2 digitalWrite(pin,value) สั่งงานใหขาพอรตมีคาสถานะเปนลอจิกสูง (HIGH หรือ “1”) หรือลอจิกตํ่า (LOW หรือ “0”) พารามิเตอร pin - หมายเลขขาพอรตของแผงวงจร ATX2 (คาเปน int) value - มีคา HIGH หรือ LOW
ตัวอยางที่ 5-2 int ledPin = 30; void setup()
// ตอ ZX-LED ทีพอร ่ ตหมายเลข 30
{ pinMode(ledPin, OUTPUT);
// กําหนดเปนเอาตพุต
} void loop() { digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); delay(500);
// LED ติดสวาง // หนวงเวลา 1 วินาที // LED ดับ // หนวงเวลา 1 วินาที
} กําหนดใหพอรตหมายเลข 30 เปน HIGH (มีลอจิกเปน “1”) หนวงเวลา 0.5 วินาที แลวจึงสังให ่ กลับเปน LOW (มีลอจิกเปน “0”) อีกครั้ง วนเชนนี้ไปตลอด หมายเหตุ : ขาพอรตในโปรแกรมนีอ้ างถึงจุดตอพอรตของแผงวงจรควบคุมอเนกประสงค ATX2
Robo-CreatorXT : ATX2 67
5.1.1.3 int
digitalRead(pin)
อานคาสถานะของขาที่ระบุไววามีคาเปน HIGH หรือ LOW พารามิเตอร pin - ขาพอรตทีต่ องการอานคา ซึงต ่ องเปนขาพอรตดิจิตอล
คาที่สงกลับ เปน HIGH หรือ LOW
ตัวอยางที่ 5-3 int ledPin = 30; int inPin = 28; int val = 0; void setup()
// ตอ ZX-LED ทีพอร ่ ตหมายเลข 30 // ตอ ZX-SWITCH01 ทีพอร ่ ตหมายเลข 28 // กําหนดเตัวแปรสําหรับเก็บคาที่อานไดจากอินพุต
{ pinMode(ledPin, OUTPUT); pinMode(inPin, INPUT);
// กําหนดใหพอรต 4 เปนเอาตพุต // กําหนดใหพอรต 23 เปนอินพุต
} void loop() { val = digitalRead(inPin); digitalWrite(ledPin, val);
// อานคาจากพอรตอินพุต // แสดงคาที่อานไดทีพอร ่ ตเอาตพุต ในทีนี่ คื่ อ พอรต 4
}
เมือไม ่ กดสวิตช สถานะทีพอร ่ ต 28 เปน “1” ทําใหพอรต 30 มีสถานะเปน”1” เชนกัน LED ทีต่ อกับพอรต 4 จึงติดสวาง เมือกดสวิ ่ ตช สถานะลอจิกที่พอรต 23 จะเปน “0” พอรต 4 จึงมีสถานะเปน “0” เชนกัน LED ทีต่ ออยูจึงดับ หมายเหตุ : ขาพอรตในโปรแกรมนีอ้ างถึงจุดตอพอรตของแผงวงจรควบคุมอเนกประสงค ATX2
68 Robo-CreatorXT : ATX2
5.1.2 การใชงานพอรตเอาตพุตดิจิตอลของแผงวงจร ATX2 5.1.2.1 คุณสมบัติของขาพอรตเอาตพุต สําหรับขาพอรตที่กําหนดใหเปนเอาตพุตผานทางฟงกชัน่ pinMode() จะมีสถานะเปนอิมพี แดนซตํา่ ทําใหสามารถจายกระแสใหกับวงจรภายนอกไดสูงถึง 40mA ซึ่งเพียงพอสําหรับขับกระแส ให LED สวาง (อยาลืมตอตัวตานทานอนุกรมดวย) หรือใชกับตัวตรวจจับตางๆ ได แตไมเพียงพอ สําหรับขับรีเลย โซลีนอยด หรือมอเตอร กอนที่จะใชงานขาดิจิตอลของแผงวงจร ATX2 จะตองสั่งกอนวาใหขาพอรตนีทํ้ าหนาที่เปน อินพุตหรือเอาตพุต ในหัวขอนี้จะทดลองตอเปนเอาตพุต ถากําหนดใหเปนเอาตพุตสามารถรับหรือ จายกระแสไดสูงสุดถึง 20 mA ซึ่งเพียงพอสําหรับขับ LED
5.1.2.2 การกําหนดโหมดของขาพอรต กอนใชงานตองกําหนดโหมดการทํางานของขาพอรตดิจิตอล ใหเปนอินพุตหรือเอาตพุต กําหนด ไดจากฟงกชัน่ pinMode()มีรูปแบบดังนี้ pinmode(pin,mode);
เมื่อ
pin คือ หมายเลขขาทีต่ องการ Mode คือ โหมดการทํางาน (INPUT หรือ OUTPUT)
หลังจากที่ กําหนดใหเปนเอาตพุตแลวเมื่อตองการเขียนคาไปยังขานั้นๆ ใหเรียกใชฟงกชั่น digitalWrite() โดยมีรูปแบบดังนี้ digitalWrite(pin,value);
เมื่อ
pin คือหมายเลขขาที่ตองการ value สถานะลอจิกที่ตองการ (HIGH หรือ LOW)
analogWrite(pin, value)
pinMode(pin,INPUT)
HIGH
pinMode(pin,OUTPUT)
digitalWrite(pin, value)
LOW
รูปที่ 5-1 ไดอะแกรมแสดงกลไกการกําหนดใหขาพอรตของ Arduino และแผงวงจร ATX2 เปน พอรตเอาตพุตดิจิตอล (บล็อกสีเทาแทนการทํางานหรือเงื่อนไขที่ตองการ)
Robo-CreatorXT : ATX2 69
5.1.3 การทดลองอินพุตดิจิตอลของแผงวงจร ATX2 5.1.3.1 คุณสมบัติของขาพอรตอินพุต ขาพอรตของ Arduino และแผงวงจร ATX2 จะถูกกําหนดเปนอินพุตตังแต ้ เริมต ่ น จึงไมจําเปน ตองใชฟงกชัน่ pinMode() ในการกําหนดใหเปนอินพุต ขาพอรตทีถู่ กกําหนดเปนอินพุตจะมีสถานะเปน อิมพีแดนซสูง ทําใหมีความตองการกระแสไฟฟาจากอุปกรณทีต่ องการอานคาอินพุตนอยมาก ทําใหไม สามารถรับหรือจายกระแสใหกับวงจรภายนอก ทําใหนําขาทีเป ่ นอินพุตนีไปใช ้ งานบางประเภท เชน สรางตัวตรวจจับการสัมผัสทีอาศั ่ ยการวัดคาความจุไฟฟา สําหรับขาอินพุต เมือไม ่ มีอินพุตปอนใหจะตองกําหนดคาแรงดันใหแนนอน ทําไดโดยตอตัวตาน ทานพูลอัป (pull-up resistor) โดยตอขาของตัวตานทานขาหนึงไปยั ่ งไฟเลียง ้ หรือตอพูลดาวน (pull- down) ซึงต ่ อขาหนึงของตั ่ วตานทานจากขาพอรตลงกราวด คาตัวตานทานทีใช ่ ทัวไปคื ่ อ 10k ดังรูปที่ 5-2 +Vcc
ปกติเ ปนลอจิกต่ํา (LOW หรือ "0") Rpull-up Di
INPUT
Di
INPUT Rpull-down
ปกติเ ปนลอจิกสูง (HIGH หรือ "1")
(ก) การตอตัวตา นทานพูลอัป (ข) การตอตัวตานทานพูลดาวน
รูปที่ 5-2 แสดงการตอตัวตานทานเพื่อกําหนดสภาวะของขาพอรตอินพุตของไมโครคอนโทรลเลอร ในขณะที่ยังไมมีอินพุตสงเขามา +Vcc
20k
สั่งใหตอตัวตานทาน พูลอัปภายในดวยคําสั่ง digitalWrite(pin, HIGH) Di
Digital input port
รูปที่ 5-3 แสดงการตอตัวตานทาน พู ลอั ปภายในที่พอรตอินพุตดิจิตอล ของไมโครคอนโทรลเลอร ซึงควบคุ ่ ม ไดดวยกระบวนการทางซอฟตแวร
70 Robo-CreatorXT : ATX2
แผงวงจร ATX2 มีจุดตอพอรตดิจิตอลที่กําหนดใหเปนอินพุตหรือเอาตพุตจํานวน 13 จุดตอ หรือ 13 ขา ถาตองการกําหนดเปนอินพุตตองกําหนดดวยฟงกชัน่ pinMode และอานคาอินพุตไดจาก ฟงกชัน่ digitalRead ซึ่งมีรูปแบบดังนี้ digitalRead(pin);
เมื่อ pin คือหมายเลขขาที่ตองการอานคาสถานะ เมือฟ ่ งกชันทํ ่ างาน จะคืนคาเปนสถานะของขาที่ตองการอานคา โดยคืนคาเปน LOW (คาเปน “0”) หรือ HIGH (คาเปน “1”)
ภายในขาพอรตของไมโครคอนโทรลเลอร ATmega644P ซึ่งเปนไมโครคอนโทรลเลอรหลัก ของแผงวงจร ATX2 จะมีการตอตัวตานทานพูลอัปคา 20k เตรี ยมไวให สั่งตอใชงานผานทาง ซอฟตแวร ดังรูปที่ 5-3 ในรู ปที่ 5-4 แสดงไดอะแกรมการเขียนคําสั่งเพื่อกําหนดใหใชงานขาพอรตของไมโคร คอนโทรลเลอรหลักของแผงวงจร ATX2 ทํางานเปนขาพอรตอินพุตดิจิตอล
digitalWrite(pin, HIGH)
pinMode(pin,INPUT)
pinMode(pin,OUTPUT)
val = digitalRead(pin);
val
รูปที่ 5-4 ไดอะแกรมแสดงกลไกการกําหนดใหขาพอรตของ Arduino และแผงวงจร ATX2 เปนพอรต อินพุตดิจิตอล (บล็อกสีเทาแทนการทํางานหรือเงื่อนไขที่ตองการ)
Robo-CreatorXT : ATX2 71
5.2 ฟงกชันเกี ่ ่ยวกับการสือสารผ ่ านพอรตอนุกรม ใชสื่อสารขอมูลระหวางฮารดแวร Arduino (ในที่ นี้คื อแผงวงจร ATX2) กับคอมพิวเตอร โดยกระทําผานโมดูลพอรต USB ที่มีอยูภายในตัวไมโครคอนโทรลเลอรหลักเบอร ATmega644P ในรูปที่ 5-5 แสดงกลไกการทํางานของฟงกชัน่ Serial ใน Arduino 1.0.7 นอกจากนีแผงวงจร ้ ATX2 ยังมีพอรตสําหรับสือสารข ่ อมูลอนุกรมหรือ UART อีกหนึงชุ ่ ดนัน่ คือ UART1 ซึ่งใชพอรตหมายเลข 2 เปนขา RxD1 สําหรับรับขอมูลอนุกรม และพอรตหมายเลข 3 เปนขา TxD1 สําหรับสงขอมูลอนุกรม โดย UART1 นีใช ้ สําหรับเชือมต ่ ออุปกรณสือสารข ่ อมูลอนุกรม ทั้งแบบมีสายหรือไรสายอยางบลูทูธ หรือ XBEE ดวยระดับสัญญาณ TTL (0 และ +5V)
5.2.1 คําอธิบายและการเรียกใชฟงกชั่น 5.2.1.1 Serial.begin(int
datarate)
กําหนดคาอัตราบอดของการรับสงขอมูลอนุกรมในหนวยบิตตอวินาที (bits per second : bps) ในกรณีทีติ่ ดตอกับคอมพิวเตอรใหใชคาตอไปนี้ 9600, 14400, 19200, 28800, 38400, 57600 หรือ 115200 พารามิเตอร Int datarate ในหนวยบิตตอวินาที (baud หรือ bps)
ตัวอยางที่ 5-4 void setup() { Serial.begin(9600);
// เปดพอรตอนุกรม กําหนดอัตราบอดเปน 9600 บิตตอวินาที
}
Serial.begin(speed)
Serial.print(data)
Serial.println(data)
Serial.write(data)
Serial.available()
Serial.read(data)
รูปที่ 5-5 กลไกการสื่อสารขอมูลอนุกรมของฟงกชัน่ Serial ใน Arduino 1.0.x
Serial.flush()
72 Robo-CreatorXT : ATX2
5.2.1.2 int
Serial.available()
ใชแจงวาไดรับขอมูลตัวอักษร (characters) แลว และพรอมสําหรับการอานไปใชงาน คาที่สงกลับจากฟงกชั่น จํานวนไบตทีพร ่ อมสําหรับการอานคา โดยเก็บขอมูลในบัฟเฟอร ตัวรับ ถาไมมีขอมูล จะมีคาเปน 0 ถามีขอมูล ฟงกชันจะคื ่ นคาที่มากกวา 0 โดยบัฟเฟอรเก็บขอมูลไดสูงสุด 128 ไบต
5.2.1.3
int Serial.read()
ใชอานคาขอมูลทีได ่ รับจากพอรตอนุกรม คาที่สงกลับจากฟงกชั่น เปนเลข int ทีเป ่ นไบตแรกของขอมูลทีได ่ รับ (หรือเปน -1 ถาไมมีขอมูล)
ตัวอยางที่ 5-5 int incomingByte = 0; void setup() { Serial.begin(9600);
// เปดพอรตสือสาร ่ กําหนดอัตราบอดเปน 9600 บิตตอวินาที } void loop() { if (Serial.available() > 0) { incomingByte = Serial.read();
// วนสงขอมูลเมือได ่ รับขอมูลเขามา // อานขอมูลอนุกรม // เก็บขอมูลทีอ่ านไดไวในตัวแปร
Serial.print("I received: ");
// พิมพขอความไปยังหนาตาง Serial Monitor Serial.println(incomingByte, DEC);
// พิมพขอมูลทีรั่ บไดออกไปยังหนาตาง Serial Monitor } }
ในตัวอยางนี้ เลือกใชอัตราบอด 9600 บิตตอวินาที ถามีขอมูลเขามาจะเก็บไวในตัวแปร incomingByte แลวนําไปแสดงผลที่หนาตาง Serial Monitor โดยตอทายขอความ I received :.....
Robo-CreatorXT : ATX2 73
เมื่อรันโปรแกรม ใหเปดหนาตาง Serial Monitor โดยคลิกที่ปุม
ซึงอยู ่ ที มุ่ มขวาของหนาตางหลัก
เลือกอัตราบอดของหนาตาง Serial Monitor เปน 9600baud, เลือก No line Ending คลิกทําเครืองหมายที ่ ช่ อง Autoscroll จากนันป ้ อนอักษร a แลวคลิกปุม Send
เมือแผงวงจร ่ ATX2 ไดรับขอมูล จะสงคาของตัวอักษรในรูปของเลขฐานสิบกลับมา อักษร a มีรหัส แอสกี้เทากับ 61 เมือแปลงเป ่ นเลขฐานสิบ จะไดคาเปน 97
5.2.1.4 Serial.flush() ใชลางบัฟเฟอรตัวรับขอมูลของพอรตอนุกรมใหวาง
74 Robo-CreatorXT : ATX2
5.2.1.5 Serial.print(data) ใชสงขอมูลออกทางพอรตอนุกรม พารามิเตอร Data - เปนขอมูลเลขจํานวนเต็ม ไดแก char, int หรือเลขทศนิยมทีตั่ ดเศษออกเปนเลขจํานวนเต็ม
รูปแบบฟงกชั่น คําสังนี ่ ้สามารถเขียนไดหลายรูปแบบ Serial.print(b)
เปนการเขียนคําสังแบบไม ่ ไดระบุรูปแบบ จะพิมพคาตัวแปร b เปนเลขฐานสิบ โดยพิมพตัวอักษรรหัส ASCII ดังตัวอยาง int b = 79; Serial.print(b);
พิมพขอความ 79 Serial.print(b, DEC)
เปนคําสังพิ ่ มพคาตัวแปร b เปนตัวเลขฐานสิบ โดยพิมพตัวอักษรตามรหัส ASCII ดังตัวอยาง int b = 79; Serial.print(b);
พิมพขอความ 79 Serial.print(b, HEX)
เปนคําสังพิ ่ มพคาตัวแปร b เปนตัวเลขฐานสิบหก โดยพิมพตัวอักษรตามรหัส ASCII ดังตัวอยาง int b = 79; Serial.print(b, HEX);
พิมพขอความ 4F Serial.print(b, OCT)
เปนคําสังพิ ่ มพคาตัวแปร b เปนตัวเลขฐานแปด โดยพิมพตัวอักษรตามรหัส ASCII ดังตัวอยาง int b = 79; Serial.print(b, OCT);
พิมพขอความ 117 Serial.print(b, BIN)
เปนคําสังพิ ่ มพคาตัวแปร b เปนตัวเลขฐานสอง โดยพิมพตัวอักษรตามรหัส ASCII ดังตัวอยาง int b = 79; Serial.print(b, BIN);
พิมพขอความ 1001111
Robo-CreatorXT : ATX2 75
Serial.write(b)
เปนคําสังพิ ่ มพคาตัวแปร b ขนาด 1 ไบต เดิมทีคําสังนี ่ ้ จะเปน Serial.print(b,BYTE) ตังแต ้ Arduino 1.0 ขึนมา ้ ไดยกเลิกคําสัง่ Serial.print(b,BYTE) และใหใชคําสัง่ Serial.write(b) แทน ดังตัวอยาง int b = 79; Serial.write(b);
พิมพตัวอักษร O ซึงมี ่ คาตามตาราง ASCII เทากับ 79 ใหดูขอมูลจากตารางรหัสแอสกี้เพิ่มเติม Serial.print(str)
เปนคําสังพิ ่ มพคาขอความในวงเล็บ หรือขอความทีเก็ ่ บในตัวแปร str ดังตัวอยาง Serial.print("Hello World!");
พิมพขอความ Hello World
พารามิเตอร b - ไบตขอมูลทีต่ องการพิมพออกทางพอรตอนุกรม str - ตัวแปรสตริงที่เก็บขอความสําหรับสงออกพอรตอนุกรม
ตัวอยางที่ 5-6 int analogValue = 0; void setup()
// กําหนดตัวแปรเก็บคาสัญญาณอะนาลอก
{ Serial.begin(9600);
// เปดพอรตอนุกรม กําหนดอัตราบอดเปน 9600 บิตตอวินาที
} void loop() { analogValue = analogRead(0);
// อานคาสัญญาณอะนาลอกชอง 0 โดยตอแผงวงจร ZX-POT เขาที่จุดตอ A0 // แสดงผลที่หนาตาง Serial Monitor ในหลายรูปแบบ Serial.print(analogValue); // แสดงเปนรหัสแอสกี้ของเลขฐานสิบ Serial.print("\t"); // คันด ่ วยแท็บ (tab) Serial.print(analogValue, DEC); // แสดงเปนรหัสแอสกี้ของเลขฐานสิบ Serial.print("\t"); // คันด ่ วยแท็บ (tab) Serial.print(analogValue, HEX); // แสดงเปนรหัสแอสกีของเลขฐานสิ ้ บหก // คันด ่ วยแท็บ (tab) Serial.print("\t"); // แสดงเปนรหัสแอสกี้ของเลขฐานแปด Serial.print(analogValue, OCT); Serial.print("\t"); // คันด ่ วยแท็บ (tab) Serial.print(analogValue, BIN); // แสดงเปนรหัสแอสกี้ของเลขฐานสอง Serial.print("\t"); // คันด ่ วยแท็บ (tab) Serial.write(analogValue/4);
// แสดงขอมูลดิบ ซึงต ่ องผานการหารดวย 4 เนื่องจากฟงกชัน่ analogRead() คืนคา 0 ถึง 1023 // แตตัวแปรแบบไบตรับคาไดเพียง 255
76 Robo-CreatorXT : ATX2
Serial.print("\t"); Serial.println(); delay(10);
// คันด ่ วยแท็บ (tab) // ขึนบรรทั ้ ดใหม // หนวงเวลา 10 มิลลิวินาที
} ตัวอยางนีแสดงการพิ ้ มพขอมูลจากฟงกชัน่ Serial.Print() ในรูปแบบตางๆ แสดงผานหนาตาง Serial Monitor
ตองเลือกอัตราบอดของหนาตาง Serial Monitor เปน 9600baud, เลือก No line Ending และคลิกทํา เครืองหมายที ่ ช่ อง Autoscroll ดวย จึงจะไดผลการทํางานทีถู่ กตอง
เทคนิคสําหรับการเขียนโปรแกรม จะตั ดเศษเลขทศนิยมเหลือเป นเลขจํานวนเต็ม ทําใหสวนทศนิยมหายไป ทางแกไขทางหนึ่งคือ คูณเลขทศนิยมดวย 10, 100, 1000 ฯลฯ ขึ้นอยูกับจํานวนหลักของเลขทศนิยม เพือแปลง ่ เลขทศนิ ยมเป นจํานวนเต็มกอนแลวจึงสงออกพอรตอนุกรม จากนั้นที่ ฝงภาครับใหทําการหารคาทีรั่ บไดเพื่อ แปลงกลับเปนเลขทศนิยม Serial.print()
Robo-CreatorXT : ATX2 77
5.2.1.6 Serial.println(data) เปนฟงกชันพิ ่ มพ (หรือสง) ขอมูลออกทางพอรตอนุกรมตามดวยรหัส carriage return (รหัส ASCII ่ เกิดการเลือนบรรทั ่ ดและ หมายเลข 13 หรือ \r) และ linefeed (รหัส ASCII หมายเลข 10 หรือ \n) เพือให ขึนบรรทั ้ ดใหมหลังจากพิมพขอความ มีรูปแบบเหมือนคําสัง่ Serial.print() รูปแบบฟงกชั่น Serial.println(b)
เปนคําสังพิ ่ มพขอมูลแบบไมไดระบุรูปแบบ จะพิมพคาตัวแปร b เปนเลขฐานสิบ ตามดวยรหัสอักษร carriage return และ linefeed ดังตัวอยางตอไปนี้ Serial.println(b, DEC)
เปนคําสังพิ ่ มพคาตัวแปร b เปนตัวเลขฐานสิบ ตามดวยรหัสอักษร carriage return และ linefeed Serial.println(b, HEX)
เปนคําสังพิ ่ มพคาตัวแปร b เปนตัวเลขฐานสิบหก ตามดวยรหัสอักษร carriage return และ linefeed Serial.println(b, OCT)
เปนคําสังพิ ่ มพคาตัวแปร b เปนตัวเลขฐานแปด ตามดวยรหัสอักษร carriage return และ linefeed Serial.println(b, BIN)
เปนคําสังพิ ่ มพคาตัวแปร b เปนตัวเลขฐานสอง ตามดวยรหัสอักษร carriage return และ linefeed Serial.println(b, BYTE)
เปนคําสังพิ ่ มพคาตัวแปร b ขนาด 1 ไบต ตามดวยรหัสอักษร carriage return และ linefeed Serial.println(str)
เปนคําสังพิ ่ มพคาขอความในวงเล็บหรือขอความ ทีเก็ ่ บในตัวแปร str ตามดวยรหัสอักษร carriage return และ linefeed Serial.println()
เปนคําสังพิ ่ มพรหัส carriage return และ linefeed
พารามิเตอร b - ไบตขอมูลทีต่ องการพิมพออกทางพอรตอนุกรม str - ตัวแปรสตริงที่เก็บขอความสําหรับสงออกพอรตอนุกรม
78 Robo-CreatorXT : ATX2
ตัวอยางที่ 5-7 int analogValue = 0; void setup() { Serial.begin(9600); } void loop() {
// ประกาศตัวแปรสําหรับเก็บคาอะนาลอก // เปพอรตอนุกรมและเลือกอัตราบอดเปน 9600 บิตตอวินาที
analogValue = analogRead(0);
// อานคาอินพุตอะนาลอกชอง 0 ตอแผงวงจร ZX-POT กับพอรตอินพุตอะนาลอก A0 // แสดงผลในรูปแบบตางๆ // แสดงเปนรหัสแอสกี้ของเลขฐานสิบ Serial.println(analogValue); Serial.println(analogValue, DEC); // แสดงเปนรหัสแอสกี้ของเลขฐานสิบ Serial.println(analogValue, HEX); // แสดงเปนรหัสแอสกีของเลขฐานสิ ้ บหก Serial.println(analogValue, OCT); // แสดงเปนรหัสแอสกี้ของเลขฐานแปด Serial.println(analogValue, BIN); // แสดงเปนรหัสแอสกี้ของเลขฐานสอง Serial.write(analogValue); // แสดงคาในรูปแบบขอมูลระดับไบต Serial.println(); Serial.flush(); delay(10);
// หนวงเวลา 10 มิลลิวินาที
}
ตองเลือกอัตราบอดของหนาตาง Serial Monitor เปน 9600baud, เลือก No line Ending และคลิกทําเครืองหมายที ่ ช่ อง Autoscroll ดวย จึงจะไดผลการทํางานทีถู่ กตอง
Robo-CreatorXT : ATX2 79
5.3 ฟงกชันอิ ่ นพุตเอาตพุตอะนาลอก 5.3.1 คําอธิบายและการเรียกใชฟงกชั่น 5.3.1.1 int
analogRead(pin)
อานคาจากขาพอรตที่กําหนดใหเปนอินพุตอะนาลอกของ Arduino และแผงวงจร ATX2 โดย แผงวงจร ATX2 มีวงจรแปลงสัญญาณอะนาลอกเปนดิจิตอล ความละเอียด 10 บิต จึงแปลงคาแรงดัน อินพุต 0 ถึง +5V ใหเปนขอมูลตัวเลขจํานวนเต็มระหวาง 0 ถึง 1023 พารามิเตอร pin - หมายเลขของขาอินพุตอะนาลอก มีคา 0 ถึง 12 หรือเปนตัวแปรทีใช ่ แทนคา 0 ถึง 12
คาที่สงกลับ เลขจํานวนเต็มจาก 0 ถึง 1023
หมายเหตุ สําหรับขาที่เปนอินพุตอะนาลอกไมจําเปนตองประกาศแจ งวาเปนอินพุตหรือเอาตพุต
ตัวอยางที่ 5-8 int ledPin = 30; int analogPin = 0; int val = 0;
// ตอแผงวงจร ZX-LED เขาที่พอรต 4 // ตอแผงวงจร ZX-POT เขาที่พอรตอินพุต A0 // กําหนดตัวแปรรับคาอะนาลอก // กําหนดคาอางอิง
int threshold = 512; void setup() { // กําหนดใหพอรต 4 เปนเอาตพุต pinMode(ledPin, OUTPUT); } void loop() { val = analogRead(analogPin); // อานคาอินพุตอะนาลอก A0 if (val >= threshold) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); }
// ขับ LED // ดับ LED
}
ตัวอยางนี้จะสั่งใหพอรต 30 เปนลอจิก “1” เมืออ ่ านคาจากพอรตอินพุต A0 แลวมีคามากกวาหรือเทากับ คาอางอิงทีกํ่ าหนดไว (ในตัวอยาง คาอางอิงหรือ threshold = 255) แตถาคานอยกวา พอรต 30 จะเปนลอจิก “0” ทําให LED ดับ หมายเหตุ : ขาพอรตในโปรแกรมนีอ้ างถึงจุดตอพอรตของแผงวงจรควบคุมอเนกประสงค ATX2
80 Robo-CreatorXT : ATX2
5.3.1.2 analogWrite(pin,
value)
ใชเขียนคาอะนาลอกไปยังพอรตที่กําหนดไว เพื่อสรางสัญญาณ PWM พารามิเตอร pin - หมายเลขขาพอรตของแผงวงจร ATX2 value - เปนคาดิวตีไซเกิ ้ ลมีคาระหวาง 0 ถึง 255 เมือค ่ าเปน 0 แรงดันของขาพอรตทีกํ่ าหนดจะเปน 0V เมือมี ่ คาเปน 255 แรงดันที่ขาพอรตจะเปน +5V สําหรับคาระหวาง 0 ถึง 255 จะทําใหขาพอรตทีกํ่ าหนดไวมีคาแรงดันเปลี่ยนแปลงในยาน 0 ถึง +5V
คาที่สงกลับจากฟงกชั่น เลขจํานวนเต็มจาก 0 ถึง 255
หมายเหตุ ขาพอรตทีใช ่ สรางสัญญาณ PWM ดวยฟงกชัน่ analogWrite() ของแผงวงจร ATX2 มี 6 ขาคือ ขา 4, 5, 6, 7, 19 และ 20 สําหรับขาอื่นๆ จะตองเขียนคาดิจิตอลเปนกําหนดเปน 0 หรือ +5V เนื่องจากขาทั้งหมดนันถู ้ กตอ เขากับวงจรขับมอเตอร จึงไมสามารถทําการทดสอบคําสัง่ analogWrite กับแผงวงจร ATX2 ได
ผูใชงานสามารถนําสัญญาณที่ไดจากคําสั่งนี้ไปใชในการปรับความสวางของ LED หรือตอ ขยายกระแสเพื่อตอปรับความเร็วของมอเตอรได หลังจากเรียกใชคําสังนี ่ ้แลวที่ขาพอรตที่กําหนดจะ มีสัญญาณ PWM สงออกมาอยางตอเนือง ่ จนกวาจะมีการเรียกคําสัง่ digitalRead หรือ digitalWrite ที่ขาเดียวกัน
Robo-CreatorXT : ATX2 81
5.4 ฟงกชันพอร ่ ตอินพุตเอาตพุตขั้นสูง (Enhanced I/O) 5.4.1
shiftOut(dataPin, clockPin, bitOrder, value)
เปนฟงกชันสํ ่ าหรับเลื่อนขอมูลขนาด 1 ไบต (8 บิต) ออกจากขาพอรตที่กําหนดไว สามารถ กําหนดไดวา จะใหเริมเลื ่ อนบิ ่ ตขอมูลจากบิตที่มีความสําคัญสูงสุด (MSB หรือบิตซายสุด) หรือบิตที่ มีความสําคัญตําสุ ่ ด (LSB - บิตขวาสุด) โดยบิตของขอมูลจะออกที่ขา dataPin และใชอีกหนึงขาคื ่ อ clockPin เปนตัวกําหนดจังหวะการเลื่อนขอมูล การสงขอมูลวิธีทีว่ านีเรี้ ยกวา การสงขอมูลอนุกรมแบบโปรโตคอลซิงโครนัส ซึงเป ่ นวิธีทัวไปที ่ ่ ไมโครคอนโทรเลอรใชติดตอกับตัวตรวจจับหรือไมโครคอนโทรลเลอรตัวอืน่ อุปกรณทังสองตั ้ วตอง ทํางานประสานกัน (ซิงโครไนซกัน) และติดตอกันทีความเร็ ่ วสูงสุด เนืองจากอุ ่ ปกรณทังสองตั ้ วจะใช สัญญาณนาฬิกาเดียวกัน จะเรียกชืออี ่ กอยางวา เปนการสือสารแบบ ่ SPI (synchronous peripheral interface) พารามิเตอร dataPin - พอรตทีกํ่ าหนดใหเปนเอาตพุตเพื่อสงขอมูลออก (ตัวแปรชนิด int) clockPin - พอรตทีกํ่ าหนดใหทําหนาที่สงสัญญาณนาฬิกาเพือกํ ่ าหนดจังหวะการเลื่อนขอมูลของ dataPin bitOrder - กําหนดลําดับการเลื่อนบิตขอมูล เลือกไดวาเปน MSBFIRST หรือ LSBFIRST value - ไบตขอมูลทีต่ องการสงแบบอนุกรม พอรตทีเป ่ น dataPin และ clockPin จะตองกําหนดใหเปนเอาตพุตกอน ดวยการเรียกใชฟงกชัน่ pinMode
5.4.1.1 การเขียนโปรแกรมทีผิ่ ดพลาดทีพบบ ่ อยของฟงกชั่น shiftOut เนืองจากฟ ่ งกชันนี ่ ้สามารถสงขอมูลไดครั้งละ 1 ไบต (8 บิต) เทานัน้ ถาเปนตัวแปร int หนึง่ ตัวเก็บขอมูลขนาด 2 ไบต (16 บิต) ทําใหไมสามารถสงคาไดโดยใชคําสังนี ่ ้เพียงครั้งเดียว ถาสังเพี ่ ยง ครั้งเดียว คาที่ไดจะผิดพลาด ดังตัวอยางโปรแกรมที่ผิดพลาดตอไปนี้ ตัวอยางที่ 5-9 int data; int clock; int cs; ... digitalWrite(cs, LOW); data = 500; shiftOut(data, clock, MSBFIRST, data) digitalWrite(cs, HIGH);
ขอมูลทีต่ องการเลือนเท ่ ากับ 500 ดังนั้นจึงมีขนาด 2 ไบต (เพราะ 1 ไบตเก็บคาไดสูงสุด 256 คา) แต เนื่องจากในโปรแกรมเลื่อนเพียง 1 ไบต คาที่ไดจึงเทากับ 244 เนื่องจากขอมูล 8 บิตบนของตัวแปร data มีคาเทากับ 244
82 Robo-CreatorXT : ATX2
ในตัวอยางที่ 5-10 เปนการแกไขโปรแกรมเพือให ่ สามารถเลื่อนขอมูลไดอยางถูกตอง ตัวอยางที่ 5-10 ในกรณีทีต่ องการเลือนบิ ่ ต MSB กอน เขียนโปรแกรมไดดังนี้ data = 500; shiftOut(data, clock, MSBFIRST, (data >> 8)); shiftOut(data, clock, MSBFIRST, data);
// เลือนข ่ อมูลไบตสูง // เลือนข ่ อมูลไบตตํา่
ในกรณีทีต่ องการเลือนบิ ่ ต LSB กอน เขียนโปรแกรมไดดังนี้ data = 500; shiftOut(data, clock, MSBFIRST, data); shiftOut(data, clock, MSBFIRST, (data >> 8));
5.4.2 unsigned
// เลือนข ่ อมูลไบตตํา่ // เลือนข ่ อมูลไบตสูง
long pulseIn(pin, value)
ใช อานคาบเวลาของพัลส (ไมวาเปน HIGH หรือ LOW) ที่เกิดขึ้นที่ pin (ขาพอรตอินพุต ดิจิตอล) ที่กําหนด เชน ถากําหนด value เปน HIGH คําสัง่ pulseIN() จะรอใหขาที่กําหนดไวมี สถานะเปน HIGH เพื่อเริมจั ่ บเวลา และจับเวลาตอไปจนกวาสถานะของขานันจะเป ้ น LOW จึงหยุด จับเวลา คาที่ฟงกชันคื ่ นกลับมาเปนคาบเวลาของพัลสในหนวยไมโครวินาที แสดงการทํางานในรูป ที่ 5-7 คาฐานเวลาของฟงกชั่นประมาณคาไดจากการทดลอง และอาจผิดพลาดไดในกรณีที่พัลสมี ความกวางมาก ฟงกชันนี ่ ้ทํางานไดดีกับสัญญาณพัลสที่มีคาบเวลา 10 ไมโครวินาทีถึง 3 นาที พารามิเตอร pin - ขาพอรตทีต่ องการอานคาคาบเวลาพัลส (ตัวแปรชนิด int) value - ระดับสัญญาณทีต่ องการตรวจจับ กําหนดเปน HIGH หรือ LOW (ตัวแปรชนิด int) โดย HIGH คือ ลอจิกสูง และ LOW คือ ลอจิกตํา่ value = HIGH
value = LOW
เริ่มการนับเวลา
หยุดการนับเวลา
รูปที่ 5-6 การทํางานของฟงกชัน่ pulseIn
เริ่มการนับเวลา
หยุดการนับเวลา
Robo-CreatorXT : ATX2 83
คาที่สงกลับจากฟงกชั่น คาบเวลาของพัลสในหนวยไมโครวินาที
ตัวอยางที่ 5-11 int pin = 18; unsigned long duration; void setup() { pinMode(pin, INPUT); } void loop() { duration = pulseIn(pin, HIGH); }
ฟงกชันนี ่ ้ไมมีกลไกการหมดเวลา ถาไมมีพัลสเกิดขึ้น จะวนรอไปตลอดเวลา ทําใหโปรแกรมคางได
5.5 ฟงกชันเกี ่ ยวกั ่ บเวลา (Time) 5.5.1
unsigned long millis()
คืนคาเปนคาเวลาในหนวยมิลลิวินาที นับตั้งแตแผงวงจร ATX2 เริมรั ่ นโปรแกรมปจจุบัน คาที่สงกลับจากฟงกชั่น คาเวลาในหนวยเปนมิลลิวินาทีตังแต ้ เริ่มรันโปรแกรมปจจุบัน คืนคาเปน unsigned long คาตัวเลขจะเกิด การโอเวอรโฟลว (คาเกินแลวกลับเปนศูนย) เมือเวลาผ ่ านไปประมาณ 9 ชัวโมง ่
ตัวอยางที่ 5-12 long time; void setup() { Serial.begin(9600); } void loop() { Serial.print(“Time: “); time = millis(); Serial.println(time); Serial.flush(); delay(1000); }
// อานคาเวลา // แสดงคาเวลา
84 Robo-CreatorXT : ATX2
5.5.2
delay(ms)
เปนฟงกชันชะลอการทํ ่ างาน หรือหนวงเวลาของโปรแกรมตามเวลาทีกํ่ าหนดในหนวยมิลลิวินาที พารามิเตอร ms - ระยะเวลาทีต่ องการหนวงเวลา หนวยเปนมิลลิวินาที (1000 ms เทากับ 1 วินาที)
ตัวอยางที่ 5-13 // ตอแผงวงจร ZX-LED กับพอรต 30 ของแผงวงจร int ledPin = 30; void setup(){ pinMode(ledPin, OUTPUT); // กําหนดเปนพอรตเอาตพุต } void loop(){ digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000);
ATX2
// ขับ LED // หนวงเวลา 1 วินาที // ดับ LED // หนวงเวลา 1 วินาที
}
5.5.3
delayMicroseconds(us)
เปนฟงกชันหน ่ วงเวลาของโปรแกรมตามเวลาทีกํ่ าหนดในหนวยไมโครวินาที เพือให ่ หนวงเวลา ไดอยางแมนยํา ฟงกชันนี ่ จะหยุ ้ ดการทํางานของอินเตอรรัปต ทําใหการทํางานบางอยาง เชน การรับขอ มูลจากพอรตอนุกรม หรือการเพิมค ่ าทีจะส ่ งกลับคืนโดยฟงกชัน่ milis() จะไมเกิดขึน้ ดังนันควรจะใช ้ ฟงกชันนี ่ สํ้ าหรับการหนวงเวลาสันๆ ้ ถาตองการหนวงเวลานานๆ แนะนําใหใชฟงกชัน่ delay() แทน พารามิเตอร us - คาหนวงเวลาในหนวยไมโครวินาที (1000 ไมโครวินาที = 1 มิลลิวินาที และหนึงล ่ านไมโครวินาที = 1 วินาที)
ตัวอยางที่ 5-14 // ตอแผงวงจร ZX-LED กับพอรต 30 ของแผงวงจร int outPin = 30; void setup(){ pinMode(outPin, OUTPUT); // กําหนดเปนพอรตเอาตพุต } void loop(){ digitalWrite(outPin, HIGH); // ขับ LED delayMicroseconds(50); // หนวงเวลา 50 ไมโครวินาที // ดับ LED digitalWrite(outPin, LOW); delayMicroseconds(50);
ATX2
// หนวงเวลา 50 ไมโครวินาที
}
จากตัวอยางนี้ กําหนดใหพอรต 30 ทํางานเปนเอาตพุตเพื่อสงสัญญาณพัลสทีมี่ คาบเวลา 100 ไมโครวินาที คําเตือน ฟงกชันนี ่ ้ทํางานอยางแมนยําในชวงตังแต ้ 3 ไมโครวินาทีขึนไป ้
Robo-CreatorXT : ATX2 85
5.6 ฟงกชันทางคณิ ่ ตศาสตร 5.6.1
min(x, y)
หาคาตัวเลขที่นอยที่สุดของตัวเลขสองตัว พารามิเตอร x - ตัวเลขตัวแรก เปนขอมูลประเภทใดก็ได y - ตัวเลขตัวทีสอง ่ เปนขอมูลประเภทใดก็ได
คาที่สงกลับจากฟงกชั่น คาทีน่ อยที่สุดของตัวเลขสองตัวที่ให
ตัวอยางที่ 5-15 sensVal = min(sensVal, 100);
ตัวอยางนี้จะไดคาของ sensVal ทีไม ่ เกิน 100 กลับจากฟงกชัน่
5.6.2
max(x,y)
หาคาตัวเลขที่มากทีสุ่ ดของตัวเลขสองตัว พารามิเตอร x - ตัวเลขตัวแรก เปนขอมูลประเภทใดก็ได y - ตัวเลขตัวทีสอง ่ เปนขอมูลประเภทใดก็ได
คาที่สงกลับจากฟงกชั่น คาทีมากที ่ สุ่ ดของตัวเลขสองตัวที่ให
ตัวอยางที่ 5-16 sensVal = max(senVal, 20);
จากตัวอยางนี้ คาของ sensVal จะมีคาอยางนอย 20
5.6.3
abs(x)
หาคาสัมบูรณ (absolute) ของตัวเลข พารามิเตอร x - ตัวเลข
คาที่สงกลับจากฟงกชั่น x เมือ่ x มีคามากกวาหรือเทากับศูนย (x มีคาเปนบวกหรือศูนย) -x เมือ่ x มีคานอยกวาศูนย (x มีคาติดลบ)
86 Robo-CreatorXT : ATX2
5.6.4
constrain(x, a, b)
ปดคาตัวเลขที่นอยกวาหรือมากกวาใหอยูในชวงที่กําหนด พารามิเตอร x - ตัวเลขทีต่ องการปดคาใหอยูในชวงทีกํ่ าหนด สามารถเปนขอมูลชนิดใดก็ได a - คาตําสุ ่ ดของชวงทีกํ่ าหนด b - คาสูงสุดของชวงทีกํ่ าหนด
คาที่สงกลับจากฟงกชั่น x เมือ่ x มีคาอยูระหวาง a และ b a เมือ่ x มีคานอยกวา a b เมือ่ x มีคามากกวา b
ตัวอยางที่ 5-17 sensVal = constrain(sensVal, 10, 150);
จากตัวอยางนี้ คาของ sensVal จะอยูในชวง 10 ถึง 150
5.7 ฟงกชันเกี ่ ่ยวกับตัวเลขสุม 5.7.1
randomSeed(seed)
ใชกําหนดตัวแปรสําหรับสรางตัวเลขสุม เลือกใชตัวแปรไดหลากหลายรูปแบบ โดยทั่วไปจะ ใชคาเวลาปจจุบัน (จากฟงกชัน่ milis()) แตใชคาอยางอื่นได เชน คาที่ไดเมือผู ่ ใชกดสวิตช หรือคา สัญญาณรบกวนที่อานไดจากขาอินพุตอะนาลอก พารามิเตอร seed เปนคาตัวเลขแบบ long int
ตัวอยางที่ 5-18 long randNumber; void setup() { Serial.begin(19200); } void loop() { randomSeed(analogRead(0)); randNumber = random(300); Serial.println(randNumber); }
ในตัวอยางนี้ กําหนดใหเกิดการสุมตัวเลขเมืออ ่ านคาจากอินพุตอะนาลอกชอง 0 ยานของตัวเลขสุมคื อ 0 ถึง 300 เมือสุ ่ มตัวเลขแลว ใหแสดงคานันที ้ ่หนาตาง Serial Monitor
Robo-CreatorXT : ATX2 87
5.7.2
long random(max), long random (min,max)
ใชสรางตัวเลขสุมเสมือน (pseudo-random numbers) เพือนํ ่ าไปใชในโปรแกรม กอนใชฟงกชัน่ นี้จะตองเรียกใชฟงกชัน่ randomSeed() กอน พารามิเตอร min กําหนดคาตัวเลขสุมไม นอยกวาคานี้ (เปนออปชันเพิ ่ มเติ ่ ม) max กําหนดคาสูงสุดของตัวเลขสุม
คาที่สงกลับจากฟงกชั่น คืนคาเปนตัวเลขสุมในช วงทีกํ่ าหนด (เปนตัวแปร long int)
ตัวอยางที่ 5-19 long randNumber; void setup() { Serial.begin(9600); } void loop() { randomSeed(analogRead(0)); randNumber = random(50,300); Serial.println(randNumber); Serial.flush(); delay(50);
// สุมค าจากการอานคาอินพุตอะนาลอก // สุมค าในชวง 50 ถึง 300
}
เมือรั ่ นโปรแกรมนี้ คาที่ไดจากจะอยูในชวง 50 ถึง 300 แมวาจะปรับคาแรงดันอินพุตทีพอร ่ ต A0 เปน 0 หรือ +5V (ซึ่งปกติมีคา 0 ถึง 1023) ทังนี ้ ้เปนผลมาจากฟงกชัน่ random(min,max)
88 Robo-CreatorXT : ATX2
5.8 ฟงกชันเกี ่ ยวกั ่ บอินเตอรรัปตจากภายนอก ใชระบุวาเมือเกิ ่ ดการอินเตอรรัปตจากภายนอกจะใหโปรแกรมกระโดดไปยังฟงกชันใด ่ หรือ ถอดการระบุฟงกชัน่
5.8.1 การอินเตอรรัปต (interrupt) หรือการขัดจังหวะการทํางานของซีพียู นับเปนคุณสมบัติทีต่ องมีในไมโครคอนโทรลเลอรสมัย ใหมและเปนคุณสมบัติที่มีบทบาทสําคัญอยางมาก ในขณะที่ ระบบกําลังทําการลําเลียงขวดไปตาม สายพานเพือทํ ่ าการบรรจุนํายา ้ แลวเกิดเหตุการณขวดหมด จึงตองมีการขัดจังหวะกระบวนการบรรจุนํายา ้ ชัวขณะ ่ จนกวาจะจัดหาขวดเขามาในระบบเปนทีเรี่ ยบรอย กระบวนการทํางานก็จะดําเนินตอไป จากตัวอยางดังกลาว ถาเปรียบเทียบกับโปรแกรมควบคุมของไมโครคอนโทรลเลอร ระบบ ลําเลียงขวดเพื่อบรรจุนํ้ายาเปรียบไดกับโปรแกรมหลัก เหตุการณขวดหมดคือ เงือนไขของการเกิ ่ ด อิ นเตอร รั ปต ที่ เป นจริ ง ทําให เกิ ดอิ นเตอร รัปตขึ้น การจัดหาขวดมาเพิ่มเติมเปรียบไดกับซีพียู กระโดดออกจากโปรแกรมหลักไปทํางานที่โปรแกรมยอยบริการอินเตอรรัปต เพื่อจัดหาขวด นั่นคือ เสร็ จสิ้นการบริ การอินเตอรรัปต ซีพียูก็จะกระโดดกลับมาทํางานที่ โปรแกรมหลักตอไป ระบบ สายพานลําเลียงก็จะทํางานตอไปตามปกติ
5.8.2 อินพุตรับสัญญาณอินเตอรรัปต แผงวงจร ATX2 มีอินพุตสําหรับรับสัญญาณอินเตอรรัปตจากภายนอก 3 จุดตอคือ INT0 ถึง INT2 ซึ่งตรงกับขา 2, 3 ซึ่งใชงานรวมกับขา RxD1, TxD1 (ขารับสงขอมูลอนุกรม UART1) และขา 18
5.8.3
attachInterrupt(interrupt, function, mode)
ใชระบุวา เมือขาอิ ่ นพุตทีรั่ บสัญญาณอินเตอรรัปตจากภายนอกมีการเปลียนแปลงจะกํ ่ าหนดใหซี พียูกระโดดไปยังฟงกชันใด ่ โดยแผงวงจรหลัก POP-XT มีขาอินพุตรับสัญญาณอินเตอรรัปตจากภายนอก 4 ขาคือ INT0 ถึง INT3 ซึงตรงกั ่ บพอรต 3,2, 0 และ 1 ตามลําดับ ทังยั ้ งตรงกับพอรตของบัส I2C และ UART1 ดวย ดังนัน้ หากเลือกใชงานพอรตนีอิ้ นพุตอินเตอรรัปต ก็จะใชงานพอรตบัส I2C หรือพอรต อนุกรม UART1 เพือติ ่ ดตออุปกรณภายนอกไมได หมายเหตุ เมือเกิ ่ ดการอินเตอรรัปตขึน้ จะไมสามารถเรียกใชฟงกชัน่ milis() และ delay() ได เมือเกิ ่ ดการตอบสนอง อินเตอรรัปตแลว ดังนั้นขอมูลทีเข ่ ามาทางพอรต UART1 อาจสูญหายได
Robo-CreatorXT : ATX2 89
พารามิเตอร Interrupt - หมายเลขของชองอินพุตอินเตอรรัปต (เปน int) function - ฟงกชันที ่ จะกระโดดไปทํ ่ างานเมือเกิ ่ ดอินเตอรรัปต ไมรับคาพารามิเตอรและไมมีการคืนคา mode - เลือกประเภทสัญญาณทีใช ่ กระตุนใหเกิดการอินเตอรรัปต LOW เกิดอินเตอรรัปตเมือขาสั ่ ญญาณเปนลอจิก “0” CHANGE เกิดอินเตอรรัปตเมื่อมีการเปลี่ยนแปลงลอจิก RISING เกิดอินเตอรรัปตเมือมี ่ การเปลี่ยนลอจิก “0” เปน “1” FALLING เกิดอินเตอรรัปตเมือมี ่ การเปลี่ยนลอจิก “1” เปน “0”
ตัวอยางที่ 5-20 int pin = 30; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; }
ตัวอยางนี้เลือกอินพุตอินเตอรรัปตชอง 0 กําหนดใหไปทํางานทีฟ่ งกชัน่ blink เมือเกิ ่ ดอินเตอรรัปตขึน้
5.8.4
detachInterrupt(interrupt)
ยกเลิกการอินเตอรรัปต พารามิเตอร Interrupt - หมายเลขของชองอินพุตอินเตอรรัปตทีต่ องการยกเลิก (คาเปน 0 ถึง 3)
90 Robo-CreatorXT : ATX2
Robo-CreatorXT : ATX2 91
การพัฒนาโปรแกรมภาษา C/C++ ดวย Arduino สําหรับแผงวงจรไมโครคอนโทรลเลอร ATX2 ดําเนินการภายใตการสนับสนุนของไฟลไลบรารี ATX2.h ทั้งนี้เพือช ่ วยลดขั้นตอนและความ ซับซอนในการเขียนโปรแกรมควบคุมสวนตางๆ ของฮารดแวรลง เนื่องจากตองการใหความสําคัญ ไปอยูที่การเขียนโปรแกรมสําหรับรองรับการเรียนรูและกิจกรรมการแขงขัน โครงสรางของไฟลไลบรารี ATX2.h แสดงดังรูป
Pixy
ZX-SERVO16i
XBEE
On-board piezo speaker
TB6612FNG
M
M
ZX-LED
ZX-SWITCH01
92Robo-CreatorXT : ATX2
6.1 ไลบรารียอยภายในไฟลไลบรารี ATX2.h บรรจุฟงกชันและคํ ่ าสังสํ ่ าหรับแสดงผลขอความ, ตัวเลข และสรางภาพกราฟก สีทีจอแสดงผลแบบกราฟ ่ ก LCD สีของแผงวงจร ATX2 (ยังไมรองรับการทํางานกับไฟลรูปภาพ) ATX2_sleep บรรจุฟงกชั่นและคําสั่งสําหรับการหนวงเวลา ATX2_in_out บรรจุฟงกชั่นและคําสั่งสําหรับอานคาอินพุตดิจิตอลและสงคาออกทาง ขาพอรตเอาตพุตดิจิตอล ATX2_analog บรรจุฟงกชั่นและคําสั่งสําหรับอานคาจากอินพุตอะนาลอกที่ตอกับตัว ตรวจจับ ATX2_sound บรรจุฟงกชั่นและคําสั่งสําหรับสรางเสียงเพื่อขับออกลําโพง ATX2_motor บรรจุฟงกชั่นและคําสั่งสําหรับขับมอเตอรไฟตรง ATX2_servo บรรจุฟงกชั่นและคําสั่งสําหรับขับเซอรโวมอเตอร ATX2_serial บรรจุฟงกชั่นและคําสั่งสําหรับสื่อสารขอมูลอนุกรมผานทางพอรต USB และผานทางขาพอรต TXD1 และ RXD1 ของแผงวงจร ATX2 ATX2_sonar บรรจุฟงกชั่นและคําสั่งสําหรับติดตอกับโมดูลวัดระยะทางดวยอัลตราโซ นิก HC-SR04 ATX2_encCnt บรรจุฟงกชั่นและคําสั่งสําหรับอานคาจากแผงวงจรตรวจจับรหัสลอ ZXENCODER ในการเรียกใชงานชุดคําสั่งยอยตางๆ เพื่อการพัฒนาโปรแกรม ตองผนวกไฟลไลบรารีหลัก ATX2.h ไวในตอนตนของโปรแกรมดวยคําสัง่ ATX2_glcd
#include <ATX2.h>
เพื่อประกาศใหใหตัวแปลภาษาหรือคอมไพเลอรรูจั กชุดคําสั่งยอยตางๆ ที่กําลังจะถูกเรียกใช
งานจากไฟลไลบรารี ATX2.h
Robo-CreatorXT : ATX2 93
6.2 รายละเอียดของฟงกชันหรื ่ อคําสังหลั ่ กในไฟลไลบรารี ATX2.h 6.2.1 ฟงกชันเกี ่ ่ยวกับการแสดงผลจอภาพแบบกราฟก LCD สี 6.2.1.1 ขอมูลเบื้องตนเกี่ยวกับจอแสดงผลของแผงวงจร ATX2 มีคุณสมบัติทางเทคนิคดังนี้ แสดงผลแบบกราฟกสี ความละเอียด 128 x 160 จุด ขนาด 1.8 นิ้ว
้ (ไมรองรับไฟลรูปภาพ) 65,536 สี พรอมไฟสองหลัง แสดงภาพกราฟกลายเสนและพืนสี แสดงผลเปนตัวอักษรขนาดปกติ (5 x 7 จุด) ได 21 ตัวอักษร 16 บรรทัด (หรือ 21x16)
ในรูปที่ 6-1 แสดงการกําหนดตําแหนงของการแสดงตัวอักษรของจอแสดงผลแบบกราฟก LCD สีของแผงวงจร ATX2 เปนการมองในแนวตั้ง
012345 67 89abc defghijk 100000000000000000000 20000 0 0000d 0000000000 300000000000000000000 400000000000000000000 500000000000000000000 600000000000000000000 700000000000000000000 800000000000000000000 900000000000000000000 a00000000000000000000 b00000000000000000000 c00000000000000000000 d00000000000000000000 e00000000000000000000 f00000000000000000000
รูปที่ 6-1 การกําหนดตําแหนงของการแสดงผลสําหรับจอแสดงผลกราฟก LCD สีทีใช ่ บนแผงวงจร ATX2
94Robo-CreatorXT : ATX2
6.2.1.1 glcd เปนฟงกชั่นแสดงขอความที่หนาจอแสดงผลกราฟก LCD สี โดยแสดงตัวอักษรขนาดปกติ ได 21 ตัวอักษร 16 บรรทัด รูปแบบ void glcd(unsigned char x, unsigned char y ,char *p,...)
พารามิเตอร x คือตําแหนงบรรทัดมีคาตั้งแต 0 ถึง 15 y คือตําแหนงตัวอักษรมีคาตั้งแต 0 ถึง 20 *p คือขอความทีต่ องการนํามาแสดงรวมถึงรหัสทีใช ่ กําหนดรูปแบบพิเศษเพือร ่ วมแสดงผลขอมูลตัวเลขในรูป แบบอืนๆ ่ ประกอบดวย %c หรือ %C - รับคาแสดงผลตัวอักษร 1 ตัวอักษร %d หรือ %D - รับคาแสดงผลตัวเลขจํานวนเต็มในชวง -32,768 ถึง 32,767 %l หรือ %L - รับคาแสดงผลตัวเลขจํานวนเต็มในชวง -2,147,483,648 ถึง 2,147,483,647 %f หรือ %F - รับคาเพือแสดงผลตั ่ วเลขจํานวนจริง (แสดงทศนิยม 3 หลัก)
ตัวอยางที่ 6-1 glcd(2,0,“Hello World“);
// แสดงขอความ Hello World ทีตํ่ าแหนงซายสุดของบรรทัด 2 (บรรทัดที่ 3)
012345 67 89abc defghijk 100000000000000000000 Hello 0 World 0000000000 300000000000000000000 400000000000000000000 500000000000000000000 600000000000000000000 700000000000000000000 800000000000000000000 900000000000000000000 a00000000000000000000 b00000000000000000000 c00000000000000000000 d00000000000000000000 e00000000000000000000 f00000000000000000000
Robo-CreatorXT : ATX2 95
ตัวอยางที่ 6-2 int x=20; glcd(1,2,”Value = %d”,x);
// แสดงตัวอักษรและตัวเลขบนบรรทัดเดียวกัน เริมต ่ นที่คอลัมน 2 ของบรรทัด 1 (บรรทัดที่ 2)
6.2.1.2 glcdSetColorWordBGR เปนฟงกชั่นกําหนดการเรียงบิตขอมูลสีใหเปนแบบ BGR (5-6-5) นั่นคือ คาของสีนํ้าเงิน 5 บิต ตอดวยสีเขียว 6 บิต และปดทายดวยคาของสีแดง 5 บิต ทั้งนี้เนื่องจากผูผลิตจอแสดงผลกราฟก LCD สีมีการผลิตจอแสดงทีมี่ คุณสมบัติเหมือนกันออกมา 2 รุน แตมีการเรียงบิตขอมูลสีตางกัน คือ เรียง แบบ BGR และเรียงแบบ RGB อยางไรก็ตาม คาตั้งตนของไฟลไลบรารี ipst_glcd.h เลือกใชการเรียงบิตขอมูลสีใหเปนแบบ BGR นั่นคือ มีการเรียกใชฟงกชั่นนี้ตั้งแตตน จึงไมตองเขียนฟงกชั่นนี้ลงในโปรแกรม รูปแบบ glcdSetColorWordBGR()
ตัวอยางที่ 6-3 #include <ATX2.h> void setup() { glcdSetColorWordBGR(); } void loop() {}
// เขียนฟงกชั่นนี้ลงไปหรือไมก็ได
96Robo-CreatorXT : ATX2
6.2.1.3 glcdSetColorWordRGB(
);
เปนฟงกชั่นกําหนดการเรียงบิตขอมูลสีใหเปนแบบ RGB (5-6-5) นั่นคือ คาของสีแดง 5 บิต ตอดวยสีเขียว 6 บิต และปดทายดวยคาของสีนําเงิ ้ น 5 บิต ทังนี ้ เนื ้ องจากผู ่ ผลิ ตจอแสดงผลกราฟก LCD สีมีการผลิตจอแสดงผลแบบนี้ 2 รุน โดยมีการเรียงบิตขอมูลสีแบบ BGR และแบบ RGB หากผูใชงานแผงวงจร IPST-SE และทดลองกําหนดสีของภาพหรือตัวอักษรแลวพบวา สีทีได ่ ไมถูกตอง จะตองเรียกใชฟงกชั่นนี้ โดยบรรจุไวใน setup() ที่ตอนตนของโปรแกรม รูปแบบ glcdSetColorWordRGB()
ตัวอยางที่ 6-4 #include <ATX2.h> void setup() { glcdSetColorWordBGR();
// เลือกรูปแบบการเรียงบิตสีเปนแบบ RGB } void loop() {}
Robo-CreatorXT : ATX2 97
6.2.1.4 colorRGB เปนฟงกชั่นเปลี่ยนคาสีในรูปแบบ RGB (แดง เขียว นํ้าเงิน) ใหอยูในรูปของตัวเลข 16 บิต โดยแบงเปนคาของสีแดง 5 บิต ตอดวยสีเขียว 6 บิต และปดทายดวยคาของสีนํ้าเงิน 5 บิต รูปแบบ unsigned int colorRGB(uint red,uint green,uint blue)
พารามิเตอร red - เปนคาของสีแดง มีคาระหวาง 0 ถึง 31 ถาคาทีป่ อนมากกวา 31 จะปรับลดใหเทากับ 31 green - คาของสีเขียว มีคาระหวาง 0 ถึง 63 ถาคาทีป่ อนมากกวา 63 จะถูกปรับลดใหเทากับ 63 blue - คาของสีนํ้าเงิน มีคาระหวาง0 ถึง 31 ถาคาทีป่ อนมากกวา 31 จะปรับลดใหเทากับ 31
ตัวอยางที่ 6-5 #include <ATX2.h> int colors; void setup() { int colors; colors=colorRGB(31,0,0); glcdFillScreen(colors); } void loop() {}
// สงคาสี 16 บิตของสีแดงใหตัวแปร colors // นําคาไปแสดงเปนสีพืนของจอแสดงผล ้
98Robo-CreatorXT : ATX2
6.2.1.5 color[ ] เปนตัวแปรอะเรยที่ใชกําหนดสีจํานวน 18 สีที่เปนสีพืนฐาน ้ ผูพัฒนาโปรแกรมสามารถเรียก ใชตัวแปร color[] หรือเรียกใชชื่อสีตรงๆ ก็ได รูปแบบ unsigned int color[]= { GLCD_RED, GLCD_GREEN, GLCD_BLUE, GLCD_YELLOW, GLCD_BLACK, GLCD_WHITE, GLCD_SKY, GLCD_MAGENTA, GLCD_ORANGE, GLCD_LIME, GLCD_VIOLET GLCD_PINK, GLCD_DOLLAR, GLCD_BROWN, GLCD_DARKGREEN, GLCD_NAVY, GLCD_DARKGREY, GLCD_GREY};
พารามิเตอร GLCD_RED - ใชกําหนดสีแดง GLCD_BLUE - ใชกําหนดสีนํ้าเงิน GLCD_BLACK - ใชกําหนดสีดํา GLCD_SKY - ใชกําหนดสีฟา GLCD_ORANGE - ใชกําหนดสีสม GLCD_VIOLET - ใชกําหนดสีมวง GLCD_DOLLAR - ใชกําหนดสีเขียวธนบัตร GLCD_DARKGREEN - ใชกําหนดสีเขียวเขม GLCD_DARKGREY - ใชกําหนดสีเทาเขม
GLCD_GREEN - ใชกําหนดสีเขียว GLCD_YELLOW - ใชกําหนดสีเหลือง GLCD_WHITE - ใชกําหนดสีขาว GLCD_MAGENTA - ใชกําหนดสีบานเย็น GLCD_LIME - ใชกําหนดสีเขียวออน GLCD_PINK - ใชกําหนดสีชมพู GLCD_BROWN - ใชกําหนดสีนํ้าตาล GLCD_NAVY - ใชกําหนดสีฟานํ้าทะเล GLCD_GREY - ใชกําหนดสีเทา
ตัวอยาง 6-6 glcdFillScreen(color[5])
// กําหนดใหพืนหลั ้ งเปนสีขาว
ตัวอยาง 6-7 glcdFillScreen(GLCD_BLUE)
// กําหนดใหพืนหลั ้ งเปนสีนํ้าเงิน
Robo-CreatorXT : ATX2 99
6.2.1.6 setTextColor เปนการกําหนดคาสีของตัวอักษรที่แสดงดวยฟงกชั่น glcd() โดยคาตั้งตนกําหนดเปนสีขาว รูปแบบ void setTextColor(unsigned int newColor)
พารามิเตอร newColor คือสีทีต่ องการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรทีกํ่ าหนดคาไวแลวจากตัวแปร color[]
ตัวอยางที่ 6-8 setTextColor(GLCD_YELLOW);
// กําหนดใหสีของตัวอักษรเปนสีเหลือง
6.2.1.7 setTextBackgroundColor เปนฟงกชันกํ ่ าหนดสีของพืนหลั ้ งตัวอักษร โดยคาตังต ้ นเปนสีดํา สีของพืนหลั ้ งตัวอักษรจะเปน คนละสวนกับสีของพืนจอภาพ ้ (screen background) ซึงต ่ องกําหนดคาผานฟงกชัน่ glcdFillScreen รูปแบบ void setTextBackgroundColor(unsigned int newColor)
พารามิเตอร newColor คือสีทีต่ องการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[]
ตัวอยางที่ 6-9 setTextBackgroundColor(GLCD_GREEN);
// กําหนดใหสีพืนหลั ้ งตัวอักษรเปนสีเขียว
100Robo-CreatorXT : ATX2
6.2.1.8 glcdClear เปนการเคลียรหนาจอแสดงผล สีของพืนหลั ้ งจะเปนสีพืนหลั ้ งของตัวอักษรลาสุด ถาไมไดกําหนด ้ งจะ ดวยคําสัง่ setTextBackGroundColor() มากอน หลังจากทําคําสัง่ glcdClear() แลวพืนหลั เปนสีดํา รูปแบบ void glcdClear()
ตัวอยางที่ 6-10 glcdClear();
// เคลียรหนาจอแสดงผล
glcdClear();
glcdClear();
ATX2
Robo-CreatorXT : ATX2 101
6.2.1.9 glcdFillScreen เปนการเคลียรหนาจอแสดงผล แลวเปลี่ยนสีพืนหลั ้ งของจอแสดงผลดวยสีที่ระบุ รูปแบบ void glcdFillScreen(unsigned int color)
พารามิเตอร color คือสีทีต่ องการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[]
ตัวอยางที่ 6-11 glcdFillScreen(GLCD_BLUE);
// กําหนดสีพืนหลั ้ งของจอภาพเปนสีนํ้าเงิน
glcdFillScreen(GLCD_YELLOW);
glcdFillScreen(GLCD_YELLOW);
102Robo-CreatorXT : ATX2
6.2.1.10
glcdMode
เปนการกําหนดทิศทางแสดงผลใหขอความหรือภาพหนาจอหมุนจอภาพ ใหแสดงภาพตังฉาก ้ ตรงหนา (โหมด 0), หมุนขวา 90 องศา (โหมด 1), หมุน 180 องศาหรือกลับหัว (โหมด 2) และหมุน 270 องศา (โหมด 3) รูปแบบ glcdMode(unsigned int modeset)
พารามิเตอร modeset คือคาทิศทางของการหมุนมีคา 0 ถึง 3 โดยใชแทนทิศทาง 0 องศา 90 องศา 180 องศา หรือ 270 องศา โดยเมือเริ ่ มต ่ นคาทิศทางคือ 0 องศา ทํางานอยูในแนวตั ้ง
ATX2
ตัวอยางที่ 6-12 #include <ATX2.h> void setup() { setTextSize(2); } void loop() { glcdClear(); glcdMode(0); glcd(0,0,"ATX2"); sw_ok_press(); glcdClear(); glcdMode(1); glcd(0,0,"ATX2"); sw_ok_press(); glcdClear(); glcdMode(2); glcd(0,0,"ATX2"); sw_ok_press(); glcdClear(); glcdMode(3); glcd(0,0,"ATX2"); sw_ok_press(); }
//
เลือกขนาดตัวอักษร 2 เทา (2x)
// // // //
ลางจอแสดงผล เลือกโหมดแสดงผลเปนโหมด 0 กําหนดขอความแสดงผล รอการกดสวิตช OK
//
เลือกโหมดแสดงผลเปนโหมด 1
//
เลือกโหมดแสดงผลเปนโหมด 2
//
เลือกโหมดแสดงผลเปนโหมด 3
ATX2
ATX2
ATX2
Robo-CreatorXT : ATX2 103
6.2.1.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 บรรทัด (แบบไมลนจอแสดงผล)
104Robo-CreatorXT : ATX2
ตัวอยางที่ 6-13 #include <ATX2.h> void setup() { setTextSize(1); setTextColor(GLCD_GREEN); glcd(0,0,"Size1");
// กําหนดขนาดขอความ 1 เทา // สีตัวอักษรเปนสีเขียว // แสดงขอความ
setTextSize(2);
// กําหนดขนาดขอความ 2 เทา
glcd(1,0,"Size2"); setTextSize(3);
// กําหนดขนาดขอความ 3 เทา
glcd(2,0,"Size3"); setTextSize(4);
// กําหนดขนาดขอความ 4 เทา
glcd(3,0,"Size4"); } void loop() {}
6.2.1.12 getTextColor เปนคําสั่งคืนคาสีปจจุบันของตัวอักษร รูปแบบ unsigned int getTextColor()
การคืนคา textColor เปนคาสีแสดงอยูในรู ปของตัวเลข 16 บิต ดูรูปแบบไดจากฟงกชั่น colorRGB()
ตัวอยางที่ 6-14 unsigned int color; color=getTextColor();
// นําคาสีของตัวอักษรเก็บไวทีตั่ วแปร color
Robo-CreatorXT : ATX2 105
6.2.1.13 getTextBackgroundColor เปนคําสั่งคืนคาสีพื้นหลังของตัวอักษรในปจจุบัน รูปแบบ unsigned int getTextBackgroundColor()
การคืนคา textBackgroundColor เปนคาสีแสดงอยูในรู ปของตัวเลข 16 บิต ดูรูปแบบไดจากฟงกชัน่ colorRGB()
ตัวอยางที่ 6-15 unsigned int color; color=getTextBackgroundColor();
6.2.1.14
// นําคาสีพืนหลั ้ งของตัวอักษรเก็บในตัวแปร color
getTextSize
คืนคาขนาดของตัวอักษรออกมาเปนจํานวนเทาของคาปกติ รูปแบบ unsigned int getTextSize()
การคืนคา textSize เปนคาจํานวนเทาของขนาดตัวอักษร
ตัวอยางที่ 6-16 unsigned int textSize; textSize=getTextSize();
// นําคาจํานวนเทาของขนาดของตัวอักษรเก็บในตัวแปร textSize
6.2.1.15 glcdGetMode เปนคําสั่งคืนคาของโหมดทิศทางการแสดงผลในปจจุบัน รูปแบบ unsigned int glcdGetMode()
การคืนคา mode เปนคาของโหมดทิศทางการแสดงผล เปนตัวเลข 0 ถึง 3 เพือแสดงผลในทิ ่ ศทาง 0 องศา, หมุน 90 องศา, หมุน 180 องศา และหมุน 270 องศาตามลําดับ
ตัวอยางที่ 6-17 unsigned int Mode; Mode=glcdGetMode();
// คืนคาทิศทางการแสดงผลของหนาจอ GLCD
106Robo-CreatorXT : ATX2
6.2.1.16 glcdPixel เปนคําสั่งพล็อตจุดบนจอภาพตามพิกัดที่กําหนด โดยอางอิงจอภาพขนาด 128 x 160 พิกเซล รูปแบบ 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 สีทีใช ่ บนแผงวงจร ATX2
Robo-CreatorXT : ATX2 107
ตัวอยางที่ 6-18 #include <ATX2.h> int i; void setup() { for (i=0;i<128;i+=4) { glcdPixel(i,80,GLCD_RED); } for (i=0;i<160;i+=4) { glcdPixel(64,i,GLCD_RED); } } void loop() {}
// พล็อตจุดทุกๆ 4 พิกเซลในแนวแกน x กลางจอ
// พล็อตจุดทุกๆ 4 พิกเซลในแนวแกน y กลางจอ
108Robo-CreatorXT : ATX2
6.2.1.17
glcdRect
เปนฟงกชั่นลากเสนจากพิกัดที่กําหนดมายังพิกัดปลายทาง รูปแบบ 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 <ATX2.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
Robo-CreatorXT : ATX2 109
6.2.1.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 <ATX2.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
110Robo-CreatorXT : ATX2
6.2.1.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 <ATX2.h> void setup() { glcdLine(0,0,127,159,GLCD_RED);
// ลากเสนสีแดงทแยงมุมจากดานบนซายลงมาดานลางขวา } void loop() {}
3 4
0 0 0000000000000000 0000000000000000 500000000000000000000 600000000000000000000 700000000000000000000 800000000000000000000 900000000000000000000 a00000000000000000000 b00000000000000000000 c00000000000000000000 d00000000000000000000 e00000000000000000000 f00000000000000000000
34
0 0
Robo-CreatorXT : ATX2 111
6.2.1.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 <ATX2.h> void setup() { glcdCircle(32,120,31,GLCD_MAGENTA);
// สรางเสนวงกลมสีบานเย็น มีรัศมี 31 พิกเซล } void loop() {}
0000000000000000 0000000000000000 500000000000000000000 600000000000000000000 700000000000000000000 800000000000000000000 900000000000 00000000 a000000000 0000000000 b00000000000000000000 c00000000000000000000 d00000000000000000000 e00000000000000000000 f00000000000000000000
112Robo-CreatorXT : ATX2
6.2.1.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 <ATX2.h> void setup() { glcdFillCircle(32,120,31,GLCD_MAGENTA);
// สรางรูปวงกลมพืนสี ้ บานเย็น รัศมี 31 พิกเซล } void loop() {}
0000000000000000 0000000000000000 500000000000000000000 600000000000000000000 700000000000000000000 800000000000000000000 900000000000 00000000 a000000000 0000000000 b00000000000000000000 c00000000000000000000 d00000000000000000000 e00000000000000000000 f00000000000000000000
Robo-CreatorXT : ATX2 113
6.2.1.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 <ATX2.h> void setup() { glcdArc(48,80,16,30,150,GLCD_RED); glcdCircle(48,75,5,GLCD_BLUE); glcdCircle(80,75,5,GLCD_BLUE); glcdArc(80,80,16,30,150,GLCD_RED); glcdFillCircle(64,90,7,GLCD_GREEN); glcdArc(64,100,30,220,320,GLCD_RED); } void loop() {}
114Robo-CreatorXT : ATX2
6.2.2 ฟงกชันเกี ่ ่ยวกับเวลา 6.2.2.1 sleep และ delay เปนฟงกชั่นหนวงเวลาโดยประมาณภายในโปรแกรมในหนวยมิลลิวินาที รูปแบบ void sleep(unsigned int ms) void delay(unsigned int ms)
พารามิเตอร ms - กําหนดคาเวลาทีต่ องการหนวงในหนวยมิลลิวินาที มีคา 0 ถึง 65,535
ตัวอยางที่ 6-25 sleep(20); delay(1000);
// หนวงเวลาประมาณ 20 มิลลิวินาที // หนวงเวลาประมาณ 1 วินาที
6.2.2.2 delay_us เปนฟงกชั่นหนวงเวลาโดยประมาณภายในโปรแกรมในหนวยไมโครวินาที รูปแบบ void delay_us(unsigned int us)
พารามิเตอร us - กําหนดคาเวลาทีต่ องการหนวงในหนวยไมโครวินาที มีคา 0 ถึง 65,535
ตัวอยางที่ 6-26 delay_us(100);
// หนวงเวลาประมาณ 100 ไมโครวินาที
Robo-CreatorXT : ATX2 115
6.2.3 ฟงกชันเกี ่ ่ยวกับเสียง 6.2.3.1 beep เปนฟงกชั่นกําเนิดเสียง “ติ๊ด” เลือกได 4 ความถีคื่ อ 250, 506, 762 และ 1274Hz นาน 100 มิลลิวินาที เพือขั ่ บออกลําโพงเปยโซของแผงวงจร ATX2 รูปแบบ void beep(int beepType)
พารามิเตอร beepType - เลือกความถี่ของสัญญาณ beep 0 หรือ () : 1,274Hz 1 : 762Hz 2 : 506Hz 3 : 250Hz
ตัวอยางที่ 6-27 beep(1);
// กําเนิดสัญญาณความถี่ 762Hz เปนเวลา 100 มิลิวินาที ขับออกลําโพงเปยโซ
6.2.3.2 sound เปนฟงกชั่นกําเนิดสัญญาณเสียงที่กําหนดความถี่และระยะเวลาในการกําเนิดสัญญาณได รูปแบบ void sound(int freq,int time)
พารามิเตอร freq - กําหนดความถี่สัญญาณเสียง มีคา 0 ถึง 32,767 time - กําหนดคาเวลาในการกําเนิดสัญญาณเสียงในหนวย 1 มิลลิวินาที มีคา 0 ถึง 32,767
ตัวอยางที่ 6-28 sound(1200,500);
// กําเนิดสัญญาณเสียงความถี่ 1200Hz นาน 500 มิลลิวินาที
116Robo-CreatorXT : ATX2
6.2.4 ฟงกชันเกี ่ ่ยวกับพอรตอินพุตเอาตพุต 6.2.4.1 in เปนฟงกชันอ ่ านคาสถานะลอจิกของพอรตทีกํ่ าหนด เปนหนึงในฟ ่ งกชันการอ ่ านและเขียนคา กับพอรตอินพุตเอาตพุตของแผงวงจร ATX2 รูปแบบ char in(x)
พารามิเตอร x - กําหนดขาพอรตทีต่ องการอานคา กําหนดได 0 ถึง 31 สําหรับแผงวงจร ATX2 แนะนําใหใชกับขา พอรต 2, 3, 8, 9, 18, 24 ถึง 31
การคืนคา เปน 0 หรือ 1
ตัวอยางที่ 6-29 char x; x = in(2);
// ประกาศตัวแปร x เพือเก็ ่ บคาผลลัพธจาการอานคาระดับสัญญาณ // อานคาดิจิตอลจากพอรตดิจิตอล 2 มาเก็บไวทีตั่ วแปร x
6.2.4.2 out เปนฟงกชั่นกําหนดระดับสัญญาณหรือขอมูลดิจิตอลไปยังพอรตที่กําหนด รูปแบบ out(char _bit,char _dat)
พารามิเตอร _bit - กําหนดขาพอรตทีต่ องการอานคา กําหนดได 0 ถึง 31 สําหรับแผงวงจร ATX2 แนะนําใหใชกับขา พอรต 2, 3, 8, 9, 18, 24 ถึง 31 _dat - กําหนดคาทีต่ องการเขียนมายังพอรตเอาตพุต มีคา 0 หรือ 1
ตัวอยางที่ 6-30 out(8,1); out(28,0);
// กําหนดใหขาพอรต 8/SCL เปนเอาตพุตดิจิตอลและมีคาเปน “1” // กําหนดใหขาพอรต 28/A4 เปนเอาตพุตดิจิตอลและมีคาเปน “0”
Robo-CreatorXT : ATX2 117
6.2.5 ฟงกชันเกี ่ ยวกั ่ บการติดตอกับตัวตรวจจับ 6.2.5.1
analog
เป นฟ งก ชั่ นอ านค าข อมู ลดิ จิ ตอล ที่ ได จากการแปลงสั ญญาณอะนาลอกของไมโคร คอนโทรลเลอรทีขาพอร ่ ต A0 ถึง A12 ซึงใช ่ เชือมต ่ อกับตัวตรวจจับทีให ่ ผลการทํางานในรูปแรงดันไฟฟา ในยาน 0 ถึง +5V รูปแบบ unsigned int analog(unsigned char channel)
พารามิเตอร channel - กําหนดชองอินพุตอะนาลอกทีต่ องการ มีคา 0 ถึง 12 ซึ่งตรงกับขาพอรต A0 ถึง A12
การคืนคา เปนขอมูลที่ไดจากการแปลงสัญญาณของโมดูลแปลงสัญญาณอะนาลอกเปนดิจิตอลภายในไมโคร คอนโทรลเลอรจากชองอินพุตทีกํ่ าหนด โดยขอมูลมีความละเอียด 10 บิต ดังนันค ้ าที่เปนไปไดคือ 0 ถึง 1,023
ตัวอยางที่ 6-31 #include <ATX2.h>
//
int val=0;
//
ผนวกไฟลไลบรารีหลัก กําหนดตัวแปรสําหรับเก็บผลลัพธ
//
รอการกดสวิตช OK
//
กําหนดขนาดของตัวอักษรเปน 2 เทา
void setup() { OK(); glcdClear(); setTextSize(2); } void loop() { glcd(1,2,"AnalogTest"); // val
= analog(2);
setTextSize(3);
//
glcd(2,2,"%d
//
",val);
setTextSize(2); }
//
//
แสดงขอความบนจอแสดงผล อานคาจากจุดตอ A2 มาเก็บไวในตัวแปร กําหนดขนาดของตัวอักษรเปน 2 เทา แสดงคาของจุดตอ A2 ทีบรรทั ่ ด 2 (บรรทัดที่ 3) กําหนดขนาดของตัวอักษรเปน 2 เทา
118Robo-CreatorXT : ATX2
จากรูปมีการเชื่อมตอแผงวงจรตัวตานทารปรับคาได ZX-POT เขาทีจุ่ ดตอ A2 ของแผงวงจร ATX2 เมื่อทําการ อัปโหลดโปรแกรมทดสอบไปยังแผงวงจร ATX2 ไมโครคอนโทรลเลอรจะอานคาของแรงดันทีจุ่ ดตอ A2 แลวทําการแปลง เปนขอมูลดิจิตอลดวยฟงกชั่น analog() แลวนํามาแสดงผลทีจอแสดงผลของแผงวงจร ่ ATX2 คาที่ไดจะอยูในชวง 0 ถึง 1,203
Robo-CreatorXT : ATX2 119
6.2.5.2 knob เปนฟงกชั่นอานคาขอมูลจากตัวตานทานปรับคาได KNOB บนแผงวงจ ATX2 คาที่อานไดมี คาในชวง 0 ถึง 1,000 รูปแบบ unsigned int knob()
การคืนคา คาที่อานไดจากตัวตานทานปรับคาได KNOB บนแผงวงจร ATX2 มีคาระหวาง 0 ถึง 1,000
ตัวอยางที่ 6-32 //
ผนวกไฟลไลบรารีหลัก
OK(); glcdClear();
//
รอการกดสวิตช OK
setTextSize(2);
//
กําหนดขนาดตัวอักษร 2 เทา
#include <ATX2.h> void setup() {
} void loop() { glcd(1,2," KnobTest");
//
setTextSize(3);
//
glcd(2,2,"%d setTextSize(2); }
",knob());
// //
แสดงขอความที่จอแสดงผล กําหนดขนาดตัวอักษร 3 เทา แสดงคาของปุม KNOB บนจอแสดงผล กําหนดขนาดตัวอักษร 2 เทา
120Robo-CreatorXT : ATX2
6.2.5.3 sw_ok() เปนฟงกชั่นตรวจสอบสถานะสวิตช OK บนแผงวงจร ATX2 โดยใหสถานะ “เปนจริง” เมื่อ มีการกดสวิตชและ “เปนเท็จ” เมื่อไมมีการกดสวิตช รูปแบบ unsigned char sw_ok()
การคืนคา 1 (เปนจริง) เมือมี ่ การกดสวิตช 0 (เปนเท็จ) เมือไม ่ มีการกดสวิตช
ตัวอยางที่ 6-33 #include <ATX2.h> void setup() { glcdClear(); } void loop() { if (sw_OK()) {
//
ผนวกไฟลไลบรารีหลัก
//
ตรวจสอบการกดสวิตช OK
glcdFillScreen(GLCD_YELLOW);
//
delay(3000);
//
เปลี่ยนสีพืนของจอแสดงผลเป ้ นสีเหลือง แสดงผล 3 วินาที
} glcdClear(); }
//
ลางขอมูลหนาจอแสดงผล แลวเปลี่ยนสีพืนกลั ้ บเปนสีดํา
Robo-CreatorXT : ATX2 121
6.2.5.4 sw_ok_press() เปนฟงกชั่นวนตรวจสอบการกดสวิตช OK บนแผงวงจร ATX2 ตองรอจนกระทั่งสวิตชถูก ปลอยหลังจากการกดสวิตชจึงจะผานฟงกชั่นนี้ไปกระทําคําสั่งอืนๆ ่ ตัวอยางที่ 6-34 ........
// รอจนกระทั่งเกิดกดสวิตช OK
sw_ok_press(); ......
6.2.5.5 OK() เปนฟงกชันวนรอการกดสวิ ่ ตช OK บนแผงวงจร ATX2 อีกแบบหนึง่ และเมือเรี ่ ยกใชฟงกชันนี ่ ้ ระบบจะทําการแสดงขอความ ATX2 Push OK ทุกครังที ้ ่จอแสดงผล และที่อักษร OK จะกะพริบ ตลอดเวลา
ตัวอยางที่ 6-35 ............ OK(); .............
//
แสดงขอความเริมต ่ นและวนรอการกดสวิตช OK
122Robo-CreatorXT : ATX2
6.2.6 ฟงกชันเกี ่ ่ยวกับการขับมอเตอรไฟตรงพืนฐาน ้ แผงวงจร ATX2 ขับมอเตอรไฟตรงขนาด 4.5 ถึง 9V ไดพรอมกัน 6 ตัว โดยมีความสามารถ ในการขับกระแสไฟฟาไดสูงสุด 1.5A ตอชอง และสุงสุดชัวขณะไม ่ เกิน 3A ทังนี ้ ขึ้ นกั ้ บความสามารถ ในการจายกระแสไฟฟาของแหลงจายไฟเลี้ยงหรือแบตเตอรี่ที่ใชงาน
6.2.6.1 motor เปนฟงกชั่นขับเคลื่อนมอเตอรไฟตรง รูปแบบ void motor(char _channel,int _power)
พารามิเตอร _channel - กําหนดชองเอาตพุตมอเตอรไฟตรงของแผงวงจร ATX2 กําหนดไดดังนี้ 1 ถึง 6 สําหรับมอเตอรทีเอาต ่ พุตชอง 1, 2, 3, 4, 5 และ 6 12 สําหรับขับมอเตอรชอง 1 และ 2 พรอมกัน 34 สําหรับขับมอเตอรชอง 3 และ 4 พรอมกัน 56 สําหรับขับมอเตอรชอง 5 และ 6 พรอมกัน 100 หรือ ALL หรือ ALL4 สําหรับขับมอเตอรชอง 1 ถึง 4 พรอมกัน 106 หรือ ALL6 สําหรับขับมอเตอรทุกชองพรอมกัน _power - กําหนดกําลังขับมอเตอร มีคาในชวง -100 ถึง 100 ถากําหนดคา _power เปนบวก (1 ถึง 100) ทําใหมอเตอรหมุนไปในทิศทางหนึง่ ถากําหนดคา _power เปนลบ (-1 ถึง -100) มอเตอรจะถูกขับใหหมุนไปในทิศทางตรงขาม ถากําหนดคา _power เปน 0 มอเตอรหยุดหมุน แตไมแนะนําใหใช หากตองการใหมอเตอรหยุดหมุน ควรเรียกใชฟงกชั่น motor_stop
Robo-CreatorXT : ATX2 123
ตัวอยางที่ 6-36 motor(1,60); motor(1,-60);
// ขับมอเตอรชอง 1 ดวยกําลัง 60% ของกําลังสูงสุด // ขับมอเตอรชอง 1 ดวยกําลัง 60% มีทิศทางการหมุนตรงขามกับคําสังก ่ อนหนา
ตัวอยางที่ 6-37 motor(12,100); motor(56,80);
// ขับมอเตอรชอง 1 และ 2 ดวยกําลัง 100% อันเปนคากําลังสูงสุด // ขับมอเตอรชอง 5 และ 6 ดวยกําลัง 80%
ตัวอยางที่ 6-38 motor(ALL,100); motor(ALL6,100);
// ขับมอเตอรชอง 1 ถึง 4 ดวยกําลัง 100% อันเปนคากําลังสูงสุด // ขับมอเตอรทุกชอง ดวยกําลัง 100% อันเปนคากําลังสูงสุด
ตัวอยางที่ 6-39 #include <ATX2.h> void setup() { OK();
// ผนวกไฟลไลบรารีหลัก // รอการกดสวิตช OK
} void loop() { motor(1,60); delay(500); motor(1,-60); delay(500); }
// ขับมอเตอรชอง 1 ดวยกําลัง 60% // ขับมอเตอรชอง 1 เปนเวลา 0.5 วินาที // ขับมอเตอรชอง 1 กลับทิศทางดวยกําลัง 60% // ขับมอเตอรชอง 1 กลับทิศทาง เปนเวลา 0.5 วินาที
124Robo-CreatorXT : ATX2
6.2.6.2 motor_stop เปนฟงกชั่นหยุดขับมอเตอร รูปแบบ void motor_stop(char _channel)
พารามิเตอร _channel - กําหนดชองเอาตพุตมอเตอรไฟตรง กําหนดเหมือนกับฟงกชั่น motor()
ตัวอยางที่ 6-40 motor_stop(1); motor_stop(2);
// หยุดขับมอเตอรชอง 1 // หยุดขับมอเตอรชอง 2
ตัวอยางที่ 6-41 motor_stop(ALL); motor_stop(ALL6);
// หยุดขับมอเตอรชอง 1 ถึง 4 พรอมกัน // หยุดขับมอเตอรทัง้ 6 ชองพรอมกัน
ตัวอยางที่ 6-42 #include <ATX2.h> void setup() { OK();
// ผนวกไฟลไลบรารีหลัก // รอการกดสวิตช OK
} void loop() { motor(1,50); motor(2,50); sleep(3000); motor(1,-50); motor(2,-50); sleep(3000); motor_stop(ALL); sleep(3000);
// ขับมอเตอรชอง 1 ดวยกําลัง 50% // ขับมอเตอรชอง 2 ดวยกําลัง 50% // ขับมอเตอรชอง 1 และ 2 เปนเวลา 3 วินาที // ขับมอเตอรชอง 1 กลับทิศทางดวยกําลัง 50% // ขับมอเตอรชอง 2 กลับทิศทางดวยกําลัง 50% // ขับมอเตอรชอง 1 และ 2 กลับทิศทาง เปนเวลา 3 วินาที // หยุดขับมอเตอรทังสองช ้ อง // หยุดขับมอเตอรเปนเวลา 3 วินาที
Robo-CreatorXT : ATX2 125
6.2.7 ฟงกชันขั ่ บมอเตอรไฟตรงสําหรับหุนยนตขับเคลื่อน 2 ลอ ในกรณีนําแผงวงจร ATX2 ไปสรางหุนยนต ขับเคลื่อนดวยมอเตอรไฟตรง และชุดลอ 2 ลอ หรือ 2-Wheel Drive (2WD) เพือช ่ วยใหการเขียนโปรแกรมควบคุมการทํางานกระทําไดงายขึ้น จึงมี การสรางฟงกชั่นเขามาชวย โดยมีขอกําหนดดังนี้ 1. มอเตอรไฟตรงดานซายตองตอกับเอาตพุตมอเตอรไฟตรงชอง 1 ของแผงวงจร ATX2 2. มอเตอรไฟตรงดานขวาตองตอกับเอาตพุตมอเตอรไฟตรงชอง 2 ของแผงวงจร ATX2
ATX2
6.2.7.1 fd มาจากคําวา forward เปนฟงกชั่นกําหนดใหหุนยนต 2 ลอเคลื่อนทีไปข ่ างหนา รูปแบบ fd(unsigned int speed)
พารามิเตอร speed คือเปอรเซ็นตความเร็วของมอเตอรมีคาตั้งแต 0 ถึง 100
ตัวอยางที่ 6-43 fd(60);
// สั่งใหหุนยนต เคลือนที ่ ่ไปขางหนาดวยความเร็ว 60 เปอรเซ็นต
126Robo-CreatorXT : ATX2
6.2.7.2 fd2 มาจากคําวา forward2 เปนฟงกชันที ่ กํ่ าหนดใหหุนยนต 2 ลอเคลือนที ่ ไปข ่ างหนาแบบกําหนด ความเร็วมอเตอรแยกอิสระ รูปแบบ fd2(unsigned int speed1 ,unsigned int speed2)
พารามิเตอร speed1 คือ คาความเร็วของมอเตอรชอง 1 มีคาตั้งแต 0 ถึง 100% speed2 คือ คาความเร็วของมอเตอรชอง 2 มีคาตั้งแต 0 ถึง 100%
ตัวอยางที่ 6-44 fd2(30,80);
// หุนยนต เคลือนที ่ เป ่ นวงกลม เนืองจากมอเตอร ่ ชอง 2 หมุนเร็วกวามอเตอรชอง 1 มาก
6.2.7.3 bk มาจากคําวา backward เปนฟงกชั่นกําหนดใหหุนยนต 2 ลอเคลื่อนทีถอยหลั ่ ง รูปแบบ bk(unsigned int speed)
พารามิเตอร speed คือเปอรเซ็นตความเร็วของมอเตอรมีคาตั้งแต 0 ถึง 100
ตัวอยางที่ 6-45 bk(90);
// กําหนดใหหุนยนต เคลือนที ่ ่ถอยหลังดวยความเร็ว 90 เปอรเซ็นต
6.2.7.4 bk2 มาจากคําวา backward2 ใชกําหนดใหหุนยนต 2 ลอถอยหลังแบบกําหนดความเร็วมอเตอรอิสระ รูปแบบ bk2(unsigned int speed1 ,unsigned int speed2)
พารามิเตอร speed1 คือเปอรเซ็นตความเร็วของมอเตอรชอง 1 มีคาตั้งแต 0 ถึง 100 speed2 คือเปอรเซ็นตความเร็วของมอเตอรชอง 2 มีคาตั้งแต 0 ถึง 100
ตัวอยางที่ 6-46 bk2(80,80);
// เปนคําสังเคลื ่ อนถอยหลั ่ งตรงดวยความเร็วเทากัน ซึงทํ ่ างานเหมือนกับคําสัง่ bk()
ฟงกชัน่ fd2() และ bk2() มีไวเพือปรั ่ บแตงการทํางานของมอเตอรไฟตรงทัง้ 2 ตัวของหุนยนต 2 ลอซึงอาจแตกต ่ างกันดานความเร็วในการหมุน ใหทํางานไดอยางใกลเคียงกันดวยการปรับคา speed1 และ speed2
Robo-CreatorXT : ATX2 127
6.2.7.5 tl และ tr มาจากคําวา turn left และ turn right หรือเลียวซ ้ ายและเลียวขวานั ้ นเอง ่ โดยการเลียวของฟ ้ งกชัน่ ทังสองนี ้ จะกํ ้ าหนดใหมอเตอรตัวใดตัวหนึงของหุ ่ นยนต หยุดอยูกั บที่ จุดหมุนของหุนยนต จะอยูที ล่ อของ มอเตอรทีหยุ ่ ดอยูกั บที่ รูปแบบ tl(unsigned int speed) tr(unsigned int speed)
พารามิเตอร speed คือ คาความเร็วของมอเตอร มีคาตั้งแต 0 ถึง 100 เปอรเซ็นต
ตัวอยางที่ 6-47 tl(60); tr(100);
// กําหนดใหหุนยนต เลียวซ ้ ายดวยความเร็ว 60 เปอรเซ็นต // กําหนดใหหุนยนต เลียวขวาด ้ วยความเร็ว 100 เปอรเซ็นต
6.2.7.6 sl และ sr มาจากคําวา spin left และ spin right หรือหมุนตัวทางซายและทางขวา ในฟงกชันนี ่ จะกํ ้ าหนด ใหมอเตอรไฟตรงทังสองตั ้ วของหุนยนต หมุนในทิศทางตรงกันขาม จุดหมุนตัวจึงอยูกึ งกลางของหุ ่ นยนต รูปแบบ sl(unsigned int speed) sr(unsigned int speed)
พารามิเตอร speed คือ คาความเร็วของมอเตอร มีคา 0 ถึง 100%
ตัวอยางที่ 6-48 sl(70); sr(100);
// กําหนดใหหุนยนต เลียวซ ้ ายดวยความเร็ว 70% // กําหนดใหหุนยนต เลียวขวาด ้ วยความเร็ว 100%
6.2.7.7 ao มาจากคําวา all motor off เปนฟงกชั่นหยุดการทํางานของมอเตอรทั้งสองตัว รูปแบบ ao()
ตัวอยางที่ 6-49 void setup() { fd(100); sleep(2000); ao(); }
// หุนยนต เคลือนที ่ ่ไปขางหนาดวยความเร็วสูงสุด // เปนเวลา 2 วินาที // กําหนดใหมอเตอรหยุดทํางาน หุนยนต จะหยุดเคลือนที ่ ่ทันที
128Robo-CreatorXT : ATX2
6.2.8 ฟงกชันขั ่ บมอเตอรไฟตรงสําหรับหุนยนตขับเคลื่อน 4 ลอ เมื่อนําแผงวงจร ATX2 ไปสรางหุนยนต ขับเคลื่อนดวยมอเตอรไฟตรง และชุดลอ 4 ลอ หรือ 4-Wheel Drive (4WD) เพือช ่ วยใหการเขียนโปรแกรมควบคุมกระทําไดงายขึ้น จึงสรางฟงกชั่นเขามา ชวย โดยมีขอกําหนดตําแหนงของมอเตอรไฟตรงที่ตอกับแผงวงจร ATX2 ดังนี้ 1. มอเตอรไฟตรงของลอหนาซายตอกับเอาตพุตมอเตอรไฟตรงชอง 1 2. มอเตอรไฟตรงของลอหลังซายตอกับเอาตพุตมอเตอรไฟตรงชอง 2 3. มอเตอรไฟตรงของลอหนาขวาตอกับเอาตพุตมอเตอรไฟตรงชอง 3 4. มอเตอรไฟตรงของลอหลังซายตอกับเอาตพุตมอเตอรไฟตรงชอง 4
ATX2
Robo-CreatorXT : ATX2 129
6.2.8.1 FD มาจากคําวา FORWARD เปนฟงกชั่นกําหนดใหหุนยนต 4 ลอเคลื่อนทีไปข ่ างหนา
ATX2
ATX2
รูปแบบ FD(unsigned int speed)
พารามิเตอร speed คือเปอรเซ็นตความเร็วของมอเตอร มีคาตั้งแต 0 ถึง 100
ตัวอยางที่ 6-50 FD(60);
// ขับเคลือนหุ ่ นยนตเคลือนที ่ ่ไปขางหนาดวยกําลัง 60%
6.2.8.2 FD2 มาจากคําวา FORWARD2 เปนฟงกชันกํ ่ าหนดใหหุนยนต 4 ลอเคลือนที ่ ไปข ่ างหนา โดยกําหนด ความเร็วของมอเตอรดานซาย (มอเตอรชอง 1 และ 2) และขวา (มอเตอรชอง 3 และ 4) แยกกันอยางอิสระ รูปแบบ FD2(unsigned int speed1, unsigned int speed2)
พารามิเตอร speed1 คือเปอรเซ็นตความเร็วของมอเตอรดานซาย (ชอง 1 และ 2) มีคาตั้งแต 0 ถึง 100 speed2 คือเปอรเซ็นตความเร็วของมอเตอรดานขวา (ชอง 3 และ 4) มีคาตั้งแต 0 ถึง 100
ตัวอยางที่ 6-51 FD2(30,80);
// ขับเคลือนหุ ่ นยนตเคลือนที ่ ่เปนรูปวงกลม // เนืองจากความเร็ ่ วในการหมุนของมอเตอรทังสองด ้ าน ของหุนยนต แตกตางกันมาก
130Robo-CreatorXT : ATX2
6.2.8.3 BK มาจากคําวา BACKWARD เปนฟงกชั่นกําหนดใหหุนยนต 4 ลอเคลื่อนทีถอยหลั ่ ง
ATX2
ATX2
รูปแบบ BK(unsigned int speed)
พารามิเตอร speed คือเปอรเซ็นตความเร็วของมอเตอร มีคาตั้งแต 0 ถึง 100
ตัวอยางที่ 6-52 BK(90);
// ขับเคลือนหุ ่ นยนต 4 ลอใหเคลือนที ่ ่ถอยหลังดวยกําลัง 90%
6.2.8.4 BK2 มาจากคําวา BCKWARD2 เปนฟงกชันกํ ่ าหนดใหหุนยนต 4 ลอเคลือนที ่ ถอยหลั ่ ง โดยกําหนด ความเร็วของมอเตอรดานซาย (มอเตอรชอง 1 และ 2) และขวา (มอเตอรชอง 3 และ 4) แยกกันอยางอิสระ รูปแบบ BK2(unsigned int speed1 ,unsigned int speed2)
พารามิเตอร speed1 คือเปอรเซ็นตความเร็วของมอเตอรดานซาย (ชอง 1 และ 2) มีคาตั้งแต 0 ถึง 100 speed2 คือเปอรเซ็นตความเร็วของมอเตอรดานขวา (ชอง 3 และ 4) มีคาตั้งแต 0 ถึง 100
ตัวอยางที่ 6-53 BK2(80,80);
// ขับมอเตอรทังสองด ้ านของหุนยนต 4 ลอใหเคลือนที ่ ่ถอยหลังดวยกําลัง 80%
Robo-CreatorXT : ATX2 131
6.2.8.5 TL และ TR มาจากคําวา Turn Left (TL) และ Turn Right (TR) หรือเลียวซ ้ ายและเลียวขวานั ้ นเอง ่ โดยการ เลียวของฟ ้ งกชันทั ่ งสองนี ้ จะกํ ้ าหนดใหมอเตอรตใดตัวหนึงของหุ ่ นยนต หยุดอยูกั บที่ จุดหมุนของหุนยนต จะอยูที ล่ อของมอเตอรทีหยุ ่ ดอยูกั บที่
ATX2
ATX2
ATX2
ATX2
รูปแบบ TL(unsigned int speed) TR(unsigned int speed)
พารามิเตอร speed คือเปอรเซ็นตความเร็วของมอเตอร มีคาตั้งแต 0 ถึง 100
ตัวอยางที่ 6-54 TL(60); TR(100);
// ขับเคลือนหุ ่ นยนต 4 ลอใหเลียวซ ้ ายดวยกําลัง 60% // ขับเคลือนหุ ่ นยนต 4 ลอใหเลียวขวาด ้ วยกําลังสูงสุด
132Robo-CreatorXT : ATX2
6.2.8.6 SL and SR มาจากคําวา Spin Left และ Spin Right หรือหมุนตัวทางซายและทางขวา ในฟงกชันนี ่ กํ้ าหนดให มอเตอรไฟตรงทังสองด ้ านของหุนยนต หมุนในทิศทางตรงกันขาม จุดหมุนตัวจึงอยูกึ งกลางของหุ ่ นยนต
ATX2
ATX2
ATX2
ATX2
รูปแบบ SL(unsigned int speed) SR(unsigned int speed)
พารามิเตอร speed คือเปอรเซ็นตความเร็วของมอเตอร มีคาตั้งแต 0 ถึง 100
ตัวอยางที่ 6-55 SL(70); SR(100);
// ขับเคลือนหุ ่ นยนต 4 ลอใหหมุนซายดวยกําลัง 70% // ขับเคลือนหุ ่ นยนต 4 ลอใหหมุนขวาดวยกําลังสูงสุด
6.2.8.7 AO มาจากคําวา All motor Off เปนฟงกชั่นหยุดการทํางานของมอเตอรทั้งสี่ตัว รูปแบบ AO();
Robo-CreatorXT : ATX2 133
6.2.9 ฟงกชั่นขับเซอรโวมอเตอร ในไฟลไลบรารีนี้มี 1 ฟงกชั่นคือ servo เปนฟงกชั่นกําหนดตําแหนงแกนหมุนของเซอรโว มอเตอร ควบคุมได 3 ตัว รูปแบบ void servo(unsigned char _ch, int _pos) พารามิเตอร _ch - ชองเอาตพุตเซอรโวมอเตอร มีคา 1 ถึง 8 _pos - กําหนดตําแหนงแกนหมุนของเซอรโวมอเตอร มีคาในชวง 0 ถึง 180 และ -1 ถากําหนดเปน -1 หมายถึง ไมใชงานเซอรโวมอเตอรทีช่ องนั้นๆ
ตัวอยางที่ 6-56 #include <ATX2.h> void setup() { OK();
// ผนวกไฟลไลบรารีหลัก // รอการกดสวิตช OK
} void loop() { servo(1,60); sleep(5000); servo(1,120); sleep(5000); }
// ขับเซอรโวมอเตอรชอง 1 ใหแกนหมุนไปยังตําแหนง 60 องศา // หนวงเวลา 5 วินาที // ขับเซอรโวมอเตอรชอง 1 ใหแกนหมุนไปตําแหนง 120 องศา // หนวงเวลา 5 วินาที
134Robo-CreatorXT : ATX2
6.2.10 ฟงกชันเกี ่ ่ยวกับการสื่อสารขอมูลอนุกรม เปนไฟลไลบรารีสนับสนุนชุดคําสั่งเกี่ยวกับการรับสงขอมูลผานโมดูลสื่อสารขอมูลอนุกรม (UART)
6.2.10.1 การเชื่อมตอทางฮารดแวร เมือต ่ องการใชงานชอง UART0 ใหตอสายจากจุดตอพอรต USB บนแผงวงจร ATX2 (เปนจุดตอเดียวกับทีใช ่ ในการอัปโหลด) เขากับพอรต USB ของคอมพิวเตอร เมือต ่ องการใชงานชอง UART1 ตอสายสัญญาณเขากับจุดตอ RXD1 (พอรต 2) และ TXD1 (พอรต 3)
Robo-CreatorXT : ATX2 135
6.2.10.2 uart เปนฟงกชันส ่ งขอมูลสายอักขระออกจากโมดูล UART0 มีอัตราบอดเริมต ่ นที่ 4,800 บิตตอวินาที รูปแบบ void uart(char *p,...)
พารามิเตอร p - รับรหัสของกลุมข อความทีต่ องการสงออกจากภาคสงของโมดูล UART0 โดยสามารถกําหนดรูปแบบ การแทรกสัญลักษณพิเศษเพือใช ่ รวมในการแสดงผลไดดังนี้ รหัสบังคับ การทํางาน %c หรือ %C แสดงผลตัวอักษร 1 ตัว %d หรือ %D แสดงผลตัวเลขฐานสิบชวงตั้งแต -32,768 ถึง +32,767 %l หรือ %L แสดงผลตัวเลขฐานสิบชวงตั้งแต -2,147,483,648 ถึง +2,147,483,647 %f หรือ %F แสดงผลขอมูลแบบจํานวนจริง(แสดงทศนิยม 3 หลัก) \r กําหนดใหขอความชิดไปทางดานซายของบรรทัด \n กําหนดใหขอความขึ้นบรรทัดใหม
ตัวอยางที่ 6-57 #include <ATX2.h>
// ผนวกไฟลไลบรารีหลัก
void setup() {} void loop() { uart("Hello Robo-Creator2!\r\n");
// สงขอมูลไปยังคอมพิวเตอรพรอมรหัสขึนบรรทั ้ ดใหม sleep(2000);
// หนวงเวลา 2 วินาที
}
ในการทดสอบจะตองตอสาย USB ระหวางคอมพิวเตอรกับแผงวงจร ATX2 ไวตลอดเวลา หลังจาก อัปโหลดโปรแกรมแลว จากนั้นเปดหนาตาง Serial Minonitor โดยคลิกทีปุ่ ม หรือเลือกจากเมนู Tools > Serial Monitor
136Robo-CreatorXT : ATX2
รอครูหนึ ง่ หนาตาง Serial Monitor จะเปดขึนมา ้ คลิกเลือกทีช่ อง Auto Scroll และ No line ending สุดทายเลือกอัตราบอดทีช่ องขวามุมลางเปน 9600 Baud จะไดผลการทํางานดังรูป
6.2.10.3 uart_set_baud เปนฟงกชั่นกําหนดอัตราบอดในการสือสารของโมดู ่ ล UART0 กับคอมพิวเตอร รูปแบบ void uart_set_baud(unsigned int baud)
พารามิเตอร baud - อัตราบอดในการสื่อสารของโมดูล UART0 กับคอมพิวเตอร มีคา 2400 ถึง 115,200
ตัวอยางที่ 6-58 uart_set_baud(4800);
// กําหนดอัตราบอดในการสื่อสารขอมูลเปน 4,800 บิตตอวินาที
6.2.10.4 uart_availabel เปนฟงกชั่นตรวจสอบการรับขอมูลเขามาของโมดูล UART0 เมื่อติดตอกับคอมพิวเตอร รูปแบบ unsigned char uart_available(void)
การคืนคา - เปน “0” เมื่อยังไมมีขอมูลเขามา - มากกวา 0 เมื่อมีขอมูลเขามา โดยมีคาเทากับจํานวนของอักขระทีได ่ รับ
ตัวอยางที่ 6-59 char x =uart_available();
// ตรวจสอบวา มีขอมูลเขามาทางภาครับของโมดูล UART0 หรือไม ถา x มีคามากกวา 0 แสดงวา // มีขอมูลเขามายังภาครับแลว ควรอานขอมูลออกดวยฟงกชัน่ uart_getkey ในลําดับถัดไปทันที
Robo-CreatorXT : ATX2 137
6.2.10.5 uart_getkey เปนฟงกชั่นอานขอมูลจากบัฟเฟอรตัวรับของโมดูล UART0 รูปแบบ char uart_getkey(void)
การคืนคา - เปน “0” เมื่อไมมีการรับอักขระใดๆ เขามายังวงจรภาครับของโมดูล UART - เปนคาของอักขระทีรั่ บไดในรูปแบบของรหัสแอสกี้
ตัวอยางที่ 6-60 #include <ATX2.h>
// ผนวกไฟลไลบรารีหลัก
void setup() { glcdMode(1); setTextSize(2);
// เลือกโหมดแสดงผลเปนโหมด 1 // เลือกขนาดตัวอักษรเปน 2 เทา
} void loop() { glcdClear(); if(uart_available())
// ตรวจสอบการรับขอมูล
{ if(uart_getkey()=='a')
// ตรวจสอบการกดตียบอรดเพือส ่ งขอมูล
{ glcd(3,1,"Key a Active!"); sleep(2000);
// แสดงขอความตอบรับการกดตคียบอรด // หนวงเวลา 2 วินาที
} else { glcdClear();
// ลางจอแสดงผล
} } }
หมายเหตุ เมือเรี ่ ยกใชฟงกชัน่ uart เพือส ่ งขอมูลออกทางโมดูลพอรตอนุกรมหรือ UART และ uart_getkey เพือตรวจจั ่ บอักขระใดๆ นัน้ อัตราบอดจะถูกกําหนดเปน 9,600 บิตตอวินาที ขอมูล 8 บิต และไมมีการตรวจสอบพาริตี้ โดยอัตโนมัติ และเปนคาตั้งตน เพื่อลดความซับซอนในการเขียนโปรแกรมลง หากตองการเปลี่ยนอัตราบอดตองใช uart_set_baud อยางไรก็ตาม ตองคํานึงดวยวา เมืออั ่ ตราบอดสูงขึนอาจส ้ งผลกระทบตอความถูกตองในการสือสารข ่ อมูล
138Robo-CreatorXT : ATX2
ในการทดสอบจะตองตอสาย USB ระหวางคอมพิวเตอรกับแผงวงจร ATX2 ไวตลอดเวลา หลังจาก อัปโหลดโปรแกรมแลว จากนันเป ้ ดหนาตาง Serial Minonitor โดยคลิกทีปุ่ ม หรือเลือกจากเมนู Tools > Serial Monitor
รอครูหนึ ่ง หนาตาง Serial Monitor จะเปดขึ้นมา คลิกเลือกทีช่ อง No line ending เลือกอัตราบอดที่ ชองขวามุมลางเปน 9600 Baud และคลิกเพือปลดเครื ่ ่องหมายใดๆ ทีช่ อง Autoscroll จากนั้นพิมพ a ทีช่ องสงขอมูล แลวคลิกปุม Send เพือส ่ งขอมูลจากคอมพิวเตอรไปยังแผงวงจร ATX2 ผานทางพอรต USB ทีถู่ กกําหนดใหทํางานเปน พอรตอนุกรมเสมือนหรือ USB Serial port จะไดผลการทํางานดังรูป
สวนทีแผงวงจร ่ ATX2 แสดงขอความ Key a Active ! ที่จอแสดงผล
Robo-CreatorXT : ATX2 139
6.2.10.6 uart1 เปนฟงกชันส ่ งขอมูลออกทางภาคสงของโมดูล UART1 มีอัตราบอดเริมต ่ นที่ 9,600 บิตตอวินาที รูปแบบ void uart1(char *p,...)
พารามิเตอร p - รับรหัสของกลุมข อความทีต่ องการสงออกจากภาคสงของโมดูล UART1 โดยกําหนดรูปแบบการแทรก สัญลักษณพิเศษเพื่อใชรวมในการแสดงผลเหมือนกับฟงกชั่น uart
6.2.10.7 uart1_set_baud เปนฟงกชั่นกําหนดอัตราบอดในการสือสารของโมดู ่ ล UART1 กับคอมพิวเตอร รูปแบบ void uart1_set_baud(unsigned int baud)
พารามิเตอร baud - กําหนดคาอัตราบอดในการสื่อสารของโมดูล UART1 มีคา 2,400 ถึง 115,200 บิตตอวินาที
ตัวอยางที่ 6-61 uart1_set_baud(19200);
// กําหนดอัตราบอดในการสือสารเป ่ น 19,200 บิตตอวินาที
6.2.10.8 uart1_available เปนฟงกชั่นตรวจสอบการรับขอมูลเขามาของโมดูล UART1 เมื่อติดตอกับคอมพิวเตอร รูปแบบ unsigned char uart1_available(void)
การคืนคา - เปน 0 เมื่อไมมีขอมูลเขามา - มากกวา 0 โดยมีคาเทากับจํานวนของอักขระทีได ่ รับ
ตัวอยางที่ 6-62 char x =uart1_available();
// ตรวจสอบวามีขอมูลเขามาทางภาครับของโมดูล UART1 หรือไม // ถา x มีคามากกวา 0 แสดงวามีขอมูลเขามาแลว ควรอานดวยฟงกชั่น uart1_getkey ทันที
6.2.10.9 uart1_getkey เปนฟงกชั่นอานขอมูลจากบัฟเฟอรตัวรับของโมดูล UART1 รูปแบบ char uart1_getkey(void)
การคืนคา - เปน 0 เมื่อยังไมมีการรับอักขระใดๆ - เปนคาของอักขระทีรั่ บไดในรูปแบบของรหัสแอสกี้
140Robo-CreatorXT : ATX2
6.2.10.10 จะใชงาน UART1 เมือใด ่ 1. เมื่อตองการติดตอกับอุปกรณสื่อสารขอมูลไรสาย อาทิ โมดูลบลูทูธ, โมดูล XBEE เปนตน TXD1
RXD1
Tx
Rx
2. เมื่อตองการสือสารข ่ อมูลระหวางแผงวงจร ATX2 สองชุด
3. เมือต ่ องการติดตอกับอุปกรณภายนอกทีต่ องการรูปแบบขอมูลอนุกรมในการสือสาร ่ อาทิ แผง วงจรขับเซอรโวมอเตอร 16 ชอง (ZX-SERVO16i) , แผงวงจรโมดูล LCD แบบอนุกรม (SLCD16x2), แผงวงจรฐานเวลานาฬิกาจริงแบบอนุกรม (ZX-17), Pixy โมดูลกลองตรวจจับสีและภาพ เปนตน
Robo-CreatorXT : ATX2 141
6.3 ฟงกชันใช ่ งาน HC-SR04 โมดูลวัดระยะทางดวยอัลตราโซนิก ในไลบรารี ATX2.h ซึงเป ่ นไลบรารีหลักของการเขียนโปรแกรมเพือควบคุ ่ มการทํางานของ แผงวงจรควบคุมอเนกประสงค ATX2 ยังไดบรรจุฟงกชั่นสําหรับติดตอกับอุปกรณอินพุตเอาตพุต และตัวตรวจจับหนาทีพิ่ เศษอืนๆ ่ อีกหลายตัว อาทิ LED8 แผงวงจรขับ LED 8 ชองทีใช ่ การติดตอแบบ อนุกรมดวยสายสัญญาณเสนเดียว, HC-SR04 เปนโมดูลตรวจจับและวัดระยะทางดวยอัลตราโซนิก, หรือ ZX-ENCODER แผงวงจรตรวจจับรหัสลอ เปนตน
6.3.1 เกี่ยวกับ HC-SR04 โมดูลตรวจจับและวัดระยะทางดวยอัลตราโซนิก HC-SR04 เปนโมดูลตรวจจับและวัดระยะทางที่ใชหลักการสะทอนของคลื่นอัลตราโซนิก หรือคลื่นความถี่เหนือเสียงราคาประหยัด โดยตัว HC-SR04 มีแหลงกําเนิดคลื่นอัลตราโซนิกสงไป สะทอนกับวัตถุที่อยูข างหนากลับมายังตัวรับสัญญาณ โดยระยะทางที่วัดไดจะสัมพันธกับระยะเวลา ทีคลื ่ นอั ่ ลตราโซนิกเคลือนที ่ ไปกระทบวั ่ ตถุและสะทอนกลับมายังตัวรับ เมือรู ่ ระยะเวลาที คลื ่ นอั ่ ลตรา โซนิกสะทอนกลับมา จึงคํานวณเปนระยะทางระหวางโมดูล HC-SR04 กับวัตถุได โดยโมดูล HC-SR04 วัดระยะทางในชวง 2 ถึง 500 ซม. (5 เมตร) มีความละเอียดอยูที่ 0.3 ซม. ใชไฟเลี้ยง +5V ในรูปที่ 6-3 แสดงสวนประกอบทั้งหมดของชุดโมดูล HC-SR04 เพือใช ่ ในการติดตอกับบอรด ไมโครคอนโทรลเลอร โดยเฉพาะอยางยิ่งกับแผงวงจร ATX2
รูปที่ 6-3 สวนประกอบทั้งหมด ของโมดูล HC-SR04 เพือใช ่ ในการ ติดตอกับแผงวงจร ATX2
142Robo-CreatorXT : ATX2
รูปที่ 6-4 การเชื่อมตอระหวางแผงวงจร ATX2 กับโมดูลวัดระยะทางดวยคลืนความถี ่ ่เหนือเสียง
6.3.2 การติดตอกับแผงวงจร ATX2 การเชื่อมตอกับแผงวงจร ATX2 ของโมดูล HC-SR04 ใชสายสัญญาณแบบ JST3AC-8 จํานวน 2 เสน ดังรูปที่ 6-4 โดยปลายสายดานหัวตอ IDC ตัวเมียของสาย JST3AC-8 เสนที่ 1 ตอกับคอนเน็กเตอร ของโมดูล HC-SR04 ที่ขาไฟเลี้ยง (+V), กราวด (GND) และ Trig สวนเสนที่ 2 ใหตอสายสัญญาณ (สีขาว เสนกลาง) กับขา Echo สวนหัวตอ IDC ตัวเมียของสายสีแดงและดําที่เหลือใหปลอยลอยไว สวนปลายสายดานทีเป ่ นหัวตอ JST ใหนําไปเสียบจุดตอพอรต 2 สําหรับขา Trig และพอรต 3 สําหรับ ขา Echo บนแผงวงจร ATX2 ในการสือสารข ่ อมูลกับโมดูล HC-SR04 ใชขาสัญญาณ 2 ขา คือ Trig และ Echo โดยขา Trigger มีไวสําหรับสั่งงานใหโมดูล HC-SR04 สงคลื่นอัลตราโซนิกออกไปขางหนา เมื่อคลื่นอัลตรา โซนิกสะทอนกลับมาจากวัตถุเปาหมาย จะสงสัญญาณพัลสออกมาทางขา Echo โดยสัญญาณนี้จะมี ความกวางที่สัมพันธกับระยะทางที่วัดได ดังนั้น ไมโครคอนโทรลเลอรจะตองสงสัญญาณพัลสที่มี ความกวางพัลสอยางนอย 10 ไมโครวินาทีไปยังขา Trigger ของโมดูล HC-SR04 แลวรอรับสัญญาณ พัลสที่สงกลับมาทางขา Echo เพือวั ่ ดความกวางของสัญญาณพัลส ดังรูปที่ 6-5
6.3.3 การคํานวณหาคาระยะทาง เมือวั ่ ดความกวางของสัญญาณพัลสจากขา Echo ในหนวยไมโครวินาทีแลว นําไปคํานวณเปน ระยะทางในหนวยเซนติเมตรหรือนิ้วไดดังนี้ ระยะทาง (เซนติเมตร) = (ระยะเวลาในหนวยไมโครวินาที / 29) / 2 ระยะทาง (นิ้ว) = (ระยะเวลาในหนวยไมโครวินาที / 74) / 2
Robo-CreatorXT : ATX2 143
รูปที่ 6-5 แสดงการติดตอระหวางแผงวงจร ATX2 กับโมดูล HC-SR04 เพื่อวัดระยะทาง
6.3.4 sonar เปนฟงกชั่นอานคาระยะทางที่วัดไดจากโมดูลวัดระยะทางดวยอัลตราโซนิก HC-SR04 รูปแบบ unsigned int sonar
การคืนคา ระยะทางในหนวยเซนติเมตร
ตัวอยางที่ 6-62 #include <ATX2.h>
// ผนวกไฟลไลบรารีหลัก
void setup() { OK(); glcdClear();
// รอการกดสวิตช OK // ลางจอแสดงผล
} void loop() { glcd(0,0,”%d
“,sonar());
// นําคาที่วัดไดมาแสดงทีจอกราฟ ่ ก LCD สีของแผงวงจร ATX2 }
144Robo-CreatorXT : ATX2
เมือรั ่ นโปรแกรม ทีจอแสดงผลจะแสดงข ่ อความและคาของการวัดในหนวยเซนติเมตรและนิ้วทันที ทดลอง ใชมือบังทีด่ านหนาของโมดูล HC-SR04 แลวเลือนมื ่ อเขาใกลและถอยหางออกจากโมดูล สังเกตคาการวัดทีได ่ ดังรูปทา 28 อาจตรวจสอบความแมนยําในการวัดดวยการใชไมบรรทัดหรือตลับเมตรวัดเทียบได จากการทดสอบในพืนที ้ โล ่ งกับวัตถุทีมี่ รูปรางแนนอนเพียง 1 ชิน้ โดยมีการปรับระยะทดสอบอยางตอเนือง ่ พบวา โมดูล HC-SR04 วัดระยะทางไดระหวาง 2 เซนติเมตร ถึง 5 เมตร แตระยะทําการทีให ่ ผลคอนขางแนนอนคือ 4 เซนติเมตร ถึง 3 เมตร
6.3.5 _sonarTime เปนฟงกชันอ ่ านคาระยะทางทีวั่ ดไดจากโมดูลวัดระยะทางดวยอัลตราโซนิก HC-SR04 โดยให คาเปนขอมูลดิบที่ตองนําไปคํานวณเพิมเติ ่ ม เพือแปลงค ่ าเปนคาระยะทางเปนเซนติเมตรตอไป รูปแบบ unsigned int _sonarTime
การคืนคา เปนขอมูลระยะทางทีเป ่ นขอมูลดิบ
รูปที่ 6-6 ตัวอยางการนําโมดูล HC-SR04 ไปติดตั้งที่ดานหนาของหุนยนต RQ-BOT (ResQ-BOT) เพือตรวจจั ่ บสิงกี ่ ดขวางในภารกิจการแขงขันหุนยนต กูภั ยยุวชน
Robo-CreatorXT : ATX2 145
6.4 ฟงกชันใช ่ งานแผงวงจรตรวจจับรหัสลอ ZX-ENCODER 6.4.1 ขอมูลเบืองต ้ นของ ZX-ENCODER แผงวงจรตรวจจับรหัสลอ ZX-ENCODER เปนแผงวงจรตรวจจับรหัสลอทีต่ องใชงานรวมกับแผนรหัสลอ (encoder dics) ซึ่งติดตั้งเขาที่แกนหมุนของชุดเฟองขับมอเตอรรุน BO1 และ BO2 ไดโดยตรง ดังแสดงหนาตาของ แผงวงจรตรวจจับนี้ในรูปที่ 6-7 คุณสมบัติทางเทคนิคที่สําคัญมีดังนี้ ใชออปโตอินเตอรรัปเตอรในการตรวจจับชองของแผนรหัสลอ ใชกับแผนรหัสลอ ที่หนาไมเกิน 5 มิลลิเมตร มีเอาตพุต 2 แบบคือ แบบสัญญาณตรง (AO) และแบบผานวงจรเปรียบเทียบ (DO) ใชไฟเลี้ยงยานกวางตั้งแต +3 ถึง +5V มี LED แสดงสถานะการทํางาน แผนรหัสลอเปนวงกลมขนาดเสนผานศูนยกลาง 20 มิลลิเมตร มีชองสําหรับตรวจ จับ 20 ชอง สวมเขากับแกนหมุนของชุดเฟองขับมอเตอรไฟตรงรุน BO1 หรือ BO2 ไดโดยตรง ขนาดของแผงวงจร 32 x 14 มิลลิเมตร
รูปที่ 6-7 แสดงสวนประกอบทังหมดของชุ ้ ดแผงวงจรตรวจจับรหัสลอ
146Robo-CreatorXT : ATX2
แผงวงจรตรวจจับรหัสลอ
แผนรหัสลอ 20 ชอง
แกนหมุนของมอเตอร
รูปที่ 6-8 แนวทางการติดตังแผงวงจร ้ ตรวจจับรหัสลอและแผนรหัสลอพลาสติก เขากับแกนหมุนของมอเตอรในหุนยนต RQ-BOT
6.4.2 แนวทางการใชงาน รูปที่ 6-8 แสดงตัวอยางการติดตั้งแผงวงจรตรวจจับรหัสลอและแผนรหัสลอเขากับแกนหมุน ของชุดเฟองขับมอเตอรเพือใช ่ งานในหุนยนต RQ-BOT สําหรับวัดระยะทางการเคลือนที ่ ของหุ ่ นยนต โดยตอสายสัญญาณจากชอง AO เขากับจุดตอพอรต 18/INT ซึ่งเปนอินพุตของสัญญาณอินเตอรรัปต จากภายนอกของแผงวงจร ATX2 การทํางานกับแผงวงจรตรวจจับรหัสลอจําเปนอยางยิงที ่ แผงวงจรควบคุ ่ มอยาง ATX2 จะตอง อานคาจากการตรวจจับและนําไปประมวลผลใหเร็วที่สุด เนื่องจากตองการทราบวา ขณะนี้หุนยนต เคลื่อนทีไปได ่ ระยะทางเปนเทาใด ยิ่งหุนยนต เคลื่อนทีด่ วยความเร็ว การตรวจจับและการตอบสนอง ตองเร็วใหทันกัน มิเชนนั้น คาของการนับสัญญาณจะผิดพลาด ทําใหการควบคุมตําแหนงมีความ คลาดเคลื่อนได อินพุตดิจิตอลที่มีการตอบสนองไดเร็วทีสุ่ ดของแผงวงจร ATX2 คือ อินพุตอินเตอรรัปต ซึ่ง ก็ตอ จุดตอพอรต 18/INT โดยแทจริงแลว แผงวงจร ATX2 มีอินพุตตอบสนองการอินเตอรรัปตจาก ภายนอกทั้งสิ้น 3 จุดตอคือ 2/RXD1 เปนอินพุตอินเตอรรัปตชอง 0 หรือ INT0 3/TXD1 เปนอินพุตอินเตอรรัปตชอง 1 หรือ INT1 18/INT เปนอินพุตอินเตอรรัปตชอง 2 หรือ INT2
Robo-CreatorXT : ATX2 147
สําหรับแผงวงจร ATX2 จะเลือกใชจุดตอพอรต 18/INT เนื่องจากอีก 2 จุดตอนันควรใช ้ งาน กับอุปกรณสื่อสารอนุกรม อาทิ โมดูลกลอง Pixy หรือโมดูลสื่อสารขอมูลอนุกรมไรสายอยางบลูทู ธหรือ WiFi จะทําใหใชงานแผงวงจร ATX2 ไดอบางมีประสทิธิผลมากกวา แนวคิดในการนําแผงวงจร ZX-ENCODER มาใชวัดระยะทางในการเคลื่อนที่ของหุนยนต ให ใชขอมูลในรูปที่ 6-9 ประกอบในการอธิบาย หากทราบขนาดเสนผานศูนยกลางของลอ ซึ่งในที่นี้คือ 5.7 เซนติเมตร ระยะทางเมื่อลอหมุนไป 1 รอบคือ D หรือเทากับ 3.14 x 5.7 = 17.898 หรือประมาณ 17.90 เซนติเมตร
รูปที่ 6-9 การวัดระยะทางดวยแผงวงจรตรวจจับรหัสลอแะแผนรหัสลอพลาสติกในหุนยนต RQ-BOT
148Robo-CreatorXT : ATX2
6.4.4 encCNT เปนฟงกชั่นอานคาจากการตรวจจับรหัสลอของแผงวงจรตรวจจับรหัสลอ ZX-ENCODER หากใชแผนรหัสลอที่มาพรอมกับแผงวงจรตรวจจับรหัสลอจะอานคาไดคา 40 ตอ 1 รอบของหมุน การคํานวณระยะทางใหใชแนวคิดตามที่แสดงในรูปที่ 6-9 รูปแบบ unsigned int encCnt
การคืนคา เปนคาของจํานวนพัลสทีตรวจจั ่ บไดจากแผนรหัสลอ
ตัวอยางที่ 6-63 // ผนวกไฟลไลบรารีหลัก
#include <ATX2.h> void setup() {
// รอการกดสวิตช OK // ลางจอแสดงผล
OK(); glcdClear(); } void loop() { glcd(0,0,”%d
“,encCnt());
// นําคาที่ตรวจจับไดมาแสดงทีจอกราฟ ่ ก LCD สีของแผงวงจร ATX2 }
ในการทดสอบใหหมุนแกนมอเตอรทีติ่ ดตังแผ ้ นรหัสลอและแผงวงจรตรวจจับรหัสลอดวยมืออยางชาๆ แลว ดูคาทีเกิ ่ ดขึนบนจอแสดงผลของแผงวงจร ้ ATX2
ตัวอยางที่ 6-64
[ตองใชกับหุนยนต RQ-BOT]
#include <ATX2.h>
// ผนวกไฟลไลบรารีหลัก
void setup() { OK(); glcdClear();
// รอการกดสวิตช OK // ลางจอแสดงผล
FD(100); while(encCnt<40);
encCnt=0; BK(100);
// คาการนับนอยกวา 40 // แสดงวา ยังไมครบรอบหรือไดระยะทาง 17.75 ซม. // เคลียรคาการนับ // เมือค ่ าทีตรวจจั ่ บไดเทากับ 40 ใหถอยหลังสันๆ ้ เพือเตรี ่ ยมหยุด
Robo-CreatorXT : ATX2 149
delay(50); AO();
// หนวงเวลาสั้นๆ 0.5 วินาที // หยุดการขับมอเตอรทังหมด ้
} void loop() { sw_OK_press(); FD(100); while(encCnt<40);
encCnt=0; BK(100); delay(50); AO();
// คาการนับนอยกวา 40 // แสดงวา ยังไมครบรอบหรือไดระยะทาง 17.75 ซม. // เคลียรคาการนับ // เมือค ่ าทีตรวจจั ่ บไดเทากับ 40 ใหถอยหลังสันๆ ้ เพือเตรี ่ ยมหยุด // หนวงเวลาสั้นๆ 0.5 วินาที // หยุดการขับมอเตอรทังหมด ้
}
ในการทดสอบนี้ตองการใหหุนยนต RQ-BOT หยุดเคลือนที ่ เมื ่ ่อเคลือนที ่ ได ่ ระยะทาง 17.75 เซนติเมตร เทคนิคทีใช ่ ในการหยุดการเคลือนที ่ ่ทันทีคือ การสั่งใหหุนยนต ถอยหลังดวยกําลังสุงสุดเปนเวลาสั้นๆ แลว ตามดวยคําสั่ง AO(); เพือหยุ ่ ดการขับมอเตอรทังหมด ้
150Robo-CreatorXT : ATX2