เริ่มต้น สอน Arduino : รับข้อมูลจากผู้ใช้ Digital Input
ในตัวอย่างนี้ เราจะได้รู้วิธีการรับข้อมูลจากผู้ใช้หรือจากเซนเซอร์ต่าง ๆ แบบดิจิตอล ซึ่งเป็นสัญญาณ 0 หรือ 1
สามารถอ่านค่าจากบอร์ด Arduino ได้ โดยเซตขาให้เป็นโหมด INPUT_PULLUP ใช้คำสั่ง
pinMode(ขาที่ต้องการ, INPUT_PULLUP);
เมื่อเซตเป็นโหมด INPUT_PULLUP แล้ว เราสามารถอ่านค่าเข้ามาได้ทันทีโดยใช้คำสั่ง
digitalRead(ขาที่ต้องการ); โดยจะให้ค่ามาเป็น 0 หรือ 1 เท่านั้น
ลองมาดูตัวอย่างกัน
เราเขียนโปรแกรมเพื่อรับค่าจากสวิตช์มาจากผู้ใช้ ถ้าผู้ใช้กดสวิตช์จะสั่งให้ LED ติด และเมื่อปล่อยจะสั่งให้ LED ดับ
โคดนี้เรากำหนดโหมดเป็น INPUT_PULLUP สถานะของสวิตช์ให้เป็น 1 ตลอด
เมื่อมีการกดสวิตช์ไฟจะไหลลงกราวน์ สวิตช์จะเป็นสถานะ 0 สามารถเขียนโปรแกรมเช็คสถานะสวิตช์ได้
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void setup() { pinMode(2,INPUT_PULLUP); pinMode(13,OUTPUT); } void loop() { int sw = digitalRead(2); if(sw==0){ digitalWrite(13,HIGH); }else if(sw==1){ digitalWrite(13,LOW); } } |
เราสามารถเขียนโคดอีกแบบได้ดังนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void setup() { pinMode(2,INPUT_PULLUP); pinMode(13,OUTPUT); } void loop() { int sw = digitalRead(2); if(sw==LOW){ digitalWrite(13,1); }else if(sw==HIGH){ digitalWrite(13,0); } } |
*** จะเห็นว่าสามารถเขียนแทนสถานะของ Digital โดยใช้คำใดคำหนึ่งก็ได้
HIGH = 1
LOW = 0
เราจำเป็นต้องกำหนดสถานะของสวิตช์ให้เป็น 1 ตลอด เพราะถ้าไม่กำหนด สถานะที่ขาจะมีสัญญาณรบกวนซึ่งทำให้บางครั้งเป็นสัญญาณ 1 หรือบางครั้งเป็นสัญญาณ 0 อุปกรณ์เราจะเหมือนทำงานเอง
การกำหนดสถานะให้เป็น 1 ตลอด มีคำศัพท์เรียกว่า “PULL UP”
หากเราต้องการให้สวิตช์มีสถานะเป็น 0 ตลอด และเมื่อกดสวิตช์ ให้มีสัญญาณเป็น 1 ทำได้โดยต่อสัญญาณ 0 ให้ที่ขา INPUT การให้สัญญาณเป็น 0 ตลอดเราจะเรียกว่า “PULL DOWN” ทำได้โดยต่อตัวต้านทานกับขา INPUT อีกขาต่อลงกราวน์
Arduino มีโหมดสำหรับรับค่า Input 2 โหมดคือ
INPUT และ INPUT_PULLUP
จะเห็นว่าในตัวอย่างที่เราต่อใช้งาน ไม่ได้ต่อตัวต้านทานไว้แล้วแบบนี้เรียก pull up หรือ pull down
ในโคดใช้คำสั่ง INPUT_PULLUP มีคำว่า PULLUP แสดงว่าเป็นแบบ pull up แล้วตัวต้านทานที่ไม่ได้ต่อล่ะหายไปไหน ตามจริงคือ มีอยู่ในวงจร Arduino มาให้ด้วยแล้ว เราเรียกว่า internal pull up โหมดนี้ช่วยให้เราสะดวกไม่ต้องต่อตัวต้านทานเพิ่ม ประหยัดอุปกรณ์ไปได้
แต่ถ้าต่อกับเซนเซอร์อื่น ๆ ที่มีการต่อ PULL UP หรือ PULL DOWN ในวงจรของเซนเซอร์มาแล้ว ก็ให้เซตเป็นโหมด INPUT ธรรมดาตามนี้ pinMode(ขา,INPUT);
ลองดูอีกตัวอย่าง ให้สังเกตผลลัพธ์จากตัวอย่างนี้
ลองดูตัวอย่างนี้ เราต้องการทำ สวิตช์กดติด/กดดับ โดยเมื่อกดแล้วปล่อยมือให้ LED ติด และเมื่อกดแล้วปล่อยมืออีกครั้งให้ LED ดับ
เขียนโคด Arduino ได้ดังนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
const int buttonPin = 2; int previousReading = LOW; int counter = 0; void setup() { pinMode(buttonPin, INPUT); Serial.begin(9600); } void loop() { int reading = digitalRead(buttonPin); if (reading == HIGH && previousReading == LOW) { if (previousReading == LOW && reading == HIGH) { counter++; Serial.print("Button pressed "); Serial.print(counter); Serial.println(" times"); } } previousReading = reading; } |
ปัญหาการอ่านค่าจากสวิตช์
ที่สวิตช์ ตอนกดปุ่มหน้าสัมผัสของสวิตช์จะไม่แนบสนิททันที ทำให้สถานะเป็น 0 หรือ 1 ภายในเสี้ยววินาที ซึ่งโปรแกรมเราสามารถอ่านค่าได้ทัน จะเห็นว่าจากกราฟ จะมีสถานะ 0 และ 1 ซึ่งเกิดจากหน้าสัมผัสสวิตช์ไม่แนบสนิททันที ก่อนจะเป็นสถานะ 1 ตามที่เราต้องการ
เราเรียกปัญหานี้ว่า debounce ซึ่งสามารถแก้ได้ง่าย ๆ โดยใช้คำสั่ง delay โดยหน่วงเวลาที่ 0.1 วินาที ตามตัวอย่างโคดนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
const int buttonPin = 2; int previousReading = LOW; int counter = 0; void setup() { pinMode(buttonPin, INPUT); Serial.begin(9600); } void loop() { int reading = digitalRead(buttonPin); if (reading == HIGH && previousReading == LOW) { delay(100); if (previousReading == LOW && reading == HIGH) { counter++; Serial.print("Button pressed "); Serial.print(counter); Serial.println(" times"); } } previousReading = reading; } |
คำสั่ง delay เป็นวิธีแก้ง่าย ๆ ที่ใช้งานได้จริง แต่มีผลข้างเคียงนิดหน่อย เพราะคำสั่ง delay จะทำให้โปรแกรมหยุดทำงานส่วนอื่นไปด้วย ซึ่งถ้าต้องการวิธีแก้แบบที่ดีกว่านี้ โดยไม่ต้องใช้คำสั่ง delay สามารถดูตัวอย่างเพิ่มเติม ได้จากลิงค์นี้ http://www.arduino.cc/en/Tutorial/Debounce
หรือถ้าไม่อยากเขียนโคด สามารถแก้ทาง hardware โดยใส่ตัวเก็บประจุค่าน้อย ๆ เช่นค่า 0.1uf คร่อมระหว่างขาปุ่มกดก็ได้ เมื่อกดสวิตช์ไฟจะไหลเข้าตัวเก็บประจุก่อน เมื่อประจุเต็มถึงจะไหลไปที่สวิตช์ ซึ่งตัวเก็บประจุสามารถจ่ายไฟให้ในระหว่างช่วงเสี้ยววินาทีที่เกิดปัญหาได้เพียงพอ จึงแก้ปัญหานี้ได้ แต่ก็จะเป็นการเพิ่มอุปกรณ์ให้วงจรเราด้วย
บทเรียนก่อนหน้าบทเรียนถัดไป
One Response Comment
ขอบคุณมากคับผม เป็นประโยชน์มากเลยคับ