จากคุณสมบัติของพอร์ตดิจิตอลในบอร์ด Arduino ซึ่งมีพอร์ตดิจิตอลทั้งหมด 14 พอร์ตนั้นสามารถกําหนดให้เป็นได้ทั้งพอร์ตเอาต์พุตและอินพุต เมื่อกําหนดให้เป็นพอร์ตอินพุตแล้วสามารถใน สาหรับรับค่าสัญญาณไฟฟ้าจากอุปกรณ์อินพุตต่าง ๆ ได้เพื่อนําไปใช้ในการควบคุมการทํางานของวงจรเอาต์พุตที่ออกแบบไว้ ตัวอย่างอปกรณ์อินพุต ได้แก่ สวิตช์หรือปุ่มกด สวิตช์หรือปุ่มกด สัญญาณอินพุตที่ พอร์ตไมโครคอนโทรลเลอร์ Arduino มีการเปลี่ยนแปลงสถานะอยู่ 2 สภาวะ คอ ลอจิก “1” กับ
ลอจิก “0” ตัวอย่างสวิตซ์อินพุตแสดงในรูปที่ 5.1
รูปที่ 5.1 สวิตซ์อินพุตรูปร่างต่าง ๆ
การต่อสวิตซ์เข้าพอร์ตไมโครคอนโทรลเลอร์ Arduino สามารถต่อใช้งานได้ 2 แบบ ได้แก่ การต่อสวิตช์แบบแอ็คทีฟ ไฮท์ (Active high) และการต่อสวิตช์แบบแอ็คทีฟ โลว์ (Active low) สําหรับการต่อสวิตช์แบบแอ็คทีฟ ไฮท์ (Active high) เป็นการต่อจากแหล่งจ่ายไฟผ่านสวิตซ์และตัวต้านทานลงกราวนด์ จุดต่อระหว่างขาสวิตซ์กับตัวต้านทานต่อ เข้าที่พอร์ตไมโคคอนโทรลเลอร์ Arduino ลักษณะการต่อตัวต้านทานแบบนี้เรียกว่า การต่อตัวต้านทานแบบพูลดาวน์ (Put down resistor) แสดงในรูปที่ 5.2 ลักษณะการ ทํางานของวงจรนี้ ขณะยังไม่กดสวิตซ์ที่ขาอินพุตของพอร์ต ไมโครคอนโทรลเลอร์มีค่าเป็นลอจิก “0” เมื่อใดที่กดสวิตซ์ ที่พอร์ตของไมโครคอนโทรลเลอร์มีค่าเป็นลอจิก “1” ซึ่งลักษณะการเปลี่ยนแปลงที่ขาอินพุตนี้นําไปใช้สําหรับการ เขียนโปรแกรมรับค่าอินพุตทางดิจิตอลต่อไป
รูปที่ 5.2 การต่อสวิตซ์แบบแอ็คทีฟ ไฮท์ (Active high)
ส่วนการต่อสวิตซ์แบบแอ็คทีฟโลว์ (Activelow) เป็นการต่อจากแหล่งจ่ายไฟผ่านตัวต้านทานและผ่านสวิตช์ลงกราวนด์ จุดต่อระหว่างขาตัวต้านทานกับสวิตช์ต่อเข้าพอร์ตดิจิตอลของไมโครคอนโทรลเลอร์ Arduino ลักษณะการต่อตัวต้านทาน แบบนี้เรียกว่า การต่อตัวต้านทานแบบพูลอัป แสดงในรูปที่ 5.3 ลักษณะการทํางานของวงจรนี้ ขณะยังไม่กดสวิตซ์ที่ขาอินพุตของพอร์ตไมโครคอนโทรลเลอร์มีค่าเป็นลอจิก “1” แต่เมื่อกดสวิตช์ที่พอร์ตของไมโครคอนโทรลเลอร์มีค่าเป็น ลอจิก “0” ซึ่งลักษณะ
การเปลี่ยนแปลงที่ขาอินพุตนี้นําไป ใช้สําหรับการเขียนโปรแกรมรับค่าอินพุตทางดิจิตอลต่อไป จากวงจรทั้ง 2 แบบนี้วงจรที่นิยมนํามาออกแบบสําหรับการ ต่อวงจรร่วมกับไมโครคอนโทรลเลอร์คือวงจรการต่อสวิตช์แบบแอ็คทีฟ โลว์ (Activelow) เนื่องจากช่วยในการป้องกัน สัญญาณรบกวนจากภายนอกได้ดีกว่าการต่อสวิตช์แบบ แอ็คทีฟ ไฮท์ (Active high)
รูปที่ 5.3 การต่อสวิตซ์แบบแอ็คทีฟ โลว์
จากการต่อสวิตช์สวิตช์แบบแอ็คทีฟ ไฮท์ (Active high) หรือแบบแอ็คทีฟ โลว์ (Active low) มีปัญหาที่เกิดขึ้นในการใช้สวิตช์แบบหน้าสัมผัสคือ ขณะกดสวิตช์และปล่อยสวิตช์นั้นเกิดการแตะกัน ของหน้าสัมผัสหลาย ๆ ครั้งเกิดขึ้น จากปัญหาดังกล่าวทําให้ไมโครคอนโทรลเลอร์สามารถอ่านค่าที่ ได้จากสัมผัสหลาย ๆ ครั้งนั้นได้ ซึ่งเป็นสาเหตุที่ทําให้ไมโครคอนโทรลเลอร์ทํางานผิดพลาดตาม โปรแกรมที่เขียนขึ้นได้ แสดงในรูปที่ 5.4
รูปที่ 5.4 การเกิดสัญญาณรบกวน ซณะกุดและปล่อยสวิตซ์
การแก้ปัญหาด้วยฮาร์ดแวร์ ดีเบาซ์ (Hardware Depouncing)
รูปที่ 5.5 การแก้ปัญหาด้วยฮาร์ดแวร์ ดีเบาซ์
ขณะยังไม่กดสวิตช์ SW1 ตัวเก็บประจุ C1 ทําการชาร์จประจุไว้ ทําให้พอร์ตอินพุตของไมโคร คอนโทรลเลอร์มีค่าเป็นลอจิก “1” แต่เมื่อทําการกดสวิตซ์ SW1 ตัวเก็บประจุ C1 ทําการคายประจุผ่านตัวต้านทาน R2 ซึ่งทําให้แรงดันค่อย ๆ ลดลงเรื่อย ๆ เมื่อแรงดันไฟฟ้ามีค่าต่ํากว่า 1.8โวลต์ ไมโคร คอนโทรลเลอร์จึงมีค่าเป็นลอจิก “0” แต่ถ้าแรงดันไฟฟ้ามีค่ามากกว่า 3.1 โวลต์ ไมโครคอนโทรลเลอร์ จึงมีค่าเป็นลอจิก “1”
ตัวอย่างการเขียนโปรแกรมทดสอบวงจรฮาร์ดแวร์ ดีเบาซ์ (Hardware Debouncing)
#define buttonPin 2 // กําหนดตัวแปร buttonPin ต่อที่พอร์ตดิจิตอลขา2
#define ledPin 13 // กําหนดตัวแปร ledPin ต่อที่พอร์ตดิจิตอลขา 13
void setup() {
pinMode(buttonPin, INPUT); // เซตพอร์ตดิจิตอลขา 2 ให้เป็นพอร์ตเอาต์พุต
pinMode(ledPin, OUTPUT); // เซตพอร์ตดิจิตอลขา 13 ให้เป็นพอร์ตเอาต์พุต
void loop() {
digitalWrite(ledPin, digitalReadbuttonPin)); // อ่านค่าจากอินพต และนําค่าที่อ่านใด
// แสดงทางเอาต์พุต
การแก้ปัญหาด้วยซอฟต์แวร์ ดีเบาซ์ (Softwave Debouncing)
การแก้ปัญหาด้วยวิธีนี้สามารถทําได้ง่ายที่สุด คือ เมื่อโปรแกรมทําการตรวจสอบว่าสวิตช์ กดแล้ว ให้ทําการหน่วงเวลาออกไปประมาณ 10 มิลลิวินาที
ตัวอย่างการเขียนโปรแกรม ทดสอบวงจรซอฟต์แวร์ ดีเบาซ์ (Softwave Debouncing)
#define buttonPin 2 // กําหนดตัวแปร buttonPin ต่อที่พอร์ตดิจิตอลขา 2
#define ledPin 13 // กําหนดตัวแปร ledPin ต่อที่พอร์ตดิจิตอลขา 13
void setup() {
pinMode(buttonPin, INPUT); // เซตพอร์ตดิจิตอลขา 2 ให้เป็นพอร์ตเอาต์พุต
pinMode(ledPin, OUTPUT); // เซตพอร์ตดิจิตอลขา 13 ให้เป็นพอร์ตเอาต์พุต
void loop() {
digitalWrite(ledPin, digitalRead(buttonPin)); // อ่านค่าจากอินพุตและนําค่าที่อ่านได้
// แสดงทางเอาต์พุต
delay(10); } // หน่วงเวลา 0.01 วินาที
การเขียนโปรแกรมเพื่อใช้งานเป็นพอร์ตดิจิตอลอินพุต ต้องใช้คําสั่งรับค่าอินพุตเข้ามายังพอร์ตของไมโครคอนโทรลเลอร์ Arduino ดังนี้
คําสั่ง digitalRead();
รูปแบบคําสั่ง
digitalRead (ตําแหน่งพอร์ต)
เป็นการอ่านค่าสถานะของตําแหน่งพอร์ตดิจิตอลที่ต้องการอ่าน ตั้งแต่พอร์ต 0 ถึง 13 ว่ามีค่าเป็น HIGH หรือ LOW
ตัวอย่างการเขียนโปรแกรม
int ledPin = 13; // กําหนดตัวแปร ledPin ต่อที่พอร์ตดิจิตอลขา 13
int in Pin = 7; // กําหนดตัวแปร inPin ต่อที่พอร์ตดิจิตอลขา 7
int val = 0; // กําหนดตัวแปร val มีค่าเท่ากับ 0
void setup () {
pinMode(ledPin, OUTPUT); // เซตพอร์ตดิจิตอลขา 13 ให้เป็นพอร์ตเอาต์พุต
pinMode (inPin, INPUT); // เซตพอร์ตดิจิตอลขา 7 ให้เป็นพอร์ตอินพุต
Void loop() {
val = digitalReadinPin); // อ่านค่าจากสัญญาณอินพุต
digitalWrite(ledPin, val); } // นําค่าที่อ่านได้แสดงผลที่พอร์ตเอาต์พุต
สรุป
ไมโครคอนโทรลเลอร์ Arduino มีพอร์ตดิจิตอลทั้งหมด 14 พอร์ต สามารถกําหนดให้พอร์ตเอาต์พุตและอินพุตได้ขึ้นอยู่กับผู้พัฒนาโปรแกรม เมื่อกําหนดให้เป็นพอร์ตอินพุตสามารถรับค่าสัญญาณไฟฟ้าจากอุปกรณ์อินพุตต่าง ๆ ได้แก่ สวิตซ์ หรือปุ่มกด สัญญาณอินพุตที่ต่อเข้ามายัง ไมโครคอนโทรลเลอร์มีการเปลี่ยนแปลงสถานะ 2 สภาวะคือ ลอจิก “0” และลอจิก “1” การต่อใช้ งานสวิตซ์นิยมต่อแบบแอ็คทีฟ โลว์ (Active low) คําสั่งสําหรับการอ่านค่าดิจิตอลอินพุตคือ คําสั่ง digitalRead();