Unicon 77
ทางผูจัดทําโปรแกรม Arduino IDE ไดจัดเตรียมฟงกชั่นพื้นฐาน เชน ฟงกชั่นเกี่ยวกับขาพอรตอินพุต เอาตพุตดิจิตอล, อินพุตเอาตพุตอะนาลอก เปนตน ดังนันในการเขี ้ ยนโปรแกรมจึงเรียกใชฟงกชันเหล ่ านีได ้ ทันที โดยไมตองใชคําสั่ง #include เพื่อผนวกไฟลเพิ่มเติมแตอยางใด นอกจากฟงกชันพื ่ นฐานเหล ้ านีแล ้ ว นักพัฒนาทานอืนๆ ่ ทีร่ วมในโครงการ Arduino นีก็้ ไดเพิมไลบรารี ่ ่ ด #include อืนๆ ่ เชน ไลบรารีควบคุมมอเตอร, การติดตอกับอุปกรณบัส I2C ฯลฯ ในการเรียกใชงานตองเพิมบรรทั เพือผนวกไฟล ่ ทีเหมาะสมก ่ อน จึงจะเรียกใชฟงกชันได ่ ในบทนี้จะอธิบายถึงการเรียกใชฟงกชั่นและตัวอยางโปรแกรมสําหรับทําการทดลอง โดยใชบอรด Unicon สําหรับวิธีการทดลองสามารถดูไดจากบทที่ 2 ของหนังสือเลมนี้
4.1.1 คําอธิบายและการเรียกใชฟงกชัน่ 4.1.1.1 pinMode(pin,mode) ใชกําหนดขาพอรตใดๆ ใหเปนพอรตดิจิตอล พารามิเตอร pin - หมายเลขขาพอรตของโมดูล POP-MCU (คาเปน int) ้ mode - โหมดการทํางานเปน INPUT หรือ OUTPUT (คาเปน int) ตองใชตัวพิมพใหญเทานัน ตัวอยางที่ 4-1 int ledPin = 31; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
// LED connected to Di pin 31
// sets as output
// // // //
LED on waits for a second LED off waits for a second
78
Unicon
4.1.1.2 digitalWrite(pin,value) สังงานให ่ ขาพอรตทีระบุ ่ ไวมีคาสถานะเปนลอจิกสูง (HIGH หรือ “1”) หรือลอจิกตํ่า (LOW หรือ “0”) พารามิเตอร pin - ขาพอรตของโมดูล POP-MCU value - มีคา HIGH หรือ LOW ตัวอยางที่ 4-2 int ledPin = 31; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(300); digitalWrite(ledPin, LOW); delay(300); }
// LED connected to Di pin 31
// sets as output
// // // //
LED on waits for 0.3 second LED off waits for 0.3 second
กําหนดใหขา 31 เปน HIGH (มีลอจิกเปน “1”) หนวงเวลา 1 วินาที แลวจึงสั่งใหขา 13 กลับเปน LOW (มีลอจิกเปน “0”) อีกครั้ง
4.1.1.3 int
digitalRead(pin)
อานคาสถานะของขาที่ระบุไววามีคาเปน HIGH หรือ LOW พารามิเตอร ่ องการอานคา ซึงต ่ องเปนขาพอรตดิจิตอล ทําใหมีคาไดจาก 0 ถึง 31 หรือเปนตัว pin - ขาพอรตทีต แปรทีมี่ คาอยูในช วง 0 ถึง 31 ก็ได คาทีส่ งกลับ เปน HIGH หรือ LOW ตัวอยางที่ 4-3 int ledPin = 31; int inPin = 7; int val = 0; void setup() { pinMode(ledPin, OUTPUT); pinMode(inPin, INPUT); } void loop() { val = digitalRead(inPin); digitalWrite(ledPin, val); }
// LED connected to Di pin 13 // pushbutton connected to digital pin 7 // variable to store the read value
// sets Di 31 as output // sets Di 7 as input
// read input pin // sets the LED to the button’s value
กําหนดใหขา 7 เปนอินพุต สถานะของ LED ทีขา ่ 31 จะเปลียนแปลงตามสถานะของอิ ่ นพุตขา 7
Unicon 79
4.1.2 การทดลองใชงานพอรตเอาตพุตดิจิตอลของ Unicon 4.1.2.1 คุณสมบัติของขาพอรตเอาตพุต สําหรับขาพอรตทีกํ่ าหนดใหเปนเอาตพุตผานทางฟงกชั่น pinMode() จะมีสถานะเปนอิมพีแดนซตํา่ ทําใหสามารถจายกระแสใหกับวงจรภายนอกไดสูงถึง 20mA ซึงเพี ่ ยงพอสําหรับขับกระแสให LED สวาง (อยา ลืมตอตัวตานทานอนุกรมดวย) หรือใชกับตัวตรวจจับตางๆ ได แตไมเพียงพอสําหรับขับรีเลย โซลีนอยด หรือ มอเตอร กอนทีจะใช ่ งานขาดิจิตอลของ Unicon จะตองสั่งกอนวาใหขา Di นีทํ้ าหนาที่เปนอินพุตหรือเอาตพุต ในหัวขอนีจะทดลองต ้ อเปนเอาตพุต ถากําหนดใหเปนเอาตพุตสามารถรับหรือจายกระแสไดสูงสุดถึง 20 mA ซึงเพี ่ ยงพอสําหรับขับ LED
4.1.2.2 การกําหนดโหมดของขาพอรต กอนใชงานตองกําหนดโหมดการทํางานของขาพอรตดิจิตอล ใหเปนอินพุตหรือเอาตพุต กําหนดไดจาก ฟงกชัน่ pinMode()มีรูปแบบดังนี้ pinmode(pin,mode);
เมื่อ pin คือ หมายเลขขาทีต่ องการ Mode คือ โหมดการทํางาน (INPUT หรือ OUTPUT) หลั งจากที่ กําหนดให เป นเอาต พุ ตแล วเมื่ อต องการเขี ยนค าไปยั งขานั้ นๆ ให เรี ยกใช ฟ งกชั่ น digitalWrite() โดยมีรูปแบบดังนี้ digitalWrite(pin,value);
เมื่อ pin คือหมายเลขขาทีต่ องการ value สถานะลอจิกที่ตองการ (HIGH หรือ LOW)
4.1.2.3 ตัวอยางโปรแกรมสั่งให LED กะพริบ ในการทดลองเกียวกั ่ บไมโครคอนโทรลเลอรเรื่องแรก ก็คือ การสั่งใหพอรตทํางานเปนเอาตพุต และ สังให ่ มีคาเปน HIGH หรือ LOW ไดตามที่ตองการ โดยจะตอกับ LED และสั่งให LED ติดดับตอเนืองกั ่ นตลอด เวลา เรียกวา ไฟกะพริบ ในการทดลองขับ LED อยางงาย ไดยกตัวอยางไฟล Blink31 ซึงมี ่ ตัวอยางในโปรแกรม Arduino IDE อยูแลว ในตัวอยางนี้จะนําโปรแกรม Blink31.ino มาประยุกต สั่งเอาตพุตของ Unicon ควบคุม LED สองดวง ใหติดดับสลับกัน เริมต ่ นดวยการตอวงจรสวนของ LED ดังรูปที่ 4-1 (ก) ในรูปจะตอวงจรให LED ทํางานที่ลอจิก 1 คือเมือ่ สังให ่ ขาเปน HIGH จะทําให LED ติด เมือสั ่ งให ่ ขาเปน LOW หลอดจะดับ ในการตอ LED สําหรับบอรด Unicon สามารถใชแผงวงจร ZX-LED ตอตรงกับจุดตอของพอรตไดทันที ดังแสดงในรูปที่ 4-1 (ข) เมื่อตออุปกรณแลว ใหเขียนโปรแกรมตามโปรแกรมที่ 4-1 ทดลองคอมไพล อัปโหลดลงบอรด Unicon ศึกษาผลการทํางาน
80
Unicon
/* Basic code for turn on LED1 and turn off LED2 for 1 second, * then off LED1 and on LED2 for one second, and so on... * File : TwoLED_Blink.ino */ #define LED1_PIN 11 #define LED2_PIN 13
// LED1 connected to digital pin 11 // LED2 connected to digital pin 13
void setup() { pinMode(LED1_PIN, OUTPUT); pinMode(LED2_PIN, OUTPUT); }
// Run once at startup // Call function pinMode to set Di 11 as OUTPUT // Call function pinMode to set Di 13 as OUTPUT
void loop() { digitalWrite(LED1_PIN, digitalWrite(LED2_PIN, delay(1000); digitalWrite(LED1_PIN, digitalWrite(LED2_PIN, delay(1000); }
// run over and over again HIGH); // Turn on LED1 LOW); // Turn off LED2 // wait 1 second (1000 milisecond) LOW); // Turn off LED1 HIGH); // Turn on LED2
โปรแกรมที่ 4-1 ไฟล TwoLED_Blink.ino โปรแกรมภาษา C ของ Arduino ควบคุมใหบอรด Unicon ขับ LED 2 ดวงกะพริบสลับกัน ZX-LED LED 510 KRC102 S
+
เชื่อมตอดวยสาย JST3AA-8
1
ZX-LED LED 510
Unicon port
KRC102
13
11
S
+
เชื่อมตอดวยสาย JST3AA-8 R2 510 LED2 LED1
ตอวงจรลงบนเบรดบอรด
R1 510
รูปที่4-1 วงจรทดลองดิจิตอลเอาตพุต สังให ่ LED 2 ดวงกะพริบสลับกัน
Unicon 81
ในโปรแกรมตัวอยางที่ 4-1 บรรทัด #define LED1_PIN 11 คือการกําหนดคาคงที่ใหขอความ LED1_PIN มีคาเทากับ 11 หลังจากบรรทัดนี้ในโปรแกรมเมื่อพบขอความ LED1_PIN ใหนําคา 11 ไปแทนที่ แลวจึงคอมไพลโปรแกรม เมื่อโปรแกรมทํางานไดแลว ทดลองแกไขโปรแกรมเพือเปลี ่ ่ยนตําแหนงขาเอาตพุตทีต่ อกับ LED โดย เปลี่ยนคาตัวเลขของบรรทัด #define LED1_PIN 11 เปนคาอื่นๆ ระหวาง 2 ถึง 30 บรรทัด delay(1000); เปนการเรียกใชฟงกชั่น delay() โดยสงคา 1000 ใหกับฟงกชั่น เพื่อให เกิดการหนวงเวลา 1000 มิลลิวินาที (ms) หรือ 1 วินาที ถาตองการปรับให LED กะพริบเร็วขึนหรื ้ อชาลง สามารถ เปลี่ยนคาในวงเล็บเปนคาอื่นๆ ได โดยคายิ่งมาก LED ยิ่งกะพริบชาลง
4.1.2.4 ตัวอยางโปรแกรมไฟวิง่ LED 4 ดวง ในตัวอยางนีจะนํ ้ าบอรด Unicon มาตอควบคุม LED จํานวน 4 ตัว โดยสังให ่ LED ติดตามลําดับ เริมจาก ่ LED1 ไปยัง LED4 แลววนกลับมาเริมที ่ ่ LED1 ตอเนืองตลอดเวลา ่ โดยมีวงจรการตอดังรูปที่ 4-2 และมีโปรแกรม ดังแสดงในโปรแกรมที่ 4-2 ZX-LED LED 510
17
KRC102 + S
ZX-LED LED 510 KRC102 + S
16 1
15 ZX-LED LED 510 KRC102 + S
14
ตอวงจรลงบนเบรดบอรด
14
15
16
17
ZX-LED LED
Unicon port
510
R1-R4 510 x4
KRC102 + S
R4
R3
R2
R1
LED4 LED3 LED2 LED1
รูปที่ 4-2 วงจรไฟวิง่ 4 ดวง
82
Unicon
/* * Code for turn on and off LED1, LED2, LED3, LED4, and so on.. * File : FourLED_Moving.ino */ #define #define #define #define
LED1_PIN LED2_PIN LED3_PIN LED4_PIN
14 15 16 17
void setup() { pinMode(LED1_PIN, pinMode(LED2_PIN, pinMode(LED3_PIN, pinMode(LED4_PIN, }
// // // //
LED1 LED2 LED3 LED4
connected connected connected connected
to to to to
digital digital digital digital
pin pin pin pin
14 15 16 17
// Run once at startup OUTPUT); OUTPUT); OUTPUT); OUTPUT);
// // // //
Set Set Set Set
Digital Digital Digital Digital
void loop() // run over { digitalWrite(LED1_PIN, HIGH); // Turn on delay(200); // wait for digitalWrite(LED1_PIN, LOW); // Turn off delay(200);
pin pin pin pin
14 15 16 17
as as as as
OUTPUT OUTPUT OUTPUT OUTPUT
and over again LED1 a 0.2 second. (200 ms) LED1
digitalWrite(LED2_PIN, HIGH); // Turn on LED2 delay(200); // wait for a 0.2 second. (200 ms) digitalWrite(LED2_PIN, LOW); // Turn off LED2 delay(200); digitalWrite(LED3_PIN, HIGH); // Turn on LED3 delay(200); // wait for a 0.2 second. (200 ms) digitalWrite(LED3_PIN, LOW); // Turn off LED3 delay(200); digitalWrite(LED4_PIN, HIGH); // Turn on LED1 delay(200); // wait for a 0.2 second. (200 ms) digitalWrite(LED4_PIN, LOW); // Turn off LED1 delay(200); }
โปรแกรมที่ 4-2 ไฟล FourLED_Moving.ino โปรแกรมภาษา C/C++ ของ Arduino เพื่อควบคุมไฟวิง่ LED 4 ดวง การทํางานของโปรแกรมนีเริ ้ ่มดวยการสั่งให LED1 ติด 0.2 วินาที ดับ 0.2 วินาที แลวสังให ่ LED2 ติด 0.2 วินาที ดับ 0.2 วินาที ตามดวย LED3 และ LED4 ติดและดับเปนลําดับวนตอเนืองตลอดเวลา ่ จากโปรแกรมสังให ่ LED ติดตามลําดับดังโปรแกรมที่ 4-2 นํามาเขียนใหม โดยใชตัวแปรอะเรย จะได เปนโปรแกรมที่ 4-3 ผลการทํางานเหมือนกัน แตโปรแกรมที่ 4-3 จะกระชับและเมือคอมไพล ่ แลวไดไฟลภาษา เครืองที ่ ่มีขนาดเล็กกวา
Unicon 83 /* * Code for turn on and off LED1, LED2, LED3, LED4, and so on.. * Same as MovingLED1 but used array. * File : MovingLED_Array.ino * By : Opas Sirikunchittavorn */ #define DELAY_TIME 200 int led_pin[]={14,15,16,17}; int count; void setup() // Run once at startup { for(count=0; count<4; count++) pinMode(led_pin[count], OUTPUT); // Call function pinMode to set Digital pin 14,15,16,17 as OUTPUT } void loop() // run over and over again { for(count=0; count<4; count++) { digitalWrite(led_pin[count], HIGH); // Turn on LED delay(DELAY_TIME); // wait for a 0.2 second. (200 ms) digitalWrite(led_pin[count], LOW); // Turn off LED delay(DELAY_TIME); } }
โปรแกรมที่ 4-3 ไฟล MovingLED_Array.ino โปรแกรมภาษา C/C++ ของ Arduino เพือควบคุ ่ มไฟวิง่ LED แบบใชตัวแปรอะเรย
4.1.3 การทดลองอินพุตดิจิตอลของ Unicon 4.1.3.1 คุณสมบัติของขาพอรตอินพุต ขาพอรตของ Unicon จะถูกกําหนดเปนอินพุตตังแต ้ เริมต ่ น จึงไมจําเปนตองใชฟงกชัน่ pinMode() ใน การกําหนดใหเปนอินพุต ขาพอรตทีถู่ กกําหนดเปนอินพุตจะมีสถานะเปนอิมพีแดนซสูง ทําใหมีความตองการ กระแสไฟฟาจากอุปกรณทีต่ องการอานคาอินพุตนอยมาก ทําใหไมสามารถรับหรือจายกระแสใหกับวงจรภายนอก ทําใหนําขาทีเป ่ นอินพุตนีไปใช ้ งานบางประเภท เชน สรางตัวตรวจจับการสัมผัสทีอาศั ่ ยการวัดคาความจุไฟฟา สําหรับขาอินพุต เมื่อไมมีอินพุตปอนใหจะตองกําหนดคาแรงดันใหแนนอน ทําไดโดยตอตัวตานทาน พูลอัป (pull-up resistor) โดยตอขาของตัวตานทานขาหนึงไปยั ่ งไฟเลี้ยง หรือตอพูลดาวน (pull- down) ซึงต ่ อขา หนึงของตั ่ วตานทานจากขาพอรตลงกราวด คาตัวตานทานที่ใชทั่วไปคือ 10k ดังรูปที่ 4-3 Unicon มีขาพอรตดิจิตอลที่กําหนดใหเปนอินพุตหรือเอาตพุตจํานวน 25 ขา ถาตองการกําหนดเปน ่ รูปแบบดังนี้ อินพุตตองกําหนดดวยฟงกชั่น pinMode และอานคาอินพุตไดจากฟงกชั่น digitalRead ซึงมี digitalRead(pin);
เมื่อ pin คือหมายเลขขาทีต่ องการอานคาสถานะ เมือฟ ่ งกชันทํ ่ างาน จะคืนคาเปนสถานะของขาทีต่ องการอานคา โดยคืนคาเปน LOW (คาเปน “0”) หรือ HIGH (คาเปน “1”)
84
Unicon
+Vcc
ปกติเปนลอจิกต่ํา (LOW หรือ "0") Rpull-up Di
INPUT
Di
Rpull-down
ปกติเปนลอจิกสูง (HIGH หรือ "1")
(ก) การตอตัวตานทานพูลอัป
INPUT
(ข) การตอตัวตานทานพูลดาวน
รูปที่ 4-3 แสดงการตอตัวตานทานเพือกํ ่ าหนดสภาวะของขาพอรตอินพุตของไมโครคอนโทรลเลอร ในขณะทียั่ งไมมีอินพุตสงเขามา +Vcc
20k
สั่งใหตอตัวตานทาน พูลอัปภายในดวยคําสั่ง digitalWrite(pin, HIGH) Di
Digital input port
รูปที่ 4-4 แสดงการตอตัวตานทานพูลอัปภายในทีขาพอร ่ ตอินพุตดิจิตอลของ POP-MCU ซึงควบคุ ่ มได ดวยกระบวนการทางซอฟตแวร ภายในขาพอรตของไมโครคอนโทรลเลอร ATmega32U4 ซึงเป ่ นไมโครคอนโทรลเลอรหลักของ Unicon จะมีการตอตัวตานทานพูลอัปคา 20k เตรียมไวให ซึงสามารถสั ่ งต ่ อใชงานผานทางซอฟตแวร ดังใน รูปที่ 4-4 สําหรับตัวอยางโปรแกรมเพื่อใชงานมีดังนี้ ตัวอยางที่ 4-4 pinMode(pin, INPUT); digitalWrite(pin, HIGH);
// set pin to input // turn on pullup resistors
Unicon 85
4.1.3.2 ทดลองรับคาสวิตชอยางงาย
Bi-color LED
510
1
เชื่อมตอดวยสาย JST3AA-8
ZX-LED LED 510
Unicon port
KRC102
11
7
S
+
เชื่อมตอดวยสาย JST3AA-8 R1 510
LED1
R2 10k +5V
ตอวงจรลงบนเบรดบอรด
S1
รูปที่ 4-5 วงจรทดสอบการทดลองดิจิตอลอินพุต
ZX-SWITCH
HIGH
S
S
+
+
LOW
10k
G
R
SW.
ในการทดลองนี้จะทดลองอานคาสถานะของสวิตชแบบกดติดปลอยดับ เพื่อควบคุมหลอด LED เมื่อ กดสวิตช S1 ทําให LED1 ติดสวาง เมื่อปลอยสวิตช LED1 จะดับ โดยมีวงจรแสดงไดดังรูปที่ 4-5 และเขียนเปน โปรแกรมไดดังโปรแกรมที่ 4-4 ในการใชงานขาอินพุตดิจิตอลตองตอตัวตานทานพูลอัป (ตอตัวตานทานจากไฟเลียง ้ +5V มายังขาอินพุต) เพือกํ ่ าหนดสถานะทีแน ่ นอนใหกับขาอินพุตในภาวะทีไม ่ มีการกดสวิตช ดังวงจรในรูปที่ 4-5 โดยตอขา 7 ผานตัว ้ +5V เมือไม ่ ไดกดสวิตช SW1 ทีขา ่ 7 จะมีสถานะเปนลอจิกสูงหรือ HIGH หรือ ตานทานคา 10k ไปยังไฟเลียง “1” เมือกดสวิ ่ ตช จะทําใหขา 7 ตอลงกราวด อานคาสถานะเปนลอจิกตําหรื ่ อ LOW หรือ “0”
86
Unicon
/* * Read input from push button for control status of LED. * Modify from Button (http://www.arduino.cc/en/Tutorial/Button) * File : Button_LED.ino * By : Opas Sirikunchittavorn */ #define LED_PIN #define IN_PIN int val = 0;
11 7
void setup() { pinMode(LED_PIN, OUTPUT); pinMode(IN_PIN, INPUT); } void loop() { val = digitalRead(IN_PIN); if (val == LOW) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } }
// choose the pin for the LED // choose the input pin (for a pushbutton) // variable for reading the pin status
// declare LED as output // declare pushbutton as input
// read input value // check the input as LOW (button pushed) // turn LED ON
// turn LED OFF
โปรแกรมที่ 4-4 ไฟล Button_LED.ino โปรแกรมภาษา C ของ Arduino สําหรับอานคาอินพุตจากสวิตช แบบปุมกดเพื อควบคุ ่ ม LED การทํางานของ LED1 จะตรงขามกับสถานะของสวิตชคือ เมือไม ่ กดสวิตช จะอานสถานะของขา 7 ได ลอจิกสูง จึงตองสังให ่ ขา 11 เปนลอจิกตําหรื ่ อ “0” เพือทํ ่ าให LED1 ดับ เมือกดสวิ ่ ตช อานคาสถานะของขา 7 ไดลอจิก “0” ตองสังให ่ ขา 11 เปน “1” เพือขั ่ บ LED1 ติดสวาง เมือโปรแกรมทํ ่ างานไดผลตามทีต่ องการแลว ใหทดลองถอดตัวตานทานพูลอัปคา 10k ออก เพือให ่ ขา 7 ลอย สังเกตกรณีนี้ เมื่อยังไมมีการกดสวิตช LED1 อาจติดกะพริบดวยความเร็วสูง เห็น LED สวางเรื่อๆ เนือง ่ จากสถานะของขา Di7 เปน “0” และ “1” สลับกันไมแนนอน
4.1.3.3 โปรแกรมแกปญหาสัญญาณรบกวนในการกดสวิตชโดยใชซอฟตแวร ในหัวขอนีจะทดลองเขี ้ ยนโปรแกรมรับคาของสวิตช ซึงเป ่ นแบบกดติดปลอยดับ ใหมีการทํางานเปนแบบ กดติดกดดับคือ เมือเริ ่ มต ่ นโปรแกรม LED ดับอยู เมือกดสวิ ่ ตช LED จะติดสวางเมือกดสวิ ่ ตชอีกครัง้ LED จะดับ สลับกันไปมาตลอดเวลา โดยวงจรทีใช ่ ยังเปนวงจรจากรูปที่ 4-5 โดยทั่วไปแลว สวิตชที่ใชจะเปนสวิตชทางกลที่ประกอบดวยหนาสัมผัสโลหะ ในการกดสวิตชใหตอ วงจร พบวาหนาสัมผัสของสวิตชจะไมสัมผัสกันสนิททันที โดยมีชวงเวลาที่เริ่มสัมผัส และหลุดเปนชวงเวลา สันๆ ้ กอนทีหน ่ าสัมผัสของสวิตชจะตออยางสมบูรณ และเมื่อวัดสัญญาณที่ไดจากสวิตชพบวา ระดับสัญญาณ
Unicon 87
+5V
+5V
R1 10k
S1
+5V
R1 10k
PORT
R1 10k
PORT
S1
PORT
S1
+5V
+5V
+5V
0V
0V
0V
สัญญาณรบกวนที่เกิดขึ้น จากการกดสวิตช
สัญญาณรบกวนที่เกิดขึ้น จากการปลอยสวิตช
รูปที่ 4-6 แสดงการเกิดสัญญาณรบกวนเมือมี ่ การกดและปลอยสวิตชในวงจรดิจิตอล มีการสันที ่ เรี่ ยกวา เบาซ (bounce) อยูชั วขณะดั ่ งแสดงในรูปที่ 4-6 โดยระยะเวลาทีสั่ ญญาณเกิดการเบาวซนีมี้ ระยะ เวลาตังแต ้ ไมกีมิ่ ลลิวินาที (ms) ไปจนถึงหลายสิบมิลลิวินาทีขึนกั ้ บประเภทของสวิตชที่ใช การแกปญหาทีระดั ่ บสัญญาณเกิดการสันนี ่ เรี้ ยกวา การดีเบาซ (debounce) หลักการแกไขสัญญาณรบกวน แบบนีคื้ อ หนวงเวลาการเกิดขึนของสั ้ ญญาณพัลสเล็กนอย เพือให ่ วงจรไมสนใจสัญญาณทีเกิ่ ดขึนในช ้ วงเริมต ่ นกดสวิตช ซึงทํ ่ าไดหลายวิธี เชน วิธีการแรก ทําไดโดยใชอุปกรณอิเล็กทรอนิกสพืนฐานอย ้ างตัวตานทานและตัวเก็บประจุ โดยตอกันใน ลักษณะวงจร RC อินติเกรเตอร ดังในรูปที่ 4-7 ดวยวิธีการนี้จะชวยลดผลของสัญญาณรบกวนทีเกิ ่ ดขึ้นจากการ กดสวิตชไดในระดับหนึง่ โดยประสิทธิภาพของวงจรจะขึนกั ้ บการเลือกคาของตัวตานทานและตัวเก็บประจุ หากเลือกคาของตัวเก็บประจุนอยเกินไป อาจไมสามารถลดสัญญาณรบกวนได แตถาเลือกคามากเกินไป จะทําใหความไวในการตรวจจับการกดสวิตชลดลง นันคื ่ อ อาจตองกดสวิตชมากกวา 1 ครั้งเพื่อใหไดสัญญาณ ที่ตองการ +5V R1 10k S1
R2 C1
R3
PORT
วงจร RC อินติเกรเตอร
รูปที่ 4-7 การตอวงจร RC อินติเกรเตอรเพือแก ่ ไขปญหาสัญญาณรบกวนจากการกดสวิตช
88
Unicon
หรื อถาแกโดยใชไมโครคอนโทรลเลอรจะสามารถแกไขไดกระบวนการทางซอฟตแวร โดยเขียน โปรแกรมให ตรวจจับการเปลียนแปลงระดั ่ บลอจิกของสวิตช ถาพบวามีการเริ่มกดสวิตช ก็คือระดับลอจิก เปลี่ยนจาก “1” เปน “0” โปรแกรมจะหนวงเวลารอจนเลยชวงเวลาเกิดเบาซของสวิตช เมื่อเลยเวลาแลวใหทํา การอานคาสถานะของสวิตชอีกครั้งถายังคงเปน “0” แสดงวา กดสวิตชสมบูรณแลว ระยะเวลาทีต่ องหนวงเวลาหาไดจากการใชออสซิลโลสโคปวัดระดับสัญญาณ หรือใชการทดลองปอน คาหนวงเวลา แลวปรับคาจนกระทังได ่ คาทีแก ่ ปญหาการเบาวซของสวิตชไดอยางสมบูรณ ในโปรแกรมทดลอง ที่ 4-5 ไดทดลองโดยใชคาของการหนวงเวลาเทากับ 10 มิลลิวินาที ซึงสามารถเปลี ่ ่ยนไดที่บรรทัด #define DEBOUNCE 10
ในการทดลองถาใช ZX-SWITCH จะตองเลือกขัวต ้ อที่เขียนวา LOW ซึงเมื ่ ่อยังไมกดสวิตชจะใหเอาต พุตเปนลอจิกสูงหรือ HIGH หรือ “1” เมื่อมีการกดสวิตชจะใหเอาตพุตเปนลอจิกตํ่าหรือ LOW หรือ “0” เมื่อ รันโปรแกรม LED จะเปลี่ยนสถานะเปนตรงขามในทุกครั้งที่กดสวิตช ดังแสดงการทํางานในรูปที่ 4-8 ZX-SWITCH
กดสวิตชเพื่อเปลี่ยน สถานะของ LED S
S
+
LOW
+
HIGH
1
S
+
ZX-LED
LED เปลี่ยนสถานะ เปนตรงขามทุกครั้ง ที่กดสวิตช
รูปที่ 4-8 การทดสอบอินพุตดิจิตอลของ Unicon เมือรั ่ นโปรแกรม DebounceSW.ino
Unicon 89 /* * Read input from push button for control status of LED. * Change operation of push button to togle switch. * File : DebouncedSW.ino * By : Opas Sirikunchittavorn */ #define IN_PIN 7 // the number of the input pin #define OUT_PIN 11 // the number of the output pin #define DEBOUNCE 10 // debounce time = 10 ms int state = HIGH; int reading; int previous = HIGH;
// the current state of the output pin // the current reading from the input pin // the previous reading from the input pin
void setup() { pinMode(IN_PIN, INPUT); pinMode(OUT_PIN, OUTPUT); digitalWrite(OUT_PIN, state); } void loop() { reading = digitalRead(IN_PIN); // if we just pressed the button (i.e. the input went from HIGH to LOW. if (reading == LOW && previous == HIGH) { delay(DEBOUNCE); // wait for decounce if(digitalRead(IN_PIN) == LOW) // if the input remain LOW state = !state; // invert the state of output LED digitalWrite(OUT_PIN, state); } previous = reading; }
โปรแกรมที่ 4-5 ไฟล DebounceSW.ino โปรแกรมภาษา C ของ Arduino อานคาสวิตชเพื่อควบคุม LED แบบมีการแกสัญญาณรบกวนจากการกดสวิตชหรือดีเบาซ
90
Unicon
ใชสําหรับสือสารข ่ อมูลระหวางฮารดแวร Arduino กับคอมพิวเตอรหรืออุปกรณอืนๆ ่ โดยจะแบงพอร ตสําหรับเชื่อมตอออกเปน 2 สวนคือ สวนแรกติดตอพอรตอนุกรมเสมือน (virtual COM port) จากการทํางาน ของสวนเชื่อมตอพอรต USB ฟงกชั่นทีใช ่ คือ Serial อีกสวนหนึงคื ่ อ ขาพอรตสื่อสารขอมูลอนุกรมโดยใชขา 0 (RxD) และ 1 (TxD) ฟงกชั่นของ Arduino ที่ใชคือ Serial1 ดังนันเมื ้ อเลื ่ อกใชงานเปนขาพอรตสื่อสารขอมูล อนุกรมแลว จะไมสามารถใชขาพอรต 0 และ 1 เปนพอรตดิจิตอลได ดังแสดงตําแหนงจุดตอพอรตเพื่อใชงาน ของบอรด Unicon ในรูปที่ 4-9
สวนสื่อสารขอมูลอนุกรม UART1 กระทําผาน ขา 0 (TxD) และขา 1 (RxD) ระดับสัญญาณเปนแบบทีทีแอล (0 และ +5V)
สวนสื่อสารขอมูลอนุกรม UART ชุดแรกกระทําผานพอรต USB โดยทํางานผาน พอรตอนุกรมเสมือน (virtual COM port)
1
รูปที่ 4-9 ตําแหนงจุดตอสัญญาณของบอรด Unicon ทีเกี ่ ยวข ่ องกับการทํางานของฟงกชันสื ่ อสารข ่ อมูล อนุกรม Serial และ Serial1 ของ Arduino1.0
Unicon 91
4.2.1 คําอธิบายและการเรียกใชฟงกชัน่ 4.2.1.1 Serial.begin(int
datarate)
กําหนดคาอัตราบอดของการรับสงขอมูลอนุกรมในหนวยบิตตอวินาที (bits per second : bps) ใชคา ตอไปนี้ 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 หรือ 115200 พารามิเตอร Int datarate ในหนวยบิตตอวินาที (baud หรือ bps) ตัวอยางที่ 4-5 void setup() { Serial.begin(9600);
// opens serial port, baudrate 9600 bps
}
เปนการเลือกอัตราบอดเทากับ 9600 บิตตอวินาที
4.2.1.2
int Serial.available()
ใชแจงวาไดรับขอมูลตัวอักษร (characters) แลว และพรอมสําหรับการอานไปใชงาน คาทีส่ งกลับจากฟงกชั่น จํานวนไบตทีพร ่ อมสําหรับการอานคา โดยเก็บขอมูลในบัฟเฟอรตัวรับ ถาไมมีขอมูลจะมีคาเปน 0 ถามี ขอมูลฟงกชันจะคื ่ นคาทีมากกว ่ า 0 โดยบัฟเฟอรสามารถเก็บขอมูลไดสูงสุด 128 ไบต ตัวอยางที่ 4-6 int incomingByte = 0; // for incoming serial data void setup() { Serial.begin(9600); // opens serial port, baud rate 9600 bps delay(5000); } void loop() { if (Serial.available() > 0) // send data only when you receive data: { incomingByte = Serial.read(); // read the incoming byte: Serial.print("I received: "); // say what you got: Serial.println(incomingByte, DEC); } }
ในตัวอยางนี้ ใชอัตราบอด 9,600 บิตตอวินาที เมื่อรันโปรแกรมจะตองเปดหนาตาง Serial Monitor เพื่อปอนขอมูลมายังบอรด Unicon ดวย ถามีขอมูลเขามาจะเก็บไวในตัวแปร incomingByte แลวนําไป แสดงที่หนาตาง Serial Monitor โดยตอทายขอความ I received : คาทีแสดงจะเป ่ นคาขอมูลในรูปของ เลขฐานสิบ ยกตัวอยาง หากปอนเลข 2 เขามา จะแสดงขอความ I received : 50 เนื่องจากรหัสแอสกี้ ของ 2 คือ 32 ฐานสิบหก เทากับ 50 ฐานสิบ
92
Unicon
4.2.1.3 int
Serial.read()
ใชอานคาขอมูลที่ไดรับจากพอรตอนุกรม คาทีส่ งกลับจากฟงกชั่น เปนเลข int ทีเป ่ นไบตแรกของขอมูลทีได ่ รับ (หรือเปน -1 ถาไมมีขอมูล) ตัวอยางที่ 4-7 int incomingByte = 0; // for incoming serial data void setup() { Serial.begin(9600); // opens serial port, baud rate 9600 bps delay(5000); } void loop() { if (Serial.available() > 0) // send data only when you receive data: { incomingByte = Serial.read(); // read the incoming byte: Serial.print("I received: "); // say what you got: Serial.println(incomingByte, DEC); } }
4.2.1.4 Serial.flush() ใชลางบัฟเฟอรตัวรับขอมูลของพอรตอนุกรมใหวาง
4.2.1.5 Serial.print(data) ใชสงขอมูลออกทางพอรตอนุกรม พารามิเตอร ่ ดเศษออกเปนเลขจํานวนเต็ม Data - เปนขอมูลเลขจํานวนเต็ม ไดแก char, int หรือเลขทศนิยมทีตั รูปแบบฟงกชั่น คําสั่งนี้สามารถเขียนไดหลายรูปแบบ Serial.print(b)
เปนการเขียนคําสั่งแบบไมไดระบุรูปแบบ จะพิมพคาตัวแปร b เปนเลขฐานสิบ โดยพิมพตัวอักษรรหัส ASCII ดังตัวอยาง int b = 79; Serial.print(b);
พิมพขอความ 79
Unicon 93 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 Serial.print(b, BYTE)
เปนคําสั่งพิมพคาตัวแปร b ขนาด 1 ไบต ดังตัวอยาง int b = 79; Serial.print(b, BYTE);
พิมพตัวอักษร O ซึงมี ่ คาตามตาราง ASCII เทากับ 79 ดูขอมูลจากตารางรหัสแอสกีเพิ ้ มเติ ่ ม Serial.print(str)
เปนคําสั่งพิมพคาขอความในวงเล็บ หรือขอความที่เก็บในตัวแปร str ดังตัวอยาง Serial.print(“Hello World!”);
พิมพขอความ Hello World พารามิเตอร b - ไบตขอมูลทีต ่ องการพิมพออกทางพอรตอนุกรม str - ตัวแปรสตริงทีเก็ ่ บขอความสําหรับสงออกพอรตอนุกรม
94
Unicon
ตัวอยางที่ 4-8 /* Analog input reads an analog input on analog in 0, prints the value out. created by Tom Igoe */ int analogValue = 0; // variable to hold the analog value void setup() { Serial.begin(9600); // open the serial port at 9600 bps: delay(5000); } void loop() { analogValue = analogRead(0); // read the analog input on pin 0: Serial.print(analogValue); // print it out in many formats: // print as an ASCII-encoded decimal Serial.print("\t"); // print a tab character Serial.print(analogValue, DEC); // print as an ASCII-encoded decimal Serial.print("\t"); // print a tab character Serial.print(analogValue, HEX); // print as an ASCII-encoded hexadecimal Serial.print("\t"); // print a tab character Serial.print(analogValue, OCT); // print as an ASCII-encoded octal Serial.print("\t"); // print a tab character Serial.print(analogValue, BIN); // print as an ASCII-encoded binary Serial.print("\t"); // print a tab character Serial.write(analogValue/4); // print as a raw byte value(divide the value by 4 because // analogRead() returns numbers from 0 to 1023, // but a byte can only hold values up to 255) Serial.print("\t"); // print a tab character Serial.println(); // print a linefeed character delay(10); // delay 10 milliseconds before the next reading }
ตัวอยางนี้แสดงการพิมพขอมูลจากฟงกชัน่ Serial.Print() และ Serial.write() ในรูป แบบตางๆ แสดงผานทางหนาตาง Serial Monitor เทคนิคสําหรับการเขียนโปรแกรม ่ อ คูณเลข Serial.print() จะตัดเศษเลขทศนิยมเหลื อเปนเลขจํานวนเต็ม ทางแกไขทางหนึงคื ทศนิยมดวย 10, 100, 1000 ฯลฯ ขึ้นอยูกับจํานวนหลักของเลขทศนิยม เพื่อแปลงเลขทศนิยมเปนจํานวนเต็ม กอนแลวจึงสงออกพอรตอนุกรม จากนั้นที่ฝงภาครับใหทําการหารคาทีรั่ บไดเพื่อแปลงกลับเปนเลขทศนิยม
Unicon 95
4.2.1.6 Serial.println(data) เปนฟงกชันพิ ่ มพ (หรือสง) ขอมูลออกทางพอรตอนุกรมตามดวยรหัส carriage return (รหัส ASCII หมาย ่ เกิดการเลือนบรรทั ่ ดและขึนบรรทั ้ ด เลข 13 หรือ \r) และ linefeed (รหัส ASCII หมายเลข 10 หรือ \n) เพือให ใหมหลังจากพิมพขอความ มีรูปแบบเหมือนคําสัง่ Serial.print() รูปแบบฟงกชั่น Serial.println(b)
เปนคําสังพิ ่ มพขอมูลแบบไมไดระบุรูปแบบ จะพิมพคาตัวแปรเปนเลขฐานสิบ ตามดวยรหัสอักษร carriage return และ linefeed Serial.println(b, DEC)
เปนคําสังพิ ่ มพคาตัวแปร b เปนตัวเลขฐานสิบ ตามดวยรหัสอักษร carriage return และ linefeed Serial.println(b, HEX)
เปนคําสังพิ ่ มพคาตัวแปร b เปนตัวเลขฐานสิบหก ตามดวยรหัสอักษร carriage return และ linefeed Serial.println(b, OCT)
เปนคําสังพิ ่ มพคาตัวแปร b เปนตัวเลขฐานแปด ตามดวยรหัสอักษร carriage return และ linefeed Serial.println(b, BIN)
เปนคําสังพิ ่ มพคาตัวแปร b เปนตัวเลขฐานสอง ตามดวยรหัสอักษร carriage return และ linefeed Serial.println(str)
พิมพคาในวงเล็บหรือขอความทีเก็ ่ บในตัวแปร str ตามดวยรหัสอักษร carriage return และ linefeed Serial.println()
เปนคําสั่งพิมพรหัส carriage return และ linefeed พารามิเตอร ่ องการพิมพออกทางพอรตอนุกรม b - ไบตขอมูลทีต str - ตัวแปรสตริงทีเก็ ่ บขอความสําหรับสงออกพอรตอนุกรม ตัวอยางที่ 4-9 int analogValue = 0; // void setup() { Serial.begin(9600); // delay(5000); } void loop() { analogValue = analogRead(0); // Serial.println(analogValue); // Serial.println(analogValue, DEC); // Serial.println(analogValue, HEX); // Serial.println(analogValue, OCT); // Serial.println(analogValue, BIN); // delay(10); }
variable to hold the analog value
open the serial port at 9600 bps:
read the print it print as print as print as print as
analog input on pin 0: out in many formats: an ASCII-encoded decimal an hexadecimal an ASCII-encoded octal an ASCII-encoded binary
96
Unicon
4.2.2 การทดลองใชงาน UART เพือติ ่ ดตอกับคอมพิวเตอร บอรด Unicon ติดตอกับคอมพิวเตอรเพือสื ่ อสารข ่ อมูลอนุกรมผานพอรต USB โดยใชพอรตอนุกรมเสมือน หรื อ virtual COM port ที่เกิดขึ้นจากการทํางานของสวนเชื่อมตอพอรต USB ของไมโครคอนโทรลเลอร ATmega32U4 และไดรเวอร โดยปกติแลวจะเชือมต ่ อพอรตอนุกรมเสมือนผานทางพอรต USB เพื่อติดตอกับ คอมพิ วเตอร ในการอั ปโหลดโปรแกรมเปนหลัก แตก็นํามาใชรับสงขอมูลจากโปรแกรมของผูใชงานกับ คอมพิวเตอรได
4.2.2.1 ฟงกชันที ่ ่เกี่ยวของกับการรับสงขอมูลผานพอรตอนุกรม Arduino1.0x มีฟงกชั่นเกี่ยวกับการรับสงขอมูลผานพอรตอนุกรมมาพรอมใชงาน ดังนี้ Serial.begin(speed) ใชกําหนดอัตราเร็วของการถายทอดขอมูลหรืออัตราบอดหรือบอดเรต Serial.available() ใชตรวจสอบวามี ขอมูลดานรับหรือไม โดยคืนคาเปน int ตามจํานวน ไบตขอมูลที่รับเขามา Serial.read(data) ใชอานคาขอมูลจากพอรตอนุกรม Serial.write(data) ใชเขียนขอมูลไบตไปยังพอรตอนุกรม Serial.flush() ใชลางบัฟเฟอรทั้งดานรับและสง Serial.print(data) ใชสงขอมูลออกพอรตอนุกรม Serial.println(data) ใชสงขอมูลออกพอรตอนุกรมพรอมกับขึ้นบรรทัดใหม
4.2.2.2 ตัวอยางโปรแกรมสงขอมูลออกพอรตอนุกรม เริมต ่ ยดวยการใชฟงกชัน่ Serial.begin() เพือสั ่ งเป ่ ดพอรตอนุกรมและกําหนดอัตราถายทอดขอมูล ที่ใชในการสื่อสารขอมูลหรืออัตราบอด มีรูปแบบการเขียนโปรแกรม ดังนี้ Serial.begin(speed);
เมื่อ speed คืออัตราบอดมีคา 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 หรือ 115200 บิตตอวินาที ปกติทีใช ่ คือ 9600 หลังจากเปดพอรต เมือต ่ องการสงขอมูลใหใชฟงกชัน่ Serial.print() หรือ Serial.println() ฟงกชันทั ่ งสองตั ้ วทํางานใหผลคลายกัน ตางกันทีเมื ่ อฟ ่ งกชัน่ Serial.println() สงขอมูลแลว จะขึนบรรทั ้ ด ใหมใหอัตโนมัติ ฟงกชั่น Serial.print()และ Serial.println()มีรูปแบบดังนี้ Serial.print(b,FORMAT);
กับ Serial.println(b,FORMAT);
โดยที่ b คือคาตัวแปรประเภทเลขจํานวนเต็มทีต่ องการสงออกทางพอรตอนุกรม ถาไมระบุรูปแบบ จะพิมพออกเปนรหัส ASCII ของคาตัวแปร FORMAT เปนรูปแบบของการพิมพมี DEC (เลขฐานสิบ), HEX (เลขฐานสิบหก), OCT (เลข ฐานแปด) และ BIN (เลขฐานสอง)
Unicon 97 /* Code for send out data to serial port * File : Serial01.pde * By : Opas Sirikunchiitavorn */ void setup() { Serial.begin(9600); // Set serial port to 9600 bit per second } void loop() { int data = 2345; // print string to serial port Serial.println("Welcome to Arduino1.0 Programming"); // print title Serial.print(data, DEC); // print as an ASCII-encoded decimal Serial.print("\t"); // print a tab character Serial.print(data, HEX); // print as an ASCII-encoded hexadecimal Serial.print("\t"); // print a tab character Serial.print(data, OCT); // print as an ASCII-encoded octal Serial.print("\t"); // print a tab character Serial.print(data, BIN); // print as an ASCII-encoded binary Serial.print("\t"); // print a tab character Serial.write(data); // print as a raw byte value Serial.println(); // print a line feed character delay(1000); // Wait 1 second }
โปรแกรมที่ 4-6 ไฟล Serial01.ino โปรแกรมทดสอบการสงขอมูลออกพอรตอนุกรมเสมือนผานทาง พอรต USB ของบอรด Unicom โปรแกรมที่ 4-6 เปนโปรแกรมทดลองสงขอมูลออกพอรตอนุกรม โดยสงขอความและคาของตัวแปร ในการ ทดลองสงคาตัวแปรจะมีการกําหนดรูปแบบหรือ FORMAT ของคําสัง่ Serial.print() ไวหลายๆ แบบ ในการทดสอบการทํางาน โปรแกรม Arduino IDE จะมีหนาตาง Serial Monitor เพื่ออํานวยความ สะดวกในการรับและสงขอมูลผานพอรตอนุกรม ซึงจะใช ่ พืนที ้ ร่ วมกับพืนที ้ แสดงข ่ อมูล (Text area) ซึงอยู ่ ทาง ดานลางของหนาตางโปรแกรม Arduino การเปดหนาตางนีทํ้ าไดโดยคลิกที่ปุม Serial Monitor ดังแสดงในรูปที่ 4-10 ในรูปที่ 4-11 แสดงผลการ ทํางานของโปรแกรมที่ 4-6 หลังจากที่อัปโหลดโปรแกรมไปยังบอรด Unicon ่ คือ 2,345 แปลงเปนเลขฐาน 16 คือ 929 เปนเลขฐาน ในโปรแกรมกําหนดคาตัวแปร data=2345 ซึงก็ 8 คือ 4451 เปนเลขฐานสองคือ 100100101001 กรณีที่สังพิ ่ มพโดยใชคําสั่ง Serial.write(data); จะสง คาเปนเลขฐานสอง 8 บิตลาง 00101001 ซึ่งก็คือ 41 ฐานสิบ เทียบเปนรหัส ASCII คืออักขระ ) ที่หนาตางของ Serial Monitor จึงแสดงเปนเครื่องหมาย ) หรือวงเล็บปดนั่นเอง
98
Unicon
Serial Monitor คลิกเพือเป ่ ดหนาตาง สําหรับรับและสงขอมูล อนุกรมระหวางฮารดแวร Arduino กับคอมพิวเตอร
รูปที่ 4-10 แสดงการเลือกเปดหนาตาง Serial Monitor
รูปที่ 4-11 ผลการทํางานของโปรแกรมที่ 4-6 เมือดู ่ คาผานทาง Serial Monitor
Unicon 99
4.2.2.3 ตัวอยางโปรแกรมรับคาจากพอรตอนุกรมเพื่อกําหนดความเร็วในการกระพริบของ LED ในการรับคาจากพอรตอนุกรมจะใชฟงกชั่น 2 ตัวคือ Serial.avaliable() และ Serial.read() โดยเริ่มจากใชฟงกชัน่ Serial.avaliable()เพือตรวจสอบว ่ ามีขอมูลหรือไม ฟงกชันจะคื ่ นคาเปน เลขจํานวนเต็มแสดงจํานวนขอมูลในบัฟเฟอรตัวรับของพอรตอนุกรม ถาอานคาไดเทากับ 0 แสดงวาไมมีขอมูล เมื่ อทดสอบพบวาฟ งกชั่ น S e r ial .ava lia ble( ) คืนคาไม เท ากับ 0 ถัดมาให ใชฟงกชั่น Serial.read() เพื่ออานคาจากบัฟเฟอรตัวรับ ฟงกชั่นคืนคาเปนเลขจํานวนเต็มที่เปนไบตแรกของขอมูลที่ ไดรับ (หรือเปน -1 ถาไมมีขอมูล) ในตัวอยางนีแสดงตั ้ วอยางการรับคาจากพอรตอนุกรม เพื่อนําคาที่รับไดไปควบคุมอัตราการกระพริบ ของ LED วงจรที่ใชในการทดลองนีแสดงได ้ ดังรูปที่ 4-11 และมีโปรแกรมดังแสดงในโปรแกรมที่ 4-7 มีสวนของโปรแกรมทีควรทราบอยู ่ แห งหนึงคื ่ อ หากผูพั ฒนาโปรแกรมตองการใหมีการแสดงขอความ บนหนาตาง Serial monitor ของ Arduino1.0 ในทุกครั้งที่เริ่มตนทํางานใหม จะตองหนวงเวลารอใหวงจร USB ภายใน ATmega32U4 ของ Unicon เตรียมความพรอมในการทํางานหรืออีนัมเมอเรชันให ่ เสร็จสมบูรณเสียกอน ดวยการแทรกคําสั่ง delay(5000); กอนใชคําสั่ง Serial.print();
1
ZX-LED LED 510
Unicon port
KRC102
11
S
+
เชื่อมตอดวยสาย JST3AA-8 R1 510
ตอวงจรลงบนเบรดบอรด
LED1
R2 10k
รูปที่ 4-12 วงจรทดสอบการรับขอมูลจากพอรตอนุกรมเพือควบคุ ่ ม LED
100
Unicon
/* * Code for blinking LED that is received data from serial port * to control rate of blinking. Receive keyboard button 1-5 only. * File : Serial02.pde * By : Opas Sirikunchittavorn */ #define LED1_PIN 11 int incomingByte = 0; int delayTime = 100;
// LED pin as pin 11 // for incoming serial data. // Initial value of delay time.
void setup() { pinMode(LED1_PIN, OUTPUT); // set pin 11 as OUTPUT Serial.begin(9600); // opens serial port at 9600 bps delay(5000); // Delay for USB enumeration Serial.print("Press 1-5 for control speed of LED :"); } void loop() { if (Serial.available() > 0) { incomingByte = Serial.read(); // read the incoming byte: // ASCII '1'=49, '2'=50, '3'=51, '4'=52 and '5'=53 // calculate new delay time if(incomingByte >= 49 && incomingByte <=53) { // echo to user Serial.write(incomingByte); Serial.println(); delayTime=(incomingByte-48)*100; } Serial.print("Press 1-5 for control speed of LED :"); } digitalWrite(LED1_PIN, HIGH); // Turn on LED1 delay(delayTime); // wait for delayTime digitalWrite(LED1_PIN, LOW); // Turn off LED1 delay(delayTime); // wait for delayTime }
โปรแกรมที่ 4-7 ไฟล Serial02.ino โปรแกรมภาษา C ของ Arduino สําหรับทดสอบการรับคาจาก พอรตอนุกรมเพือกํ ่ าหนดความเร็วในการกะพริบของ LED ผลการทํางานของโปรแกรมที่ 4-7 แสดงไดดังรูปที่ 4-13 โปรแกรมนี้จะพิมพขอความ Press 1-5 for control speed of LED : ออกทางพอรตอนุกรม แลวรอใหผูทดลองกดปุม 1 ถึง 5 ทีแป ่ นคียบอรด โดยกด 1 คือให LED ติด 0.1 วินาทีและดับ 0.1 วินาที และถากด 5 จะทําให LED ติด 0.5 วินาทีและดับ 0.5 วินาที ถาไมใชปุม 1 ถึง 5 โปรแกรมจะไมตอบสนอง เมื่อกดแลวโปรแกรมจะสงรหัส ASCII ของปุมนี ้กลับคืนเพื่อแจงผูทดลอง แลวนําคาทีได ่ ไปคํานวณ คาหนวงเวลาการติดดับของ LED
Unicon 101
1
พิมพขอความทีนี่ ่ 2
คลิกเพื่อสง
รูปที่ 4-13 ผลการทํางานของโปรแกรมที่ 4-7 ที่หนาตาง Serial Monitor ของ Arduino เมื่อตองการสงขอความ ใหพิมพขอความที่ตองการในชองวาง ดานบน เมือพิ ่ มพเสร็จใหคลิกปุม Send คารหัส ASCII ของตัวอักษร 1,2,3,4 และ 5 คือ 49,50,51,52 และ 53 ตามลําดับ ในการคํานวณคา หนวงเวลาของฟงกชั่น delay() ทําไดโดยนําคารหัส ASCII ของตัวอักษรลบดวย 48 แลวนําคาที่ไดคูณดวย 100 ซึงมี ่ สูตรดังนี้ delayTime=(incomingByte-48)*100;
การตรวจจับอินพุตจากการกดปุม 1 ถึง 5 ของผูใชงาน ทําไดโดยใชคําสั่ง if โดยกําหนดเงือนไขดั ่ งนี้ if(incomingByte >= 49 && incomingByte <=53)
เงื่อนไขของคําสั่งนีจะเป ้ นจริงเมื่อคาของขอมูลที่รับไดมากกวาหรือเทากับ 49 และตองนอยกวาหรือ เทากับ 53 จึงจะคํานวณคาหนวงเวลาใหม ถาเปนปุมอื ่น เงื่อนไขของคําสั่ง if เปนเท็จ จะกําหนดใหขามสวน คํานวณคาหนวงเวลาไป
102
Unicon
4.3.1 คําอธิบายและการเรียกใชฟงกชัน่ 4.3.1.1 int
analogRead(pin)
อ านคาจากขาพอรตทีกํ่ าหนดใหเปนอินพุตอะนาลอก Unicon มีวงจรแปลงสัญญาณอะนาลอกเปน ดิจิตอลความละเอียด 10 บิต ทําใหแปลงคาแรงดันอินพุต 0 ถึง +5V ใหเปนขอมูลตัวเลขจํานวนเต็ม ระหวาง 0 ถึง 1,023 พารามิเตอร ่ แทนคา 0 ถึง 11 pin - หมายเลขของขาอินพุตอะนาลอก มีคา 0 ถึง 11 หรือเปนตัวแปรทีใช คาทีส่ งกลับ เลขจํานวนเต็มจาก 0 ถึง 1023 หมายเหตุ สําหรับขาทีเป ่ นอินพุตอะนาลอกไมจําเปนตองประกาศแจงวาเปนอินพุตหรือเอาตพุต ตัวอยางที่ 4-10 int int int int
ledPin = 31; analogPin = 3; val = 0; threshold = 512;
// // // //
LED connected to digital pin 13 potentiometer connected to analog pin 3 variable to store the read value threshold
void setup() { pinMode(ledPin, OUTPUT); } void loop() { val = analogRead(analogPin); if (val >= threshold) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } }
// sets the digital pin 31 as output
// read the input pin
// LED on
// LED off
ตัวอยางนีจะสั ้ งให ่ ขา 31 เปน HIGH เมืออ ่ านคาจากขา analogPin แลวมีคามากกวาหรือเทากับคาเงือนไข ่ ทีกํ่ าหนดไว (ในตัวอยาง คาเงือนไขหรื ่ อ threshold = 255) ทําให LED ทีต่ ออยูติ ดสวาง แตถามีคานอยกวา ขา 31 จะเปน LOW ทําให LED ดับ
Unicon 103
4.3.1.2 analogWrite(pin,
value)
ใชในการเขียนคาอะนาลอกไปยังขาพอรตทีกํ่ าหนดไว เพื่อสรางสัญญาณ PWM พารามิเตอร pin - หมายเลขขาพอรตของโมดูล POP-MCU value - เปนคาดิวตี้ไซเกิลมีคาระหวาง 0 ถึง 255 เมือค ่ าเปน 0 แรงดันของขาพอรตทีกํ่ าหนดจะเปน 0V เมือมี ่ คาเปน 255 แรงดันทีขาพอร ่ ตจะเปน +5V สําหรับคาระหวาง 0 ถึง 255 จะทําใหขาพอรตที่กําหนดไวมีคาแรงดันเปลียนแปลงในย ่ าน 0 ถึง 5V คาทีส่ งกลับจากฟงกชั่น เลขจํานวนเต็มจาก 0 ถึง 255 หมายเหตุ ขาพอรตที่ใชสรางสัญญาณ PWM ดวยฟงกชัน่ analogWrite () ซึงก็ ่ คือ ขา 3, 5, 9, 10 และ 11จะพิเศษจากขาทีเป ่ นพอรตดิจิตอลปกติคือ ไมตองกําหนดคาเพื่อเลือกเปน INPUT หรือ OUTPUT คาความถีของสั ่ ญญาณ PWM มีคาประมาณ 490Hz ่ จะตองเขียนคาดิจิตอล คําสั่ง analogWrite ทํางานกับขา 3, 5, 9, 10, 11 เทานัน้ สําหรับขาอืนๆ เปนกําหนดเปน 0 หรือ 5V ผูใช งานสามารถนําสัญญาณทีได ่ จากคําสังนี ่ ไปใช ้ ในการปรับความสวางของ LED หรือตอขยายกระแส เพื่อตอปรับความเร็วของมอเตอรได หลังจากเรียกใชคําสั่งนี้ ที่ขาพอรตทีกํ่ าหนดจะมีสัญญาณ PWM สงออก มาอยางตอเนือง ่ จนกวาจะเรียกใชคําสัง่ analogWrite (หรือเรียกคําสัง่ digitalRead หรือ digitalWrite ที่ขาเดียวกัน) ตัวอยางที่ 4-11 int ledPin = 11; int analogPin = 0;
// LED connected to digital pin 11 // potentiometer connected to analog pin 0
int val = 0;
// variable to store the read value
void setup() { pinMode(ledPin, OUTPUT);
// sets the pin as output
} void loop() { val = analogRead(analogPin); // read the input pin analogWrite(ledPin, val / 4); // analogRead values go from 0 to 1023, // analogWrite values from 0 to 255 }
ตัวอยางนี้จะควบคุมความสวางของ LED ที่ตอกับขา 11 ใหเปนไปตามคาทีอ่ านไดจากตัวตานทาน ปรับคาไดทีต่ อกับขา A0 (ตรงกับขา 18)
104
Unicon
4.3.2 การทดลองอินพุตอะนาลอกของ Unicon ภายในไมโครคอนโทรลเลอร ATmega32U4 บนบอรด Unicon มีวงจรแปลงสัญญาณอะนาลอกเปน ดิจิตอล ความละเอียด 10 บิต จํานวน 12 ชอง ซึงได ่ กําหนดขาตอเปน A0 ถึง A11 วงจรแปลงสัญญาณอะนาลอกเปนดิจิตอลมีความละเอียด 10 บิต ทําหนาที่แปลงแรงดันอินพุต 0 ถึง 5V เปนคาเลขจํานวนเต็ม 0 ถึง 1023 ฟงกชั่นสําหรับอานคาจากอินพุตอะนาลอกคือ analogRead()
โดยคาในวงเล็บคือหมายเลขของชองสัญญาณที่ตองการอานคา (0 ถึง 11) เมื่อฟงกชันทํ ่ างานเสร็จ จะคืนคาเปนเลขจํานวนเต็ม (int) จาก 0 ถึง 1,023 ถาตองการคํานวณเปนคาแรงดันทีมี่ หนวยเปนโวลต (Volt : V) กระทําไดจากความสัมพันธดังนี้ volt = คาทีอ่ านได x 5 /1023
A
A0/18
Unicon port
+5V
VR1 10k
ตอวงจรลงบนเบรดบอรด
รูปที่ 4-14 วงจรทดลองอานคาอินพุตอะนาลอกเพือส ่ งไปแสดงทีคอมพิ ่ วเตอร
A
1
Potentiometer
POTENTIOMETER
ZX-POTV
ZX-POTH
Unicon 105
4.3.2.1 การทดลองอานคาอินพุตอะนาลอกและสงคาออกพอรตอนุกรม ในการทดลองนี้จะตองตอวงจรเพิ่มเติมคือ ตัวตานปรับคาไดที่ตอกับกับไฟเลียง ้ +5V และกราวน โดย มีวงจรดังรูปที่ 4-14 ซึ่งสามารถใชแผงวงจร ZX-POTV หรือ ZX-POTH ตอเขากับบอรด Unicon ไดทันที สําหรับโปรแกรมทดลองแสดงในโปรแกรมที่ 4-8 จากการทํางานของโปรแกรมที่ 4-8 พบวาตัวโปรแกรมจะสงผลการแปลงสัญญาณอะนาลอกซึงก็ ่ คือ คาแรงดันไฟตรงเปนขอมูลดิจิตอลของเลขจํานวนเต็มจาก 0 ถึง 1023 ถาตองการใหสงขอมูลเปนคาของแรงดันในหนวยโวลต (V) ที่มีการแสดงเปนตัวเลขทศนิยมออกทาง พอรตอนุกรม จะตองมีการแกไขโปรแกรมเล็กนอย ดังแสดงโปรแกรมที่แกไขแลวในโปรแกรมที่ 4-9 ในโปรแกรมที่ 4-9 นี้ การคํานวณเพื่อแปลงคาที่อานไดจากอินพุต A0 ใหเปนแรงดัน หากใชสูตร temp = analogValue*4.0/1023;
จะไดคาแรงดันเปนตัวเลขทศนิยม เสร็จแลวใหนําคาที่ไดไปเขาฟงกชั่น sprintf() เพื่อแปลงคาตัว เลขให เปนตัวอักษร จากการทดลองพบวา ฟงกชั่น sprintf() ของ Arduino ไมสามารถใชกับตัวแปรเลข ทศนิยมได จึงตองดัดแปลงสูตรการแปลงคาเปนแรงดัน ดังนี้ temp = analogValue*4.0/1023*1000;
คําตอบที่ไดเปนเลขจํานวนเต็มจาก 0000 (0V) ถึง 5000 (5 V) แลวจึงแปลงเปนขอความและสงออก พอรตอนุกรมทีละตัวอักษร โดยตองใสตําแหนงของจุดทศนิยมใหถูกตอง เมื่อเปรียบเทียบขนาดไฟลที่ไดหลังการคอมไพลของโปรแกรมที่ 4-8 และ 4-9 พบวา ไฟลมีขนาดใหญ ขึนจาก ้ 2,726 ไบต เปน 5,166 ไบต เนืองจากมี ่ การเรียกใชฟงกชั่น sprintf เพื่อแปลงตัวเลขใหเปนขอความ กอน ดังนั้นในการใช งานไมโครคอนโทรลเลอรจึงนิยมสงเปนขอมูลดิบ แลวใหฝงรับซึงก็ ่ คือคอมพิวเตอร นําขอมูลนีไปคํ ้ านวณตอ /* Code for read analog input at An 0 and send to serial port. * File : AnalogIn01.ino * By : Opas Sirikunchittavorn */ #define ANALOG_PIN 0 // Analog input at pin An 0. int analogValue = 0; // Variable for store analog value void setup() { Serial.begin(9600); }
// set serial port at 9600 bps
void loop() { analogValue = analogRead(ANALOG_PIN); Serial.print("Analog input0 = "); Serial.println(analogValue); delay(200); }
// // // //
Read analog input at pin An 0. Send string to serial port. Send analog value to serial port. Delay 0.2 second.
โปรแกรมที่ 4-8 ไฟล AnalogIn01.ino โปรแกรมภาษา C ของ Arduino สําหรับอานคาอินพุต อะนาลอกแลวสงขอมูลทีได ่ จากการแปลงสัญญาณออกไปทีพอร ่ ตอนุกรม
106
Unicon
รูปที่ 4-15 ผลการทํางานของโปรแกรมที่ 4-8 แสดงผานหนาตาง Serial Terminal ของ Arduino IDE /* * * *
Code for read analog input at An 0, convert to voltage input and send to serial port. File : AnalogIn02.pde (Size after compile 5166 bytes) By : Opas Sirikunchittavorn */
#include <stdio.h> #define ANALOG_PIN 0 int analogValue = 0; void setup() { Serial.begin(9600); }
// include file stdio.h for function sprintf() // Analog input at pin An 0. // variable to store analog value
// set serial port at 9600 bps
void loop() { char str[5]; // Declare string variable int temp; // Temporary variable. analogValue = analogRead(ANALOG_PIN); // Read analog input at pin An 0. temp = analogValue*4.0/1023*1000; // convert to volt and scale *1000 sprintf(str,"%4d",temp); // convert interger to string Serial.print("Analog input0 = "); // print string Serial.print(str[0]); // print voltage in first digit Serial.print("."); if(str[1]==' ') Serial.print("0"); else Serial.print(str[1]); // print voltage in 3rd digit (0.1 volt) if(str[2]==' ') Serial.print("0"); else Serial.print(str[2]); // print voltage in 4th digit (0.01 volt) Serial.print(str[3]); // print voltage in 5th digit (0.001 volt) Serial.println(" Volt"); delay(200); // wait 0.2 second }
โปรแกรมที่ 4-9 ไฟล AnalogIn02.pde โปรแกรมภาษา C ของ Arduinoสําหรับอานคาอินพุตอะนาลอก แลวทําการแปลงเปนคาแรงดันเพือส ่ งออกไปยังพอรตอนุกรม
Unicon 107
รูปที่ 4-16 ผลการทํางานของโปรแกรมที่ 4-9 แสดงผานหนาตาง Serial Terminal ของ Arduino IDE Unicon-Note4/1 แผงวงจรตัวตานทานปรับคาไดแบบแกนหมุน : ZX-POTH และ ZX-POTV ใชกําหนดแรงดัน 0 ถึง +5V ตามการหมุนแกน นําไปใชวัดคามุมและระยะทางได มีแบบตัวตั้งและตัวนอน ให เอาตพุต 2 แบบคือ แรงดันมากขึ้นเมื่อหมุนทวนเข็มนาฬิกา หรือ ตามเข็มนาฬิกา แบบตัวตั้ง
เมื่อหมุนทวนเข็มนาฬิกา แรงดันที่ไ ดจะมากขึ้น
A
POTENTIOMETER
แบบตัวนอน
ZX-POTV/POTH S + S
10kB
+
A
A
Potentiometer
เมื่อหมุนตามเข็มนาฬิกา แรงดันที่ไ ดจะมากขึ้น เมื่อหมุนทวนเข็มนาฬิกา แรงดันที่ไ ดจะมากขึ้น เมื่อหมุนตามเข็มนาฬิกา แรงดันที่ไ ดจะมากขึ้น
108
Unicon
4.3.2.2 ทดลองอานคาอินพุตอะนาลอกเพือควบคุ ่ มความเร็วในการกะพริบของ LED ในตัวอยางนีเป ้ นการอานคาแรงดันทีขา ่ A0 แลวนําคาทีได ่ จากการแปลงสัญญาณอะนาลอกเปนดิจิตอลของ Unicon ไปปรับความเร็วของการกะพริบของ LED ทีขา ่ 11 ดวยการปรับคาหนวงเวลาของฟงกชัน่ delay()ทํา ให LED ติด-ดับไดนาน 0 ถึง 1.023 วินาที วงจรทดลองแสดงดังรูปที่ 4-18 โปรแกรมทดลองคือโปรแกรมที่ 4-10
A
Potentiometer
ZX-POTH
1
S
+
ZX-LED
11
A0/18
Unicon port
R1 510
LED1
+5V
VR1 10k
ตอวงจรลงบนเบรดบอรด
รูปที่ 4-17 วงจรทีใช ่ ในการอานคาอินพุตอะนาลอกเพือควบคุ ่ มการกะพริบของ LED /* Code for read analog input at An 0, used analog value to control blink rate of LED * By : Opas Sirikunchittavorn */ #define LED1_PIN 2 #define ANALOG_PIN 0 int analogValue = 0;
// LED1 connect at Di 2 // Analog input at pin An 0.
void setup(){ pinMode(LED1_PIN,OUTPUT); } void loop() { analogValue = analogRead(ANALOG_PIN); digitalWrite(LED1_PIN,HIGH); delay(analogValue); digitalWrite(LED1_PIN,LOW); delay(analogValue); }
// read analog input at pin an 0 // Turn on LED1 // delay time = analogValue
โปรแกรมที่ 4-10 ไฟล AnalogIn03.ino สําหรับอานคาอะนาลอกเพือควบคุ ่ มการกะพริบของ LED
Unicon 109
4.3.2.4 การทดลองเอาตพุตอะนาลอกของบอรด Unicon ใน Arduino มีฟงกชัน่ analogWrite() ทําใหสรางสัญญาณอะนาลอกสงออกทางขาพอรตเอาตพุตได โดยอาศัยเทคนิคการสรางสัญญาณ PWM (Pulse Width Modulation) หรือสัญญาณมอดูเลชันทางความกว ่ างพัลส ผูใช งานสามารถปรับคาดิวตีไซเกิ ้ ลของสัญญาณพัลสไดระหวาง 0 ถึง 255 เมือค ่ าเปน 0 แรงดันของขาพอรตที่ กําหนดไวจะมีคาเปน 0V หากมีคาเปน 255 แรงดันทีขาพอร ่ จะเปน +5V สําหรับคา 0 ถึง 255 จะทําใหขาทีกํ่ าหนด ไวมีคาแรงดันเปลียนแปลงสลั ่ บไปมาระหวาง 0 และ 5V ถามีคาสูง ชวงเวลาทีขาพอร ่ ตนันมี ้ แรงดัน 5V จะนานขึน้ ถาคาเปน 51 สัญญาณพัลสจะมีระดับสัญญาณ +5V เปนเวลานาน 20% ของคาบเวลา และมีแรงดัน 0V นาน 80% ของคาบเวลา หรือมีคาดิวตี้ไซเกิลเทากับ 20%นันเอง ่ ถามีคาเปน 127 สัญญาณพัลสจะมีระดับสัญญาณ +5V เปนเวลานานครึ่งหนึ่งของคาบเวลา และ 0V นานครึ่งหนึ่งของคาบเวลา หรือมีคาดิวตี้ไซเกิล 50% ถามีคาเปน 191 นันคื ่ อ สัญญาณพัลสจะมีระดับสัญญาณ +5V เปนเวลานานสามสวนสี่ ของคาบเวลา และมีแรงดัน 0V นานหนึงส ่ วนสีของคาบเวลา ่ หรือมีคาดิวตี้ไซเกิล 75% ในรูปที่ 4-18 แสดงสัญญาณ PWM ที่คาดิวตี้ไซเกิลตางๆ
20%
50%
75%
รูปที่ 4-18 แสดงสัญญาณ PWM ทีค่ าดิวตี้ไซเกิลตางๆ Unicon-Note4/2 ดิวตี้ไซเกิลของสัญญาณพัลส
tW
คํานวณไดจาก T
t D w 100% T
โดยที่ tw คือความกวางของพัลส T คือ คาบเวลาของสัญญาณพัลส 1 ลูก การเปลี่ยนแปลงดิวตี้ไซเกิลไมสงผลตอความถีของสั ่ ญญาณแตอยางใด
110
Unicon
1
S
+
ZX-LED
11
Unicon port
R1 510
LED1
ตอวงจรลงบนเบรดบอรด
รูปที่ 4-19 วงจรทดสอบการทํางานของฟงกชั่น analogWrite() /* Code for fading LED at pin 11 by used analogWrite() function. * By : Opas Sirikunchittavorn */ #define LED_PIN 11 int value = 0;
// LED1 connected to digital pin 11 // variable to keep the actual value
void setup() {} void loop() { for(value = 0 ; value <= 255; value+=5) // fade in (from min to max) { analogWrite(LED_PIN, value); // sets the value (range from 0 to 255) delay(30); // waits for 30 milliseconds to see the dimming effect } for(value = 255; value >=0; value-=5) // fade out (from max to min) { analogWrite(LED_PIN, value); delay(30); } }
โปรแกรมที่ 4-11 ไฟล AnalogOut.ino โปรแกรมภาษา C ของ Arduino สําหรับควบคุมความสวางของ LED ดวยสัญญาณ PWM
Unicon 111
คาแรงดันของสัญญาณพัลสจะไดเปนคาเฉลียของสั ่ ญญาณพัลส ซึงสามารถคํ ่ านวณไดจากความสัมพันธ ทางคณิตศาสตรตอไปนี้ Outout_voltage = (on_time / off_time) * max_voltage เราสามารถนําสัญญาณ PWM ที่ไดจากคําสั่ง analogWrite() นีไปปรั ้ บความสวางของ LED หรือ ตอขยายกระแสเพื่อควบคุมความเร็วของมอเตอรไฟตรงได หลังจากเรียกใชคําสั่งนีแล ้ วขาพอรตทีกํ่ าหนดจะมี สัญญาณ PWM สงออกมาอยางตอเนือง ่ จนกวาจะมีการเรียกใชคําสั่ง analogWrite ในรอบใหม หรือเรียก คําสั่ง digitalRead หรือ digitalWrite ที่ขาพอรตเดียวกัน ฮารดแวร Arduino Leonardo และ Unicon มีขาพอรตทีทํ่ าหนาที่เปนเอาตพุตอะนาลอกได 5 ขา คือ ขา 3, 5, 9, 10 และ 11 การสังให ่ ขาพอรตเปนเอาตพุตอะนาลอก จะตองสังผ ่ านฟงกชัน่ analogWrite() มีรูปแบบดังนี้ analogWrite(pin,value);
เมื่อ pin คือ หมายเลขขาพอรตที่ตองการ (3, 5, 9, 10 และ 11) value คือ คาดิวตี้ไซเกิลทีต ่ องการ คาจาก 0 ถึง 255 การทดลองนีจะสาธิ ้ ตการใชฟงกชั่น analogWrite()โดยมีวงจรทดลองแสดงดังรูปที่ 4-19 สวน โปรแกรมแสดงในโปรแกรมที่ 4-11 โดยกําหนดใหขา 11 ทํางานเปนขาพอรต PWM เพือสร ่ างสัญญาณ PWM ทีมี่ คาดิวตีไซเกิ ้ ลจาก 0 ถึง 255 ทําให LED ทีต่ ออยูมี การติดสวางไลจากดับไปสวางทีสุ่ ด จากนันเปลี ้ ยนค ่ าดิวตีไซเกิ ้ ล เปนจาก 255 ลดลงไปถึง 0 ทําให LED ทีติ่ ดสวางทีสุ่ ด คอยๆ หรีลงจนดั ่ บ จากนันการทํ ้ างานจะวนกลับไปขับ LED ใหติดสวางอีกครัง้
4.3.2.5 การทดลองเอาตพุตอะนาลอกของบอรด Unicon เพือขั ่ บ LED 3 สี อีกหนึงตั ่ วอยางการใชงานเอาตคพุตอะนาลอกสรางสัญญาณ PWM ที่นาสนใจคือ การขับ LED 3 สี RGB (Red, Green, Blue หรือสีแดง, สีเขียว และสีนําเงิ ้ น) เพื่อสรางแสงสีตางๆ จากการผสมของแสงจาก LED แตละสีในตัวถังเดียวกัน แผงวงจร LED 3สีทีใช ่ ในการทดลองนีคื้ อ ZX-LED3C แผงวงจรไฟแสดงผลหลายสี มีหนาตา ของบอรดแสดงในรูปที่ 4-20 และวงจรสมบูรณ ZX-LED3C แสดงในรูปที่ 4-21 ใช LED แมสีแสง 3 สีคือ สีแดง, ้ นทีบรรจุ ่ รวมอยูในตั วถังเดียวกัน มีขา จุดรับสัญญาณขับ เขียว และนําเงิ LED สีน้ําเงิน รวมเปนขาแคโทด ในการแสดงผลสามารถผสมให เกิดแสงสีตางๆ ไดดวยการปอนแรงดันไฟตรงเขาที่ จุดรับสัญญาณขับ ชองอินพุตสีแดง (R - Red), เขียว (G - Green) และนํา้ LED สีแดง เงิน (B - Blue) ดวยแรงดันทีป่ อนใหแก LED ทัง้ 3 ่ างกันจะทําให LED เปลงแสงสีทีเกิ ่ ดจาก รูปที่ 4-20 แผงวงจร ZX-LED3C และจุดตอสัญญาณ ตัวทีแตกต การผสมกันของ LED 3 สีทีอยู ่ ภายใน
จุดรับสัญญาณขับ LED สีเขียว O
GREEN BLUE RED
112
Unicon
+V Q4 KRA102 (DTA114)
RED
Q6 KRA102 (DTA114)
Q5 KRA102 (DTA114)
Q1 KRC102 (DTC114)
Q2 KRC102 (DTC114)
GREEN
RG 330
RR 680
LED1 RGB Common Cathode
Q3 KRC102 (DTC114)
BLUE
R
G
RB 510
B
รูปที่ 4-21 วงจรของ ZX-LED3C แผงวงจรไฟแสดงผลหลายสี
ตอวงจรลงบนเบรดบอรด 13
1
5
11
Unicon port
R2 R3 510 330 G B R
R1 680 LED1 RGB
com
สัญญาณ PWM สําหรับขับ LED สีเขียว
11
5
ZX-LED3C
13
O GREEN BLUE RED
สัญญาณ PWM สําหรับขับ LED สีน้ําเงิน
สัญญาณ PWM สําหรับขับ LED สีแดง
รูปที่ 4-22 วงจรทดลองขับ LED 3 สีดวยสัญญาณ PWM โดยใชบอรด Unicon
Unicon 113 // Init the Pins used for PWM const int redPin = 13; // const int greenPin = 11; // const int bluePin = 5; // int Level; // int LevelR; // int LevelG; // int LevelB; // void setup() { // Set all LED pin as output pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); analogWrite(redPin, 200); delay(300); Level=0; }
Set pin Set pin Set pin Declare Declare Declare Declare
13 for driving the red LED 11 for driving the green LED 13 for driving the blue LED the level counter the red LED level variable the green LED level variable the blue LED level variable
// Start witg red color 0.3 second // Clear counter
void loop() { Level++; // LevelR = Level + 200; // LevelG = Level; // LevelB = Level; // analogWrite(redPin, LevelR); // analogWrite(bluePin, LevelB); // analogWrite(greenPin, LevelG);// delay(50); if (Level > 255) // { Level = 0; // analogWrite(redPin, 200); // delay(300); } }
Increase counter Define red LED level Define green LED level Define blue LED level Send PWM signal to red LED Send PWM signal to blue LED Send PWM signal to green LED Check maximum value of PWM Clear counnter Drive red LED again
การทํางานของโปรแกรม เริ่มตนดวยการกําหนดใหขาพอรตที่ใชในการขับ LED เปนเอาตพุตดวยคําสั่ง pinMode จากนัน้ ขับ LED ใหแสดงสีแดง แลวเขาสูลูปของโปรแกรมเพื่อเริมต ่ นผสมแสงสีอืนเข ่ าไป ดวยการปอนสัญญาณ PWM ไปยังจุดตอรับสัญญาณของ LED แตละสี โดยใชคําสั่ง analogWrite โดยวนปอนคาสําหรับแสง สีเขียวและนําเงิ ้ น ตังแต ้ 0 ถึง 255 ในการทํางานจริง จะเห็น LED ขับแสงสีแดง ครูหนุ งจากนันจะเริ ้ ่มเปลียน ่ เปนสีเขียว เขียวอมฟา จนกลายเปนสีขาว แลววนกลับมาเปนสีแดงเพื่อเรีมรอบการแสดงผลใหม ่
โปรแกรมที่ 4-12 ไฟล PWM_LED3C.ino โปรแกรมภาษา C/C++ ของ Arduino สําหรับขับ LED 3 สี ดวยสัญญาณ PWM
114
Unicon
LED แตละสีมีวงจรขับแยกกันอิสระ ซึงใช ่ ทรานซิสเตอรเบอร KRA102 และ KRC102 ทํางานรวม กัน ตัวตานทานทีใช ่ ในการจํากัดกระแสของ LED แตละสีจะแตกตางกัน ทังนี ้ เพื ้ อให ่ เมือป ่ อนแรงดัน +5V ใหแก LED ทั้ง 3 สีแลว จะทําใหเกิดการรวมแสงสีเปนแสงสีขาว วงจรทดลองแสดงในรูปที่ 4-22 และโปรแกรมสําหรับทดสอบแสดงในโปรแกรมที่ 4-12 การทํางาน หลักๆ ของโปรแกรมคือ สรางสัญญาณ PWM ที่มีคาดิวตี้ไซเกิลตางกัน เพื่อนําไปขับ LED แตละสี เพื่อใหได แสงสีตามที่ตองการ
4.3.2.6 การตรวจสอบขาของ LED 3 สี 4 ขา ในกรณีที่ทําการทดลองโดยใช LED 3 สี 4 ขาแบบปกติ จะตองทําการตรวจสอบขาของ LED กอน เนืองจาก ่ LED 3 สี 4 ขานีมี้ การจัดขาที่แตกตางกันไปในแตละผูผลิต ทั้งยังแตกตางกันทังชนิ ้ ดแอโนดรวมกับ แคโทดรวม (1) ตรวจสอบกอนวา LED 3 สีที่ใชเปนแบบแอโนดรวมหรือแคโทดรวม โดยตอขารวมหรือขาคอม มอน (common) ซึงเป ่ นขาที่ยาวสุดเขากับไฟเลี้ยง +3V หรือ +3.3V หรือ +5V ตองตออนุกรมกับตัวตานทาน ประมาณ 330 ถึง 510 กอน เพื่อจํากัดกระแสไฟฟาไมใหไหล ผาน LED มากเกินไป รวมถึงปองกันในกรณีที่ ตอกลับขั้วดวย จากนั้นใหตอขาที่เหลือเขากับกราวดทีละขา ดังรูป
(1.1) ถา LED ติดสวางในการตอทุกขา สรุปไดวา LED ตัวนันๆ ้ เปนแบบแอโนดรวม ใหตรวจสอบ ตอวาขาใดเปน ขาแคโทดของ LED สีใด (1.2) ถา LED ติดจากการตอคูใดคู หนึ ง่ อาจเปนเพราะตําแหนงขารวมผิด โดยขาที่ตอเขากับกราวด แลว LED ติด อาจเปนขาแคโทดรวม (1.3) ถา LED ไมติดเลยในทุกกรณี ใหทําตอในขันตอนที ้ ่ (2)
Unicon 115
(2) ตอขารวมเขากับกราวดผานตัวตานทานประมาณ 330 ถึง 510 สวนขาที่เหลือตอกับ +3V หรือ +3.3V หรือ +5V โดยใหตอทีละขา เพื่อดูวา LED ติดหรือไม (ติดเปนสีใดก็ได)
(2.1) ถา LED ติดสวางในการตอทุกขา สรุปไดวา LED ตัวนั้นๆ เปนแบบแคโทดรวม ใหตรวจ สอบตอวาขาใดเปนขาแอโนดของ LED สีใด (2.2) ถา LED ติดจากการตอคูใดคู หนึ งเท ่ านัน้ (ติดกรณีเดียว) อาจเกิดจากตําแหนงขารวมผิด โดย ขาที่ตอเขากับไฟเลี้ยงแลวทําให LED ติด อาจเปนขาแอโทดรวม (2.3) ถา LED ไมติดเลยในทุกกรณี ใหกลับไปทําในขั้นตอนที่ (1)ใหมอีกครั้ง หรืออาจสรุปไดวา LED ตัวนั้นๆ เสียหายไปแลว
4.3.2.7 การทดลองใชงานอินพุตและเอาตพุตอะนาลอกของบอรด Unicon เพือขั ่ บ LED 3 สี ในตัวอยางการทดลองตอไปนี้ เปนการใชงานอินพุตอะนาลอกเพื่อรับสัญญาณมาควบคุมการทํางาน ของเอาตคพุตอะนาลอกใหสรางสัญญาณ PWM ตามการเปลียนแปลงค ่ าของอินพุต โดยเอาตพุตของวงจรตอ เขากับ LED 3 สี หรือแผงวงจร ZX-LED3C ดังแสดงวงจรในรูปที่ 4-23 ดานอินพุตอะนาลอกของบอรด Unicon ที่ชอง A0, A1 และ A2 ใหตอเขากับ ZX-POTH หรือ ZX-POTV หรือตัวตานทานปรับคาได จํานวน 3 ตัว โปรแกรมสําหรับทดลองแสดงในโปรแกรมที่ 4-13
116
Unicon
รูปที่ 4-23 วงจรทดลองขับ LED 3 สีดวยสัญญาณ PWM โดย รับการกําหนดคาจากสัญญาณ อินพุตอะนาลอก
Unicon 117 // Init the Pins used for PWM const int redPin = 13; const int greenPin = 11; const int bluePin = 5; // Init the Pins used for 10K pots const int redPot = 0; const int greenPot = 1; const int bluePot = 2; // Init our Vars int RedValue; int GreenValue; int BlueValue; void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { // Read the voltage on each analog pin then scale down to 0 to 255 RedValue = (map(analogRead(redPot), 0, 1023, 0, 255)); BlueValue = (map(analogRead(bluePot), 0, 1023, 0, 255)); GreenValue = (map(analogRead(greenPot), 0, 1023, 0, 255)); // Write the color to each pin using PWM analogWrite(redPin, RedValue); analogWrite(bluePin, BlueValue); analogWrite(greenPin, GreenValue); }
การทํางานของโปรแกรม เริ่มตนดวยการกําหนดใหขาพอรตที่ใชในการขับ LED เปนเอาตพุตดวยคําสั่ง pinMode จากนัน้ อานคาของสัญญาณอินพุตอะนาลอกจากขา A0 ถึง A2 แลวทําการปรับคาจาก 0 ถึง 1023 เปนคา 0 ถึง 255 ดวยคําสั่ง map แลวนํามาเก็บไวในตัวแปร RedValue, GreenValue และ BlueValue ตามลําดับ จากนันทํ ้ าการสรางสัญญาณ PWM ออกไปยังขาเอาตพุตอะนาลอกทัง้ 3 ขา ดวยคําสัง่ analogWrite ดังนั้น LED จะขับแสงสีตางๆ ตามสัญญาณ PWM ทีเปลี ่ ่ยนแปลงตามการปรับคาของตัวตานทาน ทีอิ่ นพุตอะนาลอก
โปรแกรมที่ 4-13 ไฟล PWM_AnalogLED3C.ino โปรแกรมภาษา C/C++ ของ Arduino สําหรับขับ LED 3 สีดวยสัญญาณ PWM ทีเปลี ่ ยนแปลงตามสั ่ ญญาณอินพุตอะนาลอก
118
Unicon
4.4.1
unsigned long millis()
คืนคาเปนคาเวลาในหนวยมิลลิวินาที นับตังแต ้ Unicon เริ่มรันโปรแกรมปจจุบัน คาทีส่ งกลับจากฟงกชั่น คาเวลาในหนวยเปนมิลลิวินาทีตั้งแตเริมรั ่ นโปรแกรมปจจุบัน คืนคาเปน unsigned long คาตัวเลข จะเกิดการโอเวอรโฟลว (คาเกินแลวกลับเปนศูนย) เมื่อเวลาผานไปประมาณ 9 ชัวโมง ่ ตัวอยางที่ 4-12 long time; void setup() { Serial.begin(9600); } void loop() { Serial.print("Time: "); time = millis(); Serial.println(time); delay(1000);
//prints time since program started // wait a second so as not to // send massive amounts of data
}
4.4.2
delay(ms)
เปนฟงกชั่นชะลอการทํางานหรือหนวงเวลาของโปรแกรมตามเวลาที่กําหนดในหนวยมิลลิวินาที พารามิเตอร ่ องการหนวงเวลา หนวยเปนมิลลิวินาที (1000 ms เทากับ 1 วินาที) ms - ระยะเวลาทีต ตัวอยางที่ 4-13 int ledPin = 31; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
// LED connected to pin 31
// sets as output
// // // //
LED on waits for a second LED off waits for a second
จากตัวอยางนี้ กําหนดให pin หมายเลข 31 เปนเอาตพุต สั่งใหเปน HIGH (LED ติด) หยุดรอ 1000 มิลลิวินาที (1 วินาที) แลวสั่งเปน LOW (LED ดับ) แลวหยุดรอ 1000 มิลลิวินาที
Unicon 119
4.4.3
delayMicroseconds(us)
เปนฟงกชั่นชะลอการทํางานหรือหนวงเวลาของโปรแกรมตามเวลาที่กําหนดในหนวยไมโครวินาที พารามิเตอร us - คาหนวงเวลาในหนวยไมโครวินาที (1000 ไมโครวินาที = 1 มิลลิวินาที และหนึ่งลานไมโครวินาที = 1 วินาที) ตัวอยางที่ 4-16 int outPin = 11;
// digital pin 11
void setup() { pinMode(outPin, OUTPUT);
// sets as output
} void loop() { digitalWrite(outPin, HIGH); delayMicroseconds(50);
// sets the pin on // pauses for 50 microseconds
digitalWrite(outPin, LOW);
// sets the pin off
delayMicroseconds(50);
// pauses for 50 microseconds
}
จากตัวอยางนี้ กําหนดใหขา 11 ทํางานเปนเอาตพุตเพื่อสงสัญญาณพัลสทีมี่ คาบเวลา 100 ไมโคร วินาทีตอเนื่องตลอดเวลา ผูทดลองสามารถอัปโหลดโปรแกรมนี้ไปยังบอรด Unicon เพื่อทดสอบการทํางาน โดยใชออสซิลโล สโคปตอวัดสัญญาณทีจุ่ ดตอพอรต 11 ของ Unicon ดังในรูปที่ 4-24 คําเตือน ฟงกชั่ นนี้สามารถทํางานอยางแมนยําในชวงตั้งแต 3 ไมโครวินาทีขึ้นไป ไมสามารถประกันไดวา delayMicroseconds จะทํางานไดอยางเทียงตรงสํ ่ าหรับคาหนวงเวลาทีตํ่ ่ากวานี้ เพื่ อใหหนวงเวลาไดอยางแมนยํา ฟงกชั่นนีจะหยุ ้ ดการทํางานของอินเตอรรัปต ทําใหการทํางาน บางอยาง เชน การรับขอมูลจากพอรตอนุกรม หรือการเพิมค ่ าทีจะส ่ งกลับคืนโดยฟงกชัน่ milis() จะไมเกิดขึน้ ดังนันควรจะใช ้ ฟงกชันนี ่ สํ้ าหรับการหนวงเวลาสันๆ ้ ถาตองการหนวงเวลานานๆ แนะนําใหใชฟงกชัน่ delay() แทน
120
Unicon
ขากราวด (GND)
1
จายไฟ +6V ไมเกิน +9V
ขา 11
สายตอกราวด ปลายปากคีบจับสายตอกราวด
สายวัดของออสซิลโลสโคป
สายกราวด
รูปสัญญาณทีได ่ จากการวัดดวยออสซิลโลสโคป จะพบวา ไดคาบเวลา 108 ไมโครวินาที ซึ่ง คลาดเคลือนจากที ่ ่กําหนดไวในโปรแกรมเล็กนอย
รูปที่ 4-24 แสดงการวัดสัญญาณทีจุ่ ดตอพอรตของบอรด Unicon ในการทดสอบฟงกชันหน ่ วงเวลา
Unicon 121
4.4.4 การทดลองใชงานฟงกชันหน ่ วงเวลาในการสรางสัญญาณเสียง การสรางเสียงเพื่อขับลําโพงที่เปนขดลวดหรือลําโพงแบบเปยโซ ตัวไมโครคอนโทรลเลอรจะตอง สรางสัญญาณกระแสสลับทีกระแสไฟฟ ่ าสามารถไหลกลับทิศได จึงตองใชสัญญาณจากไมโครคอนโทรลเลอร 2 เสน หรือถาตองการประหยัดจะใชสัญญาณเพียงเสนเดียวก็ได แตตองตอตัวเก็บประจุอนุกรมกับขาเอาตพุตที่ ใชขับสัญญาณเสียงดวย ในการทดลองนีจะสร ้ างเสียงความถี่ 1kHz ออกที่ลําโพงเปยโซนาน 0.5 วินาที แลวเงียบ 0.5 วินาที สลับกันตลอดเวลา โดยใชวงจรในรูปที่ 4-25 และเขียนโปรแกรมไดดังโปรแกรมที่ 4-14 อุปกรณที่เพิ่มเขามาในการทดลองนี้คือ ZX-SPEAKER แผงวงจรลําโพงเปยโซ มีวงจรภายในแสดงใน รูปที่ 4-26 สวนดานการเขียนโปรแกรม ในการทดลองนี้มีเปาหมายคือ สรางสัญญาณเสียงความถี่ 1kHz สัญญาณ จึงมีคาบเวลาเทากับ 1 มิลลิวินาที ดังนันจะต ้ องทําใหสัญญาณทีส่ งไปยังลําโพงเปยโซมีระดับสัญญาณเปนลอจิก สูงหรือ HIGH หรือ “1” เปนเวลา 500 ไมโครวินาที และเปนลอจิกตํ่าหรือ LOW หรือ “0” นาน 500 ไมโคร วินาที สลับกันตอเนือง ่ ทําไดโดยใชคําสั่งดังนี้ digitalWrite(PIEZO_PIN,HIGH); delayMicroseconds(500); digitalWrite(PIEZO_PIN,LOW); delayMicroseconds(500);
ตอวงจรลงบนเบรดบอรด Unicon port
11 C1 10F
1
SPEAKER
รูปที่ 4-25 วงจรทดลองสรางสัญญาณเสียงดวยฟงกชันหน ่ วงเวลาของ Arduino
S
+
+ S
O
SP1 Piezo
122
Unicon
K1 SOUND + S
C1 10/16V
ใชลําโพงเปยโซ มีอิมพีแดนซ 32 มีคาความถีเรโซแนนซ ่ ในยาน1 ถึง 3kHz
SP1 Piezo speaker
รับสัญญาณอินพุตไดสูงสุด 5Vp-p
รูปที่ 4-26 หนาตา, วงจร และขอมูลทางเทคนิคของ ZX-SPEAKER แผงวงจรลําโพงเปยโซ /*********************************************************** * Program drive piezo speaker to sound at 1kHz 0.5 sec and off 0.5 sec. * File : Sound1kHz.ino * By : Opas Sirikunchittaworn ***********************************************************/ #define PIEZO_PIN 11 void setup() { pinMode(PIEZO_PIN,OUTPUT); // Piezo speaker at pin 3 } void loop() { int i; for(i=0;i<500;i++) { digitalWrite(PIEZO_PIN,HIGH); delayMicroseconds(500); digitalWrite(PIEZO_PIN,LOW); delayMicroseconds(500); } delay(500); // off buzzer 0.5 second. }
โปรแกรมที่ 4-14 ไฟล Sound1kHz.ino โปรแกรมภาษา C/C++ ของ Arduino สําหรับทดลองสราง สัญญาณเสียงอยางงายกับบอรด Unicon ในโปรแกรมตองการใหเสียงความถี่ 1kHz ดังนาน 0.5 วินาที แสดงวาตองใหสัญญาณเกิดขึ้น 500 ลูก for() ดังนี้ ดังนันส ้ วนของโปรแกรมดานบนจะตองทํางาน 500 ครัง้ ซึงในโปรแกรมทํ ่ าไดโดยใชคําสังวนรอบ ่ for(i=0;i<500;i++)
เมื่อตองการใหเงียบ 0.5 วินาทีทําไดโดยใชคําสั่ง delay(500);
Unicon 123
ใชระบุวาเมื่อเกิดการอินเตอรรัปตจากภายนอกจะใหโปรแกรมกระโดดไปยังฟงกชั่นใด
4.5.1
attachInterrupt(interrupt, function, mode)
ใชระบุวา เมื่อขาอินพุตที่รับสัญญาณอินเตอรรัปตจากภายนอกมีการเปลี่ยนแปลงเกิดขึ้น จะกําหนดให ซีพียูกระโดดไปยังฟงกชันใด ่ โดยบอรด Unicon มีขาอินพุตรับสัญญาณอินเตอรรัปตจากภายนอก 4 ขาคือ INT0 ถึง INT3 ซึงตรงกั ่ บขา 3, 2, 0 และ 1 ตามลําดับ ซึงใช ่ งานรวมกับขา SCL และ SDA (ขาสัญญาณสําหรับติดตอ อุปกรณระบบบัส I2C), RxD, TxD (ขารับสงขอมูลอนุกรม UART1)
INT0 : 3/SCL INT2 : 0/RxD
INT1 : 2/SDA INT3 : 1/TxD
1
หมายเหตุ ฟงกชันที ่ ่ทํางานเมื่อการอินเตอรรัปตจะไมสามารถเรียกใชฟงกชัน่ milis() และ delay() ได เมื่อ เกิดการตอบสนองอินเตอรรัปตแลว ดังนั้นขอมูลทีเข ่ ามาทางขา serial data อาจสูญหายได พารามิเตอร Interrupt - หมายเลขของชองอินพุตอินเตอรรัปต (เปน int) ่ จะกระโดดไปทํ ่ างานเมือเกิ ่ ดอินเตอรรัปต ฟงกชันนี ่ ต้ องไมรับคาพารามิเตอรและ function - ฟงกชันที ไมมีการคืนคา
124
Unicon
- เลือกประเภทสัญญาณทีใช ่ กระตุนใหเกิดการอินเตอรรัปต LOW เกิดอินเตอรรัปตเมื่อขาสัญญาณเปนลอจิก “0” CHANGE เกิดอินเตอรรัปตเมื่อมีการเปลียนแปลงลอจิ ่ ก RISING เกิดอินเตอรรัปตเมือมี ่ การเปลียนลอจิ ่ ก “0” เปน “1” FALLING เกิดอินเตอรรัปตเมือมี ่ การเปลียนลอจิ ่ ก “1” เปน “0” ตัวอยางที่ 4-14 mode
int pin = 31; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; }
ตัวอยางนี้เลือกอินพุตอินเตอรรัปตชอง 0 กําหนดใหกระโดดไปทํางานที่ฟงกชัน่ blink เพื่อเปลี่ยน สถานะลอจิกที่ขา 31 เมื่อเกิดการอินเตอรรัปตจากการเปลี่ยนแปลงลอจิกที่ขา INT0 หรือ SCL หรือขา 3
4.5.2
detachInterrupt(interrupt)
ยกเลิกการอินเตอรรัปต พารามิเตอร Interrupt - หมายเลขของชองอินพุตอินเตอรรัปตทีต ่ องการยกเลิก (คาเปน 0 หรือ 1) Unicon-Note4/3 การอินเตอรรัปต (interrupt) หรื อการขั ดจั งหวะการทํ างานของซี พี ยู นั บเป นคุ ณสมบั ติ ที่ ต องมี ในไมโครคอนโทรลเลอร สมั ยใหม และ เปนคุณสมบัติทีมี่ บทบาทสําคัญอยางมาก ในขณะทีระบบกํ ่ าลังทําการลําเลียงขวดไปตามสายพานเพือทํ ่ าการบรรจุนํายา ้ แลวเกิด เหตุการณขวดหมด จึงตองมีการขัดจังหวะกระบวนการบรรจุนํายาชั ้ วขณะ ่ จนกวาจะจัดหาขวดเขามาในระบบเปนทีเรี่ ยบรอย กระบวนการทํางานก็จะดําเนินตอไป จากตัวอยางดังกลาว ถาเปรียบเทียบกับโปรแกรมควบคุมของไมโครคอนโทรลเลอร ระบบลําเลียงขวดเพือบรรจุ ่ นํายา ้ เปรียบไดกับโปรแกรมหลัก เหตุการณขวดหมดคือ เงือนไขของการเกิ ่ ดอินเตอรรัปตที่เปนจริง ทําใหเกิดอินเตอรรัปตขึ้น การจัดหาขวดมาเพิมเติ ่ มเปรียบไดกับซีพียูกระโดดออกจากโปรแกรมหลักไปทํางานทีโปรแกรมย ่ อยบริการอินเตอรรัปต เพือจั ่ ด หาขวด นันคื ่ อ เสร็จสินการบริ ้ การอินเตอรรัปต ซีพียูก็จะกระโดดกลับมาทํางานทีโปรแกรมหลั ่ กตอไป ระบบสายพานลําเลียง ก็จะทํางานตอไปตามปกติ
Unicon 125
4.6.1
min(x, y)
หาคาตัวเลขที่นอยที่สุดของตัวเลขสองตัว พารามิเตอร x - ตัวเลขตัวแรก เปนขอมูลประเภทใดก็ได ่ เปนขอมูลประเภทใดก็ได y - ตัวเลขตัวทีสอง คาทีส่ งกลับจากฟงกชั่น คาทีน่ อยที่สุดของตัวเลขสองตัวทีให ่ ตัวอยางที่ 4-15 sensVal = min(sensVal, 100); // assigns sensVal to the smaller of sensVal or 100, // ensuring that it never gets above 100.
ตัวอยางนี้จะไดคาของ sensVal ทีไม ่ เกิน 100 กลับจากฟงกชัน่
4.6.2
max(x, y)
หาคาตัวเลขที่มากที่สุดของตัวเลขสองตัว พารามิเตอร x - ตัวเลขตัวแรก เปนขอมูลประเภทใดก็ได ่ เปนขอมูลประเภทใดก็ได y - ตัวเลขตัวทีสอง คาทีส่ งกลับจากฟงกชั่น คาทีมากที ่ สุ่ ดของตัวเลขสองตัวทีให ่ ตัวอยางที่ 4-16 sensVal = max(senVal, 20); // assigns sensVal to the bigger of sensVal // or 20 (effectively ensuring that it is at least 20)
จากตัวอยางนี้ คาของ sensVal จะมีคาอยางนอย 20
4.6.3
abs(x)
หาคาสัมบูรณ (absolute) ของตัวเลข เปนการทําใหคาของตัวแปรเปนคาจํานวนเต็มบวก พารามิเตอร x - ตัวเลข คาทีส่ งกลับจากฟงกชั่น x เมื่อ x มีคามากกวาหรือเทากับศูนย (x มีคาเปนบวกหรือศูนย) -x เมื่อ x มีคานอยกวาศูนย (x มีคาติดลบ)
126
4.6.4
Unicon constrain(x, a, b)
ปดคาตัวเลขที่นอยกวาหรือมากกวาใหอยูในชวงที่กําหนด พารามิเตอร x - ตัวเลขทีต ่ องการปดคาใหอยูในช วงที่กําหนด สามารถเปนขอมูลชนิดใดก็ได a - คาตํ่าสุดของชวงทีกํ ่ าหนด b - คาสูงสุดของชวงทีกํ ่ าหนด คาทีส่ งกลับจากฟงกชั่น าง a และ b x เมื่อ x มีคาอยูระหว a เมื่อ x มีคานอยกวา a b เมื่อ x มีคามากกวา b ตัวอยางที่ 4-17 sensVal = constrain(sensVal, 10, 150); // limits range of sensor values to between 10 and 150
จากตัวอยางนี้ คาของ sensVal จะอยูในช วง 10 ถึง 150
4.7.1
randomSeed(seed)
ใชกําหนดตัวแปรสําหรับสรางตัวเลขสุม โดยสามารถใชตัวแปรไดหลากหลายรูปแบบ โดยทั่วไปจะ ใชคาเวลาป จจุบัน (จากฟงกชั่น milis()) แตสามารถใชคาอยางอื่นได เชน คาที่ไดเมื่อผูใชกดสวิตช หรือคา สัญญาณรบกวนที่อานไดจากขาอินพุตอะนาลอก พารามิเตอร seed เปนคาตัวเลขแบบ long int ตัวอยางที่ 4-18 long randNumber; void setup() { Serial.begin(19200); } void loop() { randomSeed(analogRead(0)); randNumber = random(300); Serial.println(randNumber); }
ในตัวอยางนี้ กําหนดใหเกิดการสุมตัวเลขขึ้นเมื่ออานคาจากอินพุตอะนาลอกชอง 0 (A0) ยานของ ตัวเลขสุมคือ 0 ถึง 300 เมื่อทําการสุมตัวเลขแลว ใหแสดงคานันที ้ ่หนาตาง Serial Monitor
Unicon 127
4.7.2
long random(max), long random (min,max)
ใชสรางตัวเลขสุมเสมื อน (pseudo-random numbers) เพือนํ ่ าไปใชในโปรแกรม กอนใชฟงกชันนี ้ จะต ้ อง เรียกใชฟงกชั่น randomSeed() กอน พารามิเตอร min กําหนดคาตัวเลขสุมไมนอยกวาคานี้ (เปนออปชันเพิ ่ ่มเติม) max กําหนดคาสูงสุดของตัวเลขสุม คาทีส่ งกลับจากฟงกชั่น คืนคาเปนตัวเลขสุมในชวงที่กําหนด (เปนตัวแปร long int) ตัวอยางที่ 4-21 long randNumber; void setup() { Serial.begin(19200); } void loop() { randomSeed(analogRead(2));
// return a random number from 50 - 300
randNumber = random(50,300); Serial.println(randNumber); }
ในตัวอยางนี้ กําหนดใหสุมตัวเลขเมื่ออานคาจากอินพุตอะนาลอกชอง 2 (A2) ยานของตัวเลขสุมคือ 50 ถึง 300 เมื่อทําการสุมตัวเลขแลว ใหแสดงคานันที ้ ่หนาตาง Serial Monitor
128
Unicon