Getting Started with the Raspberry Pi Pico Microcontroller and Arduino IDE [LEP]

ในตอนสุดท้ายนี้เป็นการทดลองเกี่ยวกับการรับสัญญาณอินเตอร์รัพท์ภายนอก (External interrupt) ของบอร์ด Raspberry Pi Pico โดยในการทดลองนี้จะใช้ขา GP1 (PIN2) เป็นขารับสัญญาณอินพุตอินเตอร์รัพท์ภายนอก โดยเมื่อมีสัญญาณอินเตอร์รัพท์ภายนอกเข้ามาที่ขาดังกล่าว โปรแกรมจะแสดงผลการทำงานให้ทราบ เทียบกับในช่วงที่โปรแกรมกำลังทำงานอยู่ในสถานะปกติ ทั้งนี้การรับสัญญาณอินเตอร์รัพท์ภายนอก เป็นคำสั่งที่นำไปใช้งานในด้านต่างๆ ได้มากมายเช่น การตรวจสอบค่าแรงดันและกระแสไฟฟ้าเกิน (Over voltage and current signal) หรือการรับค่าสัญญาณเตือนต่างๆ (Alarm signal) เป็นต้น


ในรูปที่ 1 และรูปที่ 2 แสดงตำแหน่งขาอินพุตรับสัญญาณอินเตอร์รัพท์ที่ใช้ในการทดลองขา GP1 (PIN2) และให้ขา GP5 (PIN7) รับสัญญาณอินพุตลอจิกปกติสำหรับเปรียบเทียบการทำงาน ในรูปที่ 2 เป็นการทดลองต่อวงจรรับสัญญาณอินเตอร์รัพท์อย่างง่ายบนเบรดบอร์ดเพื่อให้ง่ายและรวดเร็วขึ้น
// https://forum.arduino.cc/t/rotary-encoder-and-raspi-pico-interrupt-handlers-never-trigger/1034710
#define ROTA 1 // GP1, pin 2
#define SWITCH 5 // GP5, pin 7
int CountInt = 0;
boolean SwitchGP5 = false;
void setup() {
pinMode(ROTA, INPUT_PULLUP);
pinMode(SWITCH, INPUT_PULLUP);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(ROTA), ActiveInt, RISING);
interrupts();
}
void loop() {
int val = digitalRead(SWITCH);
if (val == 0) {
if (SwitchGP5 == false) {
SwitchGP5 = true;
Serial.println("SwitchGP5");
}
} else {
SwitchGP5 = false;
}
Serial.println(CountInt);
delay(300);
}
void ActiveInt() {
CountInt++;
}
สำหรับโปรแกรม Arduino บนสำหรับบอร์ด Raspberry Pi Pico ในการตรวจจับสัญญาณอินพุตอินเตอร์รัพท์ภายนอก จะแบ่งออกเป็น การตั้งค่าพิน (Pin Setup) กำหนดขา ROTA (GP1) และ SWITCH (GP5) เป็น INPUT_PULLUP ทำให้สถานะปกติของขามีค่าเป็น HIGH (1) และเมื่อปุ่มถูกกดหรือสวิตช์ต่อลง Ground จะกลายเป็น LOW (0) การขัดจังหวะ (Interrupt Handling) จะใช้คำสั่ง attachInterrupt เพื่อจับสัญญาณขาขึ้น (RISING) จากทั้งขา ROTA เมื่อที่ขาดังกล่าวเกิดสัญญาณเปลี่ยนจาก 0 ไป 1 จะทำให้โปรแกรมเข้าไปยังฟังก์ชัน void ActiveInt() ทันทีเพื่อบวกค่าตัวแปร CountInt เพิ่มขึ้นทีละ 1
ในการทำงานลูปโปรแกรมหลัก void loop() โดยปกติจะรอสัญญาณอินพุตอินเตอร์รัพท์ภายนอกและตรวจจับปุ่มกดเพื่ออ่านค่าที่ขา SWITCH โดยถ้า SWITCH ถูกกด (เป็น 0) จะพิมพ์คำว่า “SwitchGP5” ออกทาง Serial Monitor เพียงครั้งเดียว (ใช้ตัวแปรสถานะ witchGP5 ป้องกันไม่ให้พิมพ์ซ้ำขณะกดค้าง) และกรณีที่เกิดการอินเตอร์รัพท์ภายนอกก็จะกระโดดไปยังฟังก์ชั่น void ActiveInt() เพื่อเพิ่มค่าตัวแปร CountInt และพิมพ์ผลที่ได้ออกทาง Serial Monitor เช่นกัน



สำหรับการทดลองเกี่ยวกับการรับสัญญาณอินเตอร์รัพท์ภายนอก (External interrupt) ของบอร์ด Raspberry Pi Pico จะเป็นตอนสุดท้ายของการเริ่มต้นใช้งานบอร์ด Raspberry Pi Pico สำหรับเป็นตัวอย่างในการนำโค้ดโปรแกรมไปใช้งานได้ง่ายและรววเร็วยิ่งขึ้น สำหรับผู้อ่านที่ต้องการศึกษาการใช้งานบอร์ด Raspberry Pi Pico โดยละเอียดเพิ่มขึ้นแนะนำเข้าไปที่เว็บไซต์อ้างอิงข้างล่าง ซึ่งจะมีเนื้อหาให้เรียนรู้และทดลองใช้งานต่างๆ มากมายครับ.
Reference
- https://www.raspberrypi.com/documentation/microcontrollers/pico-series.html
- https://randomnerdtutorials.com/
- https://github.com/micropython/micropython/wiki
- https://forum.arduino.cc/t/rotary-encoder-and-raspi-pico-interrupt-handlers-never-trigger/1034710
- https://pip-assets.raspberrypi.com/categories/610-raspberry-pi-pico/documents/RP-008355-DS-1-raspberry-pi-pico-python-sdk.pdf
- https://projecthub.arduino.cc/angadiameya007/getting-started-with-raspberry-pi-pico-in-arduino-ide-5e13ee
- https://th.cytron.io/p-edu-project-and-innovation-kits-for-pico-w
- https://wokwi.com/pi-pico
- https://thonny.org/
- https://microcontrollerslab.com/raspberry-pi-pico-pinout-features-programming-peripherals/