เริ่มต้น สอน Arduino : รับข้อมูลจากผู้ใช้ Digital Input
ในตัวอย่างนี้ เราจะได้รู้วิธีการรับข้อมูลจากผู้ใช้หรือจากเซนเซอร์ต่าง ๆ แบบดิจิตอล ซึ่งเป็นสัญญาณ 0 หรือ 1

สามารถอ่านค่าจากบอร์ด Arduino ได้ โดยเซตขาให้เป็นโหมด INPUT_PULLUP ใช้คำสั่ง

pinMode(ขาที่ต้องการ, INPUT_PULLUP);

เมื่อเซตเป็นโหมด INPUT_PULLUP แล้ว เราสามารถอ่านค่าเข้ามาได้ทันทีโดยใช้คำสั่ง

digitalRead(ขาที่ต้องการ); โดยจะให้ค่ามาเป็น 0 หรือ 1 เท่านั้น

 

ลองมาดูตัวอย่างกัน

เราเขียนโปรแกรมเพื่อรับค่าจากสวิตช์มาจากผู้ใช้ ถ้าผู้ใช้กดสวิตช์จะสั่งให้ LED ติด และเมื่อปล่อยจะสั่งให้ LED ดับ

โคดนี้เรากำหนดโหมดเป็น INPUT_PULLUP สถานะของสวิตช์ให้เป็น 1 ตลอด

เมื่อมีการกดสวิตช์ไฟจะไหลลงกราวน์ สวิตช์จะเป็นสถานะ 0 สามารถเขียนโปรแกรมเช็คสถานะสวิตช์ได้

เราสามารถเขียนโคดอีกแบบได้ดังนี้

*** จะเห็นว่าสามารถเขียนแทนสถานะของ Digital โดยใช้คำใดคำหนึ่งก็ได้
HIGH = 1
LOW = 0

เราจำเป็นต้องกำหนดสถานะของสวิตช์ให้เป็น 1 ตลอด เพราะถ้าไม่กำหนด สถานะที่ขาจะมีสัญญาณรบกวนซึ่งทำให้บางครั้งเป็นสัญญาณ 1 หรือบางครั้งเป็นสัญญาณ 0 อุปกรณ์เราจะเหมือนทำงานเอง

การกำหนดสถานะให้เป็น 1 ตลอด มีคำศัพท์เรียกว่า “PULL UP”

หากเราต้องการให้สวิตช์มีสถานะเป็น 0 ตลอด และเมื่อกดสวิตช์ ให้มีสัญญาณเป็น 1 ทำได้โดยต่อสัญญาณ 0 ให้ที่ขา INPUT การให้สัญญาณเป็น 0 ตลอดเราจะเรียกว่า “PULL DOWN” ทำได้โดยต่อตัวต้านทานกับขา INPUT อีกขาต่อลงกราวน์

arduino-pulsador-3

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);

 

ลองดูอีกตัวอย่าง ให้สังเกตผลลัพธ์จากตัวอย่างนี้

ScreenShot_20160415143110ScreenShot_20160415142356 

ลองดูตัวอย่างนี้ เราต้องการทำ สวิตช์กดติด/กดดับ โดยเมื่อกดแล้วปล่อยมือให้ LED ติด และเมื่อกดแล้วปล่อยมืออีกครั้งให้ LED ดับ

เขียนโคด Arduino ได้ดังนี้

ปัญหาการอ่านค่าจากสวิตช์

ที่สวิตช์ ตอนกดปุ่มหน้าสัมผัสของสวิตช์จะไม่แนบสนิททันที ทำให้สถานะเป็น 0 หรือ 1 ภายในเสี้ยววินาที ซึ่งโปรแกรมเราสามารถอ่านค่าได้ทัน จะเห็นว่าจากกราฟ จะมีสถานะ 0 และ 1 ซึ่งเกิดจากหน้าสัมผัสสวิตช์ไม่แนบสนิททันที ก่อนจะเป็นสถานะ 1 ตามที่เราต้องการ

Bouncy_Switch

 

เราเรียกปัญหานี้ว่า debounce ซึ่งสามารถแก้ได้ง่าย ๆ โดยใช้คำสั่ง delay โดยหน่วงเวลาที่ 0.1 วินาที ตามตัวอย่างโคดนี้

คำสั่ง delay เป็นวิธีแก้ง่าย ๆ ที่ใช้งานได้จริง แต่มีผลข้างเคียงนิดหน่อย เพราะคำสั่ง delay จะทำให้โปรแกรมหยุดทำงานส่วนอื่นไปด้วย ซึ่งถ้าต้องการวิธีแก้แบบที่ดีกว่านี้ โดยไม่ต้องใช้คำสั่ง delay สามารถดูตัวอย่างเพิ่มเติม ได้จากลิงค์นี้ http://www.arduino.cc/en/Tutorial/Debounce

หรือถ้าไม่อยากเขียนโคด สามารถแก้ทาง hardware โดยใส่ตัวเก็บประจุค่าน้อย ๆ เช่นค่า 0.1uf คร่อมระหว่างขาปุ่มกดก็ได้ เมื่อกดสวิตช์ไฟจะไหลเข้าตัวเก็บประจุก่อน เมื่อประจุเต็มถึงจะไหลไปที่สวิตช์ ซึ่งตัวเก็บประจุสามารถจ่ายไฟให้ในระหว่างช่วงเสี้ยววินาทีที่เกิดปัญหาได้เพียงพอ จึงแก้ปัญหานี้ได้ แต่ก็จะเป็นการเพิ่มอุปกรณ์ให้วงจรเราด้วย

 


One Response Comment

  • DEW  13 กันยายน 2019 at 22:38

    ขอบคุณมากคับผม เป็นประโยชน์มากเลยคับ

    ตอบกลับ

โพสคอมเมนต์

Please enter your name. Please enter an valid email address. Please enter a message.