บทความ ESPino32 ตอนที่ 4 การใช้งาน Digital Input/Digital Output

สารบัญ บทความ ESPino32

บทความ ESPino32 ตอนที่ 4 การใช้งาน Digital Input/Digital Output

        บทความ ESPino32 ตอนที่ 4 การใช้งาน Digital Input/Output เป็นการใช้งานบอร์ดไมโครคอนโทรเลอร์เพื่อทำการติดต่อรับส่งข้อมูลจากอุปกรณ์ภายนอกหรือผู้ใช้งาน ดังรูป การติดต่อรับส่งข้อมูลจากผู้ใช้งานและอุปกรณ์ภายนอก โดยในบทนี้จะเป็นการใช้งานขา GPIO (General Purpose Input/Output) ของบอร์ด ESPino32 ในการอ่านและเขียนข้อมูลแบบดิจิทัลหรือข้อมูลเชิงตรรกกะ

การติดต่อรับส่งข้อมูลจากผู้ใช้งานและอุปกรณ์ภายนอก

        ข้อมูลแบบดิจิทัลหรือข้อมูลเชิงตรรกกะในบอร์ดไมโครคอนโทรเลอร์นั้นจะมีสถานะอยู่ 2 สถานะ คือ ลอจิก ‘1’ หรือ HIGH และ ลอจิก ‘0’ หรือ LOW ดังนั้นจะอธิบายช่วงของข้อมูลทางดิจิทัลเปรียบเทียบกับค่าความต่างศักย์ทางไฟฟ้าว่าค่าของข้อมูลแบบดิจิทัลที่บอร์ด ESPino32 อ่านได้อยู่ในช่วงลอจิก ‘1’ หรือ อยู่ในช่วงลอจิก ‘0’ สามารถดูเพิ่มเติมได้จากรูป DC Characteristics ของบอร์ด ESPino32

DC Characteristics ของบอร์ด ESPino32 (VDD คือไฟเลี้ยง)

– ลอจิก ‘1’ สำหรับบอร์ด ESPino32 จะมีค่าความต่างศักย์ทางไฟฟ้าตั้งแต่ 0.75 x VDD ถึง VDD+0.3 โดยสามารถคำนวณได้จากแถบ VIH ในรูป DC Characteristics ของบอร์ด ESPino32

ตัวอย่างเช่น

– จ่ายไฟให้บอร์ด ESPino32 3.0V ลอจิก ‘1’ จะมีค่าอยู่ระหว่าง 2.25V – 3.3V

– จ่ายไฟให้บอร์ด ESPino32 3.3V ลอจิก ‘1’ จะมีค่าอยู่ระหว่าง 2.475V – 3.6V

– ลอจิก ‘0’ สำหรับบอร์ด ESPino32 จะมีค่าความต่างศักย์ทางไฟฟ้าตั้งแต่ -0.3 ถึง 0.25 x VDD โดยสามารถคำนวณได้จากแถบ VIL ในรูป DC Characteristics ของบอร์ด ESPino32

ตัวอย่างเช่น

– จ่ายไฟให้บอร์ด ESPino32 3.0V ลอจิก ‘0’ จะมีค่าอยู่ระหว่าง -0.3V – 0.75V

จ่ายไฟให้บอร์ด ESPino32 3.3V ลอจิก ‘1’ จะมีค่าอยู่ระหว่าง -0.3V – 0.825V

– หากค่าความต่างศักย์ทางไฟฟ้าที่บอร์ด ESPino32 อ่านได้ ไม่อยู่ในช่วงลอจิก ‘1’ หรือลอจิก ‘0’ บอร์ด ESPino32 จะไม่สามารถตัดสินใจได้ว่าค่าที่ได้อยู่ในช่วงลอจิกไหน สถานะนี้เรียกว่า Hysteresis ซึ่งเป็นช่องว่างระหว่างลอจิกที่มีค่าความแตกต่างกันอย่างชัดเจนทำให้มีความทนทานต่อสัญญาณรบกวนจากภายนอก

สถานะทางลอจิกของบอร์ด ESPino32 เปรียบเทียบกับโวลต์

        สำหรับการใช้งานการอ่านและเขียนข้อมูลแบบดิจิทัลนั้น ทางทีมงานขอยกตัวอย่างโครงงานที่ใช้ Digital Input/Output เพื่อให้ผู้อ่านเข้าใจและเห็นตัวอย่างการนำไปประยุกต์ใช้งาน เช่น

– การอ่านค่าข้อมูลแบบดิจิทัล

        ใช้ในการอ่านสถานะทางลอจิกเพื่อที่จะรับข้อมูลดิจิทัลเพื่อไปประมวล ตัวอย่างการใช้งานเช่น อ่านค่าสถานะขา GPIO ที่ต่ออยู่กับปุ่มกดเพื่อตรวจสอบว่าปุ่มถูกกดหรือไม่ อ่านค่าสถานะขา GPIO ที่ต่อกับ PIR Motion Sensor ที่มีเอาต์พุตเป็นดิจิทัลโดยเมื่อมีการเคลื่อนไหวเอาต์พุตจากเซ็นเซอร์จะมีค่าเป็น ‘1’ และเมื่อไม่มีการเคลื่อนไหวจะมีค่าเป็น ‘0’ เพื่อที่จะตรวจจับการเคลื่อนไหวในพื้นที่รอบเซ็นเซอร์ เป็นต้น

– การเขียนค่าข้อมูลแบบดิจิทัล

        ใช้ในการเขียนสถานะลอจิกเพื่อใช้ในการควบคุมการทำงานของอุปกรณ์หรือส่งออกข้อมูลไปยังอุปกรณ์ภายนอก ตัวอย่างการใช้งานเช่น ให้บอร์ด ESPino32 ส่งลอจิก 1 หรือลอจิก 0 ออกไปทางขา GPIO ต่างๆของตัวบอร์ด เพื่อควบคุมการทำงานของอุปกรณ์ภายนอกเช่น LED หรือรีเลย์ เป็นต้น


        คำสั่งการใช้งานของ Digital Input/Output ของบอร์ด ESPino32 สามารถใช้คำสั่ง digitalRead ในการอ่านค่าดิจิทัล และคำสั่ง digitalWrite ในการเขียนข้อมูลดิจิทัล เหมือนกับการใช้งาน Digital Input/Digital Output ที่พัฒนาบนแพลตฟอร์มของ Arduino และในส่วนของคำสั่งเรียกฟังก์ชันการใช้งาน Digital Input/Output สามารถใช้งานได้โดยอ้างอิงหมายเลขของ Pin ในแถบ Input/Output สีเหลืองดังรูป ESPino32 Pinout

ESPino32 Pinout

* หมายเหตุ GPIO บางขาของบอร์ด ESPino32 ใช้งานได้เพียง Input เท่านั้น ดูข้อมูลเพิ่มเติมได้จากรูป ESPino32 Pinout

รูปแบบการใช้งาน Digital Input/Digital Output

pinMode(pin, mode); 

รายละเอียด

pin     คือ หมายเลข pin
mode คือ Mode การใช้งาน แบ่งเป็น 5 อย่างคือ

– INPUT                                 กำหนดสถานะให้รอรับอินพุตจากอุปกรณ์ภายนอก

– INPUT_PULLUP                กำหนดสถานะให้รอรับอินพุตจากอุปกรณ์ภายนอก และ ใช้วงจร Pull-Up  ภายในตัวบอร์ด

– INPUT_PULLDOWN        กำหนดสถานะให้รอรับอินพุตจากอุปกรณ์ภายนอก และ ใช้วงจร Pull-Down ภายในตัวบอร์ด

– OUTPUT                             ใช้เป็นเอาต์พุต มีสถานะ 2 สถานะคือ High และ Low

– OUTPUT_OPEN_DRAIN  ใช้เป็นเอาต์พุต มีสถานะ 2 สถานะคือ Open Drain และ Low


ตัวอย่างการใช้งาน Digital Output

Syntax
digitalWrite(pin,value);

Parameters
pin:      หมายเลข pin
value:   HIGH,LOW


การใช้งาน digitalWrite โดยอ้างอิงจากชื่อ Pin ของ ESPino32

ต่อวงจรดังรูป วงจรไฟกระพริบ

วงจรไฟกระพริบ

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         ประกาศตัวแปร ledPin ชนิด Byte ที่เป็นค่าคงที่ให้อยู่ที่ขา GPIO02
บรรทัดที่ 2         สร้างฟังก์ชัน setup()
บรรทัดที่ 3         เปิดฟังก์ชั่น setup()
บรรทัดที่ 4         กำหนดให้ขา ledPin เป็น OUTPUT
บรรทัดที่ 5         ปิดฟังก์ชั่น setup()
บรรทัดที่ 6         สร้างฟังก์ชัน loop()
บรรทัดที่ 7         เปิดฟังก์ชัน loop()
บรรทัดที่ 8         สั่งให้ ledPin มีสถานะเป็น HIGH ทำให้ LED ดับ
บรรทัดที่ 9         หน่วงเวลา 1000 มิลลิวินาที
บรรทัดที่ 10        สั่งให้ ledPin มีสถานะเป็น LOW ทำให้ LED ติด
บรรทัดที่ 11        หน่วงเวลา 1000 มิลลิวินาที
บรรทัดที่ 12        ปิดฟังก์ชัน loop()

ผลการทดลอง 

        เมื่อบอร์ด ESPino32 เริ่มทำงาน โปรแกรมจะใช้คำสั่ง digitalWrite HIGH ที่ขา ledPin ทำให้ขา GPIO02 มีสถานะเป็น HIGH ส่งผลให้ LED ดับเป็นเวลา 1000 มิลลิวินาทีและเมื่อมีการสั่ง digitalWrite LOW ที่ขา ledPin ทำให้ขา GPIO02 มีสถานะเป็น LOW ส่งผลให้ LED ติดเป็นเวลา 1000 มิลลิวินาที จากนั้นก็วนรอบการทำงานในฟังชัน loop() ต่อไป

ตัวอย่างการใช้งาน Digital Input

Syntax
digitalRead(pin);

Parameters
pin:      หมายเลข pin

การใช้งาน digitalRead โดยอ้างอิงจากชื่อ Pin ของ ESPino32

ต่อวงจรดังรูป วงจรกดปุ่มไฟติด-ปล่อยไฟดับ

วงจรกดปุ่มไฟติด-ปล่อยไฟดับ

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         ประกาศตัวแปร ledPin ชนิด Byte ที่เป็นค่าคงที่ให้อยู่ที่ขา GPIO02
บรรทัดที่ 2         ประกาศตัวแปร buttonPin ชนิด Byte ที่เป็นค่าคงที่ให้อยู่ที่ขา GPIO15
บรรทัดที่ 3         ประกาศตัวแปร buttonState ชนิด Byte ให้มีค่าเท่ากับ 0
บรรทัดที่ 4         สร้างฟังก์ชัน setup()
บรรทัดที่ 5         เปิดฟังก์ชั่น setup()
บรรทัดที่ 6         กำหนดให้ขา buttonPin เป็น INPUT
บรรทัดที่ 7         กำหนดให้ขา ledPin เป็น OUTPUT
บรรทัดที่ 8         ปิดฟังก์ชั่น setup()
บรรทัดที่ 9         สร้างฟังก์ชัน loop()
บรรทัดที่ 10        เปิดฟังก์ชัน loop()
บรรทัดที่ 11        อ่านค่าสถานะทางดิจิทัลจากขา buttonPin มาเก็บไว้ในตัวแปร buttonState
บรรทัดที่ 12        ตรวจสอบว่าตัวแปร buttonState มีค่าเป็น HIGH หรือไม่ และเปิดฟังก์ชันถ้าตัวแปร buttonState มีสถานะเป็น HIGH
บรรทัดที่ 13        ให้ ledPin มีสถานะเป็น HIGH ส่งผลให้ LED ดับ
บรรทัดที่ 14        ปิดฟังก์ชันถ้าตัวแปร buttonState มีสถานะเป็น HIGH และเปิดฟังก์ชันถ้าตัวแปร buttonState มีสถานะไม่เท่ากับ HIGH
บรรทัดที่ 15        ให้ ledPin มีสถานะเป็น LOW ส่งผลให้ LED ติด
บรรทัดที่ 16        ปิดฟังก์ชันถ้าตัวแปร buttonState มีสถานะไม่เท่ากับ HIGH
บรรทัดที่ 17        ปิดฟังก์ชัน loop()

ผลการทดลอง 

        เมื่อบอร์ด ESPino32 เริ่มทำงาน โปรแกรมจะอ่านค่าสถานะจากขา buttonPin ที่ต่ออยู่กับสวิตท์ แล้วทำการเปลี่ยนแปลงค่าตัวแปร buttonState ตามสถานะของปุ่มกด จากนั้นโปรแกรมจะเช็คว่าค่าตัวแปร buttonState เป็น HIGH หรือไม่ ถ้าตัวแปร buttonState มีค่าเป็น HIGH โปรแกรมจะสั่ง digitalWrite HIGH ที่ขา ledPin ทำให้ LED ดับ ถ้าตัวแปร buttonState มีค่าไม่เท่ากับ HIGH โปรแกรมจะสั่ง digitalWrite LOW ที่ขา ledPin ทำให้ LED ติด จากนั้นก็วนรอบการทำงานในฟังชัน loop() ต่อไป

การใช้งานอินเทอร์รัพท์ภายนอกจาก Digital Input

        Interrupt หมายถึง การขัดจังหวะการทำงานของโปรแกรม โดยเมื่อมีการเกิดอินเทอร์รัพท์ขึ้นโปรแกรมจะทิ้งโปรแกรมหลักไปทำงานบางอย่างตามที่ได้กำหนดไว้แทน เมื่อทำงานบางอย่างตามที่ตั้งไว้สำเร็จแล้วโปรแกรมจะกลับมาทำงานต่อ ณ จุดเดิมที่เคยทำงานค้างไว้ ในบทความนี้จะใช้งานอินเทอร์รัพท์ภายนอกโดยอ่านค่าสถานะของ Digital Input จากขา GPIO บนบอร์ด ESPino32 เพื่อตรวจสอบการเกิดอินเทอร์รัพท์จากการกดปุ่ม

Syntax

attachInterrupt(pin, ISR, mode);

Parameters

pin:      หมายเลข pin
ISR:     ฟังก์ชันที่ทำงานเมื่อเกิดการอินเทอร์รัพท์
mode:   เหตุการณ์ที่ทำให้เกิด

– CHANGE         เมื่อสถานะของ GPIO เปลี่ยนแปลง

– RISING            เมื่อสถานะเปลี่ยนจาก LOW เป็น HIGH

– FALLING         เมื่อสถานะเปลี่ยนจาก HIGH เป็น LOW

– ONLOW           เมื่อสถานะของ GPIO เป็น LOW

– ONHIGH          เมื่อสถานะของ GPIO เป็น HIGH

ต่อวงจรดังรูป การใช้งานอินเทอร์รัพท์ภายนอกจาก Digital Input

การใช้งานอินเทอร์รัพท์ภายนอกจาก Digital Input

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         ประกาศตัวแปร ledPin ชนิด Byte ที่เป็นค่าคงที่ให้อยู่ที่ขา GPIO02
บรรทัดที่ 2         ประกาศตัวแปร interruptPin ชนิด Byte ที่เป็นค่าคงที่ให้อยู่ที่ขา GPIO15
บรรทัดที่ 3         ประกาศตัวแปร state ชนิด Byte ให้มีค่าเท่ากับ LOW
บรรทัดที่ 4         สร้างฟังก์ชัน setup()
บรรทัดที่ 5         เปิดฟังก์ชั่น setup()
บรรทัดที่ 6         กำหนดให้ ledPin เป็น OUTPUT
บรรทัดที่ 7         กำหนดให้ interruptPin เป็น INPUT
บรรทัดที่ 8         ใช้งานฟังก์ชัน Serial โดยตั้งค่าอัตราเร็ว Baud rate อยู่ที่ 115200 บิตต่อวินาที
บรรทัดที่ 9         กำหนดให้ใช้งานอินเทอร์รัพ ถ้าตรวจสอบพบการเปลี่ยนแปลงสถานะที่ขา interruptPin ให้ทำงานฟังก์ชัน blink()
บรรทัดที่ 10        ปิดฟังก์ชั่น setup()
บรรทัดที่ 11        สร้างฟังก์ชัน loop()
บรรทัดที่ 12        เปิดฟังก์ชั่น loop()
บรรทัดที่ 13        สร้างฟังก์ชันวนรอบการทำงาน 100 รอบ และเมื่อทำงานเสร็จแล้วจะเพิ่มรอบขึ้นทีละ 1 รอบ
บรรทัดที่ 14        เปิดฟังก์ชันวนการทำงาน
บรรทัดที่ 15        แสดงจำนวนรอบที่กำลังทำงาน ออกทาง Serial Monitor
บรรทัดที่ 16        หน่วงเวลา 1000 มิลลิวินาที
บรรทัดที่ 17        ปิดฟังก์ชันวนการทำงาน
บรรทัดที่ 18        ปิดฟังชัน loop()
บรรทัดที่ 19        สร้างฟังก์ชัน blink()
บรรทัดที่ 20        เปิดฟังก์ชั่น blink()
บรรทัดที่ 21        กลับค่าตัวแปร state แล้วนำมาเก็บไว้ในตัวแปร state
บรรทัดที่ 22        สั่งงานให้ ledPin มีสถานะเป็น LOW หรือ HIGH ตามสถานะของตัวแปร state ทำให้ LED ติดหรือดับสลับกันไป
บรรทัดที่ 23        แสดงคำว่า “put switch” ออกทาง Serial Monitor
บรรทัดที่ 24        ปิดฟังก์ชัน blink()

หลังจากอัพโหลดโปรแกรม ลงบนบอร์ด ESPino32 เลือกรูปแว่นขยาย หรือกด Shift + Ctrl + m เพื่อเปิด Serial Monitor ดูผลลัพธ์ของโปรแกรมที่แสดงออกมา ดังรูป เปิด Serial Monitor

เปิด Serial Monitor

เลือกอัตราเร็ว Baud rate ตามที่ตั้งไว้ ดังรูป เลือก Baud rate

เลือก Baud rate

ดูผลลัพธ์โปรแกรมที่รัน และทดสอบกดปุ่มเพื่อทดสอบการใช้งานอินเทอร์รัพ ดังรูป การใช้งานอินเทอร์รัพจากภายนอก

การใช้งานอินเทอร์รัพจากภายนอก

* หมายเหตุ บางครั้งการกดสวิตซ์ 1 ครั้งอาจเหมือนการกดหลายครั้งเนื่องจากเกิดสัญญาณ bounce

ผลการทดลอง

        เมื่อบอร์ด ESPino32 เริ่มทำงาน โปรแกรมหลักจะแสดงเลข 0-99 เมื่อมีการกดปุ่มในระหว่างที่โปรแกรมกำลังทำงาน ฟังก์ชันตรวจจับการเกิดอินเทอร์รัพท์จะทำงานทำให้โปรแกรมไปทำงานที่ฟังก์ชัน blink เมื่อเข้าสู่ฟังก์ชัน blink ค่าของตัวแปร state จะเปลี่ยนแปลงไปทำให้ LED ติด/ดับตามสถานะของตัวแปร state และแสดงคำว่า “put switch” ออกไปยัง Serial Monitor จากนั้นเมื่อทำงานเสร็จจะกลับมาทำงาน ณ ตำแหน่งเดิมที่เคยทำงานไว้

        สำหรับบทความ ESPino32 ในตอนที่ 4 การใช้งาน Digital Input/Digital Output จะเป็นพื้นฐานการเริ่มต้นการพัฒนาโปรแกรมและทดลองต่อวงจรดิจิทัลขั้นสำหรับผู้เริ่มต้น หวังว่าผู้อ่านจะสามารถประยุกต์การใช้งาน Digital Input และ Digital Output เพื่อสร้างเป็นชิ้นงานหรือนวัตกรรมใหม่ๆ เช่น ใช้ Digital Output ของบอร์ด ESPino32 ไปต่อร่วมกับรีเลย์เพื่อควบคุมการเปิดปิดไฟหรือควบคุมการทำงานของปั๊มน้ำ หรือสร้างชิ้นงานอื่นๆเพื่ออำนวยความสะดวกในชีวิตประจำวันต่อไปครับ


ขอขอบคุณข้อมูลอ้างอิงจาก

– https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf

– http://aimagin.com/blog/how-to-use-digital-input-output/

สารบัญ บทความ ESPino32