อินพุตที่สามารถรับสัญญาณที่มีลักษณะสัญญาณเป็นสัญญาณต่อเนื่อง

Function prototype
     pinMode คือ ฟังก์ชันที่ใช้กำหนดหน้าที่ของขาสัญญาณว่าเป็นขาสัญญาณขาเข้าหรือขาออกวิธีการใช้
     pinMode ( ขาสัญญาณ, INPUT/OUTPUT/INPUT_PULLUP ); 

     ไมโครคอลโทรลเลอร์ก็เหมือนกับคอมพิวเตอร์เล็กๆตัวหนึ่ง ที่เราต้องบอกมันให้ชัดเจนว่ามันควรทำอะไร เมื่อไร อย่างไร ส่วนที่สำคัญส่วนหนึ่งของไมโครคอลโทรลเลอร์คือการจัดการ สัญญาณขาเข้า และขาออก ของอุปกรณ์ และ Arduino เป็นหนึ่งในไมโครคอลโทรลเลอร์ที่พัฒนามาให้ใช้งานตรงจุดนี้ง่ายมาก จากที่เมื่อก่อนเราต้องกำหนด register จาก datasheet ที่ดูยุ่งยาก เหลือเพียงแค่ใส่ฟังก์ชัน pinMode ( ขาอะไร, ทำงานอะไร ) เท่านี้ก็จบ ขาที่พูดถึงคือ GPIO (General purpose input/output) หรือขาที่สามารถเป็นได้ทั้ง input และ output นั่นเอง

ลองมาดูตำแหน่งขา GPIO บน Arduino กันสักหน่อย


อินพุตที่สามารถรับสัญญาณที่มีลักษณะสัญญาณเป็นสัญญาณต่อเนื่อง

จะเห็นว่าบน Arduino uno r3 ตัวนี้มีทั้ง GPIO แบบที่มีทั้ง analog และ digital

ซึ่งนิยามของ analog และ digital คือ

  • สัญญาณอนาล็อก (Analog Signal) หมายถึงสัญญาณข้อมูลแบบต่อเนื่อง (Continuouse Data) มีขนาดของสัญญาณไม่คงที่ การเปลี่ยนแปลงขนาดของสัญญาณแบบค่อยเป็นค่อยไป มีลักษณะเป็นเส้นโค้งต่อเนื่องกันไป โดยการส่งสัญญาณแบบอนาล็อกจะถูกรบกวนให้มีการแปลความหมายผิดพลาดได้ง่าย เช่น สัญญาณเสียงในสายโทรศัพท์ เป็นต้น

  • สัญญาณดิจิตอล(Digital Signal) หมายถึง สัญญาณที่เกี่ยวข้องกับข้อมูลแบบไม่ต่อเนื่อง(Discrete Data) ที่มีขนาดแน่นอนซึ่งขนาดดังกล่าวอาจกระโดดไปมาระหว่างค่าสองค่า คือ สัญญาณระดับสูงสุดและสัญญาณระดับต่ำสุด ซึ่งสัญญาณดิจิตอลนี้เป็นสัญญาณที่คอมพิวเตอร์ใช้ในการทำงานและติดต่อสื่อสารกัน

กล่าวโดยย่อคือ ดิจิตอล คือเปิดหรือปิด ส่วน อนาล็อก คือระดับสัญญาณคล้ายๆระดับน้ำ นั่นเอง ซึ่งระดับสัญญาณ เปิดหรือปิด หมายถึง 5v (ON) 0v (OFF) และระดับสัญญาณ อนาล็อกคือ ระดับตั้งแต่ 0-5v สำหรับ Arduino uno r3  arduino mega และรุ่นอื่นๆ ตระกูล AVR ซึ่งจะต่างกับตระกูล ESP เช่น ESP32 หรือ ESP8266 (หรือ nodemcu) ที่จะมีระดับแรงดันเปิดปิดคือ 3.3v คือ ON และ 0v คือ OFF และอนาล็อกเป็นระดับแรงดัน 0-3.3v (บางที่เขียน 3v3)

พูดถึงเรื่องแรงดันขา GPIO ก็เป็นเรื่องสำคัญที่ต้องทราบว่าคอนโทรลเลอร์เราใช้ระดับแรงดันเท่าไรสำหรับขา GPIO เพื่อป้องกันการเสียหายจากการต่ออุปกรณ์ที่มีแรงดันมากกว่าที่คอนโทรลเลอร์รับได้ และก่อให้เกิดความเสียหาย ซึ่งวิธีแก้คือต้องแปลงระดับสัญญาณฝั่งส่งให้เหมาะสมกับฝั่งรับเสียก่อน หรือใช้ โมดูลแปลงระดับสัญญาณ 8 ช่อง สองทิศทาง 8-Channel 5V/3.3V IIC UART SPI TTL Logic Level Converter Bi-Directional Module แปลงระดับสัญญาณไปมาระหว่างอุปกรณ์และคอนโทรลเลอร์ครับ

อินพุตที่สามารถรับสัญญาณที่มีลักษณะสัญญาณเป็นสัญญาณต่อเนื่อง

สำหรับ Arduino uno r3 มีขาสำหรับ analog ตั้งแต่ A0-A5 รวม 6 ขา ซึ่งเราสามารถกำหนดให้เป็นขาแบบ digital ได้เช่นกัน โดยหากกำหนดเป็น digital ก็จะทำงานคล้ายขาที่ 0-13 ทุกประการ แต่กลับกันขาที่ 0-13 หากต้องการใช้เป็นการรับสัญญาณ analog จะทำไม่ได้ เนื่องจากขาเหล่านั้นไม่มี ADC (Analog digital converter) ที่คอยแปลงสัญญาณอนาล็อกให้เป็นดิจิตอล เพราะคอลโทรลเลอร์รู้จักแค่ on กับ off เท่านั้นแหบะ

การกำหนดขาพินให้เป็นสัญญาณ digital ให้เป็นขาเข้า(INPUT)หรือขาออก(OUTPUT) กำหนดโดยฟังก์ชัน pinMode โดยระบุเลขขานั้นๆ และหน้าที่ของมันว่าเป็น INPUT หรือ OUTPUT

แต่หากต้องการกำหนดให้เป็นการรับค่า analog บนขา A0-A5 ก็ไม่จำเป็นต้องสั่ง pinMode เพราะคอนโทรลเลอร์รู้อยู่แล้วว่า analog ทำได้แค่รับเข้ามาอย่างเดียว

ตัวอย่างการกำหนดขา A0 ให้เป็น digital แบบ INPUT

  /**
   * กำหนดขา A0 เป็นสัญญาณ digital ขาเข้า
   */
 pinMode(A0, INPUT);

 /**
   * อ่านค่าโดยใช้ digitalRead จะได้ค่า 0 หรือ 1
   */
int value = digitalRead(A0);

ตัวอย่างการกำหนดขา 4 ให้เป็น digital แบบ OUTPUT

  /**
   * กำหนดขา 4 เป็นสัญญาณ digital ขาเข้า
   */
 pinMode(4, INPUT);

 /**
   * เขียนค่าโดยใช้ digitalWrite(ขา, ระดับสัญญาณ)
   * HIGH = 5v (เปิด) , LOW= 0v
   */
 digitalWrite(4, HIGH);
 digitalWrite(4, LOW);

ตัวอย่างการกำหนดขา A4 ให้เป็น analog แบบ INPUT

  /**
   * กำหนดขา A4 เป็นสัญญาณ analog ขาเข้า
   * ไม่ต้องสั่ง pinMode(A4, INPUT) ถ้าสั่งไประบบจะเข้าใจว่า
   * เราให้ A4 เป็น digital
   */

 /**
   * อ่านค่าโดยใช้ analogRead
   * จะได้ค่าระหว่าง 0-1023 (10bit)
   */
 int value = analogRead(A4);

แต่สำหรับฟังก์ชัน pinMode ยังกำหนดขาสัญญาณให้ทำอีกหน้าที่นึงคือ INPUT_PULLUP ซึ่งจะแตกต่างกับ INPUT ธรรมดาดังนี้

     INPUT จะให้สัญญาณเป็นขาเข้าที่หากวัดแรงดันจะมีค่า 0v เมื่อยังไม่ต่ออุปกรณ์
     INPUT_PULLUP จะให้สัญญาณเป็นขาเข้าที่หากวัดแรงดันจะมีค่า 5v เมื่อยังไม่ต่ออุปกรณ์

ซึ่งเป็นเพราะหากเราใช้คำสั่ง INPUT_PULLUP ระบบจะใช้ตัวต้านทานที่ต่อกับแรงดัน 5v ต่อเข้ากับขาไว้ก่อน ทำให้หากเราใช้คำสั่ง digitalRead จะได้ค่า 1 หรือ ON ตลอดเวลา จนมีสัญญาณที่เป็น 0v เข้ามาจึงจะอ่านค่าเป็น 0

ทำให้ INPUT_PULLUP มีประโยชน์มากในการลดอุปกรณ์บางชนิดลง เพราะไม่จำเป็นต้องส่งระดับแรงดัน 5v ถึงจะสั่ง ON บน Arduino ได้ แค่ใช้ระดับแรงดัน 0v ก็เพียงพอต่อการเปลี่ยนสถานะ

ลองมาเปรียบเทียบการต่อสวิตซ์เมื่อใช้ INPUT ธรรมดา (รูปบน) และ INPUT_PULLUP (รูปล่าง) เห็นความแตกต่างอะไรไหมครับ

อินพุตที่สามารถรับสัญญาณที่มีลักษณะสัญญาณเป็นสัญญาณต่อเนื่อง
อินพุตที่สามารถรับสัญญาณที่มีลักษณะสัญญาณเป็นสัญญาณต่อเนื่อง

หวังว่าบทความนี้จะเป็นประโยชน์กับผู้ที่สนใจศึกษา อย่าอายที่จะสอบถามกันเข้ามาหากมีข้อสงสัย

ธนบดี บุหลันศรีชาติ
ผู้เขียน
เลี้ยงกาแฟผมสักแก้ว : https://ko-fi.com/modulemore

Reference
   http://iteiei.blogspot.com/2012/03/blog-post_29.html
   https://www.arduino.cc/en/Reference.PinMode
   https://www.arduino.cc/en/tutorial/button