KB-IDE [EP4]: ทดลองใช้งาน GPIO ของบอร์ด ESP32 ด้วย KB-IDE
How to use ESP32 gpio with KB-IDE
ก่อนที่จะเริ่มใช้งานบอร์ดต่าง ๆ เราควรที่จะทราบขาใช้งานของ ESP32 ที่เราจะใช้เสียก่อน ในที่นี้ผมจะเลือกเป็น บอร์ด TTGO T1 ซึ่งขาใช้งานมีดังต่อไปนี้
จากภาพที่ 1 จะเห็นได้ว่า GPIO จะแสดงด้วยสีชมพู ดังนั้นไม่ว่าจะให้เป็น ดิจิตอลอินพุต หรือ ดิจิตอลเอาต์พุต จะทำได้หมด ซึ่งการเรียกใช้งานในโปรแกรม สามารถกำหนดขาตามชื่อของ GPIO ได้เลย
#หมายเหตุ ขาใช้งานที่เป็นอินพุตได้เท่านั้น คือ GPIO35, 36 และ 39
การทดลองที่ 1: LED Blink
หลังจากที่เราได้ทำการติดตั้งโปรแกรม KB-IDE มาแล้ว
เราก็จะมาเขียนโปรแกรม ไฟกระพริบกัน ก่อนอื่นต้องต่อวงจรตามรูปเลยครับ
เขียนโปรแกรมตามรูปภาพที่ 3 (สังเกตุขาใช้งาน สามารถกำหนดเป็นตัวเลข 22 ตรงตามขาใช้งานได้เลย ไม่ต้องเขียน GPIO22) จากภาพที่ 2 วงจรควบคุมการติดดับของหลอด LED จะเห็นว่าเราต่อ LED ที่ ขา 22 ดังนั้นเราต้องเขียนโปรแกรมควบคุมการติดดับที่ขา 22 ด้วย ตามภาพที่ 3
จากภาพที่ 4 เมื่อปรับโหมดเป็น Programmer Level จะแสดงโค้ดแปลงมาจากบล็อก ซึ่งผู้พัฒนา สามารถศึกษาโค้ดเพิ่มเติมได้
อธิบายการทำงานของโปรแกรมการทดลองที่ 1
void setup() จากบล็อก Setup เป็นการตั้งค่า หรือกำหนดค่าเริ่มต้นให้กับโปรแกรม เช่น กำหนดขาใช้งาน กำหนดการเชื่อมต่อผ่าน serial, กำหนดการเชื่อมต่อเซ็นเซอร์ต่าง ๆ
void setup()
{
}
void loop() จากบล็อก Loop จะเป็นการทำงานแบบวนรอบ ภายในปีกกาเปิด ปิด โดยโปรแกรมจะทำงานวนรอบอยู่ในลูปนี้
void loop()
{
}
set pin เป็นการกำหนดขาใช้งานว่าเป็นเอาต์พุต อินพุต หรือ อินพุต พูลอัพ
pinMode(22,OUTPUT);
ส่วนการกำหนดขาใช้งานจะอยู่ตรงจุดที่กรอบสีแดง สามารถเปลี่ยนการทำงานของขาใช้งานความต้องการ
สีแดงคือขา GPIO ที่ใช้
สีน้ำเงินคือกำหนด OUTPUT, INPUT, INPUT_PULLUP
digitalWrite คำสั่งนี้ป็นคำสั่งการกำหนด ลอจิก ให้ออกไปยัง ขาที่กำหนดโดยจะกำหนดเป็นลอจิก “ 0 ” , “ 1 ” แทนด้วย 0 โวลต์ และ 5 โวลต์ ตามลำดับ
digitalWrite(22, 1);
โดยการกำหนด ตรงกรอบสีน้ำเงิน เป็นการกำหนด GPIO ที่ต้องการ ส่วนตรงกรอบสีแดงเป็นการกำหนด ลอจิก “0”, “1”
สีน้ำเงิน เป็นการกำหนด GPIO ที่ต้องการ ตรงเส้นใต้สีแดงเป็นการกำหนดลอจิก “0”, “1”
delay คำสั่งนี้เป็น การกำหนดให้หยุดการทำงานชั่วขณะ มีหน่วยเป็นมิลลิวินาที (Millisecond) จากตัวอย่างในบล็อกแทนค่าด้วย 100 คือหยุด100 มิลิวินาที
delay(100);
การทดลองที่ 2: การรับค่าอินพุตดิจิตอล
- แบบ Polling เป็นการเขียนโปรแกรมแบบวนตรวจสอบลอจิกที่ขาพอร์ต
2. แบบ Interrupt เป็นการเขียนโปรแกรมที่เปิดให้ยอมรับการรับสัญญาณการขัดจังหวะจากภายนอกได้
มาดูวิธี การต่อวงจรสวิตช์
จะสังเกตได้ว่า การใช้ INPUT นั้นจะต้องต่อ ตัวต้านทางภายนอกช่วยด้วย มีให้ใช้แบบ pullup หรือ แบบ pulldown เลือกกันได้เลย
ส่วนถ้าใช้ INPUT_PULLUP เราก็ไม่ต่อต่อตัวต้านทานแบบ pullup หรือ แบบ pulldown เลย ตัว MCU จะไปดึงแบบ pullup ใน MCU มาต่อให้ อัตโนมัติ
ดังนั้นมันก็ขึ้นอยู่กับการเรียกใช้งานแบบ INPUT ก็จะเหมาะกับงานจริงจังแต่ถ้าฝึกเขียนก็ต้อง INPUT_PULLUP น่าจะไหวตามต้องการเลยครับ
pinMode(BTPIN,INPUT);
pinMode(BTPIN,INPUT_PULLUP);
จากรูปภาพข้างบน BTPIN คือ GPIO ที่เราต้องการที่จะกำหนด
มาดูการเขียนโปรแกรมอ่านค่าจาก GPIO โดยการรับค่าอินพุต
ข้างบนแบบใช้ Block ข้างล่างแบบเขียนโปรแกรม
Number BTPIN;
void setup()
{
Serial.begin(115200);
BTPIN = 33;
pinMode(BTPIN,INPUT);}
void loop()
{
Serial.println(digitalRead(BTPIN));
delay(500);
}
ถ้าอับโหลดโปรแกรมได้ก็จะได้แบบนี้ เวลาเรากดปุ่มกราฟจะเป็น 0 เวลาปล่อย 1
การทดลองที่ 3: การใช้งาน PWM (Pulse Width Modulation)
PWM เป็นการควบคุมเวลาเปิดและปิดด้วยความถี่ ที่ใวกว่าตาเราจะมองเห็น
ค่า PWM จะกำหนดตั้งแต่ 0–255 จะเป็น 0%-100% และมี แค่ 15 ช่องเท่านั้น
การต่อวงจรก็ใช้ GPIO 22 เลยตามรูปครับ
หลังจากต่อเสร็จก็มาดูโค้ดกันครับ
แบบ Block
แบบโค้ด
void setup()
{
ledcSetup(0, 5000, 8);
ledcAttachPin(22, 0);
ledcWrite(0, 127);
}
void loop()
{
}
การทดลองที่ 4: การใช้งาน ADC
ADC เป็นการแปลงค่า อนาลอกเป็นค่าดิจิตอล โดยการแปลงค่าก็จะมาค่าความละเอียดด้วยส่วนของ ESP32 นั้นจะเป็น 12BIT มีค่าตั้งแต่ 0–4095 ค่าเลยทีเดียว
ส่วน GPIO ที่ใช้งานได้ ไปดูรูปภาพที่ 1 เลยครับ จะเขียนว่า ADC เช่น ADC14 อยู่ที่ GPIO13
ต่อวงจรตามรูปต่อไปนี้
หลังจากต่อเสร็จก็มาดูโค้ดกันครับ
แบบ Block
แบบ Code
void setup()
{
Serial.begin(115200);
}
void loop()
{
Serial.println(analogRead(13));
delay(500);
}
การทดลองที่ 5: การใช้งาน DAC
DAC เป็นการแปลงค่า ดิจิตอลเป็นค่าอนาลอก โดยการแปลงค่าก็จะมาค่าความละเอียดด้วยส่วนของ ESP32 นั้นจะเป็น 8BIT มีค่าตั้งแต่ 0–255 ค่าเลยส่วน GPIO ที่ใช้งานได้ มีอยู่ 2 ขา คือ GPIO25 และ GPIO26 เท่านั้นก็มาดูโค้ดกันครับ
แบบ Block
แบบโค้ด
void setup()
{
dacWrite(26,128);
}
void loop()
{
}
เอา โวลต์มิเตอร์ วัดที่ GPIO26 จะมีแรงดันออกมา 1.626V ถือว่าถูกต้องครับ
สำหรับบทความนี้ก็มีประมาณนี้ครับบทความต่อไปก็จะมาลงลึกอีกหน่อยนะครับ