Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore ไมโครคอนโทรลเลอร์และการประยุกต์

ไมโครคอนโทรลเลอร์และการประยุกต์

Description: ไมโครคอนโทรลเลอร์และการประยุกต์

Search

Read the Text Version

275 ตวั อยางท่ี 11.1 การรบั คาจากเซ็นเซอรพ รอมแสดงผลผานจอแอลซีดี การทำงาน: รบั คา จากตัวตานทานแบบปรับคาไดแ ละแสดงผลผา นจอแอลซีดี วิธีทำ 1. สวนวงจรทดลอง รูปที่ 11.5 วงจรทดลองการรับคา จากเซน็ เซอรพรอ มแสดงผลผานจอแอลซดี ี ทีม่ า: ผูเขียน คำอธบิ าย: ที่หลอดแอลซดี ีและเซ็นเซอรมกี ารกำหนดตำแหนง ขาทีเ่ ช่ือมตอ กบั บอรด Arduino ดงั น้ี 1. ขา E ของแอลซดี ีเชื่อมตอกับ ตำแหนง ขาท่ี 11 ของบอรด Arduino 2. ขา RS ของแอลซดี เี ช่อื มตอกับ ตำแหนง ขาที่ 12 ของบอรด Arduino 3. ขา RW ของแอลซดี เี ช่ือมตอกับกราวด 4. ขา D4 – D7 ของแอลซีดีเชอ่ื มตอ กบั ตำแหนง ขาที่ 5 - 2 ของบอรด Arduino ตามลำดบั 5. ขารบั ขอมลู จากเซ็นเซอรเช่ือมตอกับตำแหนงขา A0 ซ่ึงเปนตำแหนงขาแบบอนาล็อก ของบอรด Arduino 2. สวนโปรแกรม #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2);

276 } void loop() { int val = analogRead(A0); val = map(val, 0 ,1023, 0, 255); lcd.clear(); lcd.setCursor(0,0); lcd.print(\"Sensor: \"); lcd.print(val); delay(1000); } คำอธิบาย: เนอื่ งจากมีการควบคมุ แอลซีดดี ังนนั้ จงึ ตอ งมีการเรยี กใชงานไลบรารี LiquidCrystal.h ซ่ึง ประกาศไวท่ีสว นบนสุดของโปรแกรม และจำเปน ตอ งกำหนดตำแหนง ขาตาง ๆ ของแอลซีดที ี่เช่ือมกับ บอรด Arduino ใหตรงกบั การเชอื่ มตอจริง ฟง กช นั Setup(): กำหนดใหม ีการควบคุมแอลซีดขี นาด 2 แถว 16 คอลมั น ฟงกชัน loop(): กำหนดใหตัวแปร val เปนชนิดจำนวนเต็มที่ทำหนาที่รอรับคาจาก เซ็นเซอร (ตัวตานทานปรับคาได ในทุก 1 วินาที ซึ่งคา val จะถูกปรับเปลี่ยนใหอยูในชวง 0 – 255 ผานฟง กช ัน map() เพ่อื ท่ีจะนำคา val มาแสดงบนจอแอลซีดี 3. ผลการทดลอง รูปท่ี 11.6 ผลการทดลองการรับคา จากเซน็ เซอรพรอ มแสดงผลผา นจอแอลซีดี ที่มา: ผเู ขียน

277 หมายเหตุ: หากผอู านทดลองปรับคาของตวั ตา นทานแบบปรบั คา ไดจ ะสังเกตเหน็ การเปลี่ยนแปลงคา ผา นการแสดงผลทแ่ี อลซดี ี ตวั อยา งที่ 11.2 การควบคุมการทำงานหลอดแอลอดี ีดว ยเซ็นเซอร การทำงาน: กำหนดเงื่อนไขการแสดงสถานะของหลอดแอลอีดี 3 หลอดดว ยเซน็ เซอร ดังนี้ กรณีที่ 1: คาจากเซน็ เซอรนอยกวา 80: หลอดแอลอีดีตำแหนงขวาสดุ จะมสี ถานะตดิ เพียง หลอดเดียว กรณีท่ี 2: คาจากเซน็ เซอรน อยกวา 160: หลอดแอลอีดีตำแหนง กลางจะมีสถานะติดเพียง หลอดเดียว กรณีที่ 3: คาจากเซ็นเซอรตั้งแต 160 ขนึ้ ไป: หลอดแอลอดี ีตำแหนง ขวาสุดจะมีสถานะติดเพยี ง หลอดเดยี ว วิธที ำ 1. สว นวงจรทดลอง: ใชว งจรเดียวกับตัวอยา งที่ 1 แตม ีการเพม่ิ หลอดแอลอดี ี 3 หลอดเพอ่ื เช่ือมตอ กับตำแหนงขาที่ 8 – 10 ของบอรด Arduino รูปที่ 11.7 วงจรทดลองการควบคมุ การทำงานหลอดแอลอีดดี วยเซน็ เซอร ท่ีมา: ผูเขยี น

278 2. สวนโปรแกรม #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int led1 = 8; int led2 = 9; int led3 = 10; void setup() { lcd.begin(16, 2); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); } void loop() { int val = analogRead(A0); val = map(val, 0 ,1023, 0, 255); lcd.clear(); lcd.setCursor(0,0); lcd.print(\"Sensor: \"); lcd.print(val); if(val < 80) { digitalWrite(led1, HIGH); digitalWrite(led2, LOW); digitalWrite(led3, LOW); } else if(val < 160) { digitalWrite(led1, LOW); digitalWrite(led2, HIGH); digitalWrite(led3, LOW); } else { digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, HIGH); }

279 delay(1000); } คำอธิบาย: มีการกำหนดตัวแปรนอกฟงกชัน 3 ตัวแปรคือ led1, led2 และ led3 สำหรับอางอิง ตำแหนง ขา 8 – 10 ของบอรด Arduino ซึง่ เชอ่ื มตอ กบั หลอดแอลอดี ี ฟงกชัน Setup(): กำหนดใหมีการควบคุมแอลซดี ีขนาด 2 แถว 16 คอลัมน และกำหนดให ตวั แปร led1, led2 และ led3 ทำหนา ที่เปนเอาตพุต ฟง กช นั loop():กำหนดใหต ัวแปร val เปน ชนดิ จำนวนเตม็ ท่ที ำหนา ทร่ี อรบั คา จากเซ็นเซอร (ตัวตานทานปรับคา ได ในทุก 1 วินาที ซึ่งคา val จะถูกปรับเปลี่ยนใหอยูในชวง 0 – 255 เพื่อนำไป กำหนดเงอ่ื นไขการทำงานของหลอดแอลอดี ี โดยผลการทดลองแบงเปน 3 เง่อื นไข ดังน้ี 3. ผลการทดลอง รปู ท่ี 11.8 ผลการทดลองการควบคุมการทำงานหลอดแอลอีดีดวยเซน็ เซอร กรณที ี่คา ท่ีเซ็นเซอรอานไดนอยกวา 80 ท่ีมา: ผเู ขยี น จากรูปที่ 11.8 คาที่อานจากเซ็นเซอรมีคาเปน 51 ซึ่งมีคานอยกวา 80 จึงเขาสูเงื่อนไขที่ 1 น่ันคือหลอดแอลอดี ดี วงขวาสดุ จะตดิ เพียงหลอดเดยี ว

280 รปู ที่ 11.9 ผลการทดลองการควบคมุ การทำงานหลอดแอลอดี ดี วยเซ็นเซอร กรณีที่คา ทเ่ี ซน็ เซอรอา นไดน อยกวา 160 แตม ากกวา 80 ทม่ี า: ผูเขียน จากรปู ท่ี 11.9 คา ทอี่ านจากเซ็นเซอรมีคา เปน 102 ซง่ึ มคี ามากกวา 80 แตนอ ยกวา 160 จึง เขาสูเง่อื นไขที่ 2 น่ันคอื หลอดแอลอีดหี ลอดกลางจะติดเพยี งหลอดเดยี ว รปู ที่ 11.10 ผลการทดลองการควบคุมการทำงานหลอดแอลอดี ดี ว ยเซ็นเซอร กรณที ่ีคา ทเี่ ซน็ เซอรอานไดนอยกวา 255 แตม ากกวา 160 ท่ีมา: ผเู ขยี น

281 จากรปู ท่ี 11–10 คา ทอ่ี า นจากเซ็นเซอรมีคาเปน 204 ซึ่งมีคา มากกวา 160 แตนอยกวา 255 จึงเขา สูเ งอ่ื นไขที่ 3 (คำสัง่ ภายใน else) นั่นคอื หลอดแอลอดี หี ลอดซายสุดจะตดิ เพียงหลอดเดยี ว ตัวอยางทั้งหมดสำหรับหัวขอถัดไปในบทนี้จะใชอุปกรณจริงทั้งหมด เนื่องจากโดยสวนใหญ แลว อุปกรณเ ซ็นเซอรหลายชนดิ ไมม ีอยใู นรายการอปุ กรณในโปรแกรม Proteus 3. เซ็นเซอรแอลดีอาร เซ็นเซอรแอลดีอาร (LDR ยอมาจาก Light Dependent Resistor คือเซ็นเซอรชนิดหนึ่งท่ี คาสัญญาณที่ถูกสงออกมาจากตัวอุปกรณขึ้นอยูกับปริมาณแสงที่มาตกกระทบ หลักการทำงานพอ สังเขปของเซ็นเซอรแอลดีอารคือคาความตานทานของเซ็นเซอรจะลดลงเมื่อมีแสงมาตกกระทบท่ี เซ็นเซอร (Margoris, 2011) ดังนั้นหากนำเซ็นเซอรชนิดนี้มาประยกุ ตใชกับบอรด Arduino จะพบวา สัญญาณที่สงออกจากเซ็นเซอรเขา สูบอรดจะมีคาตำ่ เมื่อไมมแี สงตกกระทบที่ตัวเซ็นเซอรเนื่องจากคา ความตานทานสูง ในทางกลับกันหากมีแสงตกกระทบที่ตัวเซ็นเซอรคาสัญญาณที่ถูกสงไปยังวงจร ทดลองจะมคี า ที่สงู เนอ่ื งจากคาความตานทานท่ีตวั เซน็ เซอรม ีคา ลดลง รปู ท่ี 11.11 เซน็ เซอรแอลดีอาร ท่มี า: ผูเขยี น จากรูปที่ 11.11 แสดงตัวอยางของเซ็นเซอรแอลดีอาร ซึ่งประกอบดวย 2 ขา โดยการนำไปใช งานกับบอรด Arduino ขาขางหนึ่งจะถูกตอกับแรงดันขนาด 5 โวลต สวนขาอีกขางจะถูกตอกับ ตำแหนงรับสญั ญาณอนาล็อกบนบอรด Arduino และตอ รวมกบั กราวด

282 ตัวอยา งที่ 11.3 การรบั คาจากแอลดีอาร และทดสอบแสดงผลลัพธผ า นคำสัง่ Serial Monitor การทำงาน: รับคาสญั ญาณจากเซ็นเซอรแ อลดีอารแ ละแสดงผลผา นคำสัง่ Serial Monitor วธิ ีทำ 1. สวนวงจรทดลอง รปู ท่ี 11.12 วงจรทดลองการรบั คา จากเซ็นเซอรแ อลดีอาร เพอ่ื แสดงผลผานคำส่งั Serial Monitor ทีม่ า: ผูเ ขยี น คำอธิบาย: กำหนดตำแหนง ขาทเ่ี ชือ่ มตอกับบอรด Arduino ดังน้ี 1. ขาดา นหนึ่งของแอลดีอารเ ชื่อมตอกบั แรงดนั 5 โวลต 2. ขาอีกดา นของแอลดีอารเ ช่ือมตอ กบั ขาหนึ่งของตวั ตา นทาน และขา A0 ของบอรด Arduino 3. ขาอีกดา นหนงึ่ ของตวั ตานทานเชอ่ื มตอกบั กราวด 2. สวนโปรแกรม int ldr_pin = 0; int value = 0; void setup(){ pinMode(ldr_pin, INPUT); Serial.begin(9600 ; } void loop(){

283 value = analogRead(ldr_pin); Serial.print(\"Value (LDR) is \"); Serial.print(value); Serial.println(); delay(1000 ; } คำอธิบาย: มีการกำหนดตัวแปรนอกฟงกชนั 2 ตัวแปรคือ ldr_pin สำหรับรับสัญญาณอนาลอ็ กผา น พอรต A0 และตัวแปร value สำหรับเก็บคา สญั ญาณอนาลอ็ กดังกลาว ฟงกชัน Setup(): กำหนดใหมีตำแหนงขา A0 ทำหนาที่รับสัญญาณจากอุปกรณภายนอก และกำหนดคำสง่ั การเริ่มส่อื สารผา นพอรตอนกุ รม ฟงกชัน loop(): มีการรับคาสัญญาณอนาล็อกผานขา A0 และนำผลลัพธเก็บไวที่ตัวแปร val กอนทจ่ี ะมีการแสดงผลลัพธผา นคำส่งั Serial Monitor 3. ผลการทดลอง รูปที่ 11.13 ผลการทดลองการควบคมุ การรบั คา สัญญาณจากเซ็นเซอร กรณีทีม่ ีแสงตกกระทบ ทม่ี า: ผูเขยี น รูปที่ 11.13 แสดงผลการทดลองการรับคาสัญญาณจากเซ็นเซอรแอลดีอารส บู อรด Arduino กรณีทมี่ ีแสงตกกระทบท่ตี ัวเซน็ เซอรพบวา สญั ญาณมีคาสงู

284 รูปที่ 11.14 ผลการทดลองการควบคมุ การรับคา สญั ญาณจากเซน็ เซอร กรณีอยูในท่ีไมมีแสงตกกระทบ ท่ีมา: ผูเ ขยี น รปู ที่ 11.14 แสดงผลการทดลองการรบั คาสัญญาณจากเซ็นเซอรแอลดีอารส บู อรด Arduino กรณอี ยใู นท่ีไมมีแสงตกกระทบท่ตี ัวเซน็ เซอรพ บวา สัญญาณมีคาต่ำ 4. เซน็ เซอรส ำหรบั วัดระยะ เซ็นเซอรส ำหรับวดั ระยะ (Proximity Sensor คอื อปุ กรณท ีส่ ามารถนำมาใชส ำหรับวัดระยะ วัตถุไดโดยใชหลักการสะทอนของคลื่นอินฟราเรด (Infrared Wave โดยระยะที่ตัวเซ็นเซอรจะ สามารถตรวจจับคาไดอยูระหวาง 3 – 80 เซนติเมตร (Adith, 2015) อยางไรก็ตามผลลัพธที่ไดจาก การคาเซ็นเซอรม เี พยี งแค 2 สถานะคอื “ตรวจพบ” และ “ตรวจไมพบ” ดงั นั้นขาสัญญาณอินฟราเรด จึงถูกเช่อื มตอกบั ตำแหนงขาทรี่ บั -สงเปน สัญญาณดจิ ิทลั รูปท่ี 11.15 เซน็ เซอรส ำหรับวดั ระยะ ทม่ี า: ผูเขยี น

285 ตัวอยางที่ 11.4 การรับคา จากเซน็ เซอรส ำหรับวดั ระยะ และทดสอบแสดงผลลัพธผา นคำสง่ั Serial Monitor การทำงาน: รับคาสัญญาณจากเซ็นเซอรส ำหรบั วัดระยะ และแจงผลการตรวจพบผา นคำส่ัง Serial Monitor วธิ ที ำ 1. สวนวงจรทดลอง รูปที่ 11.16 วงจรทดลองการรับคา จากเซน็ เซอรอินฟราเรด เพอ่ื แสดงผลผานคำส่งั Serial Monitor ที่มา: ผูเ ขียน คำอธิบาย: กำหนดตำแหนงขาทเ่ี ชอ่ื มตอกับบอรด Arduino ดงั นี้ 1. ขาทีเ่ ชอ่ื มกับสายสญั ญาณสเี หลืองคือสัญญาณสำหรบั วดั ระยะซึ่งถูกเช่ือมกบั ขา 8 ของ บอรด Arduino 2. ขาท่เี ชอ่ื มกบั สายสัญญาณสดี ำอีกถกู เชือ่ มตอกบั กราวด 3. ขาทีเ่ ช่อื มกบั สายสญั ญาณสแี ดงอีกถูกเชื่อมตอกบั แรงดัง 5 โวลต 2. สวนโปรแกรม int infrared_sw = 8; void setup() { Serial.begin(9600); pinMode(infrared_sw, INPUT); } void loop()

286 { if (digitalRead(infrared_sw) == HIGH) { Serial.println(\"Object is detected\"); } else { Serial.println(\"Object is not still detected\"); } delay(500); } คำอธิบาย: มีการกำหนดตัวแปรนอกฟงกชัน 1 ตัวแปรคือ infrared_sw สำหรับรับสัญญาณผาน ตำแหนง ขา 8 ของบอรด Arduino ฟงกชัน Setup(): กำหนดใหมีตำแหนงขา 8 ทำหนาที่เปนอินพุตเพื่อรอรับสัญญาณจาก อปุ กรณภ ายนอก และกำหนดคำสัง่ การเรมิ่ ส่ือสารผา นคำส่งั Serial Monitor ฟงกชัน loop(): มีการรับคาสัญญาณจากเซ็นเซอรอินฟราเรดผานตำแหนงขา 8 ของบอรด Arduino โดยแบงออกเปน 2 เงื่อนไขคือสถานะของสัญญาณคือ “HIGH” เมื่อตรวจพบวัตถุ ในทาง กลบั กนั สถานะของสัญญาณคอื “LOW” หากยังไมตรวจพบวตั ถุ 3. ผลการทดลอง รปู ท่ี 11.17 ผลการทดลองการรับคา จากเซน็ เซอรอนิ ฟราเรด กรณตี รวจพบวตั ถุ ที่มา: ผเู ขยี น

287 รูปที่ 11.18 ผลการทดลองการรบั คาจากเซน็ เซอรอนิ ฟราเรด กรณียงั ตรวจไมพ บวตั ถุ ทีม่ า: ผูเขยี น 5. เซ็นเซอรตรวจจบั ความเคลอ่ื นไหว เซ็นเซอรตรวจจับความเคลื่อนไหว คืออุปกรณที่ใชสำหรับตรวจจับการเคลื่อนไหวของวัตถุ เมือ่ มวี ัตถุเคลอ่ื นทีผ่ าน (Don, 2015) จงึ นิยมถูกนำมาใชสำหรบั การตรวจจับการเคลือ่ นไหวของวัตถุ รปู ที่ 11.19 เซ็นเซอรต รวจจบั ความเคลื่อนไหว ที่มา: ผูเขียน รูปที่ 11.19 แสดงตวั อยางของเซน็ เซอรตรวจจบั ความเคลื่อนไหว โดยเซน็ เซอรจะตรวจจับได เมอื่ มีวตั ถเุ คล่ือนทผี่ านชอ งสีดำ ซ่ึงสามารถนำอปุ กรณชนิดน้ไี ปประยุกตใชสำหรับการนับจำนวนวตั ถุ หรือวัดความเรว็ รอบของมอเตอรได โดยมีตำแหนงขาสำหรับใชงานทง้ั หมด 4 ขา ดงั ตาราง 11.1

288 ตารางที่ 11.1 รายละเอียดขาสญั ญาณของเซ็นเซอรต รวจจบั ความเคลอื่ นไหว ชือ่ ขาสัญญาณ รายละเอยี ด Vcc ขาแรงดันขนาด 5 โวลต GND ขากราวด D0 ขาสำหรบั สง สัญญาณ “HIGH” เม่ือตรวจพบวัตถุ A0 ขาสำหรับปลอยสญั ญาณอนาลอ็ ก สำหรบั ตรวจจบั วตั ถุ จากตารางที่ 11.1 แสดงขาสัญญาณทั้งหมดของเซ็นเซอรตรวจจับความเคลื่อนไหว ซึ่งมี ทั้งหมด 4 ขาโดยขา A0 คือสัญญาณอนาล็อกสำหรับการตรวจจบั วตั ถุ และขา D0 คือขาที่ใชสำหรับ การแจงเตอื นหากมกี ารตรวจพบวตั ถุ ตัวอยางท่ี 11.5 การทดสอบผลลัพธเซ็นเซอรตรวจจบั ความเคลื่อนไหว และทดสอบแสดงผลลพั ธผ าน คำส่งั Serial Monitor การทำงาน: ทดสอบคาผลลัพธกรณีที่มีวัตถุเคลื่อนที่ผานเซ็นเซอร และกรณีที่ไมมีวัตถุเคลื่อนที่ผาน โดยแจงผลการตรวจพบผา นคำสั่ง Serial Monitor วธิ ที ำ 1. สว นวงจรทดลอง GvDAcn00cd รปู ท่ี 11.20 วงจรทดลองการรบั คา จากเซ็นเซอรต รวจจบั ความเคลอ่ื นไหว เพ่อื แสดงผลผา นพอรตอนุกรม ที่มา: ผูเขยี น

289 คำอธิบาย: กำหนดตำแหนง ขาทเี่ ช่อื มตอกับ บอรด Arduino ดงั นี้ 1. ขาที่เชอ่ื มกับสายสญั ญาณสีเหลอื งคือสญั ญาณสำหรบั วัดระยะซึง่ ถูกเช่ือมกับขา A0 2. ขาทเี่ ชอ่ื มกบั สายสัญญาณสดี ำอกี ถกู เชอื่ มตอ กบั กราวด 3. ขาที่เช่ือมกับสายสญั ญาณสีแดงอีกถกู เชื่อมตอกับแรงดัง 5 โวลต 2. สวนโปรแกรม void setup() { Serial.begin(9600); } void loop() { int val = analogRead(A0); Serial.println(val); } คำอธิบาย: ฟง กชนั Setup():กำหนดคำสงั่ การเรม่ิ สื่อสารผานคำสั่ง Serial Monitor ฟงกชัน loop(): มีการรับคาสัญญาณอนาล็อกจากเซ็นเซอรผานตำแหนงขา A0 ของบอรด Arduino โดยหากตรวจพบวัตถุสัญญาณอนาล็อกที่ถูกปอนเขาสูวงจรทดลองจะมีคาต่ำ ในทาง กลับกันสัญญาณอนาล็อกที่ถูกปอนเขาสูบอรดจะมีคาสูง เมื่อตรวจพบวัตถุเคลื่อนที่ผานตำแหนงที่ ทำงานตรวจจับ 3.1 ผลการทดลองกรณียงั ตรวจไมพ บวตั ถุ รูปท่ี 11.21 ผลการทดลองการรบั คา จากเซ็นเซอรตรวจจับ ความเคลอ่ื นไหวกรณียังตรวจไมพบวัตถุ ที่มา: ผเู ขยี น

290 3.2 ผลการทดลองกรณตี รวจพบวตั ถุ รปู ที่ 11.22 ผลการทดลองการรบั คา จากเซน็ เซอรต รวจจับ ความเคลอ่ื นไหวกรณีตรวจพบวัตถุ ทีม่ า: ผูเขียน จากผลการทดลองสังเกตไดวา กรณีที่ไมพบวัตถุเคลื่อนที่ผานคาสัญญาณที่ตรวจพบจะมีคา นอยมาก (ต่ำกวา 100 ทั้งหมด) ในทางกลับกันกรณีที่ตรวจพบวัตถุเคลื่อนที่ผาน คาสัญญาณที่ตรวจ พบจะมีคาสูงมาก (สูงกวา 100 ทั้งหมด ดังนั้นสามารถนำเซ็นเซอรตรวจจับความเคลื่อนไหวมา ประยกุ ตใ ชสำหรับการตรวจนับสงิ่ ของท่เี คลือ่ นทผ่ี า นจดุ ตรวจ ตวั อยางที่ 11.6 การทดสอบประยุกตใชงานเซน็ เซอรตรวจจับความเคลือ่ นไหว และแสดงผลผาน คำส่งั Serial Monitor การทำงาน: นับจำนวนวัตถุทุกครงั้ เมอ่ื มีวตั ถเุ คลอ่ื นทีผ่ า นเซน็ เซอร วิธีทำ 1. สว นวงจรทดลอง เชอ่ื มตออปุ กรณภ ายนอกเขากบั บอรด Arduino ดงั ตัวอยางท่ี 11.5 2. สวนโปรแกรม int counter; void setup() { Serial.begin(9600); } void loop() { int val = analogRead(A0); if(val > 100){

291 counter = counter+1; Serial.println(counter); delay(1000); } } คำอธิบาย: มีการกำหนดตัวแปรนอกฟงกชัน 1 ตัวแปรคือ count สำหรับนับจำนวนวัตถุท่ีเคลื่อนที่ ผา นเซน็ เซอรตรวจจับความเคล่อื นไหว ฟง กชนั Setup(): กำหนดคำสั่งการเร่ิมส่ือสารผา นคำส่ัง Serial Monitor ฟงกชัน loop(): มีการรับคาสัญญาณอนาล็อกจากเซ็นเซอรผานตำแหนงขา A0 ของบอรด Arduino และนำมาตรวจสอบเงื่อนไขวาคาสัญญาณที่รับมีคาสูงกวา 100 หรือไม โดยหากมีคา มากกวา 100 (ตรวจพบวัตถุ) จะเพิ่มคาใหตัวแปร count ขึ้นอีก 1 คาและแสดงสถานะของ count ปจ จุบันผา นคำส่งั Serial Monitor 3. ผลการทดลอง รูปที่ 11.23 ผลการทดลองการตรวจนับวตั ถุเคล่ือนทผ่ี านเซน็ เซอร ทม่ี า: ผเู ขียน 6. เซ็นเซอรอ ัลตราโซนิก เซ็นเซอรอัลตราโซนิก (Ultrasonic Sensor) คือเซ็นเซอรที่ใชสำหรับวัดระยะหางจากวัตถุที่ ถูกตรวจพบโดยใชวิธีสงสัญญาณคลื่นเสียงจากตัวสงไปตกกระทบยังวัตถุและสงสัญญาณกลับมาท่ี ตัวรับของเซ็นเซอรซึ่งเซ็นเซอรจะสามารถวัดเวลาการตรวจจับวัตถุได (Jestop, Marimuthu & Chithra, 2017)

292 ตวั สง คลื่นเสยี ง วัตถุ คล่ืนเสยี งตกกระทบ ตัวรับ รปู ที่ 11.24 ตวั อยางการจำลองการทำงานของเซน็ เซอรอ ัลตราโซนิก ทีม่ า: ผูเขยี น รูปที่ 11.24 แสดงตัวอยางการจำลองการทำงานของเซ็นเซอรอัลตราโซนิก โดยกำหนดให ระยะเวลาที่เซ็นเซอรตรวจจับวัตถุไดคือ t ในหนวยไมโครวินาที (us) ดังนั้นสามารถคำนวณคา ระยะหางระหวางตำแหนงของเซ็นเซอรและตำแหนงของวัตถุไดจาก s = v*t เมื่อ v คือคาความเร็ว ของคลื่นเสียงซงึ่ มคี าอยทู ี่ประมาณ 340 m/s และ s คอื ระยะหางระหวา งเซน็ เซอรแ ละวัตถุ อยางไรก็ ตามเนื่องจาก s ที่คำนวณไดคือระยะทางไป และกลับ ดังนั้นระยะหางระหวางเซ็นเซอรและวัตถุที่ แทจ ริงคอื s/2 ตัวอยางเชนหากเซ็นเซอรสามารถตรวจจับวัตถุไดดวยเวลา 1000 us ดังนั้นระยะระหวาง เซ็นเซอรแ ละวตั ถุคือ s=v*t แปลง t เปน หนวยวินาทีไดดงั นี้ t = 1000 us = 1000 * 10-6 s = 10-3 s ดังนนั้ s = 340 * 10-3 m แปลง s เปนหนวยเซนตเิ มตร (cm ไดดังน้ี s = 340 * 10-3 m = 340 * 10-3 * 102 * 10-2 m = 340 * 10-3 * 102 cm = 340 * 10-1 cm = 34 cm และสามารถคำนวณระยะจริงไดจาก 34/2 = 17 cm สำหรับในหวั ขอนีเ้ ลือกใชเ ซน็ เซอรอลั ตราโซนิกรุน SRF05 ซึ่งเปนโมดูลทส่ี ามารถตรวจจับ วัตถุในชว ง 1 – 400 cm และหากกำหนดใหเวลาทตี่ รวจจับไดมีหนวยเปน us ดังนน้ั ซงึ่ สามารถ เปล่ยี นหนวยของ v ไดเปน ดงั นี้

293 จาก v = 340 m/s = 340 * 102 * 10-2 m/ 106 * 10-6 s = 340 * 102 cm/ 106 * us = 0.034 cm/us ความหมายคือ 1 us คลื่นเสียงเคล่ือนท่ีได 0.034 cm ดังนั้นสามารถคำนวณหาระยะเวลาท่ี คลื่นเสียงเคล่ือนที่ 1 cm โดยเทียบบัญญัตไิ ตรยางศไ ด ดงั น้ี คลื่นเสยี งเคลอ่ื นท่ี 0.034 cm ใชเ วลา 1 us คลืน่ เสียงเคล่อื นท่ี 1 cm ใชเวลา 1/0.034 ≈ 29.41 us เพราะฉะนั้นสามารถคำนวณระยะหางไดโดยการเทียบบัญญัติไตรยางศ เชนสมมติวาเวลาที่ ไดจ ากการตรวจจับคอื 1000 us ไดวา ระยะเวลา 29.41 us วตั ถุเคลื่อนท่ีได 1 cm ระยะเวลา 1000 us วตั ถุเคลือ่ นที่ได 1000/29.41 ≈ 34 cm และสามารถคำนวณระยะจรงิ ไดจ าก 34/2 = 17 cm หรือสามารถคำนวณหาระยะระหวางเซ็นเซอรแ ละวัตถุไดจากสตู ร s = t/(29.41*2) (11.1 เมื่อ t คอื ระยะเวลาที่เรม่ิ จากสัญญาณคลืน่ ถูกสง ออกจากตัวสง และสะทอนกลับมายงั ตัวรบั อยางไรก็ตามคาความเร็วคลื่นเสียงที่กำหนดใหเปนคาโดยประมาณ โดยอุณหภูมิมีผลตอ ความเร็วคลื่นเสียงดว ย ดังนัน้ ความเรว็ คลนื่ จะเปล่ยี นเมื่ออุณหภมู มิ ีการเปลย่ี นแปลง

294 รูปท่ี 11.25 เซน็ เซอรอัลตราโซนกิ SRF05 ท่ีมา: ผูเขียน รูปที่ 11.25 แสดงเซ็นเซอรอัลตราโซนกิ SRF05 ซ่งึ มีขาสัญญาณทง้ั หมด 5 ขาดังตารางที่ 11.2 ตารางท่ี 11.2 รายละเอียดขาสัญญาณของเซน็ เซอรอัลตราโซนิก ช่ือขาสัญญาณ รายละเอยี ด Vcc Trig ขาแรงดันขนาด 5 โวลต Echo ขาสง สัญญาณคล่ืนเสียง OUT ขารับสัญญาณคลืน่ เสยี ง GND ขาเอาตพตุ ขากราวด จากตารางที่ 11.2 แสดงขาสัญญาณทั้งหมดของโมดูล SRF05 ซึ่งมีทั้งหมด 5 ขาโดย ขาสัญญาณท่ใี ชส ำหรับการรับ-สงคลน่ื เสียงคือ Trig และ Echo ขอแตกตางระหวางเซ็นเซอรอัลตราโซนิก และเซ็นเซอรสำหรับวัดระยะคือเซ็นเซอรอัลตรา โซนิกสามารถวัดระยะหางระหวางวัตถุและเซ็นเซอรได ในขณะที่เซ็นเซอรสำหรับวัดระยะสามารถ ตรวจไดเ พยี งพบหรือไมพ บวตั ถุเทาน้ัน โปรแกรม Arduino IDE มีฟงกชัน pulseIn() สำหรับควบคุมการทำงานเซ็นเซอรอัลตราโซ นิก หลักการคือหากสัญญาณมีการกลับคาสถานะที่แสดงผลลัพธเปนเวลาในหนวยไมโครวินาที เชน สญั ญาณเริม่ ตน ท่ตี รวจพบมีสถานะเปน “HIGH” จะเรมิ่ นบั เวลาจนกระท่งั สัญญาณเปลี่ยนสถานะเปน “LOW” มีรูปแบบเปนดงั นี้

295 รูปแบบ pulseIn(pin, value) หรือ pulseIn(pin, value, timeout) พารามิเตอร 1. pin คอื ตำแหนงขาของวงจรทดลอง 2. value คือ สถานะเร่มิ ตนของสญั ญาณที่กำหนดใหว งจรทดลอง 3. timeout คอื ชว งเวลาสงู สุดที่ฟงกช นั ยงั คงทำงาน ตวั อยางท่ี 11.7 การรบั คา จากเซ็นเซอรตรวจจบั ความเคลือ่ นไหว และทดสอบแสดงผลลัพธผานคำสั่ง Serial Monitor การทำงาน: รับคาสัญญาณจากตรวจจับความเคลื่อนไหว และแจงผลการตรวจพบผานคำสั่ง Serial Monitor วิธีทำ 1. สวนวงจรทดลอง TVEOGrccnuichgdto SRF 05 รูปท่ี 11.26 วงจรทดลองการรับคา จากเซน็ เซอรอลั ตราโซนิก เพื่อแสดงผลผา นคำสง่ั Serial Monitor ท่มี า: ผเู ขยี น

296 คำอธิบาย: กำหนดตำแหนง ขาท่ีเช่ือมตอกบั วงจรทดลองดังนี้ 1. ขาที่เชื่อมกับสายสัญญาณสีฟาคือสัญญาณ Trig สำหรับสงสัญญาณอัลตราโซนิกเพื่อวดั ระยะของวัตถุซึง่ ถูกเชื่อมกบั ขา 8 ของ บอรด Arduino 2. ขาที่เช่อื มกับสายสญั ญาณสีเหลืองคือสัญญาณ Echo สำหรับรับสญั ญาณอัลตราโซนิกที่ เกิดจากการสะทอนกลับซง่ึ ถูกเช่ือมกบั ขา 7 ของบอรด Arduino 3. ขาท่เี ชื่อมกบั สายสญั ญาณสดี ำอีกถูกเชอื่ มตอ กบั กราวด 4. ขาทเี่ ชอื่ มกับสายสัญญาณสีแดงอกี ถกู เชื่อมตอกับแรงดัง 5 โวลต 2. สวนโปรแกรม int trig = 8; int echo = 7; void setup(){ Serial.begin(9600); pinMode(trig, OUTPUT); pinMode(echo, INPUT); } float calDis(){ digitalWrite(trig, LOW); delayMicroseconds(3); digitalWrite(trig, HIGH); delayMicroseconds(5); digitalWrite(trig, LOW); float t_u = pulseIn(echo, HIGH); float dis = t_u/29.41/2.0; return dis; } void loop(){ float d = calDis(); Serial.print(\"Distance is \"); Serial.println(d, DEC); delay(500); }

297 คำอธิบาย: มีการกำหนดตัวแปรนอกฟงกชัน 2 ตัวแปรคือ trig สำหรับรับสงสัญญาณคลื่นเสียงเพื่อ ตรวจจับวัตถแุ ละ echo ซ่ึงคือตำแหนง ขาสำหรบั รอรบั สัญญาณคล่นื เสียงที่สะทอนกลบั มา ฟง กช นั Setup(): กำหนดใหมีตำแหนงขา trig ทำหนา ทเี่ ปน เอาตพ ุต และตำแหนง ขา echo ทำหนาที่รับสัญญาณจากอุปกรณภายนอก และกำหนดคำสั่งการเริ่มสื่อสารผานคำสั่ง Serial Monitor ฟงกชัน loop(): มีการเรียกใชฟงกชัน calDis() ซึ่งเปนฟงกชันสำหรับคำนวณระยะหาง ระหวางตำแหนงเซ็นเซอรและวัตถุโดยที่ฟงกชัน calDis() จะรีเทิรนคาเปนคาระยะหางในหนวย เซนติเมตร ฟงกชัน calDis(): รับคาเวลาที่ตรวจพบวัตถุ (t) ในหนวยไมโครวินาทีกอนที่จะคำนวณหา ระยะหางในหนวยเซนตเิ มตรและสงคนื คาดงั กลา วกลับคนื ฟงกชันการทำงานหลักในตำแหนง ที่เรยี กใช 3.1 ผลการทดลองกรณีเคล่ือนวตั ถเุ ขา ใกลเ ซน็ เซอร รูปที่ 11.27 ผลการทดลองการรับคา จากเซน็ เซอรอัลตราโซนกิ กรณีเคล่ือนวตั ถเุ ขาใกลเ ซน็ เซอร ทีม่ า: ผเู ขยี น จากรปู ที่ 11.27 แสดงผลการทดลองการรับคาจากเซ็นเซอรอลั ตราโซนิกกรณีเคลื่อนวัตถุเขา ใกลเ ซ็นเซอรพบวาสัญญาณมีคา ตำ่

298 3.2 ผลการทดลองกรณเี คล่อื นวัตถุออกหา งจากเซน็ เซอร รปู ที่ 11.28 ผลการทดลองการรับคาจากเซน็ เซอรอลั ตราโซนิก กรณเี คลื่อนวัตถุออกหางจากเซ็นเซอร ทีม่ า: ผูเขยี น จากรูปที่ 11.28 แสดงผลการทดลองการรับคาจากเซ็นเซอรอัลตราโซนิกกรณีเคลื่อนวัตถุ ออกหางจากเซน็ เซอรพบวา สญั ญาณมคี าสงู 7. กา นควบคุม กานควบคุม (Joystick คืออุปกรณอิเล็กทรอนิกสที่ทำหนาที่เปนอินพุตชนิดสำหรับสง สัญญาณไปยังบอรด Arduino โดยใชคันโยกที่ถูกตั้งอยูบนฐานเปนตัวควบคุมการสงสัญญาณซึ่งจะ ชวยใหการควบคุมการทำงานสามารถทำไดงายขึ้น นอกเหนือจากนั้นหากนำกานควบคุมไป ประยุกตใชกับการเลนเกมจะชว ยใหการเลนเกมดูสมจรงิ มากยิ่งขึน้ สามารถชวยเพิ่มความสนุกสนาน แกผูเ ลนมากขึน้ รปู ท่ี 11.29 กานควบคมุ ทีม่ า: ผูเ ขยี น

299 จากรปู ที่ 11.29 แสดงตวั อยา งของกา นควบคุมซ่งึ มขี าสัญญาณท้ังหมด 5 ขาดังน้ี ตารางท่ี 11.3 รายละเอยี ดขาสญั ญาณของกานควบคุม ช่ือขาสัญญาณ รายละเอยี ด GND ขากราวด +5V ขาแรงดนั ขนาด 5 โวลต VRx ขารบั สัญญาณการโยกคันโยกตามแนวแกน x VRy ขารับสัญญาณการโยกคันโยกตามแนวแกน y SW ขารบั สญั ญาณการกดปุม จากตารางที่ 11.3 คาของสัญญาณ VRx, VRy และ sw จะขึ้นอยูกับการเลื่อนตำแหนงของคัน โยก ดังราย ละเอยี ดตอ ไปนี้ สัญญาณ VRx: กรณไี มม ีการเคล่ือนตามแกน x: คาสญั ญาณตามแนวแกน x จะมคี าอยทู ป่ี ระมาณ 500 กรณโี ยกคักโยกไปทางซา ย: คา สญั ญาณตามแนวแกน x จะมคี าอยูที่ประมาณ 1023 กรณีโยกคักโยกไปทางขวา: คาสัญญาณตามแนวแกน x จะมคี าอยทู ี่ประมาณ 0 สัญญาณ VRy: กรณีไมมีการเคล่ือนตามแกน y: คาสญั ญาณตามแนวแกน y จะมีคา อยูท ่ปี ระมาณ 500 กรณีโยกคกั โยกขนึ้ : คา สัญญาณตามแนวแกน y จะมีคาอยทู ปี่ ระมาณ 1023 กรณีโยกคักโยกลง: คาสัญญาณตามแนวแกน y จะมคี าอยูทปี่ ระมาณ 0 สญั ญาณ sw: กรณไี มมกี ารสัมผสั ปุม: สัญญาณ sw เปน 1 กรณมี กี ารสมั ผสั ปมุ : สัญญาณ sw เปน 0

300 ตัวอยางท่ี 11.8 การรบั คา จากกา นควบคุม และทดสอบแสดงผลลัพธผ า นคำสั่ง Serial Monitor การทำงาน: รบั คา สญั ญาณจากกา นควบคมุ และแจงผลการตรวจพบผานคำส่ัง Serial Monitor วิธีทำ 1. สว นวงจรทดลอง Joystick VVswRRxy +G5nVd รูปท่ี 11.30 วงจรทดลองการรับคา จากเซน็ เซอรกา นควบคุม เพือ่ แสดงผลผา นพอรตอนุกรม ที่มา: ผเู ขียน คำอธิบาย: กำหนดตำแหนงขาท่ีเชอ่ื มตอกับบอรด Arduino ดังนี้ 1. ขาที่เชอ่ื มกับสายสญั ญาณสฟี าคอื สัญญาณทเี่ ชื่อมระยะสวิตซกบั ตำแหนงขา 8 ของ บอรด Arduino 2. ขาท่เี ชื่อมกบั สายสญั ญาณสเี หลืองคือสญั ญาณอนาล็อกสำหรับการวัดระยะการเคลอื่ นที่ ตามแนวแกน y ที่เช่ือมระหวาง VRy กบั ตำแหนงขา A1 ของบอรด Arduino 3. ขาท่ีเชอ่ื มกบั สายสัญญาณสีเขียวคอื สัญญาณอนาล็อกสำหรับการวดั ระยะการเคลอ่ื นที่ ตามแนวแกน x ทเ่ี ชือ่ มระหวาง VRx กับตำแหนงขา A0 ของบอรด Arduino 4. ขาท่เี ช่ือมกบั สายสัญญาณสแี ดงอีกถกู เชื่อมตอกับแรงดัง 5 โวลต 5. ขาท่ีเชอื่ มกับสายสัญญาณสดี ำอีกถูกเช่อื มตอ กับกราวด

301 2. สวนโปรแกรม int pin_x = 0; int pin_y = 1; int sw = 8; int bt = -1; int x = -1; int y = -1; void setup(){ pinMode(sw, INPUT); digitalWrite(sw, HIGH); Serial.begin(9600); } void loop(){ ReadJoyStrick(); Serial.print(\"Position X is \"); Serial.print(x); Serial.println(); Serial.print(\"Position Y is \"); Serial.print(y); Serial.println(); Serial.print(\"Status button: \"); Serial.print(bt); Serial.println(); delay(1000); } void ReadJoyStrick(){ bt = digitalRead(sw); x = analogRead(pin_x); y = analogRead(pin_y); } คำอธิบาย: มีการกำหนดตัวแปรนอกฟงกชัน 6 ตัวแปรคือ ตัวแปร pin_x และ pin_y เปนตัวแปร สำหรับอางอิงตำแหนงขา A0 และ A1 ของบอรด Arduino ตามลำดับ ตัวแปร sw คือตำแหนงขา บอรดที่ถูกเชื่อมตอกับสวิตซของกานควบคุม ตัวแปร bt, x, y แทนสถานะของการสัมผัสสวิตซ การ เคลื่อนท่ตี ามแนวแกน x และการเคลอ่ื นที่ตามแนวแกน y ตามลำดบั

302 ฟงกชัน Setup(): กำหนดให sw แทนการรับสัญญาณจากอุปกรณภายนอกโดยมีสถานะ เริ่มตน คอื “HIGH” และกำหนดคำส่งั การเร่มิ สอ่ื สารผานคำส่ัง Serial Monitor ฟงกชัน loop(): มกี ารเรยี กใชฟง กชัน ReadJoyStrick() ซงึ่ เปน ฟงกช ันสำหรับตรวจจับการ เคลื่อนที่เปลี่ยนตำแหนงและการสัมผัสกานควบคุม และแสดงผลลัพธของแตละตัวแปรผานพอรต อนุกรม ฟงกชัน ReadJoyStrick(): ตรวจสอบการสัมผัสสวิตซ การเคลื่อนที่ตามแนวแกน x และการ เคลอ่ื นทต่ี ามแนวแกน y จากกานควบคุม โดยผลลพั ธท่ีไดจ ะเปน ตามรายละเอยี ดดังตารางท่ี 13.1 3.1 ผลการทดลองกรณีทยี่ ังไมมกี ารขยบั ปุม รปู ท่ี 11.31 ผลการทดลองการควบคมุ กานควบคมุ กรณที ่ียังไมมีการขยับปุม ทม่ี า: ผเู ขยี น จากรูปที่ 11.31 แสดงการทดลองการควบคุมกานควบคุมกรณีที่ยังไมมีการขยับปุมผลการ ทดลองปรากฏวาระยะตามแกน x และ y จะมีคาอยูในชวงประมาณ 500 และสถานะของปุมคือ ‘1’ เน่ืองจากยังไมม ีการสัมผสั สวติ ซ

303 3.2 ผลการทดลองกรณีท่มี ีการขยับปุมขน้ึ รปู ที่ 11.32 ผลการทดลองการควบคุมกานควบคุม กรณที ม่ี ีการขยับปมุ ข้นึ ท่ีมา: ผเู ขยี น จากรูปที่ 11.32 แสดงการทดลองการควบคุมกานควบคุมกรณีมีการขยับปุมขึ้น ผลการ ทดลองปรากฏวา ระยะตามแกน y จะมีคาสูงโดยจะเปล่ยี นไปอยูในชวงประมาณ 1023 3.3 ผลการทดลองกรณีท่ีมีการขยบั ปุมลง รูปที่ 11.33 ผลการทดลองการควบคมุ กานควบคมุ กรณที มี่ ีการขยับปมุ ลง ทม่ี า: ผเู ขียน จากรูปที่ 11.33 แสดงการทดลองการควบคุมกานควบคุมกรณีมีการขยับปุมลง ผลการ ทดลองปรากฏวาระยะตามแกน y จะมีคาตำ่ โดยจะเปลีย่ นไปอยูในชว งประมาณ 0

304 3.4 ผลการทดลองกรณีที่มีการขยับปุมไปทางขวา รูปท่ี 11.34 ผลการทดลองการควบคมุ กานควบคมุ กรณที ่มี ีการขยับปมุ ไปทางขวา ทมี่ า: ผเู ขยี น จากรูปที่ 11.34 แสดงการทดลองการควบคุมกานควบคุมกรณีมีการขยับปุมไปทางขวา ผล การทดลองปรากฏวา ระยะตามแกน x จะมีคาต่ำโดยจะเปล่ยี นไปอยใู นชว งประมาณ 0 3.5 ผลการทดลองกรณที ี่มีการขยบั ปุมไปทางซาย รปู ท่ี 11.35 ผลการทดลองการควบคุมกานควบคุม กรณที ี่มีการขยับปมุ ไปทางซาย ที่มา: ผูเขยี น

305 จากรูปที่ 11.35 แสดงการทดลองการควบคุมกานควบคุมกรณีมีการขยับปุมไปทางซาย ผล การทดลองปรากฏวา ระยะตามแกน x จะมีคา สงู โดยจะเปลีย่ นไปอยูในชว งประมาณ 1023 3.6 ผลการทดลองกรณที ่ีมีการสมั ผัสปุม รูปท่ี 11.36 ผลการทดลองการควบคมุ กานควบคุม กรณที ม่ี ีการสัมผัสปุม ทมี่ า: ผูเขียน จากรูปที่ 11.36 แสดงการทดลองการควบคุมกานควบคุมกรณีมีการสัมผัสปุม (สีเหลี่ยมสี แดง) ผลการทดลองปรากฏวา สถานะของปุม เปลี่ยนเปน ‘0’ 8. บทสรุป เซ็นเซอรคือ อุปกรณทางอิเล็กทรอนิกสท่ีถกู นำมาใชสำหรับการตรวจจับสญั ญาณในรูปแบบ ตางๆ เชน สัญญาณแสง สัญญาณเสยี ง หรือคาสี เปนตน เพอ่ื นำไปใชประโยชนไดใ นหลากหลายดาน เชนงานดานเกษตร อุตสาหกรรม ทางการแพทย โดยเฉพาะอยางยิ่งระบบงานทีม่ ีลักษณะการทำงาน แบบอตั โนมัติ โดยทัว่ ไป สัญญาณที่ถกู สง จากเซน็ เซอรจ ะเปนแบบอนาล็อก (แตย งั มีเซ็นเซอรบางชนิด ที่สงสัญญาณเปนแบบดิจิทัล ซึ่งเปนสัญญาณที่มีความตอเนื่อง ดังนั้นการเขียนโปรแกรมควบคุม บอรด Arduino เพื่อรอรับคาจากเซ็นเซอรจะมีความแตกตางจากการรับคาจากสวิตซ เนื่องจากกรณี ที่สัญญาณเปนแบบอนาล็อกจำเปนตองถูกแปลงเปนสัญญาณดิจิทัลกอนที่จะนำไปใชงาน อยางไรก็ ตามการสงสญั ญาณดังกลาวไปยังบอรด Arduino จำเปนตองถูกสงไปยังตำแหนงขาที่สามารถรองรับ สัญญาณแบบอนาล็อกไดเทานั้น โปรแกรม Arduino IDE มีฟงกชันที่ชื่อ “analogRead()” ซึงเปน

306 ฟง กช ันสำหรับอานสัญญาณแบบอนาลอ็ กจากเซ็นเซอรสบู อรด Arduino ซึ่งบอรด Arduino Uno R3 สามารถรับสัญญาณอนาล็อกไดที่ตำแหนงขา A0 - A5 นอกเหนือจากนั้นผูใชงานสามารถใชฟงกชัน map() เพือ่ ปรบั ชวงคา ของสัญญาณอนาลอ็ กใหมใหอ ยูในชว งตามทีผ่ ูใ ชงานตองการได เซ็นเซอรแอลดอี าร คือเซ็นเซอรทคี่ า สญั ญาณท่ีถูกสง ออกมาจากตัวอุปกรณขึน้ อยูกับปริมาณ แสงทม่ี าตกกระทบ โดยท่ีคา ความตานทานจะลดลงเมอื่ มีแสงมาตกกระทบท่ีเซน็ เซอร เซ็นเซอรสำหรับวัดระยะ ใชสำหรับวัดระยะวัตถุไดโดยใชหลักการสะทอนของคล่ืน อนิ ฟราเรด โดยระยะท่ีตัวเซ็นเซอรจ ะสามารถตรวจจบั คา ไดอ ยูระหวาง 3 – 80 เซนตเิ มตร เซ็นเซอรตรวจจับความเคลื่อนไหว คืออุปกรณที่ใชสำหรับตรวจจับการเคลื่อนไหวของวัตถุ เมือ่ มวี ัตถุเคลื่อนท่ผี าน จึงนยิ มถูกนำมาใชสำหรบั การตรวจจบั การเคลอ่ื นไหวของวตั ถุ เซ็นเซอรอัลตราโซนิก ถูกใชสำหรับวัดระยะหางจากวัตถุที่ถูกตรวจพบโดยใชวิธีสงสัญญาณ คลื่นเสียงจากตัวสงไปตกกระทบยังวัตถุและสงสัญญาณกลับมาที่ตัวรับของเซ็นเซอรซึ่งเซ็นเซอรจะ สามารถวัดเวลาการตรวจจับวัตถไุ ด กานควบคุม คืออุปกรณอิเล็กทรอนิกสที่ทำหนาที่เปนอินพุตชนิดหนึ่งเพื่อใชสำหรับสง สัญญาณไปยังบอรด Arduino โดยใชคันโยกที่ถูกตั้งอยูบนฐานเปนตัวควบคุมการสงสัญญาณซึ่งจะ ชว ยใหก ารควบคมุ การทำงานสามารถทำไดงายขนึ้

307 แบบฝก หดั ทา ยบท บทท่ี 11 1. สญั ญาณอนาล็อกคืออะไร 2. บอรด Arduino Uno R3 มีตำแหนง ขาใดบา งที่สามารถรับสญั ญาณอนาล็อกได 3. ฟง กชัน analogRead() มีประโยชนอยา งไร 4. ฟงกช นั map() มปี ระโยชนอ ยา งไร 5. จงแสดงการใชฟงกชนั map() เพอ่ื รบั สัญญาณอนาลอ็ กขนาด 10 บิต โดยปรับคาใหอยูใ นชวง 0 – 100 6. จงอธิบายความแตกตา งระหวา งเซ็นเซอรวัดระยะ และเซ็นเซอรต รวจจบั ความเคล่ือนไหว 7. เซ็นเซอรอลั ตราโซนิกสามารถตรวจจบั วัตถุไดภ ายในเวลา 900 ไมโครวนิ าทีจงความหาระยะหาง ระหวางวตั ถแุ ละเซอร 8. กำหนดใหเซอรเซ็น 2 ตัวถูกเชื่อมตอกับตำแหนงขา A0 และ A1 และหลอดแอลอีดีจำนวน 1 หลอดซึ่งขั้วแอโนดถูกเชื่อมตอกับตำแหนงขา 8 จงเขียนโปรแกรมเพื่อควบคุมสถานะของหลอด แอลอีดีโดยเงื่อนไขเดียวที่จะทำใหหลอดแอลอีดีเกิดสถานะ “ติด” คือเซอรเซอรตัวที่ถูกเชื่อมตอกับ A0 มีคา มากกวา 70 และเซน็ เซอรตวั ที่ถูกเชอื่ มตอกับ A1 มคี านอ ยกวา 50

308 เอกสารอา งอิง เดชฤทธิ์ มณีธรรม. (2559). คัมภีรการใชงาน ไมโครคอนโทรลเลอร Arduino. กรุงเทพฯ: ซีเอ็ด ยูเคชั่น. ประภาส พุมพวง. (2561). การเขียนและการประยุกตใชงานโปรแกรม Arduino. กรุงเทพฯ: ซีเอ็ด ยเู คชั่น. Adith, J. B. (2015). Arduino by Example. Birmingham: Packt Publishing Ltd. Don, W. (2015). Arduino Electronics Blueprints. Birmingham: Packt Publishing Ltd. Jestop, C., Marimuthu, B. and Chithra, K. (2017). Ultrasonic water level indicator and controller using AVR microcontroller. Proceedings of the International Conference on Information Communication and Embedded Systems, Febuary 23-24 2017. (pp. 1 – 6). China: IEEE. Margolis, M. (2011). Arduino Cookbook. United States: O’Reilly Media, Inc. Tero, K., Kimmo, K. and Ville, V. (2014). Make: Sensors. Canada: Maker Media. Inc.

แผนบรหิ ารการสอนประจำบทท่ี 12 การประยุกตใ ชไ อซสี ำหรบั ขยายพอรต การทำงาน หวั ขอเนอ้ื หา 1. ไอซเี บอร 74HC595 2. ฟง ชนั ก shiftOut( 3. การใชไ อซี 74HC595 สำหรับขยายพอรต Arduino เพื่อควบคุมแอลอีดี 7 สวน 4. การใชไอซี 74HC595 สำหรบั ขยายพอรต Arduino เพื่อควบคุมเมตริกซแอลอดี ี 5. การทดสอบใชงานเมตริกซแ อลอีดสี ำเรจ็ รปู ใน Proteus 6. บทสรุป แบบฝก หดั ทายบท เอกสารอางองิ วตั ถปุ ระสงคเ ชิงพฤติกรรม เม่ือผูเ รียน เรียนจบบทนี้แลว ผูเรียนควรมีความสามารถ ดังน้ี 1. อธิบายเก่ยี วกบั ไอซีสำหรบั ขยายพอรตการทำงานได 2. อธิบายเกี่ยวกับฟงชันกที่ใชรวมกับไอซีสำหรับขยายพอรตการทำงานในโปรแกรม Arduino IDE ได 3. เขียนโปรแกรมควบคุมอปุ กรณอิเล็กทรอนิกสร วมกบั การใชง านไอซีขยายพอรต 4. มีความตง้ั ใจในการเรยี นและการฝก ปฏิบตั กิ ารเขียนโปรแกรม วิธกี ารสอนและกิจกรรมการเรยี นการสอนประจำบท 1. บรรยายเนอื้ หาในแตล ะหัวขอ พรอ มยกตัวอยางประกอบ โดยใชเอกสารคำสอน และสือ่ power point 2. ทดลองปฏิบัติจริง โดยการเขียนโปรแกรม Arduino IDE เพื่อควบคุมอุปกรณ อิเล็กทรอนิกสโ ดยใชไอซขี ยายพอรต การทำงานผา นโปรแกรม Proteus 3. ผูสอนสรปุ เน้อื หา 4. ทำแบบฝก หดั เพ่ือทบทวนบทเรียน 5. เปด โอกาสใหผเู รียนถามขอสงสัย

310 6. ผสู อนทำการซักถาม สอ่ื การเรยี นการสอน 1. เอกสารคำสอนวิชาการประยุกตใ ชงานไมโครคอนโทรลเลอร 2. สือ่ power point การวัดผลและการประเมิน 1. การเขาเรยี นตรงตอ เวลา และการแตงกาย 2. ความรวมมือและความรับผิดชอบตอการเรยี น 3. การถาม-ตอบ 4. การสง งานที่ไดรบั มอบหมายภายในเวลาท่กี ำหนด 5. การทำแบบฝกหัดที่มีความถูกตอ งไมน อยกวา 80%

บทที่ 12 การประยกุ ตใ ชไ อซสี ำหรบั ขยายพอรตการทำงาน เนื่องจากบอรด Arduino โดยสวนมากจะถูกออกแบบมีพอรตสำหรับการใชงานจำนวนไม มาก ดังนั้นจำนวนพอรตอาจมีไมเพียงพอตอการใชงาน ซึ่งในกรณีท่ีจำเปนตองใชงานพอรตเปน จำนวนมาก การแกปญหาคือนำไอซีที่ทำงานเปนแบบชิฟรีจิสเตอรมาประยุกตใชงาน (ธวัชชัย เลื่อน ฉวี และ อนุรักษ เถื่อนฉวี, 2527) หลักการสำคัญคือเมื่อมีการใสคำสั่งขอมูลใหมจะเกิดการเลื่อนบิต ขอมูลที่ตรงตามคำสั่ง โดยไอซีที่ใชสำหรับทำหนาที่เปนชิฟรีจิสเตอรมีอยูเปนจำนวนมากเชน 74HC595, 74LS595, TPIC6B595 โดยเอกสารคำสอนเลมนี้จะยกตัวอยางการนำไอซีเบอร 74HC595 มาประยุกตใ ชงานกับบอรด Arduino Uno R3 1. ไอซเี บอร 74HC595 ไอซีเบอร 74HC595 คือไอซีที่สามารถนำมาประยุกตใชสำหรับการขยายพอรตของบอรด Arduino รวมไปถึงไมโครคอนโทรลเลอรต ระกูลอืน่ ๆ ไดโดยใชหลกั การเลอ่ื นขอมลู ครัง้ ละ 1 บิต รูปที่ 12.1 ไอซีเบอร 74HC595 จากโปรแกรม Fritzing ที่มา: ผเู ขยี น รูปที่ 12.1 แสดงตัวอยางของไอซีเบอร 74HC595 ซึ่งเปนไอซีขนาด 16 ขา โดยใชขารับ สัญญาณที่จำเปนตองเชื่อมตอกับบอรด Arduino เพียง 3 ขา แตสามารถใชเปนขาสำหรับควบคุม สถานะของการทำงานอุปกรณภ ายนอกไดสูงถึง 8 ขา

312 รปู ที่ 12.2 ไอซเี บอร 74HC595 สำหรบั โปรแกรม Proteus ท่มี า: ผเู ขยี น รูปที่ 12.2 แสดงไอซีเบอร 74HC595 ที่ใชสำหรับโปรแกรม Proteus ไอซีชนิดนี้เปนไอซี ตระกูลทีทีแอลที่หากนำไปประยุกตใชงานกับไมโครคอนโทรเลอรจะทำหนาที่ขยายพอรตการใชงาน เพิ่มมากขึ้น (เดชฤทธ์ิ มณธี รรม, 2559 โดยมขี าการใชงานที่สำคัญเปนดังน้ี ขา 11 (SH_CP) คือขาที่ทำหนาที่เปนตัวใหก ำเนิดสญั ญาณนาิกา ซึ่งทุกครั้งที่มกี ารเปล่ียน สถานะของเอาตพุตจะตองสรางสัญญาณนาิกา แตอยา งไรกต็ ามเน่ืองจากบอรด Arduino มีฟงกชัน ที่ใชสำหรับแสดงสถานะเอาตพุตรวมกับชิพรีจิสเตอรซึ่งจะสรางสัญญาณนาิกาที่ขา SH_CP โดย อตั โนมตั ิ ขา 12 (ST_CP คือขาที่ใชสำหรับควบคุมจังหวะการสงขอมูลโดยท่ีจะกำหนดใหมีสถานะ เปน “HIGH” ในกรณีที่ยังไมมีการสงขอมูลเกิดขึ้น และกำหนดใหมีสถานะเปน “LOW” ในขณะที่มี การสงขอมูล ขา 14 (DS คอื ขาทีใ่ ชสำหรับการปอ นคาขอมูลไปยงั ชฟิ รีจสิ เตอรค รั้งละ 1 บติ ขา 10 (MR) คอื ขาท่ีใชสำหรับเคลียรขอมูลในชิฟรีจิสเตอร โดยจะถูกกำหนดใหมีสถานะเปน “HIGH” เสมอ ดังนั้นจงึ สามารถตอขาดงั กลา วรว มกับ +VCC ขา 13 (OE) คือขาที่ถูกกำหนดสถานะเปน “LOW” เสมอ ดังนั้นจึงสามารถตอขาดังกลาว รว มกับขากราวดเสมอ ขา 15 และ 1-7 (Q0 – Q7) คือขาเอาตพุตรวมกันขนาด 8 บิตซึ่งจะแสดงผลแบบขนาน (แสดงผลการทำงานพรอมกันทั้ง 8 ขา) ขา 9 (Q7') คอื ขาเอาตพุตทแ่ี สดงผลเปน แบบลำดับรว มกบั ขา Q0 – Q7 สำหรับขาที่จะเชื่อมกับบอรด Arduino มีทั้งหมด 3 ขาประกอบไปดวย SH_CP, ST_CP และ DS โดยวธิ ีการสำหรบั ควบคุมสถานะการทำงาน Q0 – Q7 เปน ดังนี้

313 ลำดับที่ 1 กำหนดสถานะของ ST_CP ใหมีสถานะเปน “LOW” เพื่อรอการสงขอมูลมาจาก บอรด Arduino ลำดับที่ 2 กำหนดใหขา DS มีคาตรงกับสถานะของเอาตพุตโดยการรับคาครั้งละ 1 บิต จำนวน 8 คา ลำดับที่ 3 กำหนดสัญญาณนาิกาที่ขา SH_CP จำนวน 1 ลูกตอการรับคาที่ขา DS จำนวน 1 บิต ดงั นน้ั หากตอ งควบคมุ สถานะทั้งหมด 8 บติ จะตองสรางสญั ญาณนาิกาจำนวนท้ังหมด 8 ลูก 2. ฟงชันก shiftOut() ฟง ชนั ก shiftOut() คอื ฟงกช ันทีม่ ีอยใู นไลบรารีของโปรแกรม Arduino IDE ซงึ่ เปนฟงกชันที่ มีหนาที่สำหรับ การเลื่อนบิตขอมูลขนาด 1 บิตมีรูปแบบการเลื่อนได 2 วิธี (ดอนสัน ปงผาบ, 2560) คือการเลื่อนจากบิตที่อยูในตำแหนงนัยสำคัญสูงสุด หรือ บิตที่อยูตำแหนงนัยสำคัญต่ำที่สุดซึ่งขอดี ของการใชงานฟงกชันนี้คือไมจำเปนตองเขียนคำสั่งควบคุมการทำงานชิฟรีจิสเตอรขึ้นเอง โดยมี รูปแบบการใชงานเปน ดังนี้ รปู แบบ shiftOut(d_pin, d_clock, bit_order, value) พารามเิ ตอร 1. d_pin คือขาที่ทำหนาที่เปนเอาตพุตที่มีขนาด 1 บิต ซึ่งคือตำแหนงขา DS ของไอซี 74HS595 2. d_clock คือขาที่ทำหนาที่กำเนิดสัญญาณนาิกา ซึ่งคือตำแหนงขา SH_CP ของไอซี 74HS595 3. bit_order คือการกำหนดรูปแบบการเลอ่ื นบติ ซึง่ กำหนดได 2 รูปแบบคือ 3.1 MSBFIRST คือกำหนดใหเลอื่ นบิตที่มีนยั สำคัญสูงสดุ กอ น 3.2 LSBFIRST คอื กำหนดใหเ ลอ่ื นบติ ที่มีนยั สำคัญตำ่ สุดกอ น 4. value คือสถานะของขอ มลู ทถี่ กู เลอ่ื น Q0 – Q7

314 ตัวอยางที่ 12.1 โปรแกรมควบคมุ หลอดแอลอีดีจำนวน 8 หลอดโดยใชไอซี 74HC595 สำหรับขยาย พอรต การทำงาน: หลอดแอลอดี ีจะมีสถานะติดดับสลบั กนั ระหวา ง 4 บิตบน และ 4 บิตลา ง วธิ ที ำ 1. สวนบอรดทดลอง รปู ท่ี 12.3 บอรด ทดลองควบคุมหลอดแอลอีดีจำนวน 8 หลอด โดยใชไ อซี 74HC595 สำหรบั ขยายพอรต ทีม่ า: ผเู ขยี น คำอธิบาย: ตอขา 1, 2 และ 3 จากบอรด Arduino เขากับขา ST_CP, DS และ SH_CP ของไอซี 74HC595 ตามลำดับ และตอหลอดแอลอีดีท้งั หมด 8 หลอดกบั ขา Q0 – Q7 ของไอซี 74HC595 โดย หลอดแอลอีดีจะแสดงสถานะของการติด – ดับสลับกันระหวางตำแหนง 4 บิตบน และตำแหนง 4 บิต ลา ง 2. สว นโปรแกรม void setup() { pinMode(1, OUTPUT); // 1 = ST_CP pinMode(2, OUTPUT); // 2 = DS pinMode(3, OUTPUT); // 3 = SH_CP digitalWrite(1, HIGH); } void loop() { Extended_Port(0x0f); delay(1000);

315 Extended_Port(0xf0); delay(1000); } void Extended_Port(byte p){ digitalWrite(1, LOW); shiftOut(2, 3, MSBFIRST, p); digitalWrite(1, HIGH); } คำอธิบาย: ฟงกชัน Setup(): กำหนดใหตำแหนงขาที่ 1, 2 และ 3 ของบอรด Arduino ทำหนาที่เปน การสงออกสัญญาณ และกำหนดใหขาที่ 1 มีสถานะเปน “HIGH” เนื่องจากยังไมมีการสงขอมูล เกิดขนึ้ ฟงกช นั loop(): เรยี กใชง านฟงกช ัน Extended_Port() ทุกๆ 1 วินาทโี ดยคาอารกิวเมนตท่ี ถูกสงไปจะสลับกันระหวาง 0xf0 (0xf0 = 11110000) และ 0x0f (0x0f = 00001111 ฟงกชัน Extened_Port( : รับพารามิเตอร 1 คาคือ p ซึ่งเปนขอมูลขนาด 8 บิตที่ใช สำหรับแสดงสถานะผานไอซี 74HC595 ที่ Q0 – Q7 โดยภายในฟงกชันจะตองกำหนดใหขา 1 มี สถานะเปน “LOW” เพอ่ื ที่จะไดเ ขยี นขอมลู ลงไอซีได และเรียกใชฟ งกชัน shiftOut() เพ่ือสั่งให Q0 – Q7 แสดงสถานะตามขอมูล p ซึ่งจากตัวอยางจะเปนการติด – ดับสลับกันระหวางตำแหนง 4 บิตบน และตำแหนง 4 บิตลาง และสุดทายสั่งใหขา 1 มีสถานะเปน “HIGH” เนื่องจากไมมีการสงขอมูล เกิดขน้ึ อกี แลว 3. การใชไอซี 74HC595 สำหรับขยายพอรต Arduino เพือ่ ควบคมุ แอลอีดี 7 สว น หวั ขอนี้กลา วถึงการนำไอซีเบอร 74HC595 มาประยกุ ตใชงานรว มกับแอลอีดี 7 สวนเพื่อลด จำนวนขาการใชง านในบอรด Arduino ตัวอยางที่ 12.2 โปรแกรมนับเลข 0 – 9 ผานหลอดแอลอีดี 7 สวนโดยใชไอซี 74HC595 สำหรับ ขยายพอรต การทำงาน: หลอดแอลอดี ี 7 สวนจะแสดงผลออกเปนเลข 0 – 9 ตามลำดับ วิธีทำ 1. สวนบอรด ทดลอง:

316 รปู ท่ี 12.4 บอรดทดลองควบคมุ แอลอดี ี 7 สวนแบบคอมมอนคาโทด โดยใชไอซี 74HC595 สำหรบั ขยายพอรต ที่มา: ผูเ ขยี น คำอธิบาย: ปรับเปลี่ยนวงจรจากตัวอยางที่ 1 โดยการนำหลอดแอลอีดี 7 สวนมาใชงานแทนแอลอีดี จำนวน 8 หลอด และขาเอาตพ ตุ ของไอซี 74HC595 มกี ารใชง านเหลอื เพียง 7 ขาคอื ขา Q0 – Q6 โดย มีการแสดงผลเปนตวั เลข 0 – 9 ตามลำดับ 2. สวนโปรแกรม byte count = 0; int num[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; void setup() { pinMode(1, OUTPUT); // 1 = ST_CP pinMode(2, OUTPUT); // 2 = DS pinMode(3, OUTPUT); // 3 = SH_CP digitalWrite(1, HIGH); } void loop() { Extended_Port(num[count]); delay(1000); count++; if(count == 10){ count = 0; } } void Extended_Port(byte p){ digitalWrite(1, LOW); shiftOut(2, 3, MSBFIRST, p);

317 digitalWrite(1, HIGH); } คำอธิบาย: มกี ารกำหนดตัวแปรนอกฟง กช นั 2 ตัวแปรคือ count ท่ีใชส ำหรับการนับคา และตวั แปร num ซงึ่ เปนตัวแปรแบบอารเ รยท่เี ก็บคา ทั้งหมด 10 คา คือรูปแบบการแสดงผลของหลอดแอลอีดี 7 สวนเปน เลข 0 – 9 ฟงกชัน Setup(): กำหนดใหตำแหนงขาที่ 1, 2 และ 3 ของบอรด Arduino ทำหนาที่เปน เอาตพ ุตและกำหนดใหข าที่ 1 มสี ถานะเปน “HIGH” เน่อื งจากยงั ไมมกี ารสง ขอมลู เกิดขึ้น ฟง กชนั loop(): เรยี กใชง านฟงกช ัน Extended_Port() ทกุ ๆ 1 วนิ าทีโดยคาอารกิวเมนตที่ ถูกสงไปคือ num[count] ซึ่งคือการแสดงผลรูปแบบตัวเลขผานแอลอีดี 7 สวนโดยคาตัวเลขที่แสดง ข้นึ อยกู ับคา count ปจจุบนั ฟงกชัน Extened_Port( : รับพารามิเตอร 1 คาคอื p ซ่งึ เปน ขอมูลขนาด 8 บิตทใี่ ชสำหรบั แสดงสถานะผานไอซี 74HC595 ที่ Q0 – Q7 โดยภายในฟงกชันจะตองกำหนดใหขา 1 มีสถานะเปน “LOW” เพื่อที่จะไดเขียนขอมูลลงไอซีได และเรียกใชฟงกชัน shifOut() เพื่อสั่งให Q0 – Q7 แสดง สถานะตามขอ มูล p ซึ่งจากตวั อยางจะเปนการกำหนดใหแอลอดี ี 7 สว นมกี ารแสดงผลเปน ตัวเลข 0 – 9 ในทุกๆ 1 วนิ าที ตัวอยางที่ 12.3 โปรแกรมนับเลข 0 – 99 ผานหลอดแอลอดี ี 7 สวนจำนวน 2 หลักโดยใชไอซี 74HC595 สำหรบั ขยายพอรต การทำงาน: หลอดแอลอีดี 7 สวนจะแสดงผลออกเปน เลข 0 – 99 ตามลำดับ วิธีทำ รูปที่ 12.5 บอรดทดลองควบคุมแอลอดี ี 7 สว นแบบคอมมอนคาโทด จำนวน 2 หลักโดยใชไอซี 74HC595 สำหรับขยายพอรต ทม่ี า: ผูเ ขียน

318 คำอธิบาย: ปรับเปลี่ยนวงจรจากตัวอยางที่ 2 โดยการเพิ่มหลอดแอลอีดี 7 สวนอีก 1 หลัก และไอซี 74HC595 อีก 1 ตัว เพื่อใหสามารถแสดงผลลัพธอ อกเปนตัวเลขแบบ 2 หลักได โดยที่โปรแกรมจะมี การแสดงผลเปน ตวั เลข 0 – 99 ตามลำดบั 2. สว นโปรแกรม int count = 0; int num[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int dg0; int dg1; void setup() { pinMode(1, OUTPUT); // 1 = ST_CP ตัวที่ 1 pinMode(2, OUTPUT); // 2 = DS ตัวท่ี 1 (ตำแหนงหลักสิบ pinMode(3, OUTPUT); // 3 = SH_CP ตวั ท่ี 1 pinMode(4, OUTPUT); // 4 = ST_CP ตัวท่ี 2 pinMode(5, OUTPUT); // 5 = DS ตัวท่ี 2 (ตำแหนง หลกั หนว ย pinMode(6, OUTPUT); // 3 = SH_CP ตวั ท่ี 2 digitalWrite(1, HIGH); digitalWrite(4, HIGH); } void loop() { dg0 = count%10; dg1 = count/10; Extended_Port(1, 2, 3, num[dg1]); Extended_Port(4, 5, 6, num[dg0]); delay(1000); count++; if(count == 100){ count = 0; } } void Extended_Port(byte st, byte ds, byte sh, byte p){ digitalWrite(st, LOW); shiftOut(ds, sh, MSBFIRST, p); digitalWrite(st, HIGH); }

319 คำอธิบาย: มีการกำหนดตัวแปรนอกฟงกชัน 4 ตัวแปรคือ โดยอีก 2 ตัวแปรที่ถูกกำหนดเพิ่มเติมคือ dg0 และ dg1 สำหรับเก็บคาเลขหลกั หนวยและหลักสิบของตวั แปร count ตามลำดบั ฟงกชัน Setup(): กำหนดใหตำแหนงขาที่ 1, 2, 3, 4, 5 และ 6 ของบอรด Arduino ทำ หนาท่เี ปนเอาตพ ุต และกำหนดใหขาท่ี 1 และ 4 มีสถานะเปน “HIGH” เน่ืองจากยังไมมกี ารสงขอมูล เกิดขึ้น ฟงกชัน loop(): เริ่มจากคำนวณหา dg0 และ dg1 และเรียกใชงานฟงกชัน Extended_Port() จำนวน 2 ครั้งในทุกๆ ทุกๆ 1 วินาทีเพื่อควบคุมแอลอีดี 7 สวนจำนวน 2 หลัก สำหรบั แตล ะรอบการทำงาน โดยคา อารกวิ เมนตท ีถ่ กู สง ไปมีทงั้ หมด 4 คาเพ่ือควบคุมขา ST_CP, DS, SH_CP และสถานะของ Q0 – Q6 ฟงกชัน Extened_Port( : รบั พารามิเตอร 4 คาคอื st, ds, sh และ p สำหรบั ควบคุมการ ทำงานท่ีขา ST_CP, DS, SH_CP และ Q0 – Q6 ของไอซี 74HC595 ตามลำดับ 4. การใชไ อซี 74HC595 สำหรบั ขยายพอรต Arduino เพื่อควบคุมเมตริกซแ อลอีดี หัวขอนี้กลาวถึงการนำไอซีเบอร 74HC595 มาประยุกตใชงานรวมกับเมตริกซแอลอีดี (Adith, 2015) เพื่อลดจำนวนขาการใชงานในบอรด Arduino ซึ่งขอดีของเมตริกซแอลอีดีเมื่อนำไป เปรียบเทียบกับแอลอีดี 7 สวนคือสามารถ กำหนดรูปแบบการแสดงผลไดยืดหยุนมากกวา (Jeremy, 2013) แตอยางไรก็ตามหากตองการความสวยงามซึ่งตองมีความละเอียดสูงจำเปนตองใชพอรต สำหรบั การเชือ่ มตอมากขน้ึ ตามไปดวย ตัวอยา งที่ 12.4 การควบคุมเมตรกิ ซแอลอดี ีแบบ 1 คอลัมนโ ดยใชไอซี 74HC595 สำหรับขยายพอรต การทำงาน: ตำแหนงการติดของหลอดแอลอดี ีคอื คอลัมนที่ 2 และแถวที่ 1, 2 วธิ ที ำ 1. สวนบอรด ทดลอง

320 คอลัมน คอลัมน คอลัมน คอลัมน ท่ี 1 ท่ี 2 ที่ 3 ที่ 4 แถวท่ี 1 แถวท่ี 2 แถวท่ี 3 รปู ที่ 12.6 บอรด ทดลองการควบคมุ เมตริกซแอลอีดีแบบ 1 คอลัมน โดยใชไอซี 74HC595 สำหรบั ขยายพอรต ทม่ี า: ผูเ ขียน คำอธิบาย: นำหลอดแอลอีดที ั้งหมด 12 หลอดมาเรียงกนั เปนแบบเมตริกซขนาด 3 แถว x 4 คอลัมน โดยใชไ อซี 74HC595 สำหรบั ขยายพอรต ซง่ึ การใชงานบอรด Arduino เหลอื เพยี ง 3 ขา ดงั นี้ ตำแหนงขา ตำแหนงขา ตำแหนงขา (Arduino) (ไอซี 74HC595 (เมตรกิ ซแอลอดี ี 1 12 - (ST_CP) 2 - 14 3 (DS) - 11 - (SH_CP) แถวท่ี 1 - 15 (Q0) แถวที่ 2 - 1 (Q1) แถวท่ี 3 - 2 (Q2) คอลัมนท ี่ 1 - 3 (Q3) คอลัมนท่ี 2 - 4 (Q4) คอลัมนท่ี 3 - 5 (Q5) คอลัมนท ่ี 4 6 (Q6)

321 2. สว นโปรแกรม void setup() { pinMode(1, OUTPUT); // 1 = ST_CP pinMode(2, OUTPUT); // 2 = DS pinMode(3, OUTPUT); // 3 = SH_CP digitalWrite(1, HIGH); Extended_Port(0x14); } void loop() { } void Extended_Port(byte p){ digitalWrite(1, LOW); shiftOut(2, 3, MSBFIRST, p); digitalWrite(1, HIGH); } คำอธิบาย: จากโจทยกำหนดใหตำแหนงการติดของหลอดแอลอีดีคือคอลัมนที่ 2 และแถวที่ 1, 2 ดังนั้นในแถวที่ 1 และ 2 ตองมีสถานะเปน “LOW” สวนแถวที่ 3 ใหมีสถานะเปน “HIGH” และใน แนวคอลัมนคือ ตองกำหนดใหคอลัมนที่ 2 มีสถานะเปน “HIGH” สวนคอลัมนที่ 1, 3 และ 4 มี สถานะเปน “LOW” ไดเ ปนดงั น้ี ตำแหนง ขาไอซี 7 6 5 4 3 2 1 15 74HC595 (Q7) (Q6) (Q5) (Q4) (Q3) (Q2) (Q1) (Q0) ตำแหนงของ - คอลมั นที่ คอลมั นที่ คอลัมนท่ี คอลมั นท่ี แถวท่ี 3 แถวท่ี 2 แถวท่ี 1 เมตริกซแ อลอีดี 4 321 สถานะ 0 0 0 1 0 100 เนอ่ื งจากตำแหนง ขาที่ 7 ของไอซี 74HC595 ไมไ ดถูกใชงานจึงสามารถกำหนดใหเปนสถานะท่ี ไมสนใจได คือมีคาเปนไดทั้ง “HIGH” หรือ “LOW” โดยหากกำหนดใหเปน “LOW” เมื่อแปลงเปน เลขฐานสิบหกจะได 0x14 แตห ากกำหนดใหเปน “HIGH” เมอ่ื แปลงเปน เลขฐานสบิ หกจะได 0x94 ฟงชันก Setup(): ตอขา 1, 2 และ 3 จากบอรด Arduino เขากับขา ST_CP, DS และ SH_CP ของไอซี 74HC595 ตามลำดบั และกำหนดใหขาท่ี 1 มสี ถานะเปน “HIGH” กอ นที่จะเรียกใช ฟงชันก Extened_Port( พรอมกับสง 0x14 เปนอารกิวเมนตสำหรับสั่งใหหลอดแอลอีดีมีสถานะ “ตดิ ” ในตำแหนง แถวที่ 1, 2 และคอลมั นที่ 2

322 ฟง ชันก loop(): - ฟงกชนั Extened_Port( : รับพารามิเตอร 1 คาคอื p ซง่ึ เปนขอมูลขนาด 8 บติ ทใ่ี ชส ำหรบั แสดงสถานะเอาตพ ุตผานไอซี 74HC595 ที่ Q0 – Q6 คือคา 0x14 ผา นฟงกชัน shiftOut( 3. ผลการทดลอง รูปท่ี 12.7 ผลการทดลองการควบคุมเมตริกซแ อลอีดีแบบ 1 คอลมั น โดยใชไอซี 74HC595 สำหรับขยายพอรต ท่มี า: ผเู ขียน ตัวอยางท่ี 12.5: การควบคุมเมตรกิ ซแ อลอดี ีแบบ 1 แถวโดยใชไ อซี 74HC595 สำหรบั ขยายพอรต การทำงาน: ตำแหนงการติดของหลอดแอลอดี ีคอื แถวท่ี 3 และคอลมั นที่ 3, 4 วธิ ีทำ 1. สว นบอรดทดลอง: เชื่อมตออุปกรณภ ายนอก เขากับบอรด Arduino ดงั ตวั อยางท่ี 12.4 2. สว นโปรแกรม void setup() { pinMode(1, OUTPUT); // 1 = ST_CP pinMode(2, OUTPUT); // 2 = DS pinMode(3, OUTPUT); // 3 = SH_CP digitalWrite(1, HIGH); Extended_Port(0x63); } void loop() {} void Extended_Port(byte p){ digitalWrite(1, LOW); shiftOut(2, 3, MSBFIRST, p); digitalWrite(1, HIGH);}

323 คำอธิบาย: จากโจทยกำหนดใหตำแหนงการติดของหลอดแอลอีดีคือแถวท่ี 3 และ คอลัมนที่ 3, 4 ดังนั้นในแถวที่ 3 ตองมีสถานะเปน “LOW” สวนแถวที่ 1 และ 2 ใหมีสถานะเปน “HIGH” และใน แนวคอลัมนคือ ตองกำหนดใหคอลัมนที่ 3, 4 มีสถานะเปน “HIGH” สวนคอลัมนที่ 1 และ 2 มี สถานะเปน “LOW” ไดเปนดงั น้ี ตำแหนง ขาไอซี 7 6 5 4 3 2 1 15 74HC595 (Q7) (Q6) (Q5) (Q4) (Q3) (Q2) (Q1) (Q0) ตำแหนงของ - คอลมั นท ่ี คอลมั นที่ คอลัมนท ี่ คอลัมนที่ แถวท่ี 3 แถวที่ 2 แถวท่ี 1 เมตรกิ ซแอลอีดี 4 321 สถานะ 0 1 1 0 0 011 ฟงชันก Setup(): ตอขา 1, 2 และ 3 จากบอรด Arduino เขากับขา ST_CP, DS และ SH_CP ของไอซี 74HC595 ตามลำดบั และกำหนดใหข าท่ี 1 มสี ถานะเปน “HIGH” กอนท่ีจะเรียกใช ฟงชันก Extened_Port( พรอมกับสง 0x63 เปนอารกิวเมนตสำหรับสั่งใหหลอดแอลอีดีมีสถานะ “ตดิ ” ในตำแหนงแถวท่ี 3 และคอลัมนที่ 3, 4 ฟงชนั ก loop(): - ฟงชนั ก Extened_Port( : รบั พารามเิ ตอร 1 คาคอื p ซง่ึ เปน ขอมูลขนาด 8 บิตที่ใชสำหรบั แสดงสถานะเอาตพ ตุ ผา นไอซี 74HC595 ที่ Q0 – Q6 ผานฟงกชนั shiftOut( 3. ผลการทดลอง รปู ที่ 12.8 ผลการทดลองการควบคมุ เมตริกซแ อลอีดีแบบ 1 แถว โดยใชไอซี 74HC595 สำหรบั ขยายพอรต ท่ีมา: ผูเขยี น

324 ตวั อยางท่ี 12.6 การควบคุมเมตริกซแอลอีดีท้งั แผงโดยใชไ อซี 74HC595 สำหรบั ขยายพอรต การทำงาน: ตำแหนงการตดิ ของหลอดแอลอดี ีเปนดงั น้ี แถวท่ี คอลมั นท่ี 3 4 1 2 ดับ ดบั ตดิ ติด ติด 1 ดบั ติด ดับ ดับ 2 ติด ตดิ 3 ดับ วธิ ที ำ 1. สวนบอรดทดลอง: เชื่อมตออุปกรณภายนอก เขากับบอรด Arduino ดงั ตัวอยา งที่ 12.4 2. สวนโปรแกรม int pattern_led[] = {0x0D, 0x10, 0x25,0x45}; int index = 0; void setup() { pinMode(1, OUTPUT); // 1 = ST_CP pinMode(2, OUTPUT); // 2 = DS pinMode(3, OUTPUT); // 3 = SH_CP digitalWrite(1, HIGH); } void loop() { Extended_Port(pattern_led[index]); index++; if(index == sizeof(pattern_led)/sizeof(int)){ index = 0; } delay(50); } void Extended_Port(byte p){ digitalWrite(1, LOW); shiftOut(2, 3, MSBFIRST, p); digitalWrite(1, HIGH); }