ATX2 Controller board manual (THAI version)

Page 1

Robo-CreatorXT :  ATX2 1

  

ATX2


2Robo-CreatorXT :  ATX2

ATX2 สงวนลิขสิทธิ์ตาม พ.ร.บ. ลิขสิทธิ์ พ.ศ. 2537 หามการลอกเลียนไมวาสวนหนึงส ่ วนใดของหนังสือเลมนี้ นอกจากจะไดรับอนุญาต

ใครควรใชหนังสือเลมนี้ 1. นักเรียน นิสิต นักศึกษา และบุคคลทัวไปที ่ มี่ ความสนใจในการนําไมโครคอนโทรลเลอรไปประยุกต ใชในการทดลองเกี่ยวกับการทํางานของระบบอัตโนมัติ หรือสนใจในการเรียนรูและทดลองไมโคร  คอนโทรลเลอรในแนวทางใหมทีใช ่ กิจกรรมหุนยนต  อัตโนมัติเปนสื่อ 2. สถาบันการศึกษา โรงเรียน วิทยาลัย มหาวิทยาลัย ทีมี่ การเปดการเรียนการสอนวิชาอิเล็กทรอนิกส หรือภาควิชาวิศวกรรมอิเล็กทรอนิกสและคอมพิวเตอร 3. คณาจารยทีมี่ ความตองการศึกษา และเตรียมการเรียนการสอนวิชาไมโครคอนโทรลเลอร รวมถึงวิทยา ศาสตรประยุกตทีต่ องการบูรณาการความรูทางอิ  เล็กทรอนิกส-ไมโครคอนโทรลเลอร-การเขียนโปรแกรม คอมพิวเตอร--การทดลองทางวิทยาศาสตร ในระดับมัธยมศึกษา อาชีวศึกษา และปริญญาตรี

ดําเนินการจัดพิมพและจําหนายโดย บริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด 108 ซ.สุขุมวิท 101/2 ถ.สุขุมวิท แขวงบางนา เขตบางนา กรุงเทพฯ 10260 โทรศัพท 0-2747-7001-4 โทรสาร 0-2747-7005 รายละเอียดทีปรากฏในหนั ่ งสือเลมนี้ไดผานการตรวจทานอยางละเอียดและถวนถี่ เพื่อใหมีความสมบูรณและ ถูกตองมากทีสุ่ ดภายใตเงือนไขและเวลาที ่ พึ่ งมีกอนการจัดพิมพเผยแพร ความเสียหายอันอาจเกิดจากการนําขอมูล ในหนังสือเลมนีไปใช ้ ทางบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด มิไดมีภาระในการรับผิดชอบแตประการใด ความผิดพลาดคลาดเคลือนที ่ อาจมี ่ และไดรับการจัดพิมพเผยแพรออกไปนัน้ ทางบริษัทฯ จะพยายามชีแจงและแก ้ ไข ในการจัดพิมพครังต ้ อไป


Robo-CreatorXT :  ATX2 3

   การนําเสนอขอมูลเกียวกั ่ บขอมูลทางเทคนิคและเทคโนโลยีในหนังสือเลมนี้ เกิดจากความตอง การทีจะอธิ ่ บายกระบวนการและหลักการทํางาน ของอุปกรณในภาพรวมดวยถอยคําทีง่ ายเพือสร ่ าง ความเขาใจแกผูอ าน ดังนันการแปลคํ ้ าศัพททางเทคนิคหลายๆ คําอาจไมตรงตามขอบัญญัติของราช บัณฑิตยสถาน และมีหลายๆ คําที่ยังไมมีการบัญญัติอยางเปนทางการ คณะผูเขี  ยนจึงขออนุญาต บัญญัติศัพทขึนมาใช ้ ในการอธิบาย โดยมีขอจํากัดเพืออ ่ างอิงในหนังสือเลมนีเท ้ านัน้ ทังนี ้ สาเหตุ ้ หลักของขอชีแจงนี ้ มาจาก ้ การรวบรวมขอมูลของอุปกรณในระบบสมองกลฝงตัว และเทคโนโลยีหุนยนต  สําหรับการศึกษาเพือนํ ่ ามาเรียบเรียงเปนภาษาไทยนันทํ ้ าไดไมงายนัก ทางคณะ ผูเขี  ยนตองทําการรวบรวมและทดลองเพือให ่ แนใจวา ความเขาใจในกระบวนการทํางานตางๆ นันมี ้ ความ คลาดเคลือนน ่ อยทีสุ่ ด เมือต ่ องทําการเรียบเรียงออกมาเปนภาษาไทย ศัพททางเทคนิคหลายคํามีความหมายทีทั่ บซอน กันมาก การบัญญัติศัพทจึงเกิดจากการปฏิบัติจริงรวมกับความหมายทางภาษาศาสตร ดังนันหากมี ้ ความ คลาดเคลือนหรื ่ อผิดพลาดเกิดขึน้ ทางคณะผูเขี  ยนขอนอมรับและหากไดรับคําอธิบายหรือชีแนะจากท ้ าน ผูรู จะได  ทําการชีแจงและปรั ้ บปรุงขอผิดพลาดทีอาจมี ่ เหลานันโดยเร็ ้ วทีสุ่ ด ทังนี ้ เพื ้ อให ่ การพัฒนาสือทางวิ ่ ชาการ โดยเฉพาะอยางยิ่งกับความรูของเทคโนโลยี  สมัยใหม สามารถดําเนินไปไดอยางตอเนือง ่ ภายใตการมีสวนรวมของผูรู ในทุ  กภาคสวน บริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด


4Robo-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)


6Robo-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

10F

A11

A10

RESET

10k

+5V

1k

4k7

+BATT

LOW BATT.

1k

A9

A8

0.1F

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.1F

+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.1F

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.1F

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.1F

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

8Robo-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

 





















 



 





 



 

 






26Robo-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) มีคุณสมบัติทางเทคนิคที่นาสนใจดังนี้


28Robo-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


30Robo-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




92Robo-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


94Robo-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() {}

// เขียนฟงกชั่นนี้ลงไปหรือไมก็ได


96Robo-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 // นําคาไปแสดงเปนสีพืนของจอแสดงผล ้


98Robo-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);

// กําหนดใหสีพืนหลั ้ งตัวอักษรเปนสีเขียว


100Robo-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);






102Robo-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 บรรทัด (แบบไมลนจอแสดงผล)


104Robo-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


106Robo-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 กลางจอ


108Robo-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






110Robo-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

 



 


112Robo-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() {}


114Robo-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 มิลลิวินาที


116Robo-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 เทา


118Robo-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 เทา


120Robo-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


122Robo-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 วินาที


124Robo-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 เปอรเซ็นต


126Robo-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 วินาที // กําหนดใหมอเตอรหยุดทํางาน หุนยนต  จะหยุดเคลือนที ่ ่ทันที


128Robo-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);

// ขับเคลือนหุ ่ นยนตเคลือนที ่ ่เปนรูปวงกลม // เนืองจากความเร็ ่ วในการหมุนของมอเตอรทังสองด ้ าน ของหุนยนต  แตกตางกันมาก


130Robo-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 ลอใหเลียวขวาด ้ วยกําลังสูงสุด


132Robo-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 วินาที


134Robo-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


136Robo-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 อยางไรก็ตาม ตองคํานึงดวยวา เมืออั ่ ตราบอดสูงขึนอาจส ้ งผลกระทบตอความถูกตองในการสือสารข ่ อมูล


138Robo-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 เมื่อยังไมมีการรับอักขระใดๆ - เปนคาของอักขระทีรั่ บไดในรูปแบบของรหัสแอสกี้


140Robo-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


142Robo-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 }


144Robo-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 แสดงสวนประกอบทังหมดของชุ ้ ดแผงวงจรตรวจจับรหัสลอ


146Robo-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


148Robo-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(); เพือหยุ ่ ดการขับมอเตอรทังหมด ้


150Robo-CreatorXT :    ATX2


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.