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); }
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445
- 446
- 447
- 448
- 449
- 450
- 451
- 452
- 453
- 454
- 455
- 456
- 457
- 458
- 459
- 460
- 461
- 462
- 463
- 464
- 465
- 466
- 467
- 468
- 469
- 470
- 471
- 472
- 473
- 474
- 475
- 476
- 477
- 478
- 479
- 480
- 481
- 482
- 483
- 484
- 485
- 486
- 487
- 488
- 489
- 490
- 491
- 492
- 493
- 494
- 495
- 496
- 497
- 498
- 499
- 500
- 501
- 502
- 503
- 504
- 505
- 506
- 507
- 508
- 509
- 510
- 511
- 512
- 1 - 50
- 51 - 100
- 101 - 150
- 151 - 200
- 201 - 250
- 251 - 300
- 301 - 350
- 351 - 400
- 401 - 450
- 451 - 500
- 501 - 512
Pages: