atx2 controller board manual (thai version)

150
ATX2

Upload: innovative-experiment-coltd

Post on 08-Apr-2016

796 views

Category:

Documents


138 download

DESCRIPTION

This is best controller board from INEX. Recommended for Robo-CreatorXT kit and World Robot Games competition.

TRANSCRIPT

Robo-CreatorXT : ATX2 1

ATX2

2Robo-CreatorXT : ATX2

ATX2

ใครควรใช หนั งสื อเล มนี้

1. น ักเรี ยน นิ ส ิต นั กศึ กษา และบุ คคลทั่ วไปที ่มี ความสนใจในการนํ าไมโครคอนโทรลเลอร ไปประย ุกต ใช ในการทดลองเกี่ ยวกั บการทํ างานของระบบอั ตโนมั ติ หรื อสนใจในการเรี ยนรู และทดลองไมโครคอนโทรลเลอร ในแนวทางใหม ที่ ใช กิ จกรรมหุ นยนต อั ตโนมั ต ิเป นส่ื อ

2. สถาบั นการศึ กษา โรงเร ียน วิ ทยาลั ย มหาวิ ทยาลั ย ที ่มี การเป ดการเรี ยนการสอนว ิชาอิ เล ็กทรอนิ กส หรื อภาควิ ชาวิ ศวกรรมอิ เล ็กทรอนิ กส และคอมพิ วเตอร

3. คณาจารย ที ่ม ีความต องการศ ึกษา และเตร ียมการเร ียนการสอนว ิชาไมโครคอนโทรลเลอร รวมถ ึงว ิทยาศาสตร ประยุ กต ที ่ต องการบ ูรณาการความรู ทางอ ิเล็ กทรอน ิกส -ไมโครคอนโทรลเลอร -การเข ียนโปรแกรมคอมพ ิวเตอร --การทดลองทางว ิทยาศาสตร ในระด ับม ัธยมศ ึกษา อาช ีวศ ึกษา และปร ิญญาตรี

รายละเอี ยดที่ ปรากฏในหนั งสื อเล มนี้ ได ผ านการตรวจทานอย างละเอี ยดและถ วนถี่ เพื่ อให มี ความสมบู รณ และถ ูกต องมากท่ี ส ุดภายใต เงื ่อนไขและเวลาที ่พ ึงม ีก อนการจ ัดพ ิมพ เผยแพร ความเส ียหายอ ันอาจเก ิดจากการน ําข อม ูลในหน ังสื อเล มนี ้ไปใช ทางบริ ษ ัท อิ นโนเวต ีฟ เอ็ กเพอริ เมนต จ ําก ัด ม ิได ม ีภาระในการรั บผิ ดชอบแต ประการใดความผ ิดพลาดคลาดเคลื ่อนที ่อาจม ีและได ร ับการจั ดพ ิมพ เผยแพร ออกไปนั ้น ทางบร ิษ ัทฯ จะพยายามชี ้แจงและแก ไขในการจั ดพ ิมพ ครั ้งต อไป

สงวนลิ ขสิ ทธ์ิ ตาม พ.ร.บ. ลิ ขสิ ทธ์ิ พ.ศ. 2537

ห ามการลอกเลี ยนไม ว าส วนหนึ ่งส วนใดของหนั งสื อเล มนี้ นอกจากจะได รั บอนุ ญาต

ดํ าเน ินการจ ัดพิ มพ และจํ าหน ายโดยบริ ษั ท อิ นโนเวตี ฟ เอ็ กเพอริ เมนต จํ ากั ด108 ซ.สุ ขุ มวิ ท 101/2 ถ.สุ ขุ มวิ ท แขวงบางนา เขตบางนา กรุ งเทพฯ 10260โทรศั พท 0-2747-7001-4โทรสาร 0-2747-7005

Robo-CreatorXT : ATX2 3

การนํ าเสนอข อม ูลเกี ่ยวก ับข อมู ลทางเทคน ิคและเทคโนโลยี ในหน ังส ือเล มนี ้ เก ิดจากความต องการท่ี จะอธ ิบายกระบวนการและหลั กการทํ างาน ของอุ ปกรณ ในภาพรวมด วยถ อยคํ าท่ี ง ายเพื่ อสร างความเข าใจแก ผู อ าน ด ังนั ้นการแปลคํ าศั พท ทางเทคนิ คหลายๆ คํ าอาจไม ตรงตามข อบ ัญญั ต ิของราชบั ณฑิ ตยสถาน และมี หลายๆ คํ าท่ี ยั งไม มี การบั ญญั ติ อย างเป นทางการ คณะผู เขี ยนจึ งขออนุ ญาตบ ัญญ ัต ิศ ัพท ขึ ้นมาใช ในการอธ ิบาย โดยม ีข อจํ าก ัดเพื ่ออ างอ ิงในหน ังส ือเล มนี ้เท าน้ั น

ทั ้งนี้ สาเหตุ หลั กของข อชี ้แจงนี ้มาจาก การรวบรวมข อม ูลของอ ุปกรณ ในระบบสมองกลฝ งต ัวและเทคโนโลยี หุ นยนต ส ําหรั บการศึ กษาเพื ่อนํ ามาเร ียบเร ียงเป นภาษาไทยนั ้นท ําได ไม ง ายน ัก ทางคณะผู เข ียนต องทํ าการรวบรวมและทดลองเพื ่อให แน ใจว า ความเข าใจในกระบวนการท ํางานต างๆ นั ้นม ีความคลาดเคลื ่อนน อยที ่ส ุด

เมื ่อต องทํ าการเร ียบเร ียงออกมาเป นภาษาไทย ศ ัพท ทางเทคน ิคหลายค ําม ีความหมายที ่ท ับซ อนก ันมาก การบ ัญญ ัต ิศ ัพท จ ึงเก ิดจากการปฏ ิบ ัต ิจร ิงร วมก ับความหมายทางภาษาศาสตร ด ังนั ้นหากม ีความคลาดเคลื ่อนหร ือผ ิดพลาดเก ิดขึ ้น ทางคณะผู เข ียนขอน อมร ับและหากได ร ับค ําอธ ิบายหร ือชี ้แนะจากท านผู รู จะได ท ําการชี ้แจงและปร ับปร ุงข อผ ิดพลาดที ่อาจม ีเหล าน้ั นโดยเร ็วที ่ส ุด

ทั้ งนี้ เพื่ อให การพั ฒนาสื่ อทางวิ ชาการ โดยเฉพาะอย างยิ่ งกั บความรู ของเทคโนโลยี สมั ยใหม สามารถดํ าเนิ นไปได อย างต อเนื่ อง ภายใต การมี ส วนร วมของผู รู ในทุ กภาคส วน

บริ ษั ท อิ นโนเวตี ฟ เอ็ กเพอริ เมนต จํ ากั ด

4Robo-CreatorXT : ATX2

บทท่ี 1 แนะน ําแผงวงจรควบค ุมอเนกประสงค ATX2..........................................................5

บทท่ี 2 Arduino ซอฟต แวร พั ฒนาโปรแกรมภาษา C/C++ส ําหร ับแผงวงจรควบค ุมอเนกประสงค ATX2.......................................................... 13

บทท่ี 3 Robo-Creator XT หุ นยนต อ ัตโนม ัต ิควบค ุมด วยโปรแกรมภาษา C/C++...............25

บทท่ี 4 โครงสร างโปรแกรมของ Arduino.............................................................................31

บทท่ี 5 ฟ งก ชั่ นพื้ นฐานของ Arduinoและต ัวอย างคํ าสั ่งส ําหร ับการพั ฒนาโปรแกรม.....................................................65

บทท่ี 6 ไลบรารี ส ําหรั บพั ฒนาโปรแกรมของแผงวงจร ATX2............................................91

Robo-CreatorXT : ATX2 5

ATX2 เป นแผงวงจรแบบโปรแกรมได ที่ ขั บมอเตอร ไฟตรงได 6 ตั ว และเซอร โวมอเตอร อี ก8 ตั วพร อมกั น ทั้ งยั งมี จุ ดต ออิ นพุ ตเอาต พุ ตเพ่ื อเชื่ อมต อกั บแผงวงจรตั วตรวจจั บแบบต างๆ ทั้ งอะนาลอกและดิ จิ ตอลจํ านวนมาก จึ งนํ าไปใช เป นแผงวงจรควบคุ มของหุ นยนต อั ตโนมั ติ เพ่ื อการศึ กษาขนาดกลาง และนํ าไปใช สร างโครงงานวิ ทยาศาสตร และเทคโนโลยี ที่ สอดคล องกั บการเรี ยนรู สะเต็ มศึ กษาได เป นอย างดี

ด านการพั ฒนาโปรแกรม แผงวงจร ATX2 รองรั บโปรแกรมที่ พั ฒนาด วยภาษา C/C++ โดยเฉพาะอย างยิ่ งกั บซอฟต แวร ในโครงการพั ฒนาระบบควบคุ มขนาดเล็ กเพื่ อประยุ กต ใช งานด านซอฟต แวร และฮาร ดแวร ในแบบโอเพ นซอร สที่ ชื่ อ Arduino (www.arduino.cc)

6Robo-CreatorXT : ATX2

1.1 ค ุณสมบั ติ ของแผงวงจรควบค ุมหลั ก

ในรู ปที่ 1-1 แสดงส วนประกอบของแผงวงจร ATX2 มี คุ ณสมบั ติ ทางเทคนิ คที่ สํ าคั ญดั งนี้

การควบค ุมหล ักใช ไมโครคอนโทรลเลอร 8 บ ิตเบอร ATmega644P ม ีหน วยความจํ าโปรแกรมแบบแฟลช 64 ก ิโลไบต โปรแกรมใหม ได 10,000 ครั ้ง ม ีหน วยความจ ําข อม ูลอ ีอ ีพรอม 4 ก ิโลไบต และหน วยความจ ําข อม ูลแรม 4 ก ิโลไบต ส ัญญาณนาฬ ิกา 20MHz จากคริ สตอล

ในส วนของอ ุปกรณ อ ินพ ุตเอาต พ ุตเสร ิมใช ไมโครคอนโทรลเลอร 8 บ ิตเบอร ATmega88Aของ Atmel ท ําหน าที ่จ ัดการอ ินพ ุตเอาต พ ุตเพิ ่มเต ิมให ก ับแผงวงจร

ก ําหนดชื ่อขาพอร ตในการต ิดต ออ ุปกรณ ตามข อก ําหนดของฮาร ดแวร Arduino มาตรฐาน

มี จุ ดต อพอร ต 3 ขา (ขาไฟเลี้ ยง, สั ญญาณ และกราวด ) แบบโปรแกรมได จํ านวน18 จุ ด แบ งเป นขาพอร ตแบบดิ จิ ตอลหรื ออะนาลอก (กํ าหนดได ) 8 จุ ด (พอร ต 24 หรื อ A0 ถึ งพอร ต31 หรื อ A7), จุ ดต ออิ นพุ ตอะนาลอกอย างเดี ยว 5 จุ ด (A8 ถึ ง A12), จุ ดต ออิ นพุ ตเอาต พุ ตแบบดิ จิ ตอลที่ รองรั บการอิ นเตอร รั ปต 1 จุ ด (พอร ต 18 หรื อ INT2), จุ ดต อขาพอร ตสํ าหรั บบั สสื ่อสารข อมู ล 2 สาย(TWI) 1 ชุ ด (2 จุ ดคื อ พอร ต 9-SCL และพอร ต 9-SDA) และจ ุดต อบั สสื ่อสารข อม ูลอนุ กรมหร ือ UART

ร ูปที ่ 1-1 แสดงส วนประกอบที ่ควรทราบของแผงวงจรควบค ุมอเนกประสงค ATX2

Robo-CreatorXT : ATX2 7

1 ชุ ด (2 จุ ด ประกอบด วย พอร ต 2-RXD1 และพอร ต 3-TXD1) สํ าหรั บจุ ดต อพอร ต TWI และ UARTสามารถกํ าหนดให เป นขาพอร ตอิ นพุ ตเอาต พุ ตดิ จิ ตอลสํ าหรั บงานทั่ วไปได นอกจากนั้ นที่ จุ ด UARTยั งใช งานเป นอิ นพุ ตดิ จิ ตอลที ่รองร ับการอ ินเตอร รั ปต ได อ ีก 2 จุ ดด วย นั ่นคื อ RXD1 คื ออ ินพุ ตอ ินเตอร รั ปต ช อง 0 หรื อ INT0 และ TXD1 คื ออิ นพุ ตอิ นเตอร รั ปต ช อง 1 หรื อ INT1

จ ุดต อพอร ตอ ินพ ุตอะนาลอกทั ้ง 13 จ ุด (A0 ถ ึง A12) รองร ับแรงด ันได ตั ้งแต 0 ถ ึง +5Vม ีความละเอ ียดในการแปลงส ัญญาณเป นข อม ูลด ิจ ิตอล 10 บ ิต ให ผลการทํ างานในช วง 0 ถ ึง 1,023

มี ตั วต านทานปรั บค าได หรื อ KNOB สํ าหรั บทดลองการทํ างานของวงจรแปลงสั ญญาณอะนาลอกเป นดิ จิ ตอลได โดยไม ต องต ออุ ปกรณ ภายนอก

มี สวิ ตช OK เป นสวิ ตช แบบกดติ ดปล อยดั บที่ มี การต อตั วต านทานพู ลอั ปไว แล วสํ าหรั บทดสอบการอ านค าอิ นพุ ตดิ จิ ตอลอย างง าย

มี ลํ าโพงเป ยโซสํ าหรั บขั บเสี ยง

มี จอแสดงผลแบบกราฟ ก LCD สี ความละเอี ยด 128 x 160 จุ ด แสดงตั วอั กษรได 21 ตั ว 16 บรรทั ด

มี จุ ดต อพอร ตสื่ อสารข อมู ลอนุ กรม UART 1 ชุ ด สํ าหรั บติ ดต อกั บอุ ปกรณ อนุ กรมอาทิ โมดู ล กล อง Pixy, โมดู ลบลู ทู ธ BlueStick, โมดู ลสื่ อสาร XBEE และ XBEE PRO, โมดู ล WiFi,แผงวงจรขั บเซอร โวหลายช องแบบอนุ กรม, โมดู ล LCD แบบอนุ กรม เป นต น

มี วงจรขั บมอเตอร ไฟตรง 6 ช อง พร อมไฟแสดงการทํ างาน รองรั บมอเตอร ไฟตรงขนาด 4.5 ถึ ง 9V (ขึ้ นกั บไฟเลี้ ยงของแผงวงจร แรงดั นสู งสุ ดที่ ใช ได คื อ +11.1V) ขั บกระแสไฟฟ าได สู งสุ ด 3A และ 1.2A หากเป นการขั บต อเนื่ อง

ม ีจ ุดต อ RC เซอร โวมอเตอร ขนาดเล ็ก 8 ช อง รองร ับเซอร โวมอเตอร ขนาด 4.8 ถ ึง 7.2V

มี LED แสดงสภาวะไฟเลี้ ยงของวงจรขั บมอเตอร และเซอร โวมอเตอร ปกติ จะติ ดสว าง และดั บลงหากมอเตอร มี การลั ดวงจร

มี วงจรตรวจสอบระดั บไฟเลี้ ยงของระบบแสดงผลด วย LED เมื่ อไฟเลี ้ยงตํ่ ากว า 6V

ดาวน โหลดและสื ่อสารข อม ูลกั บคอมพ ิวเตอร ผ านพอร ต USB ม ีไฟแสดงการทํ างาน

มี สวิ ตช RESET สํ าหรั บรี เซตการทํ างาน

รองรั บการขยายพอร ตผ านจุ ดต อพอร ตบั ส 2 สายหรื อ TWI โดยใช อุ ปกรณ เพ่ิ มเติ ม

ใช ไฟเลี ้ยง +6 ถ ึง +9V กระแสไฟฟ า 1100mA (เป นอย างน อย หากใช ก ับมอเตอร 4 ต ัว)

ม ีวงจรควบค ุมแรงด ันคงที ่ +5V ส ําหร ับไมโครคอนโทรลเลอร และควบค ุมแรงด ันคงที ่+6V ส ําหร ับวงจรข ับเซอร โวมอเตอร ทั ้งนี ้เพื ่อป องก ันความเส ียหายกรณ ีจ ายไฟเก ินแก เซอร โวมอเตอร

8Robo-CreatorXT : ATX2

2k2

A1

25

A3

27

A5

29

A7

31

PA

7

PA

6

PA

5

PA

4

PA

3

PA

2

PA

1

PA

0

42

1k

10

k

+5V

15 0O

K

100/1

6V

KN

OB

A2

26

A4

28

A6

30

A0

24

18

IN

T2+

5V

D-D+ID

GND

VUSB

FT

23

2R

L

15

16

D+

D-

RX

D1

SE

RIA

L1

PD

2

18

INT2

+5V

GND

3

+5V

GND

2

TX

D1

PD

3

US

B

10k

+5V

PWREN

DA

TA

TXLE

D23

RXLE

D22

+5V

VIO

4

GN

D7

VD

D20

GN

D18

GN

D21

AG

ND

25

TEST

26

0.1F

DTR

RXD

5TXD

1

30

29

28

27

26

25

24

A6

A5

A4

A3

A2

A1

A0

31

A7

37

36

35

34

33

32

31

30

PB

2

0.1

F

10k+

5V

RE

SE

T

+VSRV

RC

. S

ER

VO

MO

TO

R

OU

TP

UT

PC

5S

V1

13

14

15

PC

6S

V2

PC

7S

V3

AT

Me

ga

64

4P

A(T

QFP

44

)

MA

IN

CO

NT

RO

LLE

R

A9

A8

28

27

26

25

24

AT

Me

ga

88

(TQ

FP

32

)

AT

X2

XIO

EX

PA

NS

ION

A1

1

A1

0

A1

2

+5V

A1

2A

11

A1

0

A9

A8

19

A1

3

22

A1

4+

BA

TT

KN

OB

3V3

17

0.1F

TW

I (

I2C

)SD

A

PC

1

GND

+5V

9

SC

L

PC

0

GND

+5V

8

+5V

2k2 x

2

20

89

19LO

WB

AT

T.

1k

A1A1PGPGA2A2B2B2PGPGB1B1

1k

1k

12

DIR

2

PW

M2

74

65D

IR1

PW

M1

DC

. M

OT

OR

OU

TP

UT

(MA

IN)

+-

+-

4k7

4k7

KRC102

+VMPWMA

+VM+VM

PWMBBIN2BIN1GNDSTBVcc

AIN1AIN2

+5V

+5V

+5V

PD

4

PD

7

PD

5

PD

6

0.1

F

470/16V

TB6612FNG

222324

131415161718192021

123456789

101112

0.1FKRC102

A1A1PGPGA2A2B2B2PGPGB1B1

1k

1k

34

DIR

4

PW

M4

20

17

19

16

DIR

3

PWM

3

+-

+-

4k7

4k7

KRC

102

+VMPWMA

+VM+VM

PWMBBIN2BIN1GNDSTBVcc

AIN1AIN2

+5V

+5V

+5V

PB

1

PB

4

PB

0

PB

3

0.1

F

470/16V

TB6612FNG

222324

131415161718192021

123456789

101112

0.1FKRC102

A1A1PGPGA2A2B2B2PGPGB1B1

1k

1k

56

+-

+-

4k7

4k7

KRC102

+VMPWMA

+VM+VM

PWMBBIN2BIN1GNDSTBVcc

AIN1AIN2

+5V

+5V

+5V 0.

1F

470/16V

TB6612FNG

222324

131415161718192021

123456789

101112

0.1FKRC

102

+BA

TT

DC

. M

OT

OR

OU

TP

UT

(X

IO)

6

15

5

14

4

13

7

16

19

43

16

40

17

41

20

44

13

14

15

24

25

26

SV1

SV2

SV3

CR

20M

Hz

78 X

1X2

+5V

VD

D38

GN

D6

AREF

29

GN

D18

GN

D39 28

0.1F x4

VD

D5

VD

D17

AG

ND

AVD

D27

14

1

23

LOW

BA

TT.

SPK.

Speake

r

10

F

SV

4S

V5

SV

6S

V7

SV

8

SV4

SV5

SV6

303132SV

7SV

81312

VC

C

GN

D

RS

T

D/C

DA

T

CLK

CS

3V

3

LCD ITDB02-1.8SPConnector

PW

M5

DIR

5D

IR6

9211PW

M6

10

12

21

22

23

+5V

RST

4

10k

+5V

1

F

150

11

10

21

22

23

12

3

14S

S

1516

17

MO

SI

MIS

OSCK

MO

SI

MIS

OSCK

10k

+5V

RST

29

ATX

2 I

SP

11

12

910

0

RXD

01

TXD

03

TXD

12

RXD

1

+V

2k2

2k2

+VSRV

+BATT

470/16V

+5V

VD

D4

GN

D3

VD

D6

GN

D5

AG

ND

21

0.1F

AVD

D18

AREF

20

0.1

F

1k

4k7

+B

ATT

US

B

21

42

3+

5V

S7

V7

F5

5V

DC

-DC

Co

nve

rte

r

INH

GN

D

Vin

Vout

KSB772

0.4

7R

1

3

2

27

8R

06

470/1

6V

+VSRV

DC

7-9

V

SW

-PO

WER

+BATT

ON

FD

S6675

DC

7-9

VA

da

pte

rIn

pu

t

4

0.1

F

INH

GN

D

Vin

Vou

t

100/1

6V

470/1

6V

ร ูปที ่ 1-2 วงจรของแผงวงจรอเนกประสงค ATX2

Robo-CreatorXT : ATX2 9

1.2 ข อมู ลของสายสั ญญาณที ่ใช ก ับแผงวงจรควบคุ มอเนกประสงค ATX2

1.2.1 สาย JST3AA-8 : สายเชื่ อมต อระหว างแผงวงจร

สาย JST3AA-8 ใช เชื่ อมต อระหว างแผงวงจรควบคุ ม IPST-SE กั บแผงวงจรตรวจจั บและแผงวงจรอุ ปกรณ ต างๆ เป นสายแพ 3 เส น ยาว 8 นิ้ ว ปลายสายทั้ งสองด านติ ดตั้ งคอนเน็ กเตอร แบบ JST3 ขา ตั วเมี ย ระยะห างระหว างขา 2 มิ ลลิ เมตร มี การจั ดขาดั งนี้

ระยะหางระหวางขา 2 มม. ระยะหางระหวางขา 2 มม.

GNDS

+5V

1.2.2 สาย USB-miniBเป นสายสั ญญาณสํ าหรั บเชื่ อมต อระหว างพอร ต USB ของคอมพิ วเตอร กั บแผงวงจร IPST-SE

10Robo-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

เตรยีมการสรางโปรแกรมควบคุม1. เปดซอฟตแวร Arduino 1.0.7 สรางไฟลใหม2. เลือกชนิดของแผงวงจร ท่ีเมนู Tools > Board > ATX2 >ATmega644P@16MHz3. เลือกชองตอคอมพิวเตอร ที่เมนู Tools > Serial port > COMxโดย x เปนเลขใดๆ ไดมาจากการตรวจสอบตําแหนงที่ Devicemanager

เขียนโปรแกรมภาษา C/C++ แลวบันทึกไฟล

คอมไพล

ติดตั้งซอฟตแวร- Arduino 1.0.7 ซอฟตแวรเขียนโปรแกรมภาษา C/C++- ไดรเวอร USB ของแผงวงจร ATX2- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ตรวจสอบชองเชื่อมตอคอมพิวเตอรของแผงวงจร ATX2

- เช่ือมตอแผงวงจร ATX2 เขากับพอรต USB- เลือกเปด Control panel > System > Hardware > DeviceManager > Ports ดูที่หัวขอ USB serial port (COMx)- จําตําแหนงของ USB serial port (COMx) โดย x เปนตัวเลขใดๆ ปกติมคีามากกวา 3 เพ่ือเลือกชองติดตอสื่อสารระหวางคอมพิวเตอรกบัแผงวงจร ATX2

อัปโหลดโปรแกรม

โปรแกรมที่แผงวงจร ATX2 เริม่ทํางาน

ร ูปที ่ 1-3 แผนภาพแสดงขั ้นตอนและกระบวนการเร ียนรู เพื ่อใช งาน ATX2 แผงวงจรควบค ุมอเนกประสงค เริ่ มจากด านซ ายตั้ งแต การติ ดตั้ งโปรแกรมและการตรวจสอบการเชื่ อมต อระหว างแผงวงจร ATX2กั บคอมพิ วเตอร ไล มาทางขวา เริ่ มจากขั้ นตอนเตรี ยมการสร างโปรแกรมควบคุ ม, เขี ยนโปรแกรม,คอมไพล หร ือการแปลโปรแกรมภาษา C/C++ เป นภาษาเครื ่อง, อ ัปโหลดหร ือ ส งโปรแกรมไปย ังแผงวงจรควบค ุมอเนกประสงค ATX2 จากนั ้นจึ งร ันโปรแกรมเพื ่อตรวจสอบการท ํางาน

12Robo-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 ข ามขั ้นตอนนี ้ไป

14Robo-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 หรื อ USBserial port)

16Robo-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 โดยเฉพาะ

18Robo-CreatorXT : ATX2

(4) พิ มพ โค ดต อไปนี้ แล วบั นทึ กในชื่ อ atx2_hello.ino#include <ATX2.h>void setup(){

OK(); // Wait for OK buttonglcdClear(); // Clear screen

}void loop(){

glcd(1,0,"Hello World"); // Show message}

(5) อั ปโหลดไปยั งแผงวงจร ATX2 เมื่ อเสร็ จสิ้ น แผงวงจร ATX2 จะทํ างานทั นที

แผงวงจร ATX2 แสดงข อความต อนรั บ แล วรอให กดสวิ ตช OK เมื่ อกดสวิ ตช OKหน าจอแสดงผลจะเปล่ี ยนการแสดงข อความเป น Hello World

Robo-CreatorXT : ATX2 19

2.4 ส วนประกอบของซอฟต แวร Arduino1.0.7เมื ่อเรี ยกให โปรแกรมท ํางาน จะมี หน าตาดั งรู ปที ่ 2-1 ตั วโปรแกรมประกอบด วยส วนต างๆ ดั งนี ้

ร ูปที ่ 2-1 แสดงส วนประกอบของโปรแกรม Arduino1.0.7

แถบเครื่ องมื อ (Tools bar)

แถบเลื อกโปรแกรม (Tab)

พื้ นที่ แสดงสถานะการทํ างาน (Message area)

Serial Monitorคลิ กเพื่ อเป ดหน าต างสํ าหรั บรั บและส งข อมู ลอนุ กรมระหว างฮาร ดแวร Arduino กั บคอมพิ วเตอร

เมนู (Menu)

พื้ นที่ สํ าหรั บเขี ยนโปรแกรม(Text Editor)

เมนู (Menu) ใช เลื อกคํ าสั่ งต างๆ ในการใช งานโปรแกรม

แถบเครื่ องมื อ (Toolbar) เป นการนํ าคํ าสั่ งที่ ใช งานบ อยๆ มาสร างเป นปุ มเพ่ื อให เรี ยกใช คํ าสั่ งได รวดเร็ วขึ้ น

แถบเลื อกโปรแกรม (Tabs) เป นแถบที่ ใช เลื อกไฟล โปรแกรมแต ละตั ว (กรณี ที่ เขี ยนโปรแกรมขนาดใหญ ประกอบด วยไฟล หลายตั ว)

พื้ นที่ เขี ยนโปรแกรม (Text editor) เป นพื้ นที่ สํ าหรั บเขี ยนโปรแกรมภาษา C/C++

พื ้นที ่แสดงสถานะการท ํางาน (Message area) เป นพื้ นที่ โปรแกรมใช แจ งสถานะการทํ างานของโปรแกรม เช น ผลการคอมไพล โปรแกรม

พื้ นที่ แสดงข อมู ล (Text area) ใช แจ งว าโปรแกรมที่ ผ านการคอมไพล แล วมี ขนาดกี่ ไบต

20Robo-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 : ใช จบการทํ างานและออกจากโปรแกรม

22Robo-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 ใช บั นทึ กไฟล สเก็ ตชบุ กที่ เขี ยนขึ้ น

24Robo-CreatorXT : ATX2

Robo-CreatorXT : ATX2 25

Robo-Creator XT เป นชุ ดหุ นยนต อั ตโนมั ติ เพื่ อการศึ กษาที่ สามารถพั ฒนาโปรแกรมควบคุ มด วยภาษา C/C++ ในแบบโอเพ นซอร สที่ เข ากั นได กั บซอฟต แวร ในโครงการพั ฒนาระบบควบคุ มขนาดเล็ กเพื่ อประยุ กต ใช งานด านซอฟต แวร และฮาร ดแวร ที่ ชื่ อ Arduino (www.arduino.cc)

Robo-Creator XT มี แผงวงจรควบคุ มที่ ชื่ อว า ATX2 ซึ่ งขั บมอเตอร ไฟตรงได 6 ตั ว และเซอร โวมอเตอร อี ก 8 ต ัวพร อมก ัน จ ัดได ว า เป นช ุดหุ นยนต อั ตโนมั ต ิเพื ่อการศึ กษาขนาดกลางสํ าหร ับเร ียนรู การพั ฒนาโปรแกรมที ่ม ีความซ ับซ อนเพิ ่มขึ ้น ตลอดจนการต ิดต อกั บอุ ปกรณ ที ่มี ความพ ิเศษมากขึ ้นอาทิ โมดู ลเข็ มท ิศอิ เล็ กทรอน ิกส , ตั วตรวจจั บแสงอิ นฟราเรดแบบหลายทิ ศทาง และโมดู ลกล องแบบอนุ กรม, โมดู ลสื่ อสารข อมู ลไร สายทั้ งแบบคลื่ นวิ ทยุ มาตรฐาน, บลู ทู ธ และ WiFi

26Robo-CreatorXT : ATX2

ด านการน ําไปใช ในการแข งข ันหุ นยนต Robo-Creator XT ย ังรองร ับการพ ัฒนาเป นหุ นยนต เพื ่อแข งขั นในระดั บนานาชาติ ได ในทุ กเวที ไม ว าจะเป น World RoboCup Junio),World Robot Games(WRG), International Robot Olympiad (IRO) และอื่ นๆ

นอกจากนั ้น ย ังน ําช ุดหุ นยนต Robo-Creator XT ไปใช สร างโครงงานว ิทยาศาสตร และเทคโนโลย ีที ่สอดคล องก ับการเร ียนรู ด านสะเต ็มศ ึกษา (STEM Education) ได อย างม ีประส ิทธ ิภาพ

3.1 อุ ปกรณ ที่ มี ในชุ ดหุ นยนต Robo-Creator XT

ประกอบด วย 5 ส วนหลั กๆ คื อ

3.1.1 แผงวงจรและอ ุปกรณ อ ิเล ็กทรอน ิกส 1. แผงวงจรควบคุ มอเนกประสงค ATX2

2. แผงวงจรตรวจจั บแสงสะท อนอิ นฟราเรด ZX-03 จํ านวน 3 ชุ ด

3. แผงวงจรตรวจจั บวั ตถุ และวั ดระยะทางด วยคลื่ นอั ตลตร าโซนิ ก

4. แผงวงจรสวิ ตช จํ านวน 4 ชุ ด

5. แผงวงจรตรวจจั บรหั สล อพร อมแผ นรหั สล อพลาสติ ก

3.1.2 อุ ปกรณ เอาต พุ ต5. มอเตอร ไฟตรงพร อมเฟ องขั บ 2 แกน อั ตราทด 48:1 จํ านวน 4 ชุ ด

6. เซอร โวมอเตอร VSD-22CMD ภายในใช เฟ องโลหะ มี แรงบิ ดสู ง

7. เซอร โวมอเตอร มาตรฐาน

3.1.3 ชิ ้นส วนและอ ุปกรณ ทางกล8. แผ นฐานโลหะ ATX

9. ล อและยางขนาดเส นผ านศู นย กลาง 50 มม. จํ านวน 4 ชุ ด

10. ชิ้ นส วนสํ าหรั บประกอบเป นกลไกมื อจั บ

11. ชุ ดชิ้ นต อพลาสติ ก 3 แบบ (แนวตรง, มุ มฉาก และมุ มป าน) รวม 6 ชิ้ น

12. ชุ ดแท งต อพลาสติ กแบบมี รู 3 ขนาด (3, 5 และ 12 รู )

13. ชุ ดเสารองพลาสติ ด 4 ขนาด (3, 10, 15 และ 25 มม.)

14. เสารองโลหะ

15. ชุ ดนอตและสกรู

16. ชุ ดฉากโลหะแบบมี รู

Robo-CreatorXT : ATX2 27

3.1.4 อ ุปกรณ และเครื ่องม ือประกอบ17. กะบะถ าน AA 6 ก อนมี สายและหั วต ออะแดปเตอร

18. ไขควง

19. แผ นโฟมสํ าหรั บชิ้ นส วนมื อจั บ

3.1.5 สายสั ญญาณ20. สาย miniB-USB

21. สาย JST3AA-8 (จะต อไว กั บแผงวงตรตั วตรวจจั บทั้ งหมด)

22. สาย JST3AC-8 สํ าหรั บแผงวงจรตรวจจั บรหั สล อ

3.2 ต ัวอย างหุ นยนต อ ัตโนม ัต ิอ ุปกรณ ที ่มี ในชุ ดหุ นยนต Robo-Creator XT รองรั บการสร างหุ นยนต ได หลากหลาย เนื ่องจาก

แผงวงจรควบคุ ม ATX2 มี จุ ดต อสั ญญาณต างๆ ที่ เป นอิ สระและมี เอาต พุ ตขั บมอเตอร ได ทั้ งมอเตอร ไฟตรงและเซอร โวมอเตอร รวมถึ งการมี ชิ้ นส วนและอุ ปกรณ ทางกลจํ านวนมาก จึ งทํ าให ผู ใช งานสามารถสร างกลไกของหุ นยนต ได หลายรู ปแบบ และยั งใช งานได กั บชิ้ นส วนสํ าหรั บตกแต งเพิ่ มเติ มอาทิ แผ นพลาสติ กลู กฟู ก, ล อแบบหลายทิ ศทาง, ล อประคอง, ชุ ดประกอบหุ นยนต ของ Tamiya หรื อกระทั่ งตั วต อ Lego และ Fischertechnik

3.2.1 คุ ณสมบั ติ ทางเทคนิ คของ RQ-Botนี่ คื อตั วอย างของหุ นยนต ที่ ประกอบขึ้ นจากชิ้ นส วนและอุ ปกรณ ในชุ ด Robo-Creator XT มี

ª×è Í Çè Ò RQ-BOT (ResQ-BOT) มี คุ ณสมบั ติ ทางเทคนิ คที่ น าสนใจดั งนี้

28Robo-CreatorXT : ATX2

ใช แผงวงจร ATX2 ควบคุ มการทํ างาน

ใช ไฟเลี้ ยงจากแบตเตอรี่ Li-Po 7.4V 1100mA

ข ับเคลื ่อนด วยมอเตอร ไฟตรงพร อมช ุดเฟ องข ับอ ัตราทด 48:1 จ ํานวน 4 ช ุด เพื ่อให ข ับเคลื ่อนแบบ 4 ล อหรื อ 4-Wheel Drive (4WD) ได

มี แขนจั บวั ตถุ ที่ จั บ, ปล อย, ยก และวางได ทํ างานด วยเซอร โวมอเตอร 2 ตั ว สํ าหรั บยกวั ตถุ ในการทํ าภารกิ จหุ นยนต กู ภั ย

ติ ดตั้ งแผงวงจรตรวจจั บรหั สล อ ทํ าให ควบคุ มระยะทางในการเคลื่ อนที่ ได แม นยํ าขึ้ น โดยไม ขึ้ นกั บระดั บไฟเลี้ ยงของหุ นยนต ใช ในการเคลื่ อนที่ บนพื้ นที่ โล งที่ ไม มี เส น เพื่ อให การกํ าหนดตํ าแหน งของหุ นยนต คาดการณ ได อย างแม นยํ ามากขึ้ น

Robo-CreatorXT : ATX2 29

ต ิดตั ้งแผงวงจรตรวจจ ับแสงสะท อนอ ินฟราเรดใต หุ นยนต เพื ่อใช ในการตรวจจ ับเส นได ทั ้งเส นสี ขาวและสี ดํ า รวมถึ งการตรวจจั บขอบเขตเพื่ อให หุ นยนต เคลื่ อนที่ ภายในพื้ นที่ ที่ กํ าหนดได

ตรวจจั บวั ตถุ และสิ่ งกี ดขวางได ทั้ งแบบสั มผั ส (ด วยการใช แผงวงจรสวิ ตช ) และแบบไม สั มผั ส (ด วยแผงวงตรวจจั บวั ตถุ และวั ดระยะทางด วยคลื่ นอั ลตร าโซนิ ก) ใช ในการตรวจจั บกํ าแพงและสิ่ งกี ดขวางในภารกิ จของหุ นยนต กู ภั ย

อั ปโหลดและสื่ อสารข อมู ลกั บคอมพิ วเตอร ผ านพอร ต USB

รองรั บการติ ดต อกั บจอยสติ๊ กไร สาย PS2, สมาร ตโฟนหรื อแท็ บเล็ ตผ านบลู ทู ธด วยโมดู ลBlueStick หรื อผ าน WiFi ด วยโมดู ล ESP-01 (ใช ชิ ป ESP8266)

รองร ับการต ิดต อก ับ Pixy โมด ูลตรวจจ ับส ีและภาพระยะไกลผ านทางบ ัส I2C และ UART

30Robo-CreatorXT : ATX2

3.2.2 การจั ดการสั ญญาณของหุ นยนต RQ-BOT

หุ นยนต RQ-BOT ออกแบบมาเพื่ อใช ในการแข งขั นหุ นยนต กู ภั ยหรื อ Rescue Robot จึ งต องมี ตั วตรวจจั บ, อุ ปกรณ เอาต พุ ต และกลไกมากพอสมควร ในรู ปที่ 3-1 แสดงภาพรวมและการเชื่ อมต ออุ ปกรณ ต างๆ ของหุ นยนต RQ-BOT

ร ูปที ่ 3-1 ภาพรวมของหุ นยนต RQ-BOT ส ําหร ับการท ําภารก ิจหุ นยนต กู ภ ัยย ุวชน

RQ-BOT เป นเพ ียงหนึ ่งในต ัวอย างของหุ นยนต อ ัตโนม ัต ิส ําหร ับการเร ียนรู และใช ในการแข งขั นหุ นยนต กู ภั ยในระดั บยุ วชน ในชุ ด Robo-Creator XT ยั งมี อุ ปกรณ อ ีกมากที ่ผู ใช งานสามารถน ํามาด ัดแปลงหร ือประด ิษฐ หุ นยนต ได อ ีกหลากหลาย ทั ้งนี ้ขึ้ นกั บภารกิ จ ความรู จิ นตนาการ และความคิ ดสร างสรรค ของผู ใช งาน

RQ-Bot (ResQ Robot)

Robo-Creator XT

ATX2

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()เป นโค ดที่ ทํ างานจริ งอย างต อเนื่ อง เช น อ านค าอิ นพุ ต ประมวลผล สั่ งงานเอาต พุ ต ฯลฯ โดยส วนกํ าหนดค าเริ่ มต นเช นตั วแปร จะต องเขี ยนที่ ส วนหั วของโปรแกรมก อนถ ึงตั วฟ งก ชั ่น นอกจากนั้ นยั งต องคํ านึ งถึ งตั วพิ มพ เล็ ก-ใหญ ของต ัวแปรและชื่ อฟ งก ชั่ นให ถู กต อง

32Robo-CreatorXT : ATX2

4.1.1 ส วนของฟ งก ชั่ น setup()ฟ งก ชั่ นนี้ จะเขี ยนที่ ส วนต นของโปรแกรม ทํ างานเมื่ อโปรแกรมเริ่ มต นเพี ยงครั้ งเดี ยว ใช เพ่ื อ

กํ าหนดค าของตั วแปร, โหมดการทํ างานของขาต างๆ หรื อเริ่ มต นเรี ยกใช ไลบรารี ฯลฯฯ

ตั วอย างที่ 4-1int 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();

for (;;)

loop();

return ;

}

ตรงกั บ void setup()

ตรงกั บ void loop()

Robo-CreatorXT : ATX2 33

โปรแกรมจะวนทํางานในฟงกชั่น loop() ตลอดเวลา หลังจากทํางานในฟงกชั่น setup() จึงอาจสรุปไดวา ฟงกชั่น setup() คือ สวนตนของโปรแกรมที่ใชในการประกาศ หรือตั้งคาการทํางานในตอนเร่ิมตนทํางานในขณะที่ฟงกชั่น loop() เปนเสมือนสวนของโปรแกรมหลักที่ตองวนทํางานอยางตอเนื่องตลอดเวลา

4.1.2 ส วนของฟ งก ชั่ น loop()หล ังจากที ่เข ียนฟ งก ชั่ น setup()ที ่กํ าหนดค าเริ ่มต นของโปรแกรมแล ว ส วนถ ัดมาคื อฟ งก ชั ่น

loop() ซึ่ งมี การทํ างานตรงตามช่ื อคื อ จะทํ างานตามฟ งก ชั่ นนี้ วนต อเนื่ องตลอดเวลา ภายในฟ งก ชั่ นนี้ จะมี โปรแกรมของผู ใช เพ่ื อรั บค าจากพอร ต ประมวล แล วสั่ งเอาต พุ ตออกขาต างๆ เพ่ื อควบคุ มการทํ างานของบอร ด

ตั วอย างที่ 4-2 int buttonPin = 3; // กํ าหนดชื่ อตั วแปรให ขาพอร ต 3 และชนิ ดของตั วแปรvoid setup()

{

beginSerial(9600);

pinMode(buttonPin, INPUT);

}

// ลู ปตรวจสอบการกดสวิ ตช ที่ ขาพอร ตซึ่ งถู กประกาศด วยตั วแปร buttonPinvoid loop()

{

if (digitalRead(buttonPin) == HIGH)

serialWrite('H');

else

serialWrite('L');

delay(1000);

}

34Robo-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-3if (pinFiveInput < 500)

{

// คํ าสั่ งเพื่ อทํ างานอย างหน่ึ ง เน่ื องมาจาก pinFiveInput มี ค าน อยกว า 500}

else

{

// คํ าสั่ งเพื่ อทํ างานอี กอย างหน่ึ ง เน่ื องมาจาก pinFiveInput มี ค ามากว าหรื อเท ากั บ 500}

หลั งคํ าสั่ ง else สามารถตามด วยคํ าสั่ ง if ทํ าให รู ปแบบคํ าสั่ งกลายเป น if...else...ifเป นการทดสอบเงื่ อนไขต างๆ เมื่ อเป นจริ งให ทํ าตามที่ ต องการ ดั งตั วอย างต อไปนี้

ตั วอย างที่ 4-4if (pinFiveInput < 500)

{

// คํ าสั่ งเพื่ อทํ างานอย างหน่ึ ง เน่ื องมาจาก pinFiveInput มี ค าน อยกว า 500}

else if (pinFiveInput >= 1000)

{

// คํ าสั่ งเพื่ อทํ างานอี กอย างหน่ึ ง เน่ื องมาจาก pinFiveInput มี ค ามากกว าหรื อเท ากั บ 1000}

else

{

// คํ าสั่ งเพื่ อกํ าหนดให ทํ างานต อไปในกรณี ที่ pinFiveInput ไม ได มี ค าน อยกว า 500// และมากกว าหรื อเท ากั บ 1000 (นั่ นคื อ จะมี การกระทํ าคํ าสั่ งในโปรแกรมย อยนี้ // เมื่ อตั วแปรมี ค าอยู ระหว าง 501 ถึ ง 999 (ฐานสิ บ)

}

หลั งคํ าสั่ ง else ตามด วยคํ าสั่ ง if ได ไม จํ ากั ด (หรื อใช คํ าสั่ ง switch case แทนคํ าสั่ งif...else...if สํ าหรั บการทดสอบเงื่ อนไขจํ านวนมากๆ ได )

เมื่ อใช คํ าสั่ ง if...else แล ว ต องกํ าหนดด วยว า ถ าทดสอบไม ตรงกั บเงื่ อนไขใดๆ เลย ให ทํ าอะไร โดยให กํ าหนดที่ คํ าสั่ ง else ตั วสุ ดท าย

36Robo-CreatorXT : ATX2

4.2.3 คํ าสั่ ง for()คํ าสั่ งนี้ ใช เพ่ื อสั่ งให คํ าสั่ งที่ อยู ภายในวงเล็ บป กกาหล ัง for มี การทํ างานซํ้ ากั นตามจํ านวนรอบ

ที่ ต องการ คํ าสั่ งนี้ มี ประโยชน มากสํ าหรั บการทํ างานใดๆ ที่ ต องทํ าซํ้ ากั นและทราบจํ านวนรอบของการทํ าซํ้ าที่ แน นอน มั กใช คู กั บตั วแปรอะเรย ในการเก็ บสะสมค าที่ อ านได จากขาอิ นพุ ตอะนาลอกหลายๆ ขาที่ มี หมายเลขขาต อเนื่ องกั น

รู ปแบบของคํ าสั่ ง for() แบ งได 3 ส วนดั งนี้

for (initialization; condition; increment)

{

//statement(s);

}

เริ ่มต นด วย initialization ใช ก ําหนดค าเริ ่มต นของต ัวแปรควบค ุมการวนรอบ ในการท ํางานแต ละรอบจะทดสอบ condition ถ าเงื ่อนไขเป นจร ิงจะกระท ําค ําสั ่งในวงเล ็บป กกา แล วมาเพิ ่มหร ือลดค าต ัวแปรตามที ่สั ่งใน increment แล วทดสอบเงื ่อนไขอ ีก ทํ าซํ ้าจนกว าเงื ่อนไขเป นเท็ จ

ตั วอย างที่ 4-5for (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-6switch (var)

{

case 1:

// คํ าสั่ งเพื่ อทํ างาน เมื่ อค าของตั วแปรเท ากั บ 1break;

case 2:

// คํ าสั่ งเพื่ อทํ างาน เมื่ อค าของตั วแปรเท ากั บ 2break;

default:

// ถ าหากค าของตั วแปรไม ใช 1 และ 2 ให กระทํ าคํ าสั่ งในส วนนี้ }

4.2.5 คํ าสั่ ง whileเป นค ําสั ่งวนรอบ โดยจะทํ าค ําสั ่งที ่เข ียนในวงเล ็บป กกาอย างต อเนื ่อง จนกว าเงื ่อนไขในวงเล ็บของ

ค ําสั ่ง while() จะเป นเท ็จ คํ าสั ่งที ่ให ทํ าซํ ้าจะต องม ีการเปลี ่ยนแปลงค าต ัวแปรที ่ใช ทดสอบ เช น ม ีการเพิ ่มต าต ัวแปร หร ือม ีเงื ่อนไขภายนอกเช นอ านค าจากเซ ็นเซอร ได เร ียบร อยแล วให หย ุดการอ านค า ม ิฉะนั ้นเงื ่อนไขในวงเล ็บของ while() เป นจร ิงตลอดเวลา ท ําให คํ าสั ่ง while ทํ างานวนรอบ ไม รู จบ

รู ปแบบคํ าสั่ งwhile(expression)

{

// statement(s);

}

พาราม ิเตอร expression เป นคํ าสั่ งทดสอบเงื่ อนไข (ถู กหรื อผิ ด)

ตั วอย างที่ 4-7var = 0;

while(var < 200)

{

// คํ าสั่ งเพื่ อทํ างาน โดยวนทํ างานทั้ งสิ้ น 200 รอบvar++;

}

38Robo-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-8y = 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-9x = 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 เท านั้ น

40Robo-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-11if (x > 0 && x < 5)

{

// ...

}

ให ค าเป นจริ งเม่ื อ x มากกว า 0 และน อยกว า 5 (มี ค า 1 ถึ ง 4)

4.5.2 || (ตรรกะ หรื อ)

ให ค าเป นจริ ง เมื่ อผลการเปรี ยบเที ยบพบว า มี ตั วแปรใดเป นจริ งหรื อเป นจริ งทั้ งคู

ตั วอย างที่ 4-12if (x > 0 || y > 0)

{

// ...

}

ให ผลเป นจริ งเม่ื อ x หรื อ y มี ค ามากกว า 0

Robo-CreatorXT : ATX2 41

4.5.3 ! (ใช กลั บผลเป นตรงกั นข าม)ให ค าเป นจริ ง เมื่ อผลการเปรี ยบเที ยบเป นเท็ จ

ตั วอย างที่ 4-13if (!x)

{

// ...

}

ให ผลเป นจริ งถ า x เป นเท็ จ (เช น ถ า x = 0 ให ผลเป นจริ ง)

4.5.4 ข อควรระวั งระวั งเรื่ องการเขี ยนโปรแกรม ถ าต องการใช ตั วกระทํ าตรรกะและ ต องเขี ยนเครื่ องหมาย &&

ถ าลื มเขี ยนเป น & จะเป นตั วกระทํ าและระดั บบิ ตกั บตั วแปร ซึ่ งให ผลที่ แตกต าง

เช นกั นในการใช ตรรกะหรื อให เขี ยนเป น || (ข ีดตั้ งสองตั วติ ดกั น) ถ าเขี ยนเป น | (ข ีดตั้ งตั วเด ียว)จะหมายถ ึงตั วกระทํ าหร ือระดั บบิ ตก ับตั วแปร

ตั วกระทํ า NOT ระดั บบิ ต (~) จะแตกต างจากตั วกลั บผลให เป นตรงข าม (!) ให เลื อกใช ให ถู กต อง

ตั วอย างที่ 4-14if (a >= 10 && a <= 20){}

// ให ผลการทํ างานเป นจริ งเมื่ อ a มี ค าอยู ระหว าง 10 ถึ ง 20

42Robo-CreatorXT : ATX2

4.6 ตั วกระทํ าระดั บบิ ต

ต ัวกระท ําระด ับจะนํ าบ ิตของตั วแปรมาประมวลผล ใช ประโยชน ในการแก ป ญหาด านการเข ียนโปรแกรมได หลากหลาย ต ัวกระท ําระด ับของภาษาซ ี (ซึ ่งรวมถ ึง Arduino) ม ี 6 ต ัวได แก & (bitwiseAND), | (OR), ^ (Exclusive OR), ~ (NOT), << (เลื ่อนบ ิตไปทางขวา) และ >> (เลื ่อนบ ิตไปทางซ าย)

4.6.1 ตั วกระทํ าระดั บบิ ต AND (&)คํ าสั่ ง AND ในระดั บบิ ตของภาษาซี เขี ยนได โดยใช & หนึ่ งตั ว โดยต องเขี ยนระหว างนิ พจน

หร ือต ัวแปรที่ เป นเลขจ ํานวนเต็ ม การทํ างานจะนํ าข อม ูลแต ละบ ิตของต ัวแปรทั้ งสองตั วมากระทํ าทางตรรกะ AND โดยมี กฎดั งนี้

ถ าอิ นพุ ตทั้ งสองตั วเป น “1” ทั้ งคู เอาต พุ ตเป น “1” กรณี อื่ นๆ เอาต พุ ตเป น “0” ดั งตั วอย างต อไปนี้ ในการดู ให คู ของตั วกระทํ าตามแนวตั้ ง

0 0 1 1 Operand1

0 1 0 1 Operand2

——————————

0 0 0 1 Returned result

ใน Arduino ตั วแปรประเภท int จะม ีขนาด 16 บิ ต ดั งนั้ นเมื ่อใช ตั วกระทํ าระดั บบ ิต AND จะมี การกระทํ าตรรกะและพร อมกั นกั บข อมู ลทั้ ง 16 บิ ต ดั งตั วอย างในส วนของโปรแกรมต อไปนี้

ตั วอย างที่ 4-15int a = 92; // เท ากั บ 0000000001011100 ฐานสองint b = 101; // เท ากั บ 0000000001100101 ฐานสองint c = a & b; // ผลลั พธ คื อ 0000000001000100 ฐานสองหรื อ 68 ฐานสิ บในตั วอย างน้ี จะนํ าข อมู ลทั้ ง 16 บิ ตของตั วแปร a และ b มากระทํ าทางตรรกะ AND แล วนํ าผลลั พธ ที่ ได ทั้ ง

16 บิ ตไปเก็ บท่ี ตั วแปร c ซึ่ งได ค าเป น 01000100 ในเลขฐานสองหรื อเท ากั บ 68 ฐานสิ บ

นิ ยมใช ตั วกระทํ าระดั บบ ิต AND เพ่ื อใช เลื อกข อมู ลบิ ตที่ ต องการ (อาจเป นหนึ่ งบิ ตหรื อหลายบิ ต) จากตั วแปร int ซึ่ งการเลื อกเพี ยงบางบิ ตนี้ จะเรี ยกว า masking

Robo-CreatorXT : ATX2 43

4.6.2 ตั วกระทํ าระดั บบิ ต OR (|)คํ าสั่ งระดั บบิ ต OR ของภาษาซี เขี ยนได โดยใช เครื่ องหมาย |หนึ่ งตั ว โดยต องเขี ยนระหว าง

นิ พจน หรื อตั วแปรที่ เป นเลขจํ านวนเต ็ม การท ํางานจะน ําข อม ูลแต ละบิ ตของตั วแปรทั้ งสองตั วมากระทํ าทางตรรกะ OR โดยมี กฎดั งนี้

ถ าอ ินพุ ตตั วใดต ัวหนึ ่งหร ือทั ้งสองตั วเป น “1” เอาต พ ุตเป น “1” กรณ ีที ่อิ นพ ุตเป น “0” ทั ้งคู เอาต พุ ตจึ งจะเป น “0” ดั งตั วอย างต อไปนี้

0 0 1 1 Operand1

0 1 0 1 Operand2

——————————

0 1 1 1 Returned result

ตั วอย างที่ 4-16

ส วนของโปรแกรมแสดงการใช ตั วกระทํ าระดั บบิ ต OR

int a = 92; // เท ากั บ 0000000001011100 ฐานสองint b = 101; // เท ากั บ 0000000001100101 ฐานสองint c = a | b; // ผลลั พธ คื อ 0000000001111101 ฐานสอง หรื อ 125 ฐานสิ บ

ตั วอย างที่ 4-17

โปรแกรมแสดงการใช ตั วกระทํ าระดั บบิ ต AND และ OR

ตั วอย างงานที่ ใช ตั วกระทํ าระดั บบิ ต AND และ OR เป นงานที่ โปรแกรมเมอร เรี ยกว า Read-Modify-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)

เขี ยนเป นโปรแกรมได ดั งนี้

44Robo-CreatorXT : ATX2

int i; // counter variable

int j;

void setup()

{

DDRD = DDRD | B11111100; // กํ าหนดทิ ศทางของขาพอร ต 2 ถึ ง 7 ด วยค า 11111100Serial.begin(9600);

}

void loop()

{

for (i=0; i<64; i++)

{

PORTD = PORTD & B00000011; // กํ าหนดข อมู ลไปยั งขาพอร ต 2 ถึ ง 7j = (i << 2);

PORTD = PORTD | j;

Serial.println(PORTD, BIN);

// แสดงค าของ PORTD ที่ หน าต าง Serial montiordelay(100);

}

}

4.6.3 คํ าสั่ งระดั บบิ ต Exclusive OR (^)

เป นโอเปอร เตอร พ ิเศษที ่ไม ค อยได ใช ในภาษา C/C++ ตั วกระทํ าระด ับบิ ต exclusive OR (หรื อXOR) จะเขี ยนโดยใช สั ญลั กษณ เครื่ องหมาย ^ ตั วกระทํ านี้ มี การทํ างานใกล เคี ยงกั บตั วกระทํ าระดั บบิ ต OR แต ต างกั นเมื่ ออิ นพุ ตเป น “1” ทั้ งคู จะให เอาต พุ ตเป น “0” แสดงการทํ างานได ดั งนี้

0 0 1 1 Operand1

0 1 0 1 Operand2

——————————

0 1 1 0 Returned result

หรื อกล าวได อี กอย างว า ตั วกระทํ าระดั บบิ ต XOR จะให เอาต พุ ตเป น “0” เมื่ ออิ นพุ ตทั้ งสองตั วมี ค าเหมื อนกั น และให เอาต พุ ตเป น “1” เมื่ ออิ นพุ ตทั้ งสองมี ค าต างกั น

ตั วอย างที่ 4-18int x = 12; // ค าเลขฐานสองเท ากั บ 1100int y = 10; // ค าเลขฐานสองเท ากั บ 1010int z = x ^ y; // ผลลั พธ เท ากั บ 0110 ฐานสองหรื อ 6 ฐานสิ บ

ตั วกระทํ าระดั บบิ ต XOR จะใช มากในการสลั บค าบางบิ ตของตั วตั วแปร int เช น กลั บจาก“0” เป น “1” หรื อกลั บจาก “1” เป น “0”

Robo-CreatorXT : ATX2 45

เมื่ อใช ตั วกระทํ าระดั บบิ ต XOR ถ าบิ ตของ mask เป น “1” ทํ าให บิ ตนั้ นถู กสลั บค า ถ า maskมี ค าเป น “1” บิ ตนั้ นมี ค าคงเดิ ม ตั วอย างต อไปนี้ เป นโปรแกรมแสดงการสั่ งให ขาดิ จิ ตอล 5 มี การกลั บลอจิ กตลอดเวลา

ตั วอย างที่ 4-19void setup()

{DDRD = DDRD | B00100000; // กํ าหนดขา 5 เป นเอาต พุ ต

}

void loop()

{

PORTD = PORTD ̂ B00100000; // กลั บลอจิ กที่ ขา 5delay(100);

}

4.6.4 ตั วกระทํ าระดั บบิ ต NOT (~)ตั วกระทํ าระดั บบิ ต NOT จะเขี ยนโดยใช สั ญลั กษณ เครื่ องหมาย ~ ตั วกระทํ านี้ จะใช งานกั บ

ตั วถู กกระทํ าเพี ยงตั วเดี ยวที่ อยู ขวามื อ โดยทํ าการสลั บบิ ตทุ กบิ ตให มี ค าตรงกั นข ามคื อ จาก “0” เป น“1” และจาก “1” เป น “0” ดั งตั วอย าง

0 1 Operand1

—————

1 0 ~ Operand1

int a = 103; // binary: 0000000001100111

int b = ~a; // binary: 1111111110011000

เมื่ อกระทํ าแล ว ทํ าให ตั วแปร b มี ค า -104 (ฐานสิ บ) ซึ ่งคํ าตอบที ่ได ติ ดลบเนื่ องจากบิ ตที่ ม ีความสํ าคั ญสู งสุ ด (บิ ตซ ายมื อสุ ด) ของตั วแปร int อั นเป นบิ ตแจ งว าตั วเลขเป นบวกหรื อลบ มี ค าเป น “1”แสดงว า ค าที ่ได นี ้ต ิดลบ โดยในคอมพิ วเตอร จะเก็ บค าต ัวเลขทั ้งบวกและลบตามระบบทู คอมพล ีเมนต (2’s complement)

การประกาศตั วแปร int ซึ ่งมี ความหมายเหม ือนก ับการประกาศตั วแปรเป น signed int ต องระว ังค าของตั วแปรจะต ิดลบได

46Robo-CreatorXT : ATX2

4.6.5 คํ าสั่ งเลื่ อนบิ ตไปทางซ าย (<<) และเลื่ อนบิ ตไปทางขวา (>>)ในภาษา C/C++ มี ตั วกระทํ าเลื่ อนบิ ตไปทางซ าย << และเลื่ อนบิ ตไปทางขวา >> ตั วกระทํ า

นี้ จะสั ่งเลื่ อนบิ ตของต ัวถู กกระทํ าที่ เข ียนด านซ ายมื อไปทางซ ายหรื อไปทางขวาตามจํ านวนบิ ตที่ ระบุ ไว ในด านขวาม ือของตั วกระทํ า

รู ปแบบคํ าสั่ งvariable << number_of_bits

variable >> number_of_bits

พาราม ิเตอร

variable เป นตั วแปรเลขจํ านวนเต็ มที ่มี จํ านวนบิ ตน อยกว าหร ือเท าก ับ 32 บิ ต (หรื อต ัวแปรประเภท byte, int หรื อ long)

ตั วอย างที่ 4-20int a = 5; // เท ากั บ 0000000000000101 ฐานสองint b = a << 3; // ได ผลลั พธ เป น 0000000000101000 ฐานสองหรื อ 40int c = b >> 3; // ได ผลลั พธ เป น 0000000000000101 ฐานสองหรื อ 5 ฐานสิ บ

ตั วอย างที่ 4-21

เม่ื อสั่ งเล่ื อนค าตั วแปร x ไปทางซ ายจํ านวน y บิ ต (x << y) บิ ตข อมู ลท่ี อยู ด านซ ายสุ ดของ xจํ านวน y ตั วจะหายไปเนื่ องจากถู กเล่ื อนหายไปทางซ ายมื อ

int a = 5; // เท ากั บ 0000000000000101ฐานสองint b = a << 14; // ได ผลลั พธ เป น 0100000000000000 ฐานสอง

การเลื ่อนบิ ตไปทางซ าย จะทํ าให ค าของต ัวแปรด านซ ายมื อของตั วกระท ําจะถ ูกค ูณด วยค าสองยกกํ าลั งบิ ตที่ เลื่ อนไปทางซ ายมื อ ดั งนี้

1 << 0 == 1

1 << 1 == 2

1 << 2 == 4

1 << 3 == 8

...

1 << 8 == 256

1 << 9 == 512

1 << 10 == 1024

...

เมื ่อสั ่งเลื ่อนต ัวแปร x ไปทางขวามื อจ ํานวน y บ ิต (x >> y) จะม ีผลแตกต างกั นขึ ้นก ับประเภทของตั วแปร ถ า x เป นตั วแปรประเภท int ค าที่ เก็ บได มี ทั้ งค าบวกและลบ โดยบิ ตซ ายมื อสุ ดจะเป นsign bit หรื อบิ ตเครื ่องหมาย ถ าเป นค าลบ ค าบ ิตซ ายมื อสุ ดจะมี ค าเป น 1 กรณี นี้ เมื่ อสั่ งเลื่ อนบ ิตไปทาง

Robo-CreatorXT : ATX2 47

ขวาม ือแล ว โปรแกรมจะนํ าค าของบ ิตเครื ่องหมายมาเติ มให กั บบ ิตทางซ ายมื อสุ ด ปรากฏการณ นี้ เร ียกว า sign extension มี ตั วอย างดั งนี้

ตั วอย างที่ 4-22int x = -16; // เท ากั บ 1111111111110000 ฐานสองint y = x >> 3; // เลื่ อนบิ ตของตั วแปร x ไปทางขวา 3 ครั้ ง

// ได ผลลั พธ เป น 1111111111111110 ฐานสอง

ถ าต องการเลื ่อนบิ ตไปทางขวามื อแล วให ค า 0 มาเต ิมย ังบิ ตซ ายมื อสุ ด (ซึ ่งเกิ ดก ับกรณี ที ่ต ัวแปรเป นประเภท unsigned int) ทํ าได โดยใช การเปลี่ ยนประเภทตั วแปรชั่ วคราว (typecast) เพ่ื อเปลี่ ยนให ตั วแปร x เป น unsigned int ชั่ วคราวดั งตั วอย างต อไปนี้

ตั วอย างที่ 4-23int x = -16; // เท ากั บ 1111111111110000 ฐานสองint y = unsigned(x) >> 3; // เลื่ อนบิ ตของตั วแปร x (แบบไม คิ ดเครื่ องหมาย)

// ไปทางขวา 3 ครั้ ง

// ได ผลลั พธ เป น 0001111111111110 ฐานสอง

ถ าหากระมั ดระวั งเรื่ อง sign extension แล ว ก็ จะใช ตั วกระทํ าเลื่ อนบิ ตไปทางขวามื อสํ าหรั บหารค าตั วแปรด วย 2 ยกกํ าลั งต างๆ ได ดั งตั วอย าง

ตั วอย างที่ 4-24int x = 1000;

int y = x >> 3; // หารค าของ 1000 ด วย 8 (มาจาก 23) ทํ าให y = 125

48Robo-CreatorXT : ATX2

4.7 ไวยากรณ ภาษาของ Arduino

4.7.1 ; (เซมิ โคลอน - semicolon)ใช เขี ยนแจ งว า จบคํ าสั่ ง

ตั วอย างที่ 4-25int 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 */

50Robo-CreatorXT : ATX2

4.7.4 #defineเป นคํ าสั ่งที ่ใช งานมากในการก ําหนดค าคงที ่ให กั บโปรแกรม เนื ่องจากเป นการกํ าหนดค าที่ ไม

ใช พื้ นที่ หน วยความจํ าของไมโครคอนโทรลเลอร แต อย างใด เมื่ อถึ งขั้ นตอนแปลภาษา คอมไพเลอร จะแทนที่ ตั วอั กษรด วยค าที่ กํ าหนดไว ใน Arduino จะใช คํ าสั่ ง #define ตรงกั บภาษา C

รู ปแบบ#define constantName value

อย าลื มเครื่ องหมาย #

ตั วอย างที่ 4-26#define ledPin 3 // เป นการกํ าหนดให ตั วแปร ledPin เท ากั บค าคงที่ 3

ท ายคํ าสั่ ง #define ไม ต องมี เครื่ องหมายเซมิ โคลอน

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-28char var = 'x';

var คื อชื่ อของตั วแปรประเภท char ที่ ต องการ

x คื อค าที่ ต องการกํ าหนดให กั บตั วแปร ในที่ นี้ เป นตั วอั กษรหนึ่ งตั ว

4.8.2 byte : ตั วแปรประเภทตั วเลข 8 บิ ตหรื อ 1 ไบต ตั วแปร byte ใช เก็ บค าตั วเลขขนาด 8 บิ ต มี ค าได จาก 0 - 255

ตั วอย างที่ 4-29byte 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;

52Robo-CreatorXT : ATX2

พาราม ิเตอร

var คื อชื่ อของตั วแปรประเภท int ที่ ต องการ

val คื อค าที่ ต องการกํ าหนดให กั บตั วแปร

ตั วอย างที่ 4-30int ledPin = 13; // กํ าหนดให ตั วแปร ledPIn มี ค าเท ากั บ 13

เมื ่อตั วแปรม ีค ามากกว าค าส ูงสุ ดที่ เก็ บได จะเกิ ดการ “ล นกล ับ” (roll over) ไปยั งค าตํ ่าสุ ดที่ เก ็บได และเมื่ อมี ค าน อยกว าค าตํ่ าสุ ดที่ เก็ บได จะล นกลั บไปยั งค าสู งสุ ด ดั งตั วอย างต อไปนี้

ตั วอย างที่ 4-31int x

x = -32,768;

x = x - 1; // เมื่ อกระทํ าคํ าสั่ งแล ว ค าของ x จะเปลี่ ยนจาก -32,768 เป น 32,767x = 32,767;x = x + 1; // เมื่ อกระทํ าคํ าสั่ งแล ว ค าของ x จะเปลี่ ยนจาก 32,767 เป น -32,768

4.8.4 unsigned int : ตั วแปรประเภทเลขจํ านวนเต็ มไม คิ ดเครื่ องหมายตั วแปรประเภทนี้ คล ายกั บตั วแปร int แต จะเก็ บเลขจํ านวนเต็ มบวกเท านั้ น โดยเก็ บค า 0 ถึ ง

65,535 (216 -1)

รู ปแบบคํ าสั่ งunsigned int var = val;

พาราม ิเตอร

var คื อชื่ อของตั วแปร int ที่ ต องการ

val คื อค าที่ ต องการกํ าหนดให กั บตั วแปร

ตั วอย างที่ 4-32unsigned int ledPin = 13;

// กํ าหนดให ตั วแปร ledPIn มี ค าเท ากั บ 13 แบบไม คิ ดเครื่ องหมาย

เมื่ อตั วแปรมี ค าสู งสุ ดจะล นกลั บไปค าตํ่ าสุ ดหากมี การเพิ่ มค าต อไป และเมื่ อมี ค าตํ่ าสุ ดจะล นกลั บเป นค าสู งสุ ดเมื่ อมี การลดค าต อไปอี ก ดั งตั วอย าง

ตั วอย างที่ 4-33unsigned int xx = 0;

x = x - 1; // เมื่ อกระทํ าคํ าสั่ งแล ว ค าของ x จะเปลี่ ยนจาก 0 เป น 65535x = x + 1; // เมื่ อกระทํ าคํ าสั่ งแล ว ค าของ 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-34long time; // กํ าหนดให ตั วแปร time เป นแบบ long

4.8.6 unsigned long : ต ัวแปรประเภทเลขจ ํานวนเต ็ม 32 บ ิต แบบไม ค ิดเครื ่องหมายเป นตั วแปรเก็ บค าเลขจํ านวนเต็ มบวก ตั วแปรหนึ่ งตั วกิ นพื้ นที่ หน วยความจํ า 32 บิ ต (4 ไบต )

เก็ บค าได จาก 0 ถึ ง 4,294,967,295 หรื อ 232 - 1

รู ปแบบคํ าสั่ งunsigned long var = val;

พาราม ิเตอร

var คื อชื่ อของตั วแปร unsigned long ที่ ต องการ

val คื อค าที่ ต องการกํ าหนดให กั บตั วแปร

ตั วอย างที่ 4-35unsigned long time; // กํ าหนดให ต ัวแปร time เป นแบบ undigned long (ไม ค ิดเครื ่องหมาย)

54Robo-CreatorXT : ATX2

4.8.7 float : ตั วแปรประเภทเลขทศนิ ยมเป นตั วแปรสํ าหรั บเก ็บค าเลขเลขทศนิ ยม ซึ ่งน ิยมใช ในการเก็ บค าสั ญญาณอะนาล ็อกหร ือค าที ่

ต อเนื่ อง เนื่ องจากสามารถเก็ บค าได ละเอี ยดกว าตั วแปร int ตั วแปร float เก็ บค าได จาก 4.4028235 x1038 ถึ ง -4.4028235 x 1038 โดยหนึ่ งตั วจะกิ นพื้ นที่ หน วยความจํ า 32 บิ ต (4 ไบต )

ในการคํ านวณคณิ ตศาสตร กั บตั วแปร float จะช ากว าการคํ านวณของตั วแปร int ดั งนั้ นจึ งพยายามหลี กเลี ่ยงการคํ านวณกั บตั วแปร float ในกรณี กระทํ าคํ าสั ่งวนรอบที ่ต องทํ างานด วยความเร็ วสู งสุ ดของฟ งก ชั่ นทางเวลาที่ ต องแม นยํ าอย างมาก โปรแกรมเมอร บางคนจะทํ าการแปลงตั วเลขทศนิ ยมให เป นเลขจํ านวนเต็ มก อนแล วจึ งคํ านวณเพื่ อให ทํ างานได เร็ วขึ้ น

รู ปแบบคํ าสั่ งfloat var = val;

พาราม ิเตอร

var คื อชื่ อของตั วแปร float ที่ ต องการ

val คื อค าที่ ต องการกํ าหนดให กั บตั วแปร

ตั วอย างที่ 4-36float myfloat;

float sensorCalbrate = 1.117;

ตั วอย างที่ 4-37int x;

int y;

float z;

x = 1;

y = x / 2; // y เท ากั บ 0 ไม มี การเก็ บค าของเศษที่ ได จากการหารz = (float)x / 2.0; // z เท ากั บ 0.5

เมื่ อมี การใช ตั วแปรแบบ float ตั วเลขที่ นํ ามากระทํ ากั บตั วแปรแบบ float นี้ จะต องเป นเลขทศนิ ยมด วยจากตั วอย างคื อ เลข 2 เมื่ อนํ ามาทํ างานกั บตั วแปร x ที่ เป นแบบ float เลข 2 จึ งต องเขี ยนเป น 2.0

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 ตั ว

Str3 ประกาศตั วแปรสตริ งพร อมกํ าหนดค าให กั บข อความ แล วป ดท ายด วยตั วอั กษรป ด นั่ นคื อ \0

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'

56Robo-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 ที่ ประกาศทั้ งขนาดและกํ าหนดค า

ตั วอย างสุ ดท ายเป นการประกาศอะเรย ของตั วแปร message ที่ เป นแบบ char มี ตั วอั กษร 5 ตั วคื อ helloแต การกํ าหนดขนาดของตั วแปรจะต องเผื่ อที่ สํ าหรั บเก็ บตั วอั กษรแจ งจบข อความด วย จึ งทํ าให ค าดั ชนี ต องกํ าหนดเป น 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-40int 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]จะเป นการอ านค าจากหน วยความจํ าซึ่ งกํ าหนดไว ใช งานอย างอื่ น ค าที่ อ านได จะผิ ดพลาด

การเขี ยนค าให กั บตั วแปรอะเรย ที่ เกิ นกว ากํ าหนดไว อาจทํ าให โปรแกรมแฮงค (หยุ ดการทํ างาน) หรื อทํ างานผิ ดเพ้ี ยนไป

การอ านหรื อเขี ยนค าเกิ นค าดั ชนี ของตั วแปรอะเรย นี้ ทํ าให เกิ ดบั ก (ข อผิ ดพลาด) ที่ ยากต อการค นหา

58Robo-CreatorXT : ATX2

4.9 ขอบเขตของตั วแปร

ตั วแปรในภาษา C ที่ ใช ใน Arduino จะมี คุ ณสมบั ติ ที่ เรี ยกว า “ขอบเขตของตั วแปร” (scope)ซึ่ งแตกต างจากภาษา BASIC ซึ่ งตั วแปรทุ กตั วมี สถานะเท าเที ยมกั นหมดคื อ เป นแบบ global

4.9.1 ตั วแปรโลคอลและโกลบอลตั วแปรแบบโกลบอล (global variable) เป นตั วแปรที่ ทุ กฟ งก ชั่ นในโปรแกรมรู จั ก โดยต อง

ประกาศตั วแปร นอกฟ งก ชั่ น สํ าหรั บตั วแปรแบบโลคอลหรื อตั วแปรท องถิ่ นเป นตั วแปรที่ ประกาศตั วแปรอยู ภายในเครื่ องหมายวงเล็ บป กกาของฟ งก ชั่ น และรู จั กเฉพาะภายในฟ งก ชั่ นนั้ น

เมื่ อโปรแกรมเร่ิ มมี ขนาดใหญ และซั บซ อนมากขึ้ น การใช ตั วแปรโลคอลจะมี ประโยชน มากเนื ่องจากแน ใจได ว ามี แค ฟ งก ชั่ นนั ้นเท านั ้นที ่สามารถใช งานต ัวแปร ช วยป องกั นการเกิ ดการผิ ดพลาดเมื่ อฟ งก ชั่ นทํ าการแก ไขค าตั วแปรที่ ใช งานโดยฟ งก ชั่ นอื่ น

ตั วอย างที่ 4-41int gPWMval; // ทุ กฟ งก ชั่ นมองเห็ นตั วแปรนี้ void setup()

{}

void loop()

{

int i; // ตั วแปร i จะถู กมองเห็ นและใช งานภายในฟ งก ชั่ น loop เท านั้ นfloat f; // ตั วแปร f จะถู กมองเห็ นและใช งานภายในฟ งก ชั่ น loop เท านั้ น

}

4.9.2 ตั วแปรสแตติ ก (static)เป นคํ าสงวน (keyword) ที่ ใช ตอนประกาศตั วแปรที่ มี ขอบเขตใช งานแค ภายในฟ งก ชั ่นเท านั ้น

โดยต างจากตั วแปรโลคอลตรงที่ ตั วแปรแบบโลคอลจะถู กสร างและลบทิ้ งทุ กครั้ งที่ เรี ยกใช ฟ งก ชั่ นสํ าหร ับต ัวแปรสแตต ิกเมื ่อจบการท ํางานของฟ งก ชั ่นค าต ัวแปรจะยั งคงอยู (ไม ถ ูกลบทิ ้ง) เป นการร ักษาค าตั วแปรไว ระหว างการเรี ยกใช งานฟ งก ชั่ น

ตั วแปรที่ ประกาศเป น static จะถู กสร างและกํ าหนดค าในครั้ งแรกที่ เรี ยกใช ฟ งก ชั่ น

Robo-CreatorXT : ATX2 59

การกํ าหนดค าคงที่ เลขจํ านวนเต็ มเป นเลขฐานต างๆ ของ Arduino

ค าคงท่ี เลขจํ านวนเต็ มก ็ค ือต ัวเลขที ่ค ุณเข ียนในโปรแกรมของ Arduino โดยตรงเช น 123 โดยปกต ิแล วต ัวเลขเหล านี ้จะเป นเลขฐานส ิบ (decimal) ถ าต องการก ําหนดเป นเลขฐานอื ่นจะต องใช เครื ่องหมายพ ิเศษระบ ุ เช น

ฐาน ต ัวอย าง10 (decimal) 1232 (binary) B11110118 (octal) 017316 (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

Arduino-Note

60Robo-CreatorXT : ATX2

4.10 ค าคงที่ (constants)

ค าคงที่ เป น กลุ มตั วอั กษรหรื อข อความที่ ได กํ าหนดค าไว ล วงหน าแล ว ตั วคอมไพเลอร ของArduino จะรู จั กกั บค าคงที่ เหล านี้ แล ว ไม จํ าเป นต องประกาศหรื อกํ าหนดค าคงที่

4.10.1 HIGH, LOW : ใช กํ าหนดค าทางตรรกะในการอ านหรื อเขี ยนค าให กั บขาพอร ตดิ จิ ตอล ค าที่ เป นได มี 2 ค าคื อ HIGH หรื อ LOW

HIGH เป นการกํ าหนดค าให ขาด ิจิ ตอลนั ้นมี แรงด ันเท าก ับ +5V ส วนการอ านค า ถ าอ านได +3V หรื อมากกว า ไมโครคอนโทรลเลอร จะอ านค าได เป น HIGH ค าคงที่ ของ HIGH คื อ “1” หรื อเที ยบเป นตรรกะคื อ จริ ง (true)

LOW เป นการกํ าหนดค าให ขาดิ จิ ตอลนั้ นมี แรงดั นเท ากั บ 0V ส วนการอ านค า ถ าอ านได +2V หรื อน อยกว า ไมโครคอนโทรลเลอร จะอ านค าได เป น LOW ค าคงที่ ของ LOW คื อ “0” หรื อเที ยบเป นตรรกะคื อ เท็ จ (false)

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-42int 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);

}}

62Robo-CreatorXT : ATX2

4.12 คํ าสงวนของ Arduino

คํ าสงวนค ือ ค าคงที ่ ตั วแปร และฟ งก ชั ่นที ่ได กํ าหนดไว เป นส วนหนึ ่งของภาษา C ของ Arduinoห ามนํ าคํ าเหล านี้ ไปตั้ งชื่ อตั วแปร สามารถแสดงได ดั งนี้

# Constants

HIGH

LOW

INPUT

OUTPUT

SERIAL

DISPLAY

PI

HALF_PI

TWO_PI

LSBFIRST

MSBFIRST

CHANGE

FALLING

RISING

false

true

null

# 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

# Datatypes

boolean

byte

char

class

default

do

double

int

long

private

protected

public

return

short

signed

static

switch

throw

try

unsigned

void

# Methods/Fucntions

sw_ok

sw_ok_press

analog

knob

glcd

glcdChar

glcdString

glcdMode

glcdGetMode

glcdFlip

glcdGetFlip

colorRGB

setTextColor

setTextBackgroundColorsetTextSize

getTextColor

getTextBackgroundColor

getTextSize

glcdFillScreen

glcdClear

glcdPixel

glcdRect

glcdFillRect

glcdLine

glcdCircle

glcdFillCircle

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

absacos+=+[]asin=atanatan2&&=||=booleanbytecaseceil

charchar

class

,//

?:

constrain

cos{}

defaultdelaydelayMicroseconds//**.else==expfalsefloatfloatfloorfor<<=HALF_PIif++

!=

int<<

<

<=

log&&

!

||^

^=loopmaxmillismin-%/**newnull()PIIreturn>>;SerialSetupsin

sq

sqrt-=

switch

tan

thistrue

TWO_PI

void

whileSerialbeginreadprintwriteprintlnavailabledigitalWritedigitalReadpinModeanalogReadanalogWriteattachInterruptsdetachInterruptsbeginSerialserialWriteserialReadserialAvailable

printString

printIntegerprintByte

printHex

printOctal

printBinaryprintNewline

pulseIn

shiftOut

64Robo-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-1int ledPin = 4; // ต อ ZX-LED ที่ พอร ตหมายเลข 4void setup(){

pinMode(ledPin, OUTPUT); // กํ าหนดเป นเอาต พุ ต}void loop()

{

digitalWrite(ledPin, HIGH); // LED ติ ดสว างdelay(1000); // หน วงเวลา 1 วิ นาที digitalWrite(ledPin, LOW); // LED ดั บdelay(1000); // หน วงเวลา 1 วิ นาที

}

66Robo-CreatorXT : ATX2

5.1.1.2 digitalWrite(pin,value)

สั่ งงานให ขาพอร ตมี ค าสถานะเป นลอจิ กสู ง (HIGH หรื อ “1”) หรื อลอจิ กตํ่ า (LOW หรื อ “0”)

พาราม ิเตอร pin - หมายเลขขาพอร ตของแผงวงจร ATX2 (ค าเป น int)value - มี ค า HIGH หรื อ LOW

ตั วอย างที่ 5-2int ledPin = 30; // ต อ ZX-LED ที่ พอร ตหมายเลข 30void setup()

{

pinMode(ledPin, OUTPUT); // กํ าหนดเป นเอาต พุ ต}

void loop()

{

digitalWrite(ledPin, HIGH); // LED ติ ดสว างdelay(500); // หน วงเวลา 1 วิ นาที digitalWrite(ledPin, LOW); // LED ดั บdelay(500); // หน วงเวลา 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-3int ledPin = 30; // ต อ ZX-LED ที่ พอร ตหมายเลข 30int inPin = 28; // ต อ ZX-SWITCH01 ที่ พอร ตหมายเลข 28int val = 0; // กํ าหนดเตั วแปรสํ าหรั บเก็ บค าที่ อ านได จากอิ นพุ ตvoid setup()

{

pinMode(ledPin, OUTPUT); // กํ าหนดให พอร ต 4 เป นเอาต พุ ตpinMode(inPin, INPUT); // กํ าหนดให พอร ต 23 เป นอิ นพุ ต

}

void loop()

{

val = digitalRead(inPin); // อ านค าจากพอร ตอิ นพุ ตdigitalWrite(ledPin, val); // แสดงค าที่ อ านได ที่ พอร ตเอาต พุ ต ในที่ นี่ คื อ พอร ต 4

}

เมื่ อไม กดสวิ ตช สถานะที่ พอร ต 28 เป น “1” ทํ าให พอร ต 30 มี สถานะเป น”1” เช นกั น LED ที่ ต อกั บพอร ต4 จึ งติ ดสว าง เมื่ อกดสวิ ตช สถานะลอจิ กที่ พอร ต 23 จะเป น “0” พอร ต 4 จึ งมี สถานะเป น “0” เช นกั นLED ที่ ต ออยู จึ งดั บ

หมายเหตุ : ขาพอร ตในโปรแกรมนี้ อ างถึ งจ ุดต อพอร ตของแผงวงจรควบคุ มอเนกประสงค ATX2

68Robo-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)

pinMode(pin,INPUT)

pinMode(pin,OUTPUT)

analogWrite(pin, value)

digitalWrite(pin, value)

LOW

HIGH

รู ปที่ 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

20k

DiDigitalinputport

สั่งใหตอตัวตานทานพูลอัปภายในดวยคําสั่งdigitalWrite(pin, HIGH)

รู ปที่ 5-3 แสดงการต อตั วต านทานพู ลอั ปภายในที่ พอร ตอิ นพุ ตดิ จิ ตอลของไมโครคอนโทรลเลอร ซึ ่งควบคุ มได ด วยกระบวนการทางซอฟต แวร

+Vcc

Rpull-up

Di INPUT

ปกติเปนลอจิกสูง(HIGH หรือ "1")

Rpull-down

Di INPUT

ปกติเปนลอจิกตํ่า(LOW หรือ "0")

(ก) การตอตัวตานทานพูลอัป (ข) การตอตัวตานทานพูลดาวน

รู ปที่ 5-2 แสดงการต อตั วต านทานเพื่ อกํ าหนดสภาวะของขาพอร ตอิ นพุ ตของไมโครคอนโทรลเลอร ในขณะที่ ยั งไม มี อิ นพุ ตส งเข ามา

70Robo-CreatorXT : ATX2

แผงวงจร ATX2 มี จุ ดต อพอร ตดิ จิ ตอลที่ กํ าหนดให เป นอิ นพุ ตหรื อเอาต พุ ตจํ านวน 13 จุ ดต อหรื อ 13 ขา ถ าต องการกํ าหนดเป นอิ นพุ ตต องกํ าหนดด วยฟ งก ชั่ น pinMode และอ านค าอิ นพุ ตได จากฟ งก ชั่ น digitalRead ซึ่ งมี ร ูปแบบดั งนี้

digitalRead(pin);

เมื่ อ pin คื อหมายเลขขาที่ ต องการอ านค าสถานะ

เมื่ อฟ งก ชั่ นทํ างาน จะคื นค าเป นสถานะของขาที่ ต องการอ านค า โดยคื นค าเป น LOW (ค าเป น “0”) หรื อHIGH (ค าเป น “1”)

ภายในขาพอร ตของไมโครคอนโทรลเลอร ATmega644P ซึ่ งเป นไมโครคอนโทรลเลอร หลั กของแผงวงจร ATX2 จะมี การต อตั วต านทานพู ลอั ปค า 20k เตรี ยมไว ให สั่ งต อใช งานผ านทางซอฟต แวร ดั งรู ปที่ 5-3

ในรู ปที่ 5-4 แสดงไดอะแกรมการเขี ยนคํ าสั่ งเพื่ อกํ าหนดให ใช งานขาพอร ตของไมโครคอนโทรลเลอร หลั กของแผงวงจร ATX2 ทํ างานเป นขาพอร ตอิ นพุ ตดิ จิ ตอล

pinMode(pin,INPUT)

pinMode(pin,OUTPUT)

digitalWrite(pin, HIGH)

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-4void setup(){

Serial.begin(9600); // เป ดพอร ตอนุ กรม กํ าหนดอั ตราบอดเป น 9600 บิ ตต อวิ นาที }

Serial.begin(speed)

Serial.print(data)

Serial.println(data)

Serial.write(data)

Serial.available()

Serial.read(data)

Serial.flush()

รู ปที่ 5-5 กลไกการสื่ อสารข อมู ลอนุ กรมของฟ งก ชั่ น Serial ใน Arduino 1.0.x

72Robo-CreatorXT : ATX2

5.2.1.2 int Serial.available()

ใช แจ งว าได รั บข อมู ลตั วอั กษร (characters) แล ว และพร อมสํ าหรั บการอ านไปใช งาน

ค าที่ ส งกล ับจากฟ งก ชั่ นจํ านวนไบต ที่ พร อมสํ าหรั บการอ านค า โดยเก็ บข อมู ลในบั ฟเฟอร ตั วรั บ

ถ าไม มี ข อมู ล จะมี ค าเป น 0

ถ ามี ข อมู ล ฟ งก ชั่ นจะคื นค าที่ มากกว า 0 โดยบั ฟเฟอร เก็ บข อมู ลได สู งสุ ด 128 ไบต

5.2.1.3 int Serial.read()

ใช อ านค าข อมู ลที ่ได รั บจากพอร ตอนุ กรม

ค าที่ ส งกล ับจากฟ งก ชั่ นเป นเลข int ที่ เป นไบต แรกของข อมู ลที่ ได รั บ (หรื อเป น -1 ถ าไม มี ข อมู ล)

ตั วอย างที่ 5-5int incomingByte = 0;

void setup()

{

Serial.begin(9600);

// เป ดพอร ตสื่ อสาร กํ าหนดอั ตราบอดเป น 9600 บิ ตต อวิ นาที }

void loop() // วนส งข อมู ลเมื่ อได รั บข อมู ลเข ามา{

if (Serial.available() > 0) // อ านข อมู ลอนุ กรม{

incomingByte = Serial.read(); // เก็ บข อมู ลที่ อ านได ไว ในตั วแปรSerial.print("I received: ");

// พิ มพ ข อความไปยั งหน าต าง Serial MonitorSerial.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()

ใช ล างบั ฟเฟอร ตั วรั บข อมู ลของพอร ตอนุ กรมให ว าง

74Robo-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) ตั้ งแต Arduino1.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-6int 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); // แสดงเป นรห ัสแอสกี ้ของเลขฐานสิ บหกSerial.print("\t"); // คั่ นด วยแท็ บ (tab)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

76Robo-CreatorXT : ATX2

Serial.print("\t"); // คั่ นด วยแท็ บ (tab)Serial.println(); // ขึ้ นบรรทั ดใหม delay(10); // หน วงเวลา 10 มิ ลลิ วิ นาที

}ต ัวอย างน้ี แสดงการพ ิมพ ข อมู ลจากฟ งก ชั ่น Serial.Print() ในร ูปแบบต างๆ แสดงผ านหน าต าง Serial

Monitor

ต องเลื อกอั ตราบอดของหน าต าง Serial Monitor เป น 9600baud, เลื อก No line Ending และคลิ กทํ าเครื่ องหมายที่ ช อง Autoscroll ด วย จึ งจะได ผลการทํ างานที่ ถู กต อง

เทคนิ คสํ าหรั บการเขี ยนโปรแกรมSerial.print() จะตั ดเศษเลขทศนิ ยมเหลื อเป นเลขจํ านวนเต็ ม ทํ าให ส วนทศนิ ยมหายไป

ทางแก ไขทางหนึ่ งคื อ คู ณเลขทศนิ ยมด วย 10, 100, 1000 ฯลฯ ขึ้ นอยู กั บจํ านวนหลั กของเลขทศนิ ยม เพื่ อแปลงเลขทศนิ ยมเป นจํ านวนเต็ มก อนแล วจึ งส งออกพอร ตอนุ กรม จากนั้ นที่ ฝ งภาครั บให ทํ าการหารค าที่ รั บได เพื่ อแปลงกลั บเป นเลขทศนิ ยม

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 เป นเลขฐานสิ บ ตามด วยรห ัสอั กษร carriagereturn และ 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 - ตั วแปรสตริ งท่ี เก็ บข อความสํ าหรั บส งออกพอร ตอนุ กรม

78Robo-CreatorXT : ATX2

ตั วอย างที่ 5-7int analogValue = 0; // ประกาศตั วแปรสํ าหรั บเก็ บค าอะนาลอกvoid setup(){

Serial.begin(9600); // เป พอร ตอนุ กรมและเลื อกอั ตราบอดเป น 9600 บิ ตต อวิ นาที }void loop(){

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-8int ledPin = 30; // ต อแผงวงจร ZX-LED เข าที่ พอร ต 4int analogPin = 0; // ต อแผงวงจร ZX-POT เข าที่ พอร ตอิ นพุ ต A0int val = 0; // กํ าหนดตั วแปรรั บค าอะนาลอกint threshold = 512; // กํ าหนดค าอ างอิ งvoid setup(){

pinMode(ledPin, OUTPUT); // กํ าหนดให พอร ต 4 เป นเอาต พุ ต}void loop(){

val = analogRead(analogPin); // อ านค าอิ นพุ ตอะนาลอก A0if (val >= threshold)

{

digitalWrite(ledPin, HIGH); // ข ับ LED}else{

digitalWrite(ledPin, LOW); // ดั บ LED}

}

ตั วอย างน้ี จะสั่ งให พอร ต 30 เป นลอจิ ก “1” เมื่ ออ านค าจากพอร ตอิ นพุ ต A0 แล วมี ค ามากกว าหรื อเท ากั บค าอ างอ ิงท่ี ก ําหนดไว (ในต ัวอย าง ค าอ างอิ งหร ือ threshold = 255) แต ถ าค าน อยกว า พอร ต 30 จะเป นลอจ ิก“0” ทํ าให LED ดั บ

หมายเหตุ : ขาพอร ตในโปรแกรมนี้ อ างถึ งจ ุดต อพอร ตของแผงวงจรควบคุ มอเนกประสงค ATX2

80Robo-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-9int 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

82Robo-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 คื อ ลอจิ กตํ่ า

รู ปที่ 5-6 การทํ างานของฟ งก ชั่ น pulseIn

value = HIGH value = LOW

เร่ิมการนับเวลา

หยุดการนับเวลา

เร่ิมการนับเวลา

หยุดการนับเวลา

Robo-CreatorXT : ATX2 83

ค าที่ ส งกล ับจากฟ งก ชั่ นคาบเวลาของพั ลส ในหน วยไมโครวิ นาที

ตั วอย างที่ 5-11int 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-12long time;void setup(){

Serial.begin(9600);}void loop(){

Serial.print(“Time: “);

time = millis(); // อ านค าเวลาSerial.println(time); // แสดงค าเวลาSerial.flush();

delay(1000);

}

84Robo-CreatorXT : ATX2

5.5.2 delay(ms)

เป นฟ งก ชั ่นชะลอการท ํางาน หร ือหน วงเวลาของโปรแกรมตามเวลาที ่ก ําหนดในหน วยม ิลล ิว ินาท ี

พาราม ิเตอร ms - ระยะเวลาที่ ต องการหน วงเวลา หน วยเป นมิ ลลิ วิ นาที (1000 ms เท ากั บ 1 วิ นาที )

ตั วอย างที่ 5-13int ledPin = 30; // ต อแผงวงจร ZX-LED กั บพอร ต 30 ของแผงวงจร ATX2void setup(){

pinMode(ledPin, OUTPUT); // กํ าหนดเป นพอร ตเอาต พุ ต}void loop(){

digitalWrite(ledPin, HIGH); // ขั บ LEDdelay(1000); // หน วงเวลา 1 วิ นาที digitalWrite(ledPin, LOW); // ดั บ LEDdelay(1000); // หน วงเวลา 1 วิ นาที

}

5.5.3 delayMicroseconds(us)

เป นฟ งก ชั ่นหน วงเวลาของโปรแกรมตามเวลาที ่กํ าหนดในหน วยไมโครว ินาท ี เพื ่อให หน วงเวลาได อย างแม นย ํา ฟ งก ชั ่นนี ้จะหย ุดการท ํางานของอ ินเตอร ร ัปต ท ําให การท ํางานบางอย าง เช น การร ับข อม ูลจากพอร ตอน ุกรม หร ือการเพ่ิ มค าที่ จะส งกล ับค ืนโดยฟ งก ชั ่น milis() จะไม เก ิดขึ ้น ด ังนั ้นควรจะใช ฟ งก ชั ่นนี ้ส ําหร ับการหน วงเวลาสั ้น ๆถ าต องการหน วงเวลานาน ๆแนะนํ าให ใช ฟ งก ชั ่น delay() แทน

พาราม ิเตอร us - ค าหน วงเวลาในหน วยไมโครว ินาท ี (1000 ไมโครว ินาท ี = 1 ม ิลล ิว ินาท ี และหน่ึ งล านไมโครว ินาท ี = 1 ว ินาท ี)

ตั วอย างที่ 5-14int outPin = 30; // ต อแผงวงจร ZX-LED กั บพอร ต 30 ของแผงวงจร ATX2void setup(){

pinMode(outPin, OUTPUT); // กํ าหนดเป นพอร ตเอาต พุ ต}void loop(){

digitalWrite(outPin, HIGH); // ขั บ LEDdelayMicroseconds(50); // หน วงเวลา 50 ไมโครวิ นาที digitalWrite(outPin, LOW); // ดั บ LEDdelayMicroseconds(50); // หน วงเวลา 50 ไมโครวิ นาที

}

จากตั วอย างน้ี กํ าหนดให พอร ต 30 ทํ างานเป นเอาต พุ ตเพ่ื อส งสั ญญาณพั ลส ที่ มี คาบเวลา 100 ไมโครวิ นาที

คํ าเตื อน ฟ งก ชั่ นน้ี ทํ างานอย างแม นยํ าในช วงตั้ งแต 3 ไมโครวิ นาที ขึ้ นไป

Robo-CreatorXT : ATX2 85

5.6 ฟ งก ชั่ นทางคณิ ตศาสตร

5.6.1 min(x, y)

หาค าตั วเลขที่ น อยที่ สุ ดของต ัวเลขสองตั ว

พาราม ิเตอร x - ตั วเลขตั วแรก เป นข อมู ลประเภทใดก็ ได

y - ตั วเลขตั วที่ สอง เป นข อมู ลประเภทใดก็ ได

ค าที่ ส งกล ับจากฟ งก ชั่ นค าที่ น อยที่ สุ ดของตั วเลขสองตั วท่ี ให

ตั วอย างที่ 5-15sensVal = min(sensVal, 100);

ตั วอย างน้ี จะได ค าของ sensVal ที่ ไม เกิ น 100 กลั บจากฟ งก ชั่ น

5.6.2 max(x,y)

หาค าตั วเลขที่ มากที ่สุ ดของตั วเลขสองตั ว

พาราม ิเตอร x - ตั วเลขตั วแรก เป นข อมู ลประเภทใดก็ ได

y - ตั วเลขตั วที่ สอง เป นข อมู ลประเภทใดก็ ได

ค าที่ ส งกล ับจากฟ งก ชั่ นค าที่ มากที่ สุ ดของตั วเลขสองตั วท่ี ให

ตั วอย างที่ 5-16sensVal = max(senVal, 20);

จากตั วอย างน้ี ค าของ sensVal จะมี ค าอย างน อย 20

5.6.3 abs(x)

หาค าสั มบู รณ (absolute) ของตั วเลข

พาราม ิเตอร x - ตั วเลข

ค าที่ ส งกล ับจากฟ งก ชั่ นx เมื่ อ x มี ค ามากกว าหรื อเท ากั บศู นย (x มี ค าเป นบวกหรื อศู นย )

- x เมื่ อ x มี ค าน อยกว าศู นย (x มี ค าติ ดลบ)

86Robo-CreatorXT : ATX2

5.6.4 constrain(x, a, b)

ป ดค าตั วเลขที่ น อยกว าหรื อมากกว าให อยู ในช วงที่ กํ าหนด

พาราม ิเตอร x - ตั วเลขที่ ต องการป ดค าให อยู ในช วงที่ กํ าหนด สามารถเป นข อมู ลชนิ ดใดก็ ได

a - ค าตํ่ าสุ ดของช วงที่ กํ าหนด

b - ค าสู งสุ ดของช วงที่ กํ าหนด

ค าที่ ส งกล ับจากฟ งก ชั่ นx เมื่ อ x มี ค าอยู ระหว าง a และ b

a เมื่ อ x มี ค าน อยกว า a

b เมื่ อ x มี ค ามากกว า b

ตั วอย างที่ 5-17sensVal = constrain(sensVal, 10, 150);

จากตั วอย างน้ี ค าของ sensVal จะอยู ในช วง 10 ถึ ง 150

5.7 ฟ งก ชั่ นเกี่ ยวกั บต ัวเลขสุ ม

5.7.1 randomSeed(seed)

ใช กํ าหนดต ัวแปรสํ าหรั บสร างตั วเลขสุ ม เลื อกใช ตั วแปรได หลากหลายรู ปแบบ โดยทั่ วไปจะใช ค าเวลาป จจุ บั น (จากฟ งก ชั่ น milis()) แต ใช ค าอย างอื่ นได เช น ค าที่ ได เมื่ อผู ใช กดสวิ ตช หรื อค าสั ญญาณรบกวนที่ อ านได จากขาอิ นพุ ตอะนาลอก

พาราม ิเตอร seed เป นค าตั วเลขแบบ long int

ตั วอย างที่ 5-18long 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-19long randNumber;void setup(){

Serial.begin(9600);}void loop()

{

randomSeed(analogRead(0)); // สุ มค าจากการอ านค าอิ นพุ ตอะนาลอกrandNumber = random(50,300); // สุ มค าในช วง 50 ถึ ง 300Serial.println(randNumber);Serial.flush();delay(50);

}

เมื่ อรั นโปรแกรมนี้ ค าที่ ได จากจะอยู ในช วง 50 ถึ ง 300 แม ว าจะปรั บค าแรงดั นอิ นพุ ตที่ พอร ต A0 เป น 0หรื อ +5V (ซึ่ งปกติ มี ค า 0 ถึ ง 1023) ทั้ งน้ี เป นผลมาจากฟ งก ชั่ น random(min,max)

88Robo-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-20int 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)

90Robo-CreatorXT : ATX2

Robo-CreatorXT : ATX2 91

การพั ฒนาโปรแกรมภาษา C/C++ ด วย Arduino สํ าหรั บแผงวงจรไมโครคอนโทรลเลอร ATX2 ดํ าเนิ นการภายใต การสนั บสนุ นของไฟล ไลบรารี ATX2.h ทั้ งนี้ เพื่ อช วยลดขั้ นตอนและความซั บซ อนในการเขี ยนโปรแกรมควบคุ มส วนต างๆ ของฮาร ดแวร ลง เนื่ องจากต องการให ความสํ าคั ญไปอยู ที่ การเขี ยนโปรแกรมสํ าหรั บรองรั บการเรี ยนรู และกิ จกรรมการแข งขั น

โครงสร างของไฟล ไลบรารี ATX2.h แสดงดั งรู ป

TB6612FNG

M

M

On-board piezo speaker

XBEE

ZX-LED

ZX-SWITCH01

Pixy

ZX-SERVO16i

92Robo-CreatorXT : ATX2

6.1 ไลบรารี ย อยภายในไฟล ไลบรารี ATX2.h

ATX2_glcd บรรจ ุฟ งก ชั ่นและค ําสั ่งส ําหร ับแสดงผลข อความ, ต ัวเลข และสร างภาพกราฟ กส ีที ่จอแสดงผลแบบกราฟ ก 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 บรรจุ ฟ งก ชั่ นและคํ าสั่ งสํ าหรั บอ านค าจากแผงวงจรตรวจจั บรหั สล อ ZX-ENCODER

ในการเรี ยกใช งานชุ ดคํ าสั่ งย อยต างๆ เพื่ อการพั ฒนาโปรแกรม ต องผนวกไฟล ไลบรารี หลั กATX2.h ไว ในตอนต นของโปรแกรมด วยค ําส่ั ง

#include <ATX2.h>

เพื่ อประกาศให ให ตั วแปลภาษาหรื อคอมไพเลอร รู จั กชุ ดคํ าสั่ งย อยต างๆ ที่ กํ าลั งจะถู กเรี ยกใช งานจากไฟล ไลบรารี ATX2.h

Robo-CreatorXT : ATX2 93

6.2 รายละเอี ยดของฟ งก ชั่ นหรื อคํ าสั ่งหล ักในไฟล ไลบรารี ATX2.h6.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 เป นการมองในแนวตั้ ง

defghijk

0 0000000000

300000000000000000000

400000000000000000000

500000000000000000000

600000000000000000000

700000000000000000000

800000000000000000000

900000000000000000000

a00000000000000000000

b00000000000000000000

c00000000000000000000

d00000000000000000000

e00000000000000000000

f00000000000000000000

012345 89abc67

20000 0000d

100000000000000000000

ร ูปที ่ 6-1 การก ําหนดต ําแหน งของการแสดงผลส ําหร ับจอแสดงผลกราฟ ก LCD ส ีที ่ใช บนแผงวงจร ATX2

94Robo-CreatorXT : ATX2

6.2.1.1 glcdเป นฟ งก ชั่ นแสดงข อความที่ หน าจอแสดงผลกราฟ ก LCD สี โดยแสดงตั วอั กษรขนาดปกติ

ได 21 ตั วอั กษร 16 บรรทั ด

รู ปแบบvoid glcd(unsigned char x, unsigned char y ,char *p,...)

พาราม ิเตอร x คื อตํ าแหน งบรรทั ดมี ค าตั้ งแต 0 ถึ ง 15

y คื อตํ าแหน งตั วอั กษรมี ค าตั้ งแต 0 ถึ ง 20

*p ค ือข อความที ่ต องการน ํามาแสดงรวมถ ึงรห ัสที ่ใช ก ําหนดร ูปแบบพ ิเศษเพื ่อร วมแสดงผลข อม ูลต ัวเลขในร ูปแบบอ่ื นๆ ประกอบด วย

%c หรื อ %C - รั บค าแสดงผลตั วอั กษร 1 ตั วอั กษร

%d หรื อ %D - รั บค าแสดงผลตั วเลขจํ านวนเต็ มในช วง -32,768 ถึ ง 32,767

%l หรื อ %L - รั บค าแสดงผลตั วเลขจํ านวนเต็ มในช วง -2,147,483,648 ถึ ง 2,147,483,647

%f หรื อ %F - รั บค าเพื่ อแสดงผลตั วเลขจํ านวนจริ ง (แสดงทศนิ ยม 3 หลั ก)

ตั วอย างที่ 6-1glcd(2,0,“Hello World“);

// แสดงข อความ Hello World ที ่ต ําแหน งซ ายสุ ดของบรรท ัด 2 (บรรท ัดที ่ 3)

defghijk

0 0000000000

300000000000000000000

400000000000000000000

500000000000000000000

600000000000000000000

700000000000000000000

800000000000000000000

900000000000000000000

a00000000000000000000

b00000000000000000000

c00000000000000000000

d00000000000000000000

e00000000000000000000

f00000000000000000000

012345 89abc67

Hello World

100000000000000000000

Robo-CreatorXT : ATX2 95

ตั วอย างที่ 6-2int x=20;

glcd(1,2,”Value = %d”,x);

// แสดงตั วอั กษรและตั วเลขบนบรรทั ดเดี ยวกั น เริ่ มต นที่ คอลั มน 2 ของบรรทั ด 1 (บรรทั ดที่ 2)

6.2.1.2 glcdSetColorWordBGR

เป นฟ งก ชั่ นกํ าหนดการเรี ยงบิ ตข อมู ลสี ให เป นแบบ BGR (5-6-5) นั่ นคื อ ค าของสี นํ้ าเงิ น 5 บิ ตต อด วยสี เขี ยว 6 บิ ต และป ดท ายด วยค าของสี แดง 5 บิ ต ทั้ งนี้ เนื่ องจากผู ผลิ ตจอแสดงผลกราฟ ก LCDสี มี การผลิ ตจอแสดงที่ มี คุ ณสมบั ติ เหมื อนกั นออกมา 2 รุ น แต มี การเรี ยงบิ ตข อมู ลสี ต างกั น คื อ เรี ยงแบบ BGR และเรี ยงแบบ RGB

อย างไรก็ ตาม ค าตั้ งต นของไฟล ไลบรารี ipst_glcd.h เลื อกใช การเรี ยงบิ ตข อมู ลสี ให เป นแบบBGR นั่ นคื อ มี การเรี ยกใช ฟ งก ชั่ นนี้ ตั้ งแต ต น จึ งไม ต องเขี ยนฟ งก ชั่ นนี้ ลงในโปรแกรม

รู ปแบบglcdSetColorWordBGR()

ตั วอย างที่ 6-3#include <ATX2.h>

void setup()

{

glcdSetColorWordBGR(); // เขี ยนฟ งก ชั่ นนี้ ลงไปหรื อไม ก็ ได }

void loop()

{}

96Robo-CreatorXT : ATX2

6.2.1.3 glcdSetColorWordRGB( );

เป นฟ งก ชั่ นกํ าหนดการเรี ยงบิ ตข อมู ลสี ให เป นแบบ RGB (5-6-5) นั่ นคื อ ค าของสี แดง 5 บิ ตต อด วยส ีเข ียว 6 บ ิต และป ดท ายด วยค าของส ีนํ ้าเง ิน 5 บ ิต ทั ้งนี ้เนื ่องจากผู ผล ิตจอแสดงผลกราฟ ก LCDสี มี การผลิ ตจอแสดงผลแบบนี้ 2 รุ น โดยมี การเรี ยงบิ ตข อมู ลสี แบบ BGR และแบบ RGB

หากผู ใช งานแผงวงจร IPST-SE และทดลองกํ าหนดสี ของภาพหรื อตั วอั กษรแล วพบว า สี ที่ ได ไม ถู กต อง จะต องเรี ยกใช ฟ งก ชั่ นนี้ โดยบรรจุ ไว ใน setup() ที่ ตอนต นของโปรแกรม

รู ปแบบglcdSetColorWordRGB()

ตั วอย างที่ 6-4#include <ATX2.h>

void setup()

{

glcdSetColorWordBGR();

// เลื อกรู ปแบบการเรี ยงบิ ตสี เป นแบบ RGB}

void loop()

{}

Robo-CreatorXT : ATX2 97

6.2.1.4 colorRGB

เป นฟ งก ชั่ นเปลี่ ยนค าสี ในรู ปแบบ RGB (แดง เขี ยว นํ้ าเงิ น) ให อยู ในรู ปของตั วเลข 16 บิ ตโดยแบ งเป นค าของสี แดง 5 บิ ต ต อด วยสี เขี ยว 6 บิ ต และป ดท ายด วยค าของสี นํ้ าเงิ น 5 บิ ต

รู ปแบบunsigned int colorRGB(uint red,uint green,uint blue)

พาราม ิเตอร red - เป นค าของสี แดง มี ค าระหว าง 0 ถึ ง 31 ถ าค าที่ ป อนมากกว า 31 จะปรั บลดให เท ากั บ 31

green - ค าของสี เขี ยว มี ค าระหว าง 0 ถึ ง 63 ถ าค าที่ ป อนมากกว า 63 จะถู กปรั บลดให เท ากั บ 63

blue - ค าของสี นํ้ าเงิ น มี ค าระหว าง0 ถึ ง 31 ถ าค าที่ ป อนมากกว า 31 จะปรั บลดให เท ากั บ 31

ตั วอย างที่ 6-5#include <ATX2.h>

int colors;

void setup()

{

int colors;

colors=colorRGB(31,0,0); // ส งค าสี 16 บิ ตของสี แดงให ตั วแปร colorsglcdFillScreen(colors); // นํ าค าไปแสดงเป นสี พื้ นของจอแสดงผล

}

void loop()

{}

98Robo-CreatorXT : ATX2

6.2.1.5 color[ ]

เป นตั วแปรอะเรย ที่ ใช กํ าหนดสี จํ านวน 18 สี ที่ เป นสี พื้ นฐาน ผู พั ฒนาโปรแกรมสามารถเรี ยกใช ตั วแปร color[] หรื อเรี ยกใช ชื่ อสี ตรงๆ ก็ ได

รู ปแบบunsigned int color[]= { GLCD_RED,

GLCD_GREEN, GLCD_BLUE,

GLCD_YELLOW, GLCD_BLACK,

GLCD_WHITE, GLCD_SKY,

GLCD_MAGENTA, GLCD_ORANGE,

GLCD_LIME, GLCD_VIOLET

GLCD_PINK, GLCD_DOLLAR,

GLCD_BROWN, GLCD_DARKGREEN,

GLCD_NAVY, GLCD_DARKGREY,

GLCD_GREY};

พารามิ เตอร GLCD_RED - ใช กํ าหนดสี แดง GLCD_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 - ใช กํ าหนดสี เทา

ตั วอย าง 6-6glcdFillScreen(color[5]) // กํ าหนดให พื้ นหลั งเป นสี ขาว

ตั วอย าง 6-7glcdFillScreen(GLCD_BLUE) // กํ าหนดให พื้ นหลั งเป นสี นํ้ าเงิ น

Robo-CreatorXT : ATX2 99

6.2.1.6 setTextColor

เป นการกํ าหนดค าสี ของตั วอั กษรที่ แสดงด วยฟ งก ชั่ น glcd() โดยค าตั้ งต นกํ าหนดเป นสี ขาว

รู ปแบบvoid setTextColor(unsigned int newColor)

พาราม ิเตอร newColor คื อสี ที่ ต องการ เป นต ัวเลข 16 บิ ต หรื อเป นค าตั วแปรที่ ก ําหนดค าไว แล วจากตั วแปร color[]

ตั วอย างที่ 6-8setTextColor(GLCD_YELLOW); // กํ าหนดให สี ของตั วอั กษรเป นสี เหลื อง

6.2.1.7 setTextBackgroundColor

เป นฟ งก ชั ่นก ําหนดส ีของพื ้นหล ังต ัวอ ักษร โดยค าตั ้งต นเป นส ีด ํา ส ีของพื ้นหล ังต ัวอ ักษรจะเป นคนละส วนก ับส ีของพื ้นจอภาพ (screen background) ซึ ่งต องก ําหนดค าผ านฟ งก ชั ่น glcdFillScreen

รู ปแบบvoid setTextBackgroundColor(unsigned int newColor)

พารามิ เตอร newColor คื อสี ที่ ต องการ เป นตั วเลข 16 บิ ต หรื อเป นค าตั วแปรท่ี กํ าหนดค าไว แล วจากตั วแปร color[]

ตั วอย างที่ 6-9setTextBackgroundColor(GLCD_GREEN); // กํ าหนดให สี พื้ นหลั งตั วอั กษรเป นสี เขี ยว

100Robo-CreatorXT : ATX2

6.2.1.8 glcdClear

เป นการเคล ียร หน าจอแสดงผล ส ีของพื ้นหล ังจะเป นส ีพื ้นหล ังของต ัวอ ักษรล าส ุด ถ าไม ได ก ําหนดด วยค ําสั ่ง setTextBackGroundColor() มาก อน หล ังจากท ําค ําสั ่ง glcdClear() แล วพื ้นหล ังจะเป นส ีด ํา

รู ปแบบvoid glcdClear()

ตั วอย างที่ 6-10glcdClear(); // เคลี ยร หน าจอแสดงผล

ATX2

glcdClear();

glcdClear();

Robo-CreatorXT : ATX2 101

6.2.1.9 glcdFillScreen

เป นการเคลี ยร หน าจอแสดงผล แล วเปลี่ ยนสี พื้ นหลั งของจอแสดงผลด วยสี ที่ ระบุ

รู ปแบบvoid glcdFillScreen(unsigned int color)

พาราม ิเตอร color คื อสี ที่ ต องการ เป นตั วเลข 16 บิ ต หรื อเป นค าตั วแปรท่ี กํ าหนดค าไว แล วจากตั วแปร color[]

ตั วอย างที่ 6-11glcdFillScreen(GLCD_BLUE); // กํ าหนดสี พื้ นหลั งของจอภาพเป นสี นํ้ าเงิ น

glcdFillScreen(GLCD_YELLOW);

glcdFillScreen(GLCD_YELLOW);

102Robo-CreatorXT : ATX2

6.2.1.10 glcdMode

เป นการก ําหนดท ิศทางแสดงผลให ข อความหร ือภาพหน าจอหม ุนจอภาพ ให แสดงภาพตั ้งฉากตรงหน า (โหมด 0), หมุ นขวา 90 องศา (โหมด 1), หมุ น 180 องศาหรื อกลั บหั ว (โหมด 2) และหมุ น270 องศา (โหมด 3)

รู ปแบบglcdMode(unsigned int modeset)

พารามิ เตอร modeset คื อค าทิ ศทางของการหมุ นมี ค า 0 ถึ ง 3 โดยใช แทนทิ ศทาง 0 องศา 90 องศา 180 องศา หรื อ

270 องศา โดยเมื่ อเริ่ มต นค าทิ ศทางคื อ 0 องศา ทํ างานอยู ในแนวตั้ ง

ATX2

ATX2

ATX2

ATX2

ตั วอย างที่ 6-12#include <ATX2.h>void setup(){

setTextSize(2); // เลื อกขนาดตั วอั กษร 2 เท า (2x)}void loop(){

glcdClear(); // ล างจอแสดงผลglcdMode(0); // เลื อกโหมดแสดงผลเป นโหมด 0glcd(0,0,"ATX2"); // กํ าหนดข อความแสดงผลsw_ok_press(); // รอการกดสวิ ตช OKglcdClear();

glcdMode(1); // เลื อกโหมดแสดงผลเป นโหมด 1glcd(0,0,"ATX2");sw_ok_press();glcdClear();glcdMode(2); // เลื อกโหมดแสดงผลเป นโหมด 2glcd(0,0,"ATX2");sw_ok_press();glcdClear();glcdMode(3); // เลื อกโหมดแสดงผลเป นโหมด 3glcd(0,0,"ATX2");sw_ok_press();

}

Robo-CreatorXT : ATX2 103

6.2.1.11 setTextSize

เป นการก ําหนดขนาดต ัวอ ักษรโดยระบ ุเป นจ ํานวนเท าของขนาดปกต ิ ค าตั ้งต นเมื ่อเริ ่มท ํางานทุ กครั้ งคื อ ขนาดตั วอั กษรปกติ ใช พื้ นที่ รวมระยะช องไฟคื อ 6 x 10 พิ กเซลต อ 1 ตั วอั กษร จึ งแสดงได 21 ตั วอั กษร 16 บรรทั ดในแนวตั้ ง

รู ปแบบsetTextSize(unsigned int newSize)

พารามิ เตอร newSize คื อค าขนาดจํ านวนเท าของขนาดปกติ มี ค า 1 ถึ ง 16 เพื่ อให ตั วอั กษรที่ แสดงไม ล นหน าจอ

ถ าหากกํ าหนดเป น 1 เท า แสดงตั วอั กษรได 21 ตั ว 16 บรรทั ด

ถ าหากกํ าหนดเป น 2 เท า แสดงตั วอั กษรได 10 ตั ว 8 บรรทั ด

ถ าหากกํ าหนดเป น 3 เท า แสดงตั วอั กษรได 7 ตั ว 5 บรรทั ด

ถ าหากกํ าหนดเป น 4 เท า แสดงตั วอั กษรได 5 ตั ว 4 บรรทั ด

ถ าหากกํ าหนดเป น 5 เท า แสดงตั วอั กษรได 4 ตั ว 3 บรรทั ด

ถ าหากกํ าหนดเป น 6 และ 7 เท า แสดงตั วอั กษรได 3 ตั ว 2 บรรทั ด

ถ าหากกํ าหนดเป น 8 เท า แสดงตั วอั กษรได 2 ตั ว 2 บรรทั ด

ถ าหากกํ าหนดเป น 9 และ 10 เท า แสดงตั วอั กษรได 2 ตั ว 1 บรรทั ด

ถ าหากกํ าหนดเป น 11 ถึ ง 16 เท า แสดงตั วอั กษรได 1 ตั ว 1 บรรทั ด (แบบไม ล นจอแสดงผล)

104Robo-CreatorXT : ATX2

ตั วอย างที่ 6-13#include <ATX2.h>

void setup()

{

setTextSize(1); // กํ าหนดขนาดข อความ 1 เท าsetTextColor(GLCD_GREEN); // สี ตั วอั กษรเป นสี เขี ยวglcd(0,0,"Size1"); // แสดงข อความsetTextSize(2);

glcd(1,0,"Size2"); // กํ าหนดขนาดข อความ 2 เท าsetTextSize(3);

glcd(2,0,"Size3"); // กํ าหนดขนาดข อความ 3 เท าsetTextSize(4);

glcd(3,0,"Size4"); // กํ าหนดขนาดข อความ 4 เท า}

void loop()

{}

6.2.1.12 getTextColor

เป นคํ าสั่ งคื นค าสี ป จจุ บั นของตั วอั กษร

รู ปแบบunsigned int getTextColor()

การค ืนค าtextColor เป นค าสี แสดงอยู ในรู ปของตั วเลข 16 บิ ต ดู รู ปแบบได จากฟ งก ชั่ น colorRGB()

ตั วอย างที่ 6-14unsigned int color;

color=getTextColor(); // นํ าค าสี ของตั วอั กษรเก็ บไว ที่ ตั วแปร color

Robo-CreatorXT : ATX2 105

6.2.1.13 getTextBackgroundColor

เป นคํ าสั่ งคื นค าสี พื้ นหลั งของตั วอั กษรในป จจุ บั น

รู ปแบบunsigned int getTextBackgroundColor()

การคื นค าtextBackgroundColor เป นค าสี แสดงอยู ในร ูปของต ัวเลข 16 บ ิต ด ูร ูปแบบได จากฟ งก ชั ่น colorRGB()

ตั วอย างที่ 6-15unsigned int color;

color=getTextBackgroundColor(); // น ําค าสี พื ้นหล ังของต ัวอั กษรเก ็บในต ัวแปร color

6.2.1.14 getTextSize

คื นค าขนาดของตั วอั กษรออกมาเป นจํ านวนเท าของค าปกติ

รู ปแบบunsigned int getTextSize()

การคื นค าtextSize เป นค าจํ านวนเท าของขนาดตั วอั กษร

ตั วอย างที่ 6-16unsigned int textSize;

textSize=getTextSize();

// นํ าค าจํ านวนเท าของขนาดของตั วอั กษรเก็ บในตั วแปร textSize

6.2.1.15 glcdGetMode

เป นคํ าสั่ งคื นค าของโหมดทิ ศทางการแสดงผลในป จจุ บั น

รู ปแบบunsigned int glcdGetMode()

การคื นค าmode เป นค าของโหมดทิ ศทางการแสดงผล เป นตั วเลข 0 ถึ ง 3 เพื่ อแสดงผลในทิ ศทาง 0 องศา, หมุ น 90

องศา, หมุ น 180 องศา และหมุ น 270 องศาตามลํ าดั บ

ตั วอย างที่ 6-17unsigned int Mode;

Mode=glcdGetMode(); // คื นค าทิ ศทางการแสดงผลของหน าจอ GLCD

106Robo-CreatorXT : ATX2

6.2.1.16 glcdPixel

เป นคํ าสั่ งพล็ อตจุ ดบนจอภาพตามพิ กั ดที่ กํ าหนด โดยอ างอิ งจอภาพขนาด 128 x 160 พิ กเซล

รู ปแบบvoid glcdPixel(unsigned int x,unsigned int y,unsigned int color)

พาราม ิเตอร x คื อค าพิ กั ดในแนวนอนหรื อแกน x มี ค าระหว าง 0 ถึ ง 127

y คื อค าพิ กั ดในแนวตั้ งหรื อแกน y มี ค าระหว าง 0 ถึ ง 159

color ค ือค าของสี ที ่ต องการ เป นต ัวเลข 16 บ ิต หร ือเป นค าต ัวแปรที ่ก ําหนดค าไว แล วจากต ัวแปร color[]

ร ูปที ่ 6-2 การก ําหนดต ําแหน งของพ ิกเซลหร ือจ ุดของจอแสดงผลกราฟ ก LCD ส ีที ่ใช บนแผงวงจร ATX2

Robo-CreatorXT : ATX2 107

ตั วอย างที่ 6-18#include <ATX2.h>

int i;

void setup()

{

for (i=0;i<128;i+=4)

{

glcdPixel(i,80,GLCD_RED); // พล็ อตจุ ดทุ กๆ 4 พิ กเซลในแนวแกน x กลางจอ}

for (i=0;i<160;i+=4)

{

glcdPixel(64,i,GLCD_RED); // พล็ อตจุ ดทุ กๆ 4 พิ กเซลในแนวแกน y กลางจอ}

}

void loop()

{}

108Robo-CreatorXT : ATX2

6.2.1.17 glcdRect

เป นฟ งก ชั่ นลากเส นจากพิ กั ดที่ กํ าหนดมายั งพิ กั ดปลายทาง

รู ปแบบvoid glcdRect(unsigned int x1,unsigned int y1,unsigned int

width,unsigned int height,unsigned int color)

พารามิ เตอร x1 คื อ ค าตํ าแหน งเร่ิ มต นของรู ปส่ี เหลี่ ยมในแกน x มี ค าระหว าง 0 ถึ ง 127

y1 คื อ ค าตํ าแหน งเร่ิ มต นของรู ปส่ี เหลี่ ยมในแกน y มี ค าระหว าง 0 ถึ ง 159

width คื อ ค าความกว างของรู ปส่ี เหลี่ ยม (แนวนอน) มี ค าระหว าง 1 ถึ ง 128

height คื อ ค าความสู งของรู ปส่ี เหลี่ ยม (แนวตั้ ง) มี ค าระหว าง 1 ถึ ง 158

color ค ือ สี ของเส น เป นค าต ัวเลข 16 บ ิต หร ือเป นค าต ัวแปรที ่ก ําหนดค าไว แล วจากต ัวแปร color[] ก็ ได

ตั วอย างที่ 6-19#include <ATX2.h>

void setup()

{

glcdRect(32,40,64,80,GLCD_RED);

// วาดรู ปส่ี เหลี่ ยมเส นสี แดง ขนาด 64 x 80 พิ กเซล}

void loop()

{}

300000000000000000000

400000000000000000000

500000000000000000000

600000000000000000000

700000000000000000000

800000000000000000000

900000000000000000000

a00000000000000000000

b00000000000000000000

c00000000000000000000

d00000000000000000000

e00000000000000000000

f00000000000000000000

Robo-CreatorXT : ATX2 109

6.2.1.18 glcdFillRect

เป นการระบายส ีพื ้นของร ูปสี ่เหลี ่ยม โดยก ําหนดจ ุดเริ ่มต นและความกว างยาวของร ูปสี ่เหลี ่ยมที ่ต องการ ฟ งก ชั ่นนี ้เป นการสร างร ูปสี ่เหลี ่ยมที ่ม ีส ีพื ้นแต ไม ม ีเส นกรอบ ในขณะที ่ฟ งก ชั ่น glcdRectเป นการวาดรู ปกรอบสี่ เหลี่ ยมที่ กํ าหนดสี ของเส นกรอบได แต ภายในกรอบไม มี สี

รู ปแบบvoid glcdFillRect(unsigned int x1, unsigned int y1,

unsigned int width, unsigned int height,unsigned int color)

พารามิ เตอร x1 คื อ ค าตํ าแหน งเร่ิ มต นของรู ปส่ี เหลี่ ยมในแกน x มี ค าระหว าง 0 ถึ ง 127

y1 คื อ ค าตํ าแหน งเร่ิ มต นของรู ปส่ี เหลี่ ยมในแกน y มี ค าระหว าง 0 ถึ ง 159

width คื อ ค าความกว างของรู ปส่ี เหลี่ ยม (แนวนอน) มี ค าระหว าง 1 ถึ ง 128

height คื อ ค าความสู งของรู ปส่ี เหลี่ ยม (แนวตั้ ง) มี ค าระหว าง 1 ถึ ง 158

color คื อ สี ของเส น เป นค าตั วเลข 16 บิ ต หรื อเป นค าตั วแปรท่ี กํ าหนดค าไว แล วจากตั วแปร color[]

ตั วอย างที่ 6-20#include <ATX2.h>

void setup()

{

glcdFillRect(32,40,64,80,GLCD_RED);

// สร างภาพส่ี เหลี่ ยมพื้ นสี แดง ขนาด 64 x 80 พิ กเซล}

void loop()

{}

300000000000000000000

400000000000000000000

500000000000000000000

600000000000000000000

700000000000000000000

800000000000000000000

900000000000000000000

a00000000000000000000

b00000000000000000000

c00000000000000000000

d00000000000000000000

e00000000000000000000

f00000000000000000000

110Robo-CreatorXT : ATX2

6.2.1.19 glcdLine

เป นฟ งก ชั่ นลากเส นจากจุ ดหนึ่ งไปยั งอี กจุ ดหนึ่ ง กํ าหนดเป นพิ กั ดในแนวแกนนอน (x) และแกนตั้ ง (y)

รู ปแบบvoid glcdLine(unsigned int x1,unsigned int y1,unsigned int

x2,unsigned int y2,unsigned int color)

พารามิ เตอร x1 คื อค าตํ าแหน งเร่ิ มต นของเส นบนแกน x มี ค าระหว าง 0 ถึ ง 127

y1 คื อค าตํ าแหน งเร่ิ มต นของเส นบนแกน y มี ค าระหว าง 0 ถึ ง 159

x2 คื อค าตํ าแหน งส้ิ นสุ ดของเส นบนแกน x มี ค าระหว าง 0 ถึ ง 127

y2 คื อค าตํ าแหน งส้ิ นสุ ดของเส นบนแกน y มี ค าระหว าง 0 ถึ ง 159

color คื อ ค าสี ของเส น เป นตั วเลข 16 บิ ต หรื อเป นค าตั วแปรท่ี กํ าหนดค าไว แล วจากตั วแปร color[]

ตั วอย างที่ 6-21#include <ATX2.h>

void setup()

{

glcdLine(0,0,127,159,GLCD_RED);

// ลากเส นสี แดงทแยงมุ มจากด านบนซ ายลงมาด านล างขวา}

void loop()

{}

3 0

0000000000000000

4 0

0000000000000000

500000000000000000000

600000000000000000000

700000000000000000000

800000000000000000000

900000000000000000000

a00000000000000000000

b00000000000000000000

c00000000000000000000

d00000000000000000000

e00000000000000000000

f00000000000000000000

3 0

4 0

Robo-CreatorXT : ATX2 111

6.2.1.20 glcdCircle

เป นฟ งก ชั่ นวาดเส นรู ปวงกลมจากการกํ าหนดจุ ดกึ่ งกลางของวงกลมและความยาวของรั ศมี

รู ปแบบvoid glcdCircle(unsgined int x, unsgined int y, unsgined

int radius,unsgined int color)

พารามิ เตอร x คื อ พิ กั ดจุ ดศู นย กลางของวงกลมบนแกน x มี ค าระหว าง 0 ถึ ง 127

y คื อ พิ กั ดจุ ดศู นย กลางของวงกลมบนแกน y มี ค าระหว าง 0 ถึ ง 159

radius คื อ ค ารั ศมี ของวงกลม

color คื อ ค าสี ของเส น เป นตั วเลข 16 บิ ต หรื อเป นค าตั วแปรท่ี กํ าหนดค าไว แล วจากตั วแปร color[]

ตั วอย างที่ 6-22#include <ATX2.h>

void setup()

{

glcdCircle(32,120,31,GLCD_MAGENTA);

// สร างเส นวงกลมสี บานเย็ น มี รั ศมี 31 พิ กเซล}

void loop()

{}

0000000000000000

0000000000000000

500000000000000000000

600000000000000000000

700000000000000000000

800000000000000000000

900000000000 00000000

a000000000 0000000000

b00000000000000000000

c00000000000000000000

d00000000000000000000

e00000000000000000000

f00000000000000000000

112Robo-CreatorXT : ATX2

6.2.1.21 glcdFillCircle

เป นฟ งก ชั่ นวาดรู ปวงกลม ที่ มี สี พื้ นจากการกํ าหนดจุ ดศู นย กลางของวงกลมและความยาวของร ัศม ี ฟ งก ชั ่นนี ้เป นการสร างร ูปวงกลมที ่ม ีส ีพื ้นแต ไม ม ีเส นกรอบ ในขณะที ่ฟ งก ชั ่น glcdCircleเป นการวาดรู ปวงกลมที่ กํ าหนดสี ของเส นรอบวงได แต ภายในวงกลมไม มี สี

รู ปแบบvoid glcdFillCircle(unsigned int x,unsigned int y,unsigned

int radius,unsigned int color)

พารามิ เตอร x คื อ พิ กั ดจุ ดศู นย กลางของวงกลมบนแกน x มี ค าระหว าง 0 ถึ ง 127

y คื อ พิ กั ดจุ ดศู นย กลางของวงกลมบนแกน y มี ค าระหว าง 0 ถึ ง 159

radius คื อ ค ารั ศมี ของวงกลม

color ค ือ ค าสี ของพื ้นวงกลม เป นต ัวเลข 16 บ ิต หร ือเป นค าต ัวแปรที ่ก ําหนดค าไว แล วจากต ัวแปร color[]

ตั วอย างที่ 6-23#include <ATX2.h>

void setup()

{

glcdFillCircle(32,120,31,GLCD_MAGENTA);

// สร างรู ปวงกลมพื้ นสี บานเย็ น รั ศมี 31 พิ กเซล}

void loop()

{}

0000000000000000

0000000000000000

500000000000000000000

600000000000000000000

700000000000000000000

800000000000000000000

900000000000 00000000

a000000000 0000000000

b00000000000000000000

c00000000000000000000

d00000000000000000000

e00000000000000000000

f00000000000000000000

Robo-CreatorXT : ATX2 113

6.2.1.22 glcdArc

เป นฟ งก ชั ่นวาดส วนโค งของวงกลม โดยระบ ุต ําแหน งจ ุดกึ ่งกลาง ร ัศม ี ต ําแหน งจ ุดเริ ่ม จ ุดสิ ้นส ุดและส ีของเส น

รู ปแบบvoid glcdArc(unsigned int x,unsigned int y,unsigned int

r,int start_angle,int end_angle,uint color)

พารามิ เตอร x คื อตํ าแหน งจุ ดกึ่ งกลางในแนวแกน x

y คื อตํ าแหน งจุ ดกึ่ งกลางในแนวแกน y

r คื อรั ศมี ของเส นโค ง

start_angle คื อตํ าแหน งมุ มของจุ ดเริ่ มต นของวงกลม

end_angle คื อตํ าแหน งมุ มจุ ดส้ิ นสุ ดของวงกลม

color คื อสี ของเส นวงกลม

ตั วอย างที่ 6-24#include <ATX2.h>

void setup()

{

glcdArc(48,80,16,30,150,GLCD_RED);

glcdCircle(48,75,5,GLCD_BLUE);

glcdCircle(80,75,5,GLCD_BLUE);

glcdArc(80,80,16,30,150,GLCD_RED);

glcdFillCircle(64,90,7,GLCD_GREEN);

glcdArc(64,100,30,220,320,GLCD_RED);

}

void loop()

{}

114Robo-CreatorXT : ATX2

6.2.2 ฟ งก ชั ่นเกี่ ยวกั บเวลา

6.2.2.1 sleep และ delayเป นฟ งก ชั่ นหน วงเวลาโดยประมาณภายในโปรแกรมในหน วยมิ ลลิ วิ นาที

รู ปแบบvoid sleep(unsigned int ms)

void delay(unsigned int ms)

พาราม ิเตอร ms - กํ าหนดค าเวลาที่ ต องการหน วงในหน วยมิ ลลิ วิ นาที มี ค า 0 ถึ ง 65,535

ตั วอย างที่ 6-25sleep(20); // หน วงเวลาประมาณ 20 มิ ลลิ วิ นาที delay(1000); // หน วงเวลาประมาณ 1 วิ นาที

6.2.2.2 delay_usเป นฟ งก ชั่ นหน วงเวลาโดยประมาณภายในโปรแกรมในหน วยไมโครวิ นาที

รู ปแบบvoid delay_us(unsigned int us)

พารามิ เตอร us - กํ าหนดค าเวลาที่ ต องการหน วงในหน วยไมโครวิ นาที มี ค า 0 ถึ ง 65,535

ตั วอย างที่ 6-26delay_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-27beep(1); // กํ าเนิ ดสั ญญาณความถี่ 762Hz เป นเวลา 100 มิ ลิ วิ นาที ขั บออกลํ าโพงเป ยโซ

6.2.3.2 soundเป นฟ งก ชั่ นกํ าเนิ ดสั ญญาณเสี ยงที่ กํ าหนดความถี่ และระยะเวลาในการกํ าเนิ ดสั ญญาณได

รู ปแบบvoid sound(int freq,int time)

พารามิ เตอร freq - กํ าหนดความถี่ สั ญญาณเสี ยง มี ค า 0 ถึ ง 32,767time - กํ าหนดค าเวลาในการกํ าเนิ ดสั ญญาณเสี ยงในหน วย 1 มิ ลลิ วิ นาที มี ค า 0 ถึ ง 32,767

ตั วอย างที่ 6-28sound(1200,500); // กํ าเนิ ดสั ญญาณเสี ยงความถี่ 1200Hz นาน 500 มิ ลลิ วิ นาที

116Robo-CreatorXT : ATX2

6.2.4 ฟ งก ชั่ นเกี่ ยวกั บพอร ตอิ นพุ ตเอาต พุ ต

6.2.4.1 inเป นฟ งก ชั ่นอ านค าสถานะลอจ ิกของพอร ตที ่ก ําหนด เป นหนึ ่งในฟ งก ชั ่นการอ านและเข ียนค า

กั บพอร ตอิ นพุ ตเอาต พุ ตของแผงวงจร ATX2

รู ปแบบchar in(x)

พารามิ เตอร x - กํ าหนดขาพอร ตที่ ต องการอ านค า กํ าหนดได 0 ถึ ง 31 สํ าหรั บแผงวงจร ATX2 แนะนํ าให ใช กั บขา

พอร ต 2, 3, 8, 9, 18, 24 ถึ ง 31

การค ืนค าเป น 0 หรื อ 1

ตั วอย างที่ 6-29char x; // ประกาศตั วแปร x เพื่ อเก็ บค าผลลั พธ จาการอ านค าระดั บสั ญญาณx = in(2); // อ านค าดิ จิ ตอลจากพอร ตดิ จิ ตอล 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-30out(8,1); // กํ าหนดให ขาพอร ต 8/SCL เป นเอาต พุ ตดิ จิ ตอลและมี ค าเป น “1”out(28,0); // กํ าหนดให ขาพอร ต 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; // กํ าหนดตั วแปรสํ าหรั บเก็ บผลลั พธ void setup()

{

OK(); // รอการกดสวิ ตช OKglcdClear();

setTextSize(2); // กํ าหนดขนาดของตั วอั กษรเป น 2 เท า}

void loop()

{

glcd(1,2,"AnalogTest"); // แสดงข อความบนจอแสดงผล

val = analog(2); // อ านค าจากจุ ดต อ A2 มาเก็ บไว ในตั วแปร

setTextSize(3); // กํ าหนดขนาดของตั วอั กษรเป น 2 เท า

glcd(2,2,"%d ",val); // แสดงค าของจุ ดต อ A2 ที่ บรรทั ด 2 (บรรทั ดที่ 3)

setTextSize(2); // กํ าหนดขนาดของตั วอั กษรเป น 2 เท า}

118Robo-CreatorXT : ATX2

จากรู ปมี การเชื่ อมต อแผงวงจรตั วต านทารปรั บค าได ZX-POT เข าที่ จุ ดต อ A2 ของแผงวงจร ATX2 เมื่ อทํ าการอั ปโหลดโปรแกรมทดสอบไปย ังแผงวงจร ATX2 ไมโครคอนโทรลเลอร จะอ านค าของแรงด ันที ่จุ ดต อ A2 แล วท ําการแปลงเป นข อมู ลดิ จิ ตอลด วยฟ งก ชั่ น analog() แล วนํ ามาแสดงผลที่ จอแสดงผลของแผงวงจร ATX2 ค าที่ ได จะอยู ในช วง 0 ถึ ง1,203

Robo-CreatorXT : ATX2 119

6.2.5.2 knob

เป นฟ งก ชั่ นอ านค าข อมู ลจากตั วต านทานปรั บค าได KNOB บนแผงวงจ ATX2 ค าที่ อ านได มี ค าในช วง 0 ถึ ง 1,000

รู ปแบบunsigned int knob()

การค ืนค าค าที่ อ านได จากตั วต านทานปรั บค าได KNOB บนแผงวงจร ATX2 มี ค าระหว าง 0 ถึ ง 1,000

ตั วอย างที่ 6-32#include <ATX2.h> // ผนวกไฟล ไลบรารี หลั กvoid setup(){

OK(); // รอการกดสวิ ตช OKglcdClear();

setTextSize(2); // กํ าหนดขนาดตั วอั กษร 2 เท า}void loop(){

glcd(1,2," KnobTest"); // แสดงข อความที่ จอแสดงผล

setTextSize(3); // กํ าหนดขนาดตั วอั กษร 3 เท า

glcd(2,2,"%d ",knob()); // แสดงค าของปุ ม KNOB บนจอแสดงผล

setTextSize(2); // กํ าหนดขนาดตั วอั กษร 2 เท า}

120Robo-CreatorXT : ATX2

6.2.5.3 sw_ok()

เป นฟ งก ชั่ นตรวจสอบสถานะสวิ ตช OK บนแผงวงจร ATX2 โดยให สถานะ “เป นจริ ง” เมื่ อมี การกดสวิ ตช และ “เป นเท็ จ” เมื่ อไม มี การกดสวิ ตช

รู ปแบบunsigned char sw_ok()

การค ืนค า1 (เป นจริ ง) เมื่ อมี การกดสวิ ตช

0 (เป นเท็ จ) เมื่ อไม มี การกดสวิ ตช

ตั วอย างที่ 6-33#include <ATX2.h> // ผนวกไฟล ไลบรารี หลั กvoid setup(){

glcdClear();}void loop(){

if (sw_OK()) // ตรวจสอบการกดสวิ ตช OK{

glcdFillScreen(GLCD_YELLOW); // เปล่ี ยนสี พื้ นของจอแสดงผลเป นสี เหลื อง

delay(3000); // แสดงผล 3 วิ นาที }

glcdClear(); // ล างข อมู ลหน าจอแสดงผล แล วเปล่ี ยนสี พื้ นกลั บเป นสี ดํ า}

Robo-CreatorXT : ATX2 121

6.2.5.4 sw_ok_press()

เป นฟ งก ชั่ นวนตรวจสอบการกดสวิ ตช OK บนแผงวงจร ATX2 ต องรอจนกระทั่ งสวิ ตช ถู กปล อยหลั งจากการกดสวิ ตช จึ งจะผ านฟ งก ชั่ นนี้ ไปกระทํ าคํ าสั่ งอื่ นๆ

ตั วอย างที่ 6-34........

sw_ok_press(); // รอจนกระทั่ งเกิ ดกดสวิ ตช OK......

6.2.5.5 OK()

เป นฟ งก ชั ่นวนรอการกดสว ิตช OK บนแผงวงจร ATX2 อ ีกแบบหนึ ่ง และเมื ่อเร ียกใช ฟ งก ชั ่นนี ้ระบบจะทํ าการแสดงข อความ ATX2 Push OK ทุ กครั้ งที่ จอแสดงผล และที่ อั กษร OK จะกะพริ บตลอดเวลา

ตั วอย างที่ 6-35............

OK(); // แสดงข อความเริ่ มต นและวนรอการกดสวิ ตช OK.............

122Robo-CreatorXT : ATX2

6.2.6 ฟ งก ชั่ นเกี่ ยวกั บการขั บมอเตอร ไฟตรงพื้ นฐานแผงวงจร ATX2 ขั บมอเตอร ไฟตรงขนาด 4.5 ถึ ง 9V ได พร อมกั น 6 ตั ว โดยมี ความสามารถ

ในการข ับกระแสไฟฟ าได ส ูงส ุด 1.5A ต อช อง และส ุงส ุดชั ่วขณะไม เก ิน 3A ทั ้งนี ้ขึ ้นก ับความสามารถในการจ ายกระแสไฟฟ าของแหล งจ ายไฟเลี้ ยงหรื อแบตเตอร่ี ที่ ใช งาน

6.2.6.1 motor

เป นฟ งก ชั่ นขั บเคลื่ อนมอเตอร ไฟตรง

รู ปแบบvoid motor(char _channel,int _power)

พารามิ เตอร _channel - กํ าหนดช องเอาต พุ ตมอเตอร ไฟตรงของแผงวงจร ATX2 กํ าหนดได ดั งนี้

1 ถึ ง 6 สํ าหรั บมอเตอร ที่ เอาต พุ ตช อง 1, 2, 3, 4, 5 และ 6

12 สํ าหรั บขั บมอเตอร ช อง 1 และ 2 พร อมกั น

34 สํ าหรั บขั บมอเตอร ช อง 3 และ 4 พร อมกั น

56 สํ าหรั บขั บมอเตอร ช อง 5 และ 6 พร อมกั น

100 หรื อ ALL หรื อ ALL4 สํ าหรั บขั บมอเตอร ช อง 1 ถึ ง 4 พร อมกั น

106 หรื อ ALL6 สํ าหรั บขั บมอเตอร ทุ กช องพร อมกั น

_power - กํ าหนดกํ าลั งขั บมอเตอร มี ค าในช วง -100 ถึ ง 100ถ ากํ าหนดค า _power เป นบวก (1 ถึ ง 100) ทํ าให มอเตอร หมุ นไปในทิ ศทางหนึ่ งถ ากํ าหนดค า _power เป นลบ (-1 ถึ ง -100) มอเตอร จะถู กขั บให หมุ นไปในทิ ศทางตรงข ามถ ากํ าหนดค า _power เป น 0 มอเตอร หยุ ดหมุ น แต ไม แนะนํ าให ใช หากต องการให มอเตอร หยุ ดหมุ นควรเรี ยกใช ฟ งก ชั่ น motor_stop

Robo-CreatorXT : ATX2 123

ตั วอย างที่ 6-36motor(1,60); // ขั บมอเตอร ช อง 1 ด วยกํ าลั ง 60% ของกํ าลั งสู งสุ ดmotor(1,-60); // ข ับมอเตอร ช อง 1 ด วยก ําล ัง 60% ม ีท ิศทางการหม ุนตรงข ามก ับค ําส่ั งก อนหน า

ตั วอย างที่ 6-37motor(12,100); // ขั บมอเตอร ช อง 1 และ 2 ด วยกํ าลั ง 100% อั นเป นค ากํ าลั งสู งสุ ด

motor(56,80); // ขั บมอเตอร ช อง 5 และ 6 ด วยกํ าลั ง 80%

ตั วอย างที่ 6-38motor(ALL,100); // ขั บมอเตอร ช อง 1 ถึ ง 4 ด วยกํ าลั ง 100% อั นเป นค ากํ าลั งสู งสุ ด

motor(ALL6,100); // ขั บมอเตอร ทุ กช อง ด วยกํ าลั ง 100% อั นเป นค ากํ าลั งสู งสุ ด

ตั วอย างที่ 6-39#include <ATX2.h> // ผนวกไฟล ไลบรารี หลั กvoid setup(){

OK(); // รอการกดสวิ ตช OK}void loop(){

motor(1,60); // ขั บมอเตอร ช อง 1 ด วยกํ าลั ง 60%

delay(500); // ขั บมอเตอร ช อง 1 เป นเวลา 0.5 วิ นาที

motor(1,-60); // ขั บมอเตอร ช อง 1 กลั บทิ ศทางด วยกํ าลั ง 60%

delay(500); // ขั บมอเตอร ช อง 1 กลั บทิ ศทาง เป นเวลา 0.5 วิ นาที }

124Robo-CreatorXT : ATX2

6.2.6.2 motor_stopเป นฟ งก ชั่ นหยุ ดขั บมอเตอร

รู ปแบบvoid motor_stop(char _channel)

พารามิ เตอร _channel - ก ําหนดช องเอาต พ ุตมอเตอร ไฟตรง กํ าหนดเหมื อนกั บฟ งก ชั่ น motor()

ตั วอย างที่ 6-40motor_stop(1); // หยุ ดขั บมอเตอร ช อง 1motor_stop(2); // หยุ ดขั บมอเตอร ช อง 2

ตั วอย างที่ 6-41motor_stop(ALL); // หยุ ดขั บมอเตอร ช อง 1 ถึ ง 4 พร อมกั น

motor_stop(ALL6); // หยุ ดขั บมอเตอร ทั้ ง 6 ช องพร อมกั น

ตั วอย างที่ 6-42#include <ATX2.h> // ผนวกไฟล ไลบรารี หลั กvoid setup(){

OK(); // รอการกดสวิ ตช OK}void loop(){

motor(1,50); // ขั บมอเตอร ช อง 1 ด วยกํ าลั ง 50%

motor(2,50); // ขั บมอเตอร ช อง 2 ด วยกํ าลั ง 50%

sleep(3000); // ขั บมอเตอร ช อง 1 และ 2 เป นเวลา 3 วิ นาที

motor(1,-50); // ขั บมอเตอร ช อง 1 กลั บทิ ศทางด วยกํ าลั ง 50%

motor(2,-50); // ขั บมอเตอร ช อง 2 กลั บทิ ศทางด วยกํ าลั ง 50%

sleep(3000); // ขั บมอเตอร ช อง 1 และ 2 กลั บทิ ศทาง เป นเวลา 3 วิ นาที

motor_stop(ALL); // หยุ ดขั บมอเตอร ทั้ งสองช อง

sleep(3000); // หยุ ดขั บมอเตอร เป นเวลา 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-43fd(60); // ส่ั งให หุ นยนต เคลื่ อนที่ ไปข างหน าด วยความเร็ ว 60 เปอร เซ็ นต

126Robo-CreatorXT : ATX2

6.2.7.2 fd2

มาจากค ําว า forward2 เป นฟ งก ชั ่นที ่ก ําหนดให หุ นยนต 2 ล อเคลื ่อนที ่ไปข างหน าแบบก ําหนดความเร ็วมอเตอร แยกอ ิสระ

รู ปแบบfd2(unsigned int speed1 ,unsigned int speed2)

พารามิ เตอร speed1 คื อ ค าความเร็ วของมอเตอร ช อง 1 มี ค าตั้ งแต 0 ถึ ง 100%

speed2 คื อ ค าความเร็ วของมอเตอร ช อง 2 มี ค าตั้ งแต 0 ถึ ง 100%

ตั วอย างที่ 6-44fd2(30,80); // หุ นยนต เคลื ่อนที ่เป นวงกลม เนื ่องจากมอเตอร ช อง 2 หม ุนเร ็วกว ามอเตอร ช อง 1 มาก

6.2.7.3 bk

มาจากคํ าว า backward เป นฟ งก ชั่ นกํ าหนดให หุ นยนต 2 ล อเคลื่ อนที่ ถอยหลั ง

รู ปแบบbk(unsigned int speed)

พารามิ เตอร speed คื อเปอร เซ็ นต ความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 6-45bk(90); // กํ าหนดให หุ นยนต เคลื่ อนที่ ถอยหลั งด วยความเร็ ว 90 เปอร เซ็ นต

6.2.7.4 bk2มาจากค ําว า backward2 ใช ก ําหนดให หุ นยนต 2 ล อถอยหล ังแบบก ําหนดความเร ็วมอเตอร อ ิสระ

รู ปแบบbk2(unsigned int speed1 ,unsigned int speed2)

พารามิ เตอร speed1 คื อเปอร เซ็ นต ความเร็ วของมอเตอร ช อง 1 มี ค าตั้ งแต 0 ถึ ง 100speed2 คื อเปอร เซ็ นต ความเร็ วของมอเตอร ช อง 2 มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 6-46bk2(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-47tl(60); // กํ าหนดให หุ นยนต เลี้ ยวซ ายด วยความเร็ ว 60 เปอร เซ็ นต tr(100); // กํ าหนดให หุ นยนต เลี้ ยวขวาด วยความเร็ ว 100 เปอร เซ็ นต

6.2.7.6 sl และ srมาจากค ําว า spin left และ spin right หร ือหม ุนต ัวทางซ ายและทางขวา ในฟ งก ชั ่นนี ้จะก ําหนด

ให มอเตอร ไฟตรงทั ้งสองต ัวของหุ นยนต หม ุนในท ิศทางตรงก ันข าม จ ุดหม ุนต ัวจ ึงอยู กึ ่งกลางของหุ นยนต

รู ปแบบsl(unsigned int speed)

sr(unsigned int speed)

พารามิ เตอร speed คื อ ค าความเร็ วของมอเตอร มี ค า 0 ถึ ง 100%

ตั วอย างที่ 6-48sl(70); // กํ าหนดให หุ นยนต เลี้ ยวซ ายด วยความเร็ ว 70%sr(100); // กํ าหนดให หุ นยนต เลี้ ยวขวาด วยความเร็ ว 100%

6.2.7.7 aoมาจากคํ าว า all motor off เป นฟ งก ชั่ นหยุ ดการทํ างานของมอเตอร ทั้ งสองตั ว

รู ปแบบao()

ตั วอย างที่ 6-49void setup()

{

fd(100); // หุ นยนต เคลื่ อนที่ ไปข างหน าด วยความเร็ วสู งสุ ดsleep(2000); // เป นเวลา 2 วิ นาที ao(); // กํ าหนดให มอเตอร หยุ ดทํ างาน หุ นยนต จะหยุ ดเคลื่ อนที่ ทั นที

}

128Robo-CreatorXT : ATX2

6.2.8 ฟ งก ชั่ นขั บมอเตอร ไฟตรงสํ าหรั บหุ นยนต ขั บเคลื่ อน 4 ล อเมื่ อนํ าแผงวงจร ATX2 ไปสร างหุ นยนต ขั บเคลื่ อนด วยมอเตอร ไฟตรง และชุ ดล อ 4 ล อ หรื อ

4-Wheel Drive (4WD) เพื่ อช วยให การเขี ยนโปรแกรมควบคุ มกระทํ าได ง ายขึ้ น จึ งสร างฟ งก ชั่ นเข ามาช วย โดยมี ข อกํ าหนดตํ าแหน งของมอเตอร ไฟตรงที่ ต อกั บแผงวงจร ATX2 ดั งนี้

1. มอเตอร ไฟตรงของล อหน าซ ายต อก ับเอาต พ ุตมอเตอร ไฟตรงช อง 1

2. มอเตอร ไฟตรงของล อหลั งซ ายต อก ับเอาต พ ุตมอเตอร ไฟตรงช อง 2

3. มอเตอร ไฟตรงของล อหน าขวาต อก ับเอาต พ ุตมอเตอร ไฟตรงช อง 3

4. มอเตอร ไฟตรงของล อหลั งซ ายต อก ับเอาต พ ุตมอเตอร ไฟตรงช อง 4

ATX2

Robo-CreatorXT : ATX2 129

6.2.8.1 FD

มาจากคํ าว า FORWARD เป นฟ งก ชั่ นกํ าหนดให หุ นยนต 4 ล อเคลื่ อนที่ ไปข างหน า

ATX2 ATX2

รู ปแบบFD(unsigned int speed)

พาราม ิเตอร speed คื อเปอร เซ็ นต ความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 6-50

FD(60); // ขั บเคลื่ อนหุ นยนต เคลื่ อนที่ ไปข างหน าด วยกํ าลั ง 60%

6.2.8.2 FD2มาจากค ําว า FORWARD2 เป นฟ งก ชั ่นก ําหนดให หุ นยนต 4 ล อเคลื ่อนที ่ไปข างหน า โดยก ําหนด

ความเร ็วของมอเตอร ด านซ าย (มอเตอร ช อง 1 และ 2) และขวา (มอเตอร ช อง 3 และ 4) แยกก ันอย างอ ิสระ

รู ปแบบFD2(unsigned int speed1, unsigned int speed2)

พาราม ิเตอร speed1 คื อเปอร เซ็ นต ความเร็ วของมอเตอร ด านซ าย (ช อง 1 และ 2) มี ค าตั้ งแต 0 ถึ ง 100speed2 คื อเปอร เซ็ นต ความเร็ วของมอเตอร ด านขวา (ช อง 3 และ 4) มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 6-51FD2(30,80); // ขั บเคลื่ อนหุ นยนต เคลื่ อนที่ เป นรู ปวงกลม

// เนื ่องจากความเร ็วในการหม ุนของมอเตอร ทั ้งสองด าน ของหุ นยนต แตกต างก ันมาก

130Robo-CreatorXT : ATX2

6.2.8.3 BK

มาจากคํ าว า BACKWARD เป นฟ งก ชั่ นกํ าหนดให หุ นยนต 4 ล อเคลื่ อนที่ ถอยหลั ง

ATX2 ATX2

รู ปแบบBK(unsigned int speed)

พาราม ิเตอร speed คื อเปอร เซ็ นต ความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 6-52BK(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 ถึ ง 100speed2 คื อเปอร เซ็ นต ความเร็ วของมอเตอร ด านขวา (ช อง 3 และ 4) มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 6-53BK2(80,80); // ขั บมอเตอร ทั้ งสองด านของหุ นยนต 4 ล อให เคลื่ อนที่ ถอยหลั งด วยกํ าลั ง 80%

Robo-CreatorXT : ATX2 131

6.2.8.5 TL และ TR

มาจากค ําว า Turn Left (TL) และ Turn Right (TR) หร ือเลี ้ยวซ ายและเลี ้ยวขวานั ่นเอง โดยการเลี ้ยวของฟ งก ชั ่นทั ้งสองนี ้จะก ําหนดให มอเตอร ตใดต ัวหนึ ่งของหุ นยนต หย ุดอยู ก ับที ่ จ ุดหม ุนของหุ นยนต จะอยู ที ่ล อของมอเตอร ที ่หย ุดอยู ก ับที ่

ATX2ATX2

ATX2ATX2

รู ปแบบTL(unsigned int speed)

TR(unsigned int speed)

พารามิ เตอร speed คื อเปอร เซ็ นต ความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 6-54TL(60); // ขั บเคลื่ อนหุ นยนต 4 ล อให เลี้ ยวซ ายด วยกํ าลั ง 60%

TR(100); // ขั บเคลื่ อนหุ นยนต 4 ล อให เลี้ ยวขวาด วยกํ าลั งสู งสุ ด

132Robo-CreatorXT : ATX2

6.2.8.6 SL and SRมาจากค ําว า Spin Left และ Spin Right หร ือหม ุนต ัวทางซ ายและทางขวา ในฟ งก ชั ่นนี ้ก ําหนดให

มอเตอร ไฟตรงทั ้งสองด านของหุ นยนต หม ุนในท ิศทางตรงก ันข าม จ ุดหม ุนต ัวจ ึงอยู กึ ่งกลางของหุ นยนต

ATX2ATX2

ATX2ATX2

รู ปแบบSL(unsigned int speed)

SR(unsigned int speed)

พารามิ เตอร speed คื อเปอร เซ็ นต ความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 6-55SL(70); // ขั บเคลื่ อนหุ นยนต 4 ล อให หมุ นซ ายด วยกํ าลั ง 70%

SR(100); // ขั บเคลื่ อนหุ นยนต 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); // ขั บเซอร โวมอเตอร ช อง 1 ให แกนหมุ นไปยั งตํ าแหน ง 60 องศา

sleep(5000); // หน วงเวลา 5 วิ นาที

servo(1,120); // ขั บเซอร โวมอเตอร ช อง 1 ให แกนหมุ นไปตํ าแหน ง 120 องศา

sleep(5000); // หน วงเวลา 5 วิ นาที }

134Robo-CreatorXT : ATX2

6.2.10 ฟ งก ชั่ นเกี่ ยวกั บการสื่ อสารข อมู ลอนุ กรมเป นไฟล ไลบรารี สนั บสนุ นชุ ดคํ าสั่ งเกี่ ยวกั บการรั บส งข อมู ลผ านโมดู ลสื่ อสารข อมู ลอนุ กรม

(UART)

6.2.10.1 การเชื่ อมต อทางฮาร ดแวร

เมื่ อต องการใช งานช อง UART0

ให ต อสายจากจ ุดต อพอร ต USB บนแผงวงจร ATX2 (เป นจ ุดต อเด ียวก ับที ่ใช ในการอ ัปโหลด)เข ากั บพอร ต USB ของคอมพิ วเตอร

เมื่ อต องการใช งานช อง UART1

ต อสายสั ญญาณเข ากั บจุ ดต อ RXD1 (พอร ต 2) และ TXD1 (พอร ต 3)

Robo-CreatorXT : ATX2 135

6.2.10.2 uart

เป นฟ งก ชั ่นส งข อม ูลสายอ ักขระออกจากโมด ูล UART0 ม ีอ ัตราบอดเริ ่มต นที ่ 4,800 บ ิตต อว ินาท ี

รู ปแบบvoid uart(char *p,...)

พารามิ เตอร p - รั บรหั สของกลุ มข อความที่ ต องการส งออกจากภาคส งของโมดู ล UART0 โดยสามารถกํ าหนดรู ปแบบ

การแทรกสั ญลั กษณ พิ เศษเพื่ อใช ร วมในการแสดงผลได ดั งนี้

รหั สบั งคั บ การทํ างาน

%c หรื อ %C แสดงผลตั วอั กษร 1 ตั ว

%d หรื อ %D แสดงผลตั วเลขฐานสิ บช วงตั้ งแต -32,768 ถึ ง +32,767

%l หรื อ %L แสดงผลตั วเลขฐานสิ บช วงตั้ งแต -2,147,483,648 ถึ ง +2,147,483,647

%f หรื อ %F แสดงผลข อมู ลแบบจํ านวนจริ ง(แสดงทศนิ ยม 3 หลั ก)

\r กํ าหนดให ข อความชิ ดไปทางด านซ ายของบรรทั ด

\n กํ าหนดให ข อความขึ้ นบรรทั ดใหม

ตั วอย างที่ 6-57#include <ATX2.h> // ผนวกไฟล ไลบรารี หลั กvoid setup()

{}

void loop()

{

uart("Hello Robo-Creator2!\r\n");

// ส งข อมู ลไปยั งคอมพิ วเตอร พร อมรหั สขึ้ นบรรทั ดใหม

sleep(2000); // หน วงเวลา 2 วิ นาที }

ในการทดสอบจะต องต อสาย USB ระหว างคอมพิ วเตอร กั บแผงวงจร ATX2 ไว ตลอดเวลา หลั งจากอั ปโหลดโปรแกรมแล ว จากนั้ นเป ดหน าต าง Serial Minonitor โดยคลิ กที่ ปุ ม หรื อเลื อกจากเมนู Tools >Serial Monitor

136Robo-CreatorXT : ATX2

รอครู หนึ ่ง หน าต าง Serial Monitor จะเป ดขึ ้นมา คล ิกเล ือกที ่ช อง Auto Scroll และ No line endingสุ ดท ายเล ือกอั ตราบอดที ่ช องขวาม ุมล างเป น 9600 Baud จะได ผลการท ํางานด ังร ูป

6.2.10.3 uart_set_baudเป นฟ งก ชั่ นกํ าหนดอั ตราบอดในการสื่ อสารของโมดู ล UART0 กั บคอมพิ วเตอร

รู ปแบบvoid uart_set_baud(unsigned int baud)

พารามิ เตอร baud - อั ตราบอดในการส่ื อสารของโมดู ล UART0 กั บคอมพิ วเตอร มี ค า 2400 ถึ ง 115,200

ตั วอย างที่ 6-58uart_set_baud(4800); // กํ าหนดอั ตราบอดในการส่ื อสารข อมู ลเป น 4,800 บิ ตต อวิ นาที

6.2.10.4 uart_availabelเป นฟ งก ชั่ นตรวจสอบการรั บข อมู ลเข ามาของโมดู ล UART0 เมื่ อติ ดต อกั บคอมพิ วเตอร

รู ปแบบunsigned char uart_available(void)

การค ืนค า- เป น “0” เมื่ อยั งไม มี ข อมู ลเข ามา- มากกว า 0 เมื่ อมี ข อมู ลเข ามา โดยมี ค าเท ากั บจํ านวนของอั กขระที่ ได รั บ

ตั วอย างที่ 6-59char 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); // เลื อกโหมดแสดงผลเป นโหมด 1

setTextSize(2); // เลื อกขนาดตั วอั กษรเป น 2 เท า}

void loop()

{

glcdClear();

if(uart_available()) // ตรวจสอบการรั บข อมู ล{

if(uart_getkey()=='a') // ตรวจสอบการกดตี ย บอร ดเพื่ อส งข อมู ล{

glcd(3,1,"Key a Active!"); // แสดงข อความตอบรั บการกดตคี ย บอร ด

sleep(2000); // หน วงเวลา 2 วิ นาที }

else

{

glcdClear(); // ล างจอแสดงผล}

}

}

หมายเหตุ เมื ่อเร ียกใช ฟ งก ชั ่น uart เพื ่อส งข อม ูลออกทางโมด ูลพอร ตอน ุกรมหร ือ UART และ uart_getkeyเพื ่อตรวจจั บอั กขระใดๆ นั ้น อั ตราบอดจะถ ูกก ําหนดเป น 9,600 บ ิตต อว ินาท ี ข อม ูล 8 บ ิต และไม ม ีการตรวจสอบพาร ิตี ้โดยอั ตโนมั ติ และเป นค าตั้ งต น เพื่ อลดความซั บซ อนในการเขี ยนโปรแกรมลง หากต องการเปลี่ ยนอั ตราบอดต องใช uart_set_baud อย างไรก ็ตาม ต องค ําน ึงด วยว า เมื ่ออั ตราบอดสู งขึ ้นอาจส งผลกระทบต อความถ ูกต องในการส่ื อสารข อม ูล

138Robo-CreatorXT : ATX2

ในการทดสอบจะต องต อสาย USB ระหว างคอมพิ วเตอร กั บแผงวงจร ATX2 ไว ตลอดเวลา หลั งจากอั ปโหลดโปรแกรมแล ว จากนั ้นเป ดหน าต าง Serial Minonitor โดยคล ิกที ่ปุ ม หร ือเล ือกจากเมน ู Tools > SerialMonitor

รอครู หนึ่ ง หน าต าง 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-61uart1_set_baud(19200); // กํ าหนดอั ตราบอดในการส่ื อสารเป น 19,200 บิ ตต อว ินาที

6.2.10.8 uart1_availableเป นฟ งก ชั่ นตรวจสอบการรั บข อมู ลเข ามาของโมดู ล UART1 เมื่ อติ ดต อกั บคอมพิ วเตอร

รู ปแบบunsigned char uart1_available(void)

การค ืนค า- เป น 0 เมื่ อไม มี ข อมู ลเข ามา- มากกว า 0 โดยมี ค าเท ากั บจํ านวนของอั กขระที่ ได รั บ

ตั วอย างที่ 6-62char x =uart1_available();

// ตรวจสอบว ามี ข อมู ลเข ามาทางภาครั บของโมดู ล UART1 หรื อไม // ถ า x มี ค ามากกว า 0 แสดงว ามี ข อมู ลเข ามาแล ว ควรอ านด วยฟ งก ชั่ น uart1_getkey ทั นที

6.2.10.9 uart1_getkeyเป นฟ งก ชั่ นอ านข อมู ลจากบั ฟเฟอร ตั วรั บของโมดู ล UART1

รู ปแบบchar uart1_getkey(void)

การค ืนค า- เป น 0 เมื่ อยั งไม มี การรั บอั กขระใดๆ- เป นค าของอั กขระที่ รั บได ในรู ปแบบของรหั สแอสกี้

140Robo-CreatorXT : ATX2

6.2.10.10 จะใช งาน UART1 เมื่ อใด

1. เมื่ อต องการติ ดต อกั บอุ ปกรณ สื่ อสารข อมู ลไร สาย อาทิ โมดู ลบลู ทู ธ, โมดู ล XBEE เป นต น

TXD1

RXD1

Rx

Tx

2. เมื่ อต องการสื่ อสารข อมู ลระหว างแผงวงจร ATX2 สองชุ ด

3. เมื ่อต องการต ิดต อก ับอ ุปกรณ ภายนอกที ่ต องการร ูปแบบข อม ูลอน ุกรมในการสื ่อสาร อาท ิ แผงวงจรข ับเซอร โวมอเตอร 16 ช อง (ZX-SERVO16i) , แผงวงจรโมด ูล LCD แบบอน ุกรม (SLCD16x2),แผงวงจรฐานเวลานาฬ ิกาจร ิงแบบอน ุกรม (ZX-17), Pixy โมด ูลกล องตรวจจ ับส ีและภาพ เป นต น

Robo-CreatorXT : ATX2 141

6.3 ฟ งก ชั่ นใช งาน HC-SR04 โมดู ลวั ดระยะทางด วยอั ลตร าโซนิ ก

ในไลบราร ี ATX2.h ซึ ่งเป นไลบราร ีหล ักของการเข ียนโปรแกรมเพื ่อควบค ุมการท ํางานของแผงวงจรควบคุ มอเนกประสงค ATX2 ย ังได บรรจุ ฟ งก ชั่ นส ําหร ับต ิดต อก ับอุ ปกรณ อิ นพุ ตเอาต พุ ตและต ัวตรวจจ ับหน าที ่พ ิเศษอื ่นๆ อ ีกหลายต ัว อาท ิ LED8 แผงวงจรข ับ LED 8 ช องที ่ใช การต ิดต อแบบอนุ กรมด วยสายสั ญญาณเส นเดี ยว, HC-SR04 เป นโมดู ลตรวจจั บและวั ดระยะทางด วยอั ลตร าโซนิ ก,หรื อ ZX-ENCODER แผงวงจรตรวจจั บรหั สล อ เป นต น

6.3.1 เกี่ ยวกั บ HC-SR04 โมดู ลตรวจจั บและวั ดระยะทางด วยอั ลตร าโซนิ กHC-SR04 เป นโมดู ลตรวจจั บและวั ดระยะทางที่ ใช หลั กการสะท อนของคลื่ นอั ลตร าโซนิ ก

หรื อคลื่ นความถี่ เหนื อเสี ยงราคาประหยั ด โดยตั ว HC-SR04 มี แหล งกํ าเนิ ดคลื่ นอั ลตร าโซนิ กส งไปสะท อนกั บวั ตถุ ที่ อยู ข างหน ากลั บมายั งตั วรั บสั ญญาณ โดยระยะทางที่ วั ดได จะสั มพั นธ กั บระยะเวลาที ่คลื ่นอ ัลตร าโซน ิกเคลื ่อนที ่ไปกระทบว ัตถ ุและสะท อนกล ับมาย ังต ัวร ับ เมื ่อรู ระยะเวลาที ่คลื ่นอ ัลตร าโซน ิกสะท อนกล ับมา จ ึงค ํานวณเป นระยะทางระหว างโมด ูล HC-SR04 ก ับว ัตถ ุได โดยโมด ูล HC-SR04วั ดระยะทางในช วง 2 ถึ ง 500 ซม. (5 เมตร) มี ความละเอี ยดอยู ที่ 0.3 ซม. ใช ไฟเลี้ ยง +5V

ในรู ปที่ 6-3 แสดงส วนประกอบทั้ งหมดของชุ ดโมดู ล HC-SR04 เพื่ อใช ในการติ ดต อกั บบอร ดไมโครคอนโทรลเลอร โดยเฉพาะอย างยิ่ งกั บแผงวงจร ATX2

รู ปที่ 6-3 ส วนประกอบทั้ งหมดของโมด ูล HC-SR04 เพื ่อใช ในการติ ดต อกั บแผงวงจร ATX2

142Robo-CreatorXT : ATX2

6.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

รู ปที่ 6-4 การเชื่ อมต อระหว างแผงวงจร ATX2 กั บโมดู ลวั ดระยะทางด วยคลื่ นความถี่ เหนื อเสี ยง

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(); // รอการกดสวิ ตช OK

glcdClear(); // ล างจอแสดงผล}

void loop()

{

glcd(0,0,”%d “,sonar());

// นํ าค าที่ วั ดได มาแสดงที่ จอกราฟ ก LCD สี ของแผงวงจร ATX2}

144Robo-CreatorXT : ATX2

เมื่ อรั นโปรแกรม ที่ จอแสดงผลจะแสดงข อความและค าของการวั ดในหน วยเซนต ิเมตรและนิ้ วทั นท ี ทดลองใช มื อบั งที่ ด านหน าของโมดู ล HC-SR04 แล วเลื่ อนมื อเข าใกล และถอยห างออกจากโมดู ล สั งเกตค าการวั ดที่ ได ดั งรู ปท า28 อาจตรวจสอบความแม นยํ าในการวั ดด วยการใช ไม บรรทั ดหรื อตลั บเมตรวั ดเที ยบได

จากการทดสอบในพื ้นที ่โล งกั บว ัตถ ุที ่ม ีร ูปร างแน นอนเพ ียง 1 ชิ ้น โดยม ีการปรั บระยะทดสอบอย างต อเนื ่องพบว า โมดู ล HC-SR04 วั ดระยะทางได ระหว าง 2 เซนติ เมตร ถึ ง 5 เมตร แต ระยะทํ าการที่ ให ผลค อนข างแน นอนคื อ 4เซนติ เมตร ถึ ง 3 เมตร

6.3.5 _sonarTime

เป นฟ งก ชั ่นอ านค าระยะทางที ่ว ัดได จากโมด ูลว ัดระยะทางด วยอ ัลตร าโซน ิก HC-SR04 โดยให ค าเป นข อมู ลดิ บที่ ต องนํ าไปคํ านวณเพิ่ มเติ ม เพื่ อแปลงค าเป นค าระยะทางเป นเซนติ เมตรต อไป

รู ปแบบunsigned int _sonarTime

การค ืนค า

เป นข อมู ลระยะทางที่ เป นข อมู ลดิ บ

รู ปที่ 6-6 ตั วอย างการนํ าโมดู ล HC-SR04 ไปติ ดต้ั งที่ ด านหน าของหุ นยนต RQ-BOT (ResQ-BOT)เพื ่อตรวจจ ับสิ ่งก ีดขวางในภารก ิจการแข งข ันหุ นยนต กู ภ ัยยุ วชน

Robo-CreatorXT : ATX2 145

6.4 ฟ งก ชั ่นใช งานแผงวงจรตรวจจ ับรห ัสล อ ZX-ENCODER

6.4.1 ข อม ูลเบื ้องต นของ ZX-ENCODER แผงวงจรตรวจจั บรห ัสล อZX-ENCODER เป นแผงวงจรตรวจจ ับรห ัสล อที ่ต องใช งานร วมก ับแผ นรห ัสล อ (encoder dics)

ซึ่ งติ ดตั้ งเข าที่ แกนหมุ นของชุ ดเฟ องขั บมอเตอร รุ น BO1 และ BO2 ได โดยตรง ดั งแสดงหน าตาของแผงวงจรตรวจจั บนี้ ในรู ปที่ 6-7

คุ ณสมบั ติ ทางเทคนิ คที่ สํ าคั ญมี ดั งนี้

ใช ออปโต อ ินเตอร ร ัปเตอร ในการตรวจจ ับช องของแผ นรห ัสล อ ใช ก ับแผ นรห ัสล อที่ หนาไม เกิ น 5 มิ ลลิ เมตร

มี เอาต พุ ต 2 แบบคื อ แบบสั ญญาณตรง (AO) และแบบผ านวงจรเปรี ยบเที ยบ (DO)

ใช ไฟเลี้ ยงย านกว างตั้ งแต +3 ถึ ง +5V

มี LED แสดงสถานะการทํ างาน

แผ นรหั สล อเป นวงกลมขนาดเส นผ านศู นย กลาง 20 มิ ลลิ เมตร มี ช องสํ าหรั บตรวจจั บ 20 ช อง สวมเข ากั บแกนหมุ นของชุ ดเฟ องขั บมอเตอร ไฟตรงรุ น BO1 หรื อ BO2 ได โดยตรง

ขนาดของแผงวงจร 32 x 14 มิ ลลิ เมตร

ร ูปที ่ 6-7 แสดงส วนประกอบทั ้งหมดของช ุดแผงวงจรตรวจจ ับรห ัสล อ

146Robo-CreatorXT : ATX2

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

รู ปที่ 6-8 แนวทางการติ ดตั้ งแผงวงจรตรวจจ ับรห ัสล อและแผ นรห ัสล อพลาสต ิกเข าก ับแกนหม ุนของมอเตอร ในหุ นยนต RQ-BOT

แผ นรหั สล อ20 ช อง

แผงวงจรตรวจจั บรหั สล อ

แกนหมุ นของมอเตอร

Robo-CreatorXT : ATX2 147

ร ูปที ่ 6-9 การว ัดระยะทางด วยแผงวงจรตรวจจ ับรห ัสล อแะแผ นรห ัสล อพลาสต ิกในหุ นยนต RQ-BOT

สํ าหรั บแผงวงจร ATX2 จะเลื อกใช จุ ดต อพอร ต 18/INT เนื่ องจากอี ก 2 จุ ดต อนั้ นควรใช งานกั บอุ ปกรณ สื่ อสารอนุ กรม อาทิ โมดู ลกล อง Pixy หรื อโมดู ลสื่ อสารข อมู ลอนุ กรมไร สายอย างบลู ทู ธหรื อ WiFi จะทํ าให ใช งานแผงวงจร ATX2 ได อบ างมี ประสทิ ธิ ผลมากกว า

แนวคิ ดในการนํ าแผงวงจร ZX-ENCODER มาใช วั ดระยะทางในการเคลื่ อนที่ ของหุ นยนต ให ใช ข อมู ลในรู ปที่ 6-9 ประกอบในการอธิ บาย หากทราบขนาดเส นผ านศู นย กลางของล อ ซึ่ งในที่ นี้ คื อ5.7 เซนติ เมตร ระยะทางเมื่ อล อหมุ นไป 1 รอบคื อ D หรื อเท ากั บ 3.14 x 5.7 = 17.898 หรื อประมาณ17.90 เซนติ เมตร

148Robo-CreatorXT : ATX2

6.4.4 encCNT

เป นฟ งก ชั่ นอ านค าจากการตรวจจั บรหั สล อของแผงวงจรตรวจจั บรหั สล อ ZX-ENCODERหากใช แผ นรหั สล อที่ มาพร อมกั บแผงวงจรตรวจจั บรหั สล อจะอ านค าได ค า 40 ต อ 1 รอบของหมุ นการคํ านวณระยะทางให ใช แนวคิ ดตามที่ แสดงในรู ปที่ 6-9

รู ปแบบunsigned int encCnt

การคื นค า

เป นค าของจํ านวนพ ัลส ที ่ตรวจจั บได จากแผ นรห ัสล อ

ตั วอย างที่ 6-63

#include <ATX2.h> // ผนวกไฟล ไลบรารี หลั กvoid setup()

{

OK(); // รอการกดสวิ ตช OK

glcdClear(); // ล างจอแสดงผล}

void loop()

{

glcd(0,0,”%d “,encCnt());

// นํ าค าที่ ตรวจจั บได มาแสดงที่ จอกราฟ ก LCD สี ของแผงวงจร ATX2}

ในการทดสอบให หม ุนแกนมอเตอร ที ่ต ิดตั ้งแผ นรห ัสล อและแผงวงจรตรวจจั บรห ัสล อด วยม ืออย างช าๆ แล วด ูค าที ่เก ิดข้ึ นบนจอแสดงผลของแผงวงจร ATX2

ตั วอย างที่ 6-64 [ต องใช กั บหุ นยนต RQ-BOT]

#include <ATX2.h> // ผนวกไฟล ไลบรารี หลั กvoid setup()

{

OK(); // รอการกดสวิ ตช OK

glcdClear(); // ล างจอแสดงผลFD(100);

while(encCnt<40); // ค าการนั บน อยกว า 40

// แสดงว า ยั งไม ครบรอบหรื อได ระยะทาง 17.75 ซม.

encCnt=0; // เคลี ยร ค าการนั บ

BK(100); // เมื ่อค าที ่ตรวจจั บได เท าก ับ 40 ให ถอยหล ังส้ั นๆ เพื ่อเตร ียมหย ุด

Robo-CreatorXT : ATX2 149

delay(50); // หน วงเวลาส้ั นๆ 0.5 วิ นาที

AO(); // หยุ ดการขั บมอเตอร ทั้ งหมด}

void loop()

{

sw_OK_press();

FD(100);

while(encCnt<40); // ค าการนั บน อยกว า 40

// แสดงว า ยั งไม ครบรอบหรื อได ระยะทาง 17.75 ซม.

encCnt=0; // เคลี ยร ค าการนั บ

BK(100); // เมื ่อค าที ่ตรวจจั บได เท าก ับ 40 ให ถอยหล ังส้ั นๆ เพื ่อเตร ียมหย ุด

delay(50); // หน วงเวลาส้ั นๆ 0.5 วิ นาที

AO(); // หยุ ดการขั บมอเตอร ทั้ งหมด}

ในการทดสอบนี้ ต องการให หุ นยนต RQ-BOT หยุ ดเคลื่ อนที่ เมื่ อเคลื่ อนที่ ได ระยะทาง 17.75 เซนติ เมตรเทคนิ คที่ ใช ในการหยุ ดการเคลื่ อนที่ ทั นที คื อ การส่ั งให หุ นยนต ถอยหลั งด วยกํ าลั งสุ งสุ ดเป นเวลาส้ั นๆ แล วตามด วยคํ าส่ั ง AO(); เพื่ อหยุ ดการขั บมอเตอร ทั้ งหมด

150Robo-CreatorXT : ATX2