คู่มือการโปรแกรม Arduino board

?

arduino

programming

notebook

?

brian w.evans

?

Arduino Programming Notebook

written an compiled by Brian W. Evans

?

With information or inspiration taken from:

http://www.arduino.cc

http://www.wiring.org.co

http://www.arduino.cc/en/Booklet/HomePage

http://cslibrary.stanford.edu/101/

?

Including material written by:

Massimo Banzi

Hernando Barragan

David Cuartielles

Tom Igoe

Daniel Jolliffe

Todd Kurt

David Mellis

and others

?

Published:

First Edition August 2007

?

This work is licensed under the Creative Commons

Attribution-Noncommercial-Share Alike 3.0 License.

?

To view a copy of this license, visit:

http://createivecommons.org/licenses/by-nc-sa/3.0/

Or send a letter to:

?

Creative Commons

171 Second Street, Suite 300

San Francisco, California, 94105, USA

?


?

contents

structure

structure

setup()

loop()

functions

{} curly braces

; semicolon

/*... */ block comments

// line comments

variables

variables

variables declaration

variable scope

datatype

byte

int

long

float

arrays

arithmetic

arithmetic

compound assignments

comparison operators

logical operators

constants

constants

true/false

high/low

input/output

flow control

if

if... else

for

while

do... while

digital i/o

pinMode(pin, mode)

digitalRead(pin)

digitalWrite(pin, value)

analog i/o

analogRead(pin)

analogWrite(pin, value)

time

delay(ms)

millis()

math

min(x,y)

max(x,y)

random

randomSeed(seed)

random(min, max)

serial

Serial.begin(rate)

Serial.println(data)

appendix

digital output

digital input

high current output

pwm output

potentiometer input

variable resistor input

servo output

?


?

บทนำ

?

?

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

?

?

STRUCTURE

การโปรแกรม Arduino board มีส่วนประกอบอย่างง่ายๆแบ่งเป็นโปรแกรมย่อยหรือฟังชั่นสองส่วน

?

void setup()

{

statements;

}

void loop()

{

statements;

}

?

โปรแกรมย่อยในส่วน setup() คือส่วนการเตรียมการเริ่มต้นใช้งาน ส่วน loop() เป็นส่วนการทำงานหลัก ซึ่งทั้งสองส่วนมีความสำคัญในการทำงานของบอร์ด

ฟังชั่นในส่วน setup() ควรจะมีส่วนที่กำหนดค่าตัวแปรที่ส่วนหัวของโปรแกรม ซึ่งมันจะทำงานเพียงครั้งเดียวและทำงานก่อนโปรแกรมอื่นๆ ส่วนมากโปรแกรมในส่วนนี้จะใช้สำหรับการกำหนดหน้าที่ขาของตัว AVR ไมโครคอนโทรลเลอร์ หรือตั้งค่าการติดต่อแบบ serial กับอุปกรณ์อื่น

โปรแกรม loop จะทำงานต่อจากโปรแกรม setup และมันจะทำงานอย่างต่อเนื่องต่อไป เช่นอ่านค่า input ส่งสัญญาณ triggering outputs เป็นต้น โปรแกรมนี้เป็นโปรแกรมทำงานหลักของ Arduino และทำงานส่วนใหญ่ของระบบ

?

SETUP()

ฟังชั่นนี้จะถูกเรียกใช้งานเพียงครั้งเดียวเมื่อโปรแกรมถูกเริ่มใช้งาน ใช้สำหรับการกำหนดค่าของขาของตัว AVR หรือตั้งค่าการติดต่อแบบ serial โปรแกรมนี้เป็นส่วนจำเป็นที่จะต้องมีถึงแม้มันจะไม่มีคำสั่งภายในตัวมันก็ตาม

?

void setup()

{

pinMode(pin,OUTPUT); // set the 'pin' as output

}

?

LOOP()

หลังจากเรียกโปรแกรม setup() แล้ว โปรแกรม loop() จะทำงานต่อและจะทำงานเป็นวนลูป เพื่อให้โปรแกรมทำงานตามสถานะต่างๆ

?

void loop()

{

digitalWrite(pin, HIGH); // turns 'pin' on

delay(1000); // pauses for one second

degitalWrite(pin, LOW) // turns 'pin' off

delay(1000);

}

?

FUNCTION

ฟังชั่นเป็นกลุ่มคำสั่งที่มีชื่อเรียกและกลุ่มคำสั่งซึ่งจะทำงานเมื่อฟังชั่นถูกเรียกใช้ นอกจากฟังชั่น void setup() และ void loop() แล้วยังมีฟังชั่นอื่นๆที่พร้อมใช้งาน(build-in) ซึ่งจะได้อฺธิบายต่อไป

ฟังชั่นที่ทำงานเฉพาะสามารถเขียนขึ้นเพื่อให้ทำงานที่ซ้ำๆกันเพื่อลดความยาวของคำสั่ง ในการสร้างฟังชั่นจะเริ่มต้นด้วยการกำหนดชนิดค่าที่ฟังชั่นจะคืนกลับให้โปรแกรมที่เรียกใช้ เช่น int สำหรับค่า integer ถ้าฟังชั่นไม่มีการคืนค่า จะใช้คำว่า void ต่อจากชนิดค่าที่ฟังชั่นคืนกลับจะเป็นชื่อฟังชั่นและตามด้วยวงเล็บซึ่งจะเป็นค่าพารามิเตอร์ที่จะส่งค่าให้กับฟังชั่น

?

type functionName(parameters)

{

statements;

}

?

ตัวอย่างด้านล่างนี้เป็นค่า integer type function delayVal() ที่ใช้ตั้งค่าหน่วงเวลาในโปรแกรมโดยอ่านค่าของ potentiometer การทำงานของฟังชั่นจะกำหนดตัวแปร v และนำค่าของ potentiometer ซึ่งมีค่า 0-1023 มาเก็บไว้ใน v จากนั้นหารค่านั้นด้วย 4 เพื่อให้ได้ค่า 0-255 สุดท้ายจึงส่งค่ากลับไปยัง main program

?

int delayVal()

{

int v; // create temporary variable 'v'

v = analogRead(pot); // read potentiometer value

v /= 4; // converts 0 - 1023 to 0 - 255

return v;

}

?

{} curly braces

วงเล็บปีกกาใช้เป็นเครื่องหมายเพื่อแสดงจุดเริ่มต้นและจุดสิ้นสุดของกลุ่มคำสั่งของฟังชั่น และกลุ่มคำสั่งเช่น void loop() function และกลุ่มคำสั่ง for และ if statement

?

type function()

{

statements;

}

?

วงเล็บปีกกาเปิด { จะต้องตามด้วยวงเล็บปีกกาปิด } เสมอ ในโปรแกรมอาจมีวงเล็บเปิดและปิดหลายๆอันแต่จะต้องมีจำนวนเท่ากัน ถ้าวงเล็บเปิดปิดไม่เท่ากันจะทำให้เกิด compiler error และบางครั้งทำให้หาข้อผิดพลาดได้ยากในโปรแกรมที่มีความซับซ้อน

สำหรับ โปรแกรม Arduino environment จะมีความสามารถในการตรวจความสมดุลย์ของวงเล็บปีกกา โดย คลิกที่ วงเล็บปีกกา หรือคลิกด้านข้างขวาของวงเล็บปีกกาที่ต้องการตรวจสอบ โปรแกรมจะแสดงวงเล็บปีกกาที่เป็นคู่ของมันทันที

?

; SEMICOLON

เครื่องหมายเซมิโคลอน ; จะต้องใช้ที่ส่วนท้ายของคำสั่งและใช้แยกส่วนของโปรแกรมออกจากกัน นอกจากนี้เซมิโคลอนยังใช้แยกส่วนของ for loop ออกเป็นส่วนๆด้วย

?

int x = 13; // declare variable 'x' as the integer 13

?

หมายเหตุ: ถ้าลืมใส่เซมิโคลอนที่ท้ายบรรทัดจะทำให้ compiler error ซึ่งการ error อาจมาจากหลายสาเหตุแต่การลืมใส่เซมิโคลอนก็เป็นสาเหตุหนึ่ง ให้ตรวจสอบบรรทัดที่ไกล้จุดที่ compiler error ว่าใส่เซมิโคลอนหรือเปล่า

?

/*....*/ BLOCK COMMENTS

คำอธิบายโปรแกรม สามารถใส่ไว้ในเครื่องหมาย /*......คำอธิบาย....*/ คำอธิบายที่อยู่ในเครื่องหมาย/*...*/ นี้ตัว compiler จะไม่นำมาประมวลผล ซึ่งจะมีประโยชน์ในการอธิบายความมุ่งหมายของคำสั่ง เพื่อให้เข้าใจการทำงานแต่ละส่วนของโปรแกรม ซึ่งจะเริ่มด้วยเครื่องหมาย /* และจบด้วยเครื่องหมาย */ และสามารถเขียน comment ได้หลายๆบรรทัดถ้าต้องการ

?

/* this is an enclosed block comment

don't forget the closing comment -

they have to be balanced!

*/

?

เนื่องจากการเขียน คำอธิบายไม่ได้เอาไปใช้ในโปรแกรมทำให้ไม่สิ้นเปลืองหน่วยความจำโปรแกรม ดังนั้นควรเขียนคำอธิบายให้ชัดเจนและทำให้เป็นนิสัย อีกอย่างที่เครื่องหมาย comment มีประโยชน์คือใช้ตัดส่วนของโปรแกรมที่ไม่ต้องการออกไปสำหรับการตรวจสอบความผิดพลาดของโปรแกรม

?

// LINE COMMENTS

การเขียนคำอธิบายโปรแกรมบรรทัดเดียวใช้เครื่องหมาย // เป็นเครื่องหมายเริ่มต้นและสิ้นสุดด้วยการขึ้นบรรทัดใหม่ และเช่นเดียวกับ block comment คือมันจะไม่เปลืองเนื้อที่โปรแกรมใช้งาน เนื่องจาก compiler จะไม่นำไปใช้ในโปรแกรม

?

// this is a single line comment

?

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

?

VARIABLES

variable หรือ ตัวแปรเป็นชื่อและที่เก็บค่าของตัวเลขสำหรับใช้งานในโปรแกรม ตัวแปรมีค่าที่เปลี่ยนแปลงได้ซึ่งตรงกันข้ามกับ constant หรือค่าคงที่ ที่ไม่สามารถเปลี่ยนแปลงค่าได้ การใช้งานตัวแปรจะต้องมีการกำหนดชนิดและอาจกำหนดค่าเริ่มต้นให้กับตัวแปรนั้น ตัวอย่างด้านล่างนี้เป็นการกำหนดตัวแปรชื่อ inputVariable หลังจากนั้นนำค่าที่ได้จาก analog input pin 2 มาเก็บไว้

?

int inputVariable = 0; // declares a variable and assigns value of 0

inputVariable = analogRead(2); // set variable to value of anlog pin 2

?

ค่าของตัวแปร inputVariable จะเปลี่ยนแปลงได้ บรรทัดแรกจะกำหนดให้มันเป็นชนิด int หรือตัวเลขจำนวนเต็มโดยมีค่าเริ่มต้นเป็น 0 บรรทัดที่สองจะนำค่าจาก analog pin 2 มาเก็บไว้ ซึ่งจะทำให้ค่าของ pin 2 จะถูกเรียกใช้ในโปรแกรมได้

เมื่อตัวแปรถูกสร้างขึ้น, หรือใส่ค่าใหม่ให้มัน, คุณสามารถตรวจสอบค่าของมันว่ามันมีค่าตามที่ต้องการ, หรือคุณจะนำค่านั้นไปใช้เลยก็ได้ ตัวอย่างด้านล่างนี้เป็นสามตัวอย่างที่ใช้งานตัวแปร, คือตรวจสอบค่าตัวแปร inputVariable ว่ามีค่าต่ำกว่า 100 หรือไม่ ถ้ามีค่าต่ำกว่า 100 ให้ใส่ค่า 100 ให้กับตัวแปร หลังจากนั้นตั้งค่าหน่วงเวลาตามค่าตัวแปร inputVariable ซึ่งก็คือค่า 100 เป็นอย่างต่ำ

?

if (inputVariable < 100) // test variable if less than 100

{

inputVariable = 100; // if true assigns value of 100

}

delay(inputVariable); // uses variables as delay

?

หมายเหตู: ตัวแปรควรจะมีชื่อที่สื่อถึงหน้าที่ใช้งาน, เพื่อให้โปรแกรมสามารถอ่านได้ง่าย ชื่อตัวแปรเช่น tiltSensor หรือ pushButton จะช่วยให้โปรแกรมเมอร์หรือคนอื่นที่อ่านโปรแกรมสามารถเข้าใจได้ว่าตัวแปรนั้นเอาไว้ทำอะไร คุณสามารถตั้งชื่ออะไรก็ได้ที่ไม่ตรงกับชื่อเฉพาะที่ใช้ใน Arduino language

?

variable declaration

ตัวแปรที่จะนำไปใช้งานได้จะต้องถูกตั้งค่าตัวแปรก่อนนำไปใช้ การตั้งค่าตัวแปรหมายถึงการระบุชนิดตัวแปร ให้เป็น int, long, float, เป็นต้น การกำหนดชื่อให้ตัวแปรมีชื่อเรียก และอาจมีการกำหนดค่าเริ่มต้นให้กับตัวแปร ซึ่งการตั้งค่านี้จะทำเพียงครั้งเดียวในโปรแกรม แต่ค่าของตัวแปรจะเปลี่ยนแปลงไปตามการทำงานของโปรแกรม

ตัวอย่างต่อไปนี้ตั้งค่าตัวแปร inputVariable ให้เป็นตัวแปรจำนวนเต็ม int,หรือ integer, และใส่ค่าเริ่มต้นให้เป็นศูนย์ ซึ่งเป็นการตั้งค่าตัวแปรแบบง่าย

?

int inputVariable = 0;

?

ตัวแปรสามารถตั้งค่าในแบบระบุตำแหน่งในหน่วยความจำ

?

variable scope

ตัวแปรสามารถตั้งค่าตอนเริ่มต้นโปรแกรมก่อน void setup(), หรือตั้งค่าตัวแปรภายในฟังชั่น,และบางครั้งก็ตั้งค่าตัวแปรภายในกลุ่มคำสั่ง for loop ซึ่งการตั้งค่าตัวแปรในแบบต่างๆ มีผลถึงขอบเขตการใช้ตัวแปร, หรืออีกนัยหนึ่งการที่โปรแกรมจะสามารถใช้ตัวแปรนั้น

ตัวแปรแบบ global เป็นตัวแปรที่โปรแกรมมองเห็นและใช้งานได้จากทุกฟังชั่นและทุกกลุ่มคำสั่งในโปรแกรม ตัวแปรนี้จะตั้งค่าที่ตอนเริ่มต้นโปรแกรม, ก่อน setup() function

ตัวแปรแบบ local เป็นตัวแปรที่ตั้งค่าภายในฟังชั่นหรือภายในกลุ่มคำสั่ง for loop ตัวแปรนี้จะมองเห็นและใช้งานได้เฉพาะภายในฟังชั่นที่มันตั้งค่า ชื่อตัวแปรแบบนี้อาจมีชื่อซ้ำกันในแต่ละฟังชั่น แต่ในการทำงานฟังชั่นแต่ละตัวจะใช้ตัวแปรตัวนั้นเฉพาะที่ตั้งค่าภายในตัวมันเท่านั้น

ตัวอย่างด้านล่างนี้แสดงการตั้งค่าตัวแปรและขอบเขตการใช้งานของตัวแปร

?

int value; // 'value' is visible to any function

void setup();

{

// no setup needded

}

void loop()

{

for (int i=0; i<20;) // 'i is only visible inside the for - loop

{

i++;

}

float f; // 'f' is only visible inside loop

}

?

byte

ตัวแปร byte เก็บตัวเลข 8 bit ไม่มีทศนิยม มีค่า 0 - 255

?

byte someVariable = 180; // declares 'someVariable' as a byte type

?

int

integer เป็นตัวแปรพื้นฐานที่เก็บตัวเลขโดยไม่มีจุดทศนิยม และเก็บค่า 16 bit มีค่าระหว่าง 32,767 ถึง -32,768

?

int someVariable = 1500; // declares 'someVariable' as an integer type

?

หมายเหตุ: ตัวแปร integer จะมีค่าย้อนกลับหรือ roll over ถ้ามันถูกใส่ค่าเกินจากค่าสูงสุดที่มันรับได้ เช่นถ้า x = 32767 และคำสั่งถัดมาให้เพิ่มค่า 1 ให้กับ x , x = x + 1 หรือ x++, ค่า x จะล้นหรือที่เรียกว่า roll over เป็นค่า -32768

?

long

?

เป็นตัวแปรจำนวนเต็มแบบขยายโดยไม่มีจุดทศนิยม เก็บค่าแบบ 32 bit มีค่าระหว่าง 2,147,483,647 ถึง -2,147,483,648

long someVariable = 90000; // declares 'someVariable' as a long type

?

float

?

ตัวแปรชนิด floating-point หรือตัวแปรที่มีจุดทศนิยม ตัวแปรนี้มีค่ามากกว่าค่าของตัวแปรจำนวนเต็ม โดยใช้เนื้อที่เก็บ 32 bit มีค่าระหว่าง 3.4028235E+38 ถึง -3.4028235E+38

?

float someVariable = 3.14; // declares 'someVariable' as a floatint -point type

?

หมายเหตุ: ค่าตัวเลขทศนิยมเป็นค่าที่ไม่เต็มจำนวน และอาจส่งผลแปลกๆเมื่อนำมาเปรียบเทียบกับค่าอื่น และการคำนวนเลขทศนิยมใช้เวลามากว่าการคำนวนเลขจำนวนเต็ม, ดังนั้นควรหลีกเลี่ยงใช้งานถ้าทำได้

?

arrays

ตัวแปร arrays หรือตัวแปรหลายมิติเป็นตัวแปรที่สามารถเข้าถึงได้ด้วยค่าตัวชี้หรือ index ค่าตัวแปรใน array อาจเรียกใช้โดยระบุชื่อ array และระบุตัวชึ้ index number ตัวแปร array จะมี index เริ่มต้นจาก 0 ตัวแปร array จะต้องตั้งค่า ก่อนจะนำไปใช้งาน และอาจกำหนดค่าเริ่มต้นหรือไม่ก็ได้

?

int myArray[] = {value0, value1, value2...}

?

เราอาจตั้งค่า array โดยกำหนดชนิดและขนาด แล้วค่อยใส่ค่าลงไปทีหลังก็ได้

?

int myArrays[5]; // declares integer array w/ 6 positions

myArray[3] = 10; // assigns the 4th index the value 10

?

การดึงค่าจาก array ใช้การเรียกค่าจากตัวแปร array และระบุตำแหน่งตัวชี้ index

?

x = myArray[3]; // x now equals 10

?

ตัวแปร arrays ใช้บ่อยใน for loops, ซึ่งจะมีการเพิ่มค่าตัวนับ และใช้ตัวนับเป็นตัวชี้ตำแหน่งของ arrays แต่ละตัว ตัวอย่างต่อไปนี้เป็นการใช้ array ในการสั่ง LED ติดดับ โดยใช้ for loop, ตัวนับจะเริ่มจาก 0, เขียนค่าที่ได้จาก array ตำแหน่งที่ 0 ของ array flicker[], ในที่นี้คือค่า 180, ไปยัง PWM pin 10, หยุดเป็นเวลา 200 ms, แล้วจึงย้ายไปเอาค่าในตำแหน่งถัดไปของ array

?

int ledPin = 10; // LED on pin 10

byte flicker[] = {180, 30, 255, 200, 10, 90, 150, 60}; // array of 8 different values

?

viod setup()

{

pinMode(ledPin, OUTPUT); // sets OUTPUT pin

}

?

viod loop()

{

for(int i=0; i<7; i++) // loop equals number of values in array

{

analogWrite(ledPin, flicker[i]); // write index value

delay(200);

}

}

?

arithmetic

ตัวกระทำการทางคณิตศาสตร์หมายรวมถึง การบวก, ลบ, คูณ, และหาร ซึ่งมันจะให้ค่า ผลรวม, ผลต่าง, ผลคูณ, หรือผลการหาร ของสองตัวดำเนินการ

?

y = y + 3;

x = x - 7;

i = j * 6;

r = r / 5

?

การทำงานของโปรแกรมจะเป็นการนำขนิดข้อมูลตัวแปรของตัวดำเนินการมาใช้, ดังนั้น, จากตัวอย่าง 9/4 ผลลัพท์จะเท่ากับ 2 แทนที่จะเท่ากับ 2.25 เนื่องจาก 9 และ 4 เป็นตัวแปรจำนวนเต็มหรือ integer ซึ่งไม่สามารถเก็บค่าทศนิยมได้ และถ้าผลลัพท์ที่ได้มีค่ามากกว่าที่ตัวแปรจะรับได้มันจะเกิดการ overflow

ถ้ามีการคำนวนกับชนิดตัวแปรที่ต่างกัน, ตัวแปรที่มีขนาดใหญ่กว่าจะถูกนำมาใช้ เช่นการบวก ลบเลขจำนวนเต็มกับเลขทศนิยม การบวกลบทศนิยมจะถูกนำมาใช้

ควรเลือกตัวแปรที่มีขนาดที่ใหญ่พอที่จะเก็บผลลัพท์การคำนวน ตรวจสอบจุดที่ตัวแปรจะมีค่าย้อนกลับหรือ roll over เช่น 0-1 หรือ 0-32768 สำหรับการคำนวนที่เป็นเลขเศษส่วน ใช้ตัวแปรที่มีจุดทศนิยม แต่ควรระวังผลข้างเคียงถ้าตัวเลขมากจะทำให้ความเร็วในการคำนวนช้าลง

หมายเหตุ: การ cast ตัวแปรคือการเปลี่ยนชนิดตัวแปรจากชนิดหนึ่งไปยังอีกชนิดหนึ่งคือ (int)myFloat เช่น i = (int)3.6 จะเป็นการแปลงค่าให้ i มีค่าเป็น 3

?

compound assignment

การเขียนคำสั่งโปรแกรมแบบย่อหมายถึงการทำงานกับตัวแปรแล้วนำผลลัพท์ที่ได้ไปเก็บในตัวแปรนั้น จะพบมากใน for loop การเขียนคำสั่งแบบย่อหรือ compound assignment ที่ใช้ทั่วไปคือ

?

x ++ // same as x = x + 1, or increments x by +1

x -- // same as x = x - 1, or decrements x by -1

x += y // same as x = x + y, or increments x by +y

x -= y // same as x = x - y, or decrements x by -y

x *= y // same as x = x * y, or multiply x by y

x /= y // same as x = x / y, or devides x by y

หมายเหตุ: ตัวอย่างเช่น x *= 3 จะคูณค่า x เป็นสามเท่าแล้วนำผลลัพท์เก็บใน x

?

comparison operator

การเปรียบเทียบตัวแปรหรือค่าคงที่กับค่าอื่นๆ จะใช้บ่อยในกลุ่มคำสั่ง if เพื่อตรวจค่าว่ามีสถานะตรงตามที่ต้องการหรือไม่ ตัวอย่างต่อไปนี้เป็นคำสี่งเปรียบเทียบตัวแปรสองตัว

?

x == y // x is equal to y ??

x != y // x is not equal to y ??

x < y // x is less than y ??

x > y // x is greater than y ??

x <= y // x is less than or equal to y ??

x >= y // x is greater than or equal to y ??

?

logical operators

การตรวจสอบทาง logic จะใช้เปรียบเทียบตัวดำเนินการสองตัวและให้ผลลัพท์ จริง หรือ เท็จ(TRUE OR FALSE) ขึ้นอยู่กับตัวดำเนินการ ตัวดำเนินการทางลอจิกมี 3 ตัวคือ AND, OR และ NOT ซึ่งใช้บ่อยใน กลุ่มคำสั่ง if ดังตัวอย่างต่อไปนี้

?

Logical AND:

if (x > 0 && x < 5) // true only if both expression are true

// เป็นจริงเมื่อทั้งสองส่วนเป็นจริง

Logical OR:

if (x > 0 || y < 5) // true only if either expression are true

// เป็นจริงเมื่อตัวใดตัวหนึ่งเป็นจริง

?

constants

ในภาษา Arduino มีค่าที่กำหนดไว้แล้ว่ไม่มาก เราเรียกค่าพวกนี้ว่า constant หรือค่าคงที่ ซึ่งมีไว้เพื่อให้โปรแกรมอ่านง่าย ค่าคงที่เหล่านี้จะแบ่งออกได้หลายกลุ่ม

?

true/false

ค่าเหล่านี้เป็นค่าคงที่ boolean ซึ่งบอกสถานะระดับลอจิก FALSE หมายถึง 0(ศูนย์) ในขณะที่ TRUE จะหมายถึง 1, หรืออะไรก็ได้ที่ไม่ใช่ ศูนย์ ดังนั้นในทางลอจิกแล้ว -1, 2, -200 จะหมายถึง TRUE

?

if (b == TRUE);

{

doSomething;

}

?

high/low

ค่าคงที่เหล่านี้แสดงถึงระดับลอจิกที่ขาไอซีว่าเป็น HIGH หรือ LOW และใช้เมื่อมีการอ่านหรือเขียนไปที่ขาไอซี HIGH จะแทนระดับลอจิก 1, ON, หรือ 5 volts ในขณะที่ LOW คือระดับลอจิก 0, OFF, หรือ 0 volts

?

digitalWrite(13, HIGH)

?

input/output

ค่าคงที่ใช้ในฟังชั่น pinMode() ในการกำหนดหน้าที่ของ digital pin ว่าจะให้เป็น INPUT หรือ OUTPUT

?

pinMode(13, OUTPUT);

?

if

?

คำสั่ง if จะใช้ตรวจหาสถานะที่ต้องการว่าเกิดขึ้นหรือยัง, เช่นค่า analog ที่อ่านได้มีค่าเกินจำนวนที่ตั้งไว้หรือยัง และทำงานตามคำสั่งในวงเล็บปีกกาถ้าสถานะเป็นจริง(TRUE) แต่ถ้าสถานะเป็นเท็จ(FALSE)โปรแกรมจะข้ามกลุ่มคำสั่งนั้นไป ดังตัวอย่าง

?

if (someVariable ?? value)

{

doSomething;

}

?

ตัวอย่างข้างบนเป็นการเปรียบเทียบ someVariable กับค่าอื่น, ซึ่งอาจเป็นตัวแปรหรือค่าคงที่ ถ้าผลลัพท์เป็นจริง คำสั่งในวงเล็บปีกกาจะถูกทำงาน แต่ถ้าไม่ โปรแกรมจะข้ามไปทำงานต่อที่หลังวงเล็บปีกกาปิด

หมายเหตุ: ระมัดระวังการใช้ '=' ในรูปคำสั่ง if (x=10), คำสั่งนี้ถูกต้องตามรูปแบบคือนำค่า 10 ไปไส่ในตัวแปร x และจะทำให้ผลลัพท์เป็นจริงตลอด อาจทำให้เกิดผลที่ไม่คาดคิด ดังนั้ควรใช้ '==' เช่น if (x==10), ซึ่งเพียงแต่ตรวจค่า x ว่ามีค่าเท่ากับ 10 หรือไม่ เท่านั้น จำไว้ว่า '=' หมายถึง 'เท่ากับ' ตรงกันข้ามกับ '==' ที่หมายถึง 'เท่ากับใช่หรือไม่'

?

if... else

if... else เป็นการเพิ่มทางเลือก 'ถ้าไม่ใช่สถานะที่ต้องการ' ให้มีทางเลือกอีกทาง ตัวอย่างเช่น ถ้าคุณต้องการตรวจสอบ digital input และทำงานอย่างหนึ่งถ้าอินพุทเป็น HIGH หรือทำงานอีกอย่างถ้าอินพุทเป็น LOW คุณจะเขียนคำสั่งในลักษณะนี้

?

if (inputPin == HIGH)

{

doThingA;

}

else

{

doThingB;

}

else สามารถขยายเงื่อนไขต่อเนื่องออกไปได้อีก ทำให้เราสามารถทดสอบเงื่อนไขได้หลายเงื่อนไขในเวลาเดียวกัน เราสามารถตั้งเงื่อนไขสำหรับการทดสอบได้อย่างไม่จำกัด แต่จำไว้ว่าเงื่อนไขทั้งหมดจะมีกลุ่มคำสั่งเดียวที่ทำงานเนื่องจากสถานะที่ทดสอบตรงตามเงื่อนไข

?

if (inputPin < 500)

{

doThingA;

}

else if (inputPin >= 1000)

{

doThingB;

}

else

{

doThingC;

}

?

หมายเหตุ: คำสั่ง if จะทดสอบเงื่อนไขในวงเล็บว่าจริงหรือเท็จ ซึ่งเงื่อนไขจะเป็นคำสั่งในภาษา C ดังตัวอย่างแรก, if (inputPin == HIGH) ในตัวอย่างนี้ คำสั่ง if จะตรวจสอบว่า inputPin เป็น HIGH หรือ +5V

?

for

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

?

for (initialization; condition; expression)

{

doSomething;

}

?

ส่วนของการเริ่มต้นค่าตัวแปรหรือที่เรียกว่า initialization จะทำงานก่อนและทำงานเพียงครั้งเดียว และเมื่อทำงานครบหนึ่งรอบ ส่วนทดสอบรอบการทำงานหรือส่วน condition จะถูกทดสอบถ้าเงื่อนไขเป็นจริง กลุ่มคำสั่ง expression จะถูกทำงานและเงื่อนไขจะถูกทดสอบอีกครั้ง ถ้าเงื่อนไขเป็นเท็จ จึงจะออกจาก loop

ตัวอย่างต่อไปนี้จะตั้งค่าเริ่มต้นให้ตัวแปร i เป็นศูนย์, ทดสอบว่ามันยังมีค่าต่ำกว่า 20 และถ้าเป็นจริง, เพิ่มค่า i ด้วย 1 และทำคำสั่งในวงเล็บปีกกา

?

for (int i=0; i < 20; i++) // declares i, test if less than 20, increment i by 1

{

degitalWrite(13, HIGH); // turn pin 13 on

delay(250); // pauses for 1/4 second

degitalWrite(13, LOW); //turn pin 13 off

delay(250); // pauses for 1/4 second

}

?

หมายเหตุ: คำสั่ง for loop ในภาษา C มีความซับซ้อนกว่า for loop ในภาษาคอมพิวเตอร์อื่นบางภาษารวมทั้งภาษาเบสิก บางส่วนของส่วนหัวอาจไม่มีกลุ่มคำสั่งแต่ก็ต้องใส่เครื่องหมายเซมิโคลอนไว้ คำสั่งของกลุ่มคำสั่งในส่วนหัวอันได้แก่ส่วน initialization, condition, และ expression จะเป็นคำสั่งภาษา C ที่มีส่วนตัวแปรที่ไม่เกี่ยวข้องกันก็ได้ ขึ้นอยู่กับการออกแบบของโปรแกรมเมอร์

?

while

while loops จะทำงานอย่างต่อเนื่องตลอดไป จนกระทั่งเงื่อนไขในวงเล็บจะเป็นเท็จ ดังนั้นจะตั้องมีเหตุการณ์บางอย่างมาเปลี่ยนแปลงค่าตัวแปรที่ใช้ทดสอบ หรือการทำงานใน while loop อาจทำงานไปตลอดโดยไม่มีการออกจาก loop ขึ้นอยู่กับคำสั่งที่คุณเขียน เช่นเพิ่มค่าตัวแปร, หรือทดสอบสถานะภายนอก, เช่นตรวจสอบ sensor เป็นต้น

?

while (someVariable ?? value) // test if less than 200

{

doSomething; // executes enclosed statements

someVariable++; // increments variable by 1

}

?

do... while

do loop จะทำงานและทดสอบสถานะการทำงานที่ด้านท้ายของ loop คล้ายกับการทำงานของ while loop ยกเว้นการตรวจสอบสถานะเพื่อออกจาก loop จะทำที่ส่วนท้ายของ loop ดังนั้น do loop จะทำงานอย่างน้อยหนึ่งครั้งเสมอ

?

do

{

doSomething;

} while (someVariable ?? value);

?

ตัวอย่างต่อไปนี้อ่านค่า readSensor() แล้วเก็บไว้ที่ตัวแปร 'x', หยุดเป็นเวลา 50 มิลลิวินาที, และทำงานวนลูปจนกระทั่ง 'x' มีค่าน้อยกว่า 100

?

do

{

x = readSensor(); // assigns the value of readSensors() to x

delay(50); // pauses 50 milliseconds

} while (x < 100); // loop if x is less than 100

?

pinMode(pin, mode)

ใช้ในกลุ่ม void setup() เพื่อกำหนดหน้าที่ขาของไมโครคอนโทรลเลอร์ให้เป็น ขารับสัญญาน INPUT หรือขาส่งสัญญาน OUTPUT

?

pingMode(pin, OUTPUT); // sets 'pin' to output

?

ขาของ Arduino digital ถูกตั้งให้เป็นขารับอินพุทโดยปริยาย ดังนั้นจึงไม่จำเป็นต้องสั่งให้มันทำหน้าที่เป็นอินพุทด้วยคำสั่ง pinMode() ขาที่ถูกตั้งให้เป็นอินพุทจะมีคุณสมบัติเป็นขาที่มีอิมพีแดนท์สูง

นอกจากนี้ยังมีความต้านทานพูลอัพ 20K ที่พร้อมใช้งานในตัว Atmega chip ซึ่งสามารถสั่งให้ทำงานได้ด้วยซอฟท์แวร์ โดยคำสั่งดังนี้

?

pinMode(pin, INPUT); // set 'pin' to input

digitalWrite(pin, HIGH); // turn on pullup resistors

?

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

ขาที่กำหนดให้เป็น OUTPUT เรียกได้ว่าเป็นขาที่ทำให้มีอิมพีแดนท์ต่ำและสามารถจ่ายกระแสได้ 40 มิลลิแอมป์ให้อุปกรณ์อื่น ซึ่งเพียงพอที่จะขับ LED ให้ติด(อย่าลืมไส่ความต้านทานจำกัดกระแสด้วย) อย่างไรก็ตามมันไม่สามารถขับรีเลย์, โซลีนอยด์, หรือมอเตอร์ได้โดยตรง

การลัดวงจรบนขาของ Arduino และการจ่ายกระแสมากเกินไปอาจทำความเสียหายให้กับขา output หรืออาจทำให้ตัวไอซีเสียหาย ดังนั้นควรต่อความต้านทานค่า 470 โอห์มหรือ 1k โอห์มอนุกรมกับอุปกรณ์ภายนอก

?

digitalRead(pin)

คำสั่งนี้อ่านค่าจาก ขาไอซีที่ถูกกำหนดให้เป็น digital pin ซึ่งจะได้ผลลัพท์เป็น HIGH หรือ LOW หมายเลขขาไอซีอาจกำหนดเป็นตัวแปรหรือค่าคงที่ (0-13)

?

value = digitalRead(pin); // sets 'value' equal to the input pin

?

digitalWrite(pin, value)

ส่งค่าลอจิก HIGH หรือ LOW (เปิด หรือ ปิด) ไปยังขา digital ที่กำหนด

หมายเลขขาไอซีอาจกำหนดเป็นตัวแปรหรือค่าคงที่ (0-13)

?

digitalWrite(pin, HIGH); // sets 'pin' to high

?

ตัวอย่างต่อไปนี้อ่านค่าจากปุ่มกดที่ต่อกับ digital input และเปิด LED ที่ต่อกับ digital output เมื่อปุ่มถูกกด

?

int led = 13; // connect LED to pin 13

int pin = 7; // connect pushbutton to pin 7

int value = 0; // variable to store the read value

void setup()

{

pinMode(led, OUTPUT); // sets pin 13 as output

pinMode(pin, INPUT); // sets pin 7 as input

}

void loop()

{

value = digitalRead(pin); // sets 'vaue' equal to the input pin

digitalWrite(led, value); // sets 'led' to the button's value

}

?

analogRead(pin)

คำสั่งนี้อ่านค่าจากขา Analog จะได้ค่า 10 bit คำสั่งนี้จะทำงานกับขา analog input (0-5) เท่านั้น และได้ผลลัพท์เป็นเลขจำนวนเต็มค่า 0 - 1023

?

value = analogRead(pin); // sets 'value' equal to 'pin'

หมายเหตุ: ขา Analog ไม่เหมือนกับ ขา digital, ไม่ต้องกำหนดตอนเริ่มต้นว่าเป็น INPUT หรือ OUTPUT

?

analogWrite(pin, value)

เป็นคำสั่งเขียนค่า analog เทียมโดยใช้ hardware enabled pulse width mdulation(PWM) ไปยังขา outut ที่สามารถทำ PWM ได้ ใน Arduino รุ่นใหม่ที่ใช้ชิพ Atmega168 คำสั่งนี้จะทำงานกับขา 3, 5, 6, 9, 10, และ 11 ส่วน Arduino รุ่นเก่าที่ใช้ Atmega8 จะรองรับเพียงขา 9, 10 และ 11 ค่าที่เขียนสามารถใช้เป็นตัวแปรหรือค่าคงที่จาก 0 - 255

?

anllogWrite(pin, value); // writes 'value' to analog 'pin'

ค่า 0 ที่เขียนไปยังขา analog จะทำให้เกิด 0 โวลท์คงที่ที่ขานั้น ส่วนค่า 255 จะทำให้เกิด 5 โวลท์คงที่ที่ขานั้นเช่นกัน สำหรับค่าระหว่าง 0 - 255 ขาจะเปลี่ยนไปเป็นค่าที่อยู่ระหว่าง 0 และ 5 โวลท์ ค่ายิ่งมากแรงดันที่ปรากฏก็ยิ่งเข้าไกล้ HIGH(5 โวลท์) ตัวอย่างเช่น ค่า 64 จะทำให้เกิด 0 โวลท์เป็นสามในสี่ของเวลาทั้งหมด และเป็น 5 โวลท์หนึ่งในสี่ที่เหลือ ถ้าค่าที่เขียนคือ 128 จะทำให้เกิด 0 ครึ่งหนึ่งของคาบเวลาและ 255 อีกครึ่งคาบเวลา ถ้าเป็นค่า 192 จะทำให้เกิด 0 โวลท์หนึ่งในสี่และ 5 โวลท์ สามในสี่ของคาบเวลา

เนื่องจากคำสั่งนี้เป็นคำสั่งให้ hardware ในตัวไอซีทำงาน ขาไอซีจะผลิตคลื่นที่มีคาบเวลาตามค่าที่เขียนอย่างคงที่หลังจากทำคำสั่ง analogWrite ไปเรื่อยๆ จนกระทั่งมีการเรียกใช้คำสั่ง analogWrite ครั้งใหม่ (หรือการเรียกใช้คำสั่ง digitalRead หรือ digitalWrite บนขาไอซีขาเดียวกัน)

?

หมายเหตุ: ขา Analog ไม่เหมือนกับ ขา digital, ไม่ต้องกำหนดตอนเริ่มต้นว่าเป็น INPUT หรือ OUTPUT

?

ตัวอย่างต่ไปนี้ อ่านค่า analog จากขา analog input pin, เปลี่ยนค่าที่อ่านได้ด้วยการหาร 4 และส่งค่าที่ได้เป็นค่า PWM ออกทางขา PWM

?

int led = 10; // LED with 220 resistor on pin 10

int pin = 0; // potentiometer on analog pin 0

int value; // value for reading

void setup(){} // no setup needed

void loop()

{

value = analogRead(pin); // sets 'value' equal to 'pin'

value /= 4; // converts 0 - 1023 to 0 - 255

analogWrite(led, value); // outputs PWM signal to led

}

?

delay(ms)

คำสั่งนี้จะหยุดการทำงานของโปรแกรมเป็นเวลาตามที่กำหนดเป็นมิลลิวินาที ซึ่ง 1000 วินาทีเท่ากับ 1 วินาที

?

delay(1000); // waits for one second

?

millis()

คำสั่งนี้จะได้ผลลัพท์ค่าเวลาเป็นมิลลิวินาทีแสดงค่าที่ Arduino board1 เริ่มต้นทำโปรแกรมปัจจุบัน ค่าที่ได้เป็นค่า unsigned long ขนาด 32 bit

?

value = missis(); // sets 'value' equal to missis()

?

หมายเหตุ: ถ้า run โปรแกรมอย่างต่อเนื่องตัวเลขจำนวนนี้จะมีค่าย้อนกลับเป็นศูนย์ หลังจากเวลาผ่านไปประมาณ 9 ชั่วโมง

?

min(x,y)

?

คำสั่งนี้คำนวนหาค่าที่น้อยกว่าของค่าที่ให้มาในวงเล็บและคืนค่าที่น้อยก่วา

?

value = min(value, 100); // sets 'value to the smaller of 'value' or 100, ensureing that

// it never gets above 100.

?

max(x,y)

?

คำสั่งนี้คำนวนหาค่าที่มากกว่าของค่าที่ให้มาในวงเล็บและคืนค่าที่มากกว่า

?

value = max(value, 100); // sets 'value to the larger of 'value' or 100, ensureing that

// it is at least 100.

?

randomSeed(seed)

กำหนดค่าเริ่มต้นของฟังชั่น random

?

randomSeed(value); // sets 'value' as the random seed

เนื่องจาก Arduino ไม่สามารถสร้างตัวเลขสุ่มได้เอง คำสั่ง randomSeed จะอนุญาตให้เราใส่ค่าตัวแปร, ค่าคงที่, หรือค่าจากฟังชั่นอื่นลงไปในฟังชั่น random เพื่อให้มันสามารถสร้างตัวเลขสุ่มได้อย่างมีประสิทธิภาพ ค่าจากฟังชั่นที่จะไส่ลงไปมีทั้งค่าจาก millis() หรือ analogRead() เป็นต้น

?

random(max)

random(min, max)

เป็นฟังชั่นที่ให้ค่าตัวเลขสุ่มที่มีค่าตัวเลขระหว่างตัวเลขจ้อยกับตัวเลขมากที่กำหนด

?

value = random(100, 200); // sets 'value' to a random number between 100-200

?

หมายเหตุ: ควรใช้คำสั่งนี้หลังจากใช้คำสั่ง randomSeed()

?

ตัวอย่างต่อไปนี้จะสร้างตัวเลขสุ่มมีค่าระหว่าง 0 - 255 และส่งตัวเลขสุ่มนี้ไปสร้างสัญญาณ PWM ออกไปที่ขา PWM

?

int randNumber; // variable to store the random value

int led = 10; // LED with 220 resistor on pin 10

void setup(){} // no setup needed

void loop()

{

randomSeed(millis()); // sets millis() asa seed

randNumber = random(255); // random number from 0 - 255

analogWrite(led, randNumber); // outputs PWM signal

delay(500); // pauses for half a second

}

?

Serial.begin(rate)

คำสั่งนี้จะเปิดพอร์ท serial และตั้งค่าความเร็วในการรับส่ง ปกติการติดต่อกับเครื่องพีซีจะตั้งไว้ที่ ความเร็ว 9600 แม้ว่ามันสามารถรับส่งได้ที่ความเร็วมากกว่านี้ก็ตาม

?

void setup()

{

Serial.begin(9600); // opens serial port set data rate to 9600 bps

}

หมายเหตุ: เมื่อใช้พอร์ทสำหรับการติดต่อ serial communication ,ขา digital pin 0 (RX) และ digital pin 1 (TX) จะนำไปใช้งานอย่างอื่นไมได้

?

Serial.println(data)

คำสั่งนี้จะส่งข้อมูลให้กับ serial port, ตามด้วยขึ้นบรรทัดใหม่โดยอัตโนมัติ คำสั่งนี้จะมีผลเหมือนกับคำสั่ง Serial.print() แต่สามารถดูข้อมูลได้ที่ Serial monitor ได้ด้วย

?

Serial.println(analogvalue); // sends the value of 'analogValue'

?

หมายเหตุ: ข้อมูลเพิ่มเติมของการใช้ ฟังชั่น Serial.println() และ Serial.print() ดูได้จากเวบไซด์ Aruduino

?

ตัวอย่างต่อไปนี้เป็นคำสั่งอ่านค่าจากขา analog pin 0 และส่งข้อมูลให้กับเครื่องคอมพิวเตอร์ทุกๆ 1 วินาที

?

viod setup()

{

Seral.begin(9600); // sets serial to 9600 bps

}

void loop()

{

Seral.println(analogRead(0)); // sends analog value

delay(1000); // pauses for 1 second

}

?

?


?

Appendix

?


?