Function prototype ไมโครคอลโทรลเลอร์ก็เหมือนกับคอมพิวเตอร์เล็กๆตัวหนึ่ง ที่เราต้องบอกมันให้ชัดเจนว่ามันควรทำอะไร เมื่อไร อย่างไร ส่วนที่สำคัญส่วนหนึ่งของไมโครคอลโทรลเลอร์คือการจัดการ สัญญาณขาเข้า และขาออก ของอุปกรณ์ และ Arduino เป็นหนึ่งในไมโครคอลโทรลเลอร์ที่พัฒนามาให้ใช้งานตรงจุดนี้ง่ายมาก จากที่เมื่อก่อนเราต้องกำหนด register จาก datasheet ที่ดูยุ่งยาก เหลือเพียงแค่ใส่ฟังก์ชัน pinMode ( ขาอะไร, ทำงานอะไร ) เท่านี้ก็จบ ขาที่พูดถึงคือ GPIO (General purpose input/output) หรือขาที่สามารถเป็นได้ทั้ง input และ output นั่นเอง ลองมาดูตำแหน่งขา GPIO บน Arduino กันสักหน่อย จะเห็นว่าบน Arduino uno r3 ตัวนี้มีทั้ง GPIO แบบที่มีทั้ง analog และ digital ซึ่งนิยามของ analog และ digital คือ
กล่าวโดยย่อคือ ดิจิตอล คือเปิดหรือปิด ส่วน อนาล็อก คือระดับสัญญาณคล้ายๆระดับน้ำ นั่นเอง ซึ่งระดับสัญญาณ เปิดหรือปิด หมายถึง 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 ต่อเข้ากับขาไว้ก่อน ทำให้หากเราใช้คำสั่ง digitalRead จะได้ค่า 1 หรือ ON ตลอดเวลา จนมีสัญญาณที่เป็น 0v เข้ามาจึงจะอ่านค่าเป็น 0 ทำให้ INPUT_PULLUP มีประโยชน์มากในการลดอุปกรณ์บางชนิดลง เพราะไม่จำเป็นต้องส่งระดับแรงดัน 5v ถึงจะสั่ง ON บน Arduino ได้ แค่ใช้ระดับแรงดัน 0v ก็เพียงพอต่อการเปลี่ยนสถานะ ลองมาเปรียบเทียบการต่อสวิตซ์เมื่อใช้ INPUT ธรรมดา (รูปบน) และ INPUT_PULLUP (รูปล่าง) เห็นความแตกต่างอะไรไหมครับ หวังว่าบทความนี้จะเป็นประโยชน์กับผู้ที่สนใจศึกษา อย่าอายที่จะสอบถามกันเข้ามาหากมีข้อสงสัย ธนบดี บุหลันศรีชาติ Reference |