ไล่ลำดับ LED บนบอร์ด
N32G031_LED_SEQUENCE
บทนำ
โปรเจกต์เบื้องต้นที่ออกแบบมาเพื่อสอนการควบคุม GPIO (General Purpose Input/Output) พื้นฐานโดยใช้ไมโครคอนโทรลเลอร์ N32G031 โปรเจกต์นี้ต่อยอดจาก "Hello World" พื้นฐานโดยการควบคุม LED บนบอร์ดตามลำดับที่ขา PB1, PB3, PB6 และ PB7 ซึ่งเป็นเครื่องมือที่ยอดเยี่ยมในการทำความเข้าใจลอจิกตามลำดับและฟังก์ชันกำหนดเวลาโดยไม่จำเป็นต้องต่อสายภายนอก โปรเจกต์นี้ได้รับการปรับแต่งอย่างเต็มที่สำหรับเวิร์กโฟลว์ข้ามแพลตฟอร์มโดยใช้ UnityMbed
Nations N32G031 Cortex-M0
PB1, PB3, PB6, PB7
LED บนบอร์ด (วิ่งสลับ)
วิดีโอสาธิตการทำงาน
การต่อวงจร
ไม่ต้องต่อสายไฟภายนอก: โปรเจกต์นี้ใช้ไฟ LED ที่ติดตั้งมาบนบอร์ด UnityMbed Starter Kit โดยตรง สามารถสังเกตกลุ่มหลอดไฟ LED บนบอร์ดซึ่งมีตัวอักษรระบุขา PB7, PB6, PB3 และ PB1 ชัดเจน
| อุปกรณ์ (Device) | ขาอุปกรณ์ (Pin) | ขาบอร์ด N32G031 | หมายเหตุ & คำแนะนำ |
|---|---|---|---|
| LED บนบอร์ด 1 | LED 1 | PB1 | หลอด LED บนบอร์ดตัวที่ 1 |
| LED บนบอร์ด 2 | LED 2 | PB3 | หลอด LED บนบอร์ดตัวที่ 2 |
| LED บนบอร์ด 3 | LED 3 | PB6 | หลอด LED บนบอร์ดตัวที่ 3 |
| LED บนบอร์ด 4 | LED 4 | PB7 | หลอด LED บนบอร์ดตัวที่ 4 |
การทำงาน & ลอจิกการทำงาน
เมื่อจ่ายไฟและแฟลชโค้ดลงบอร์ดแล้ว ไมโครคอนโทรลเลอร์จะทำงานตามลูปต่อไปนี้อย่างต่อเนื่องเพื่อสร้างเอฟเฟกต์ไฟวิ่ง (Chasing Effect):
เปิด Clock & กำหนด PMODE/POTYPE
เปิด Clock ผ่าน RCC->APB2PCLKEN บิต 3 และตั้งค่า PMODE/POTYPE สำหรับขา PB1, PB3, PB6, PB7 ให้เป็น Push-Pull Output
ควบคุม PBSC Set/Reset ทีละขา
สั่ง ON ขา PB1 -> หน่วงเวลา -> สั่ง OFF แล้วส่งต่อไปยัง PB3 -> PB6 -> PB7 และวนกลับมาเริ่มต้นใหม่
// UnityMbed — ไฟ LED วิ่งตามลำดับที่ขา PB1, PB3, PB6, PB7 @ N32G031
#include "n32g031.h"
static void delay(volatile uint32_t n) { while (n--) __NOP(); }
int main(void) {
/* เปิดสัญญาณนาฬิกา (Clock) ให้กับพอร์ต GPIOB ผ่าน APB2 บิตที่ 3 */
RCC->APB2PCLKEN |= (1u << 3);
/* กำหนดขา PB1, PB3, PB6, PB7 เป็น Push-Pull Output */
// เคลียร์บิต PMODE สำหรับ PB1[3:2], PB3[7:6], PB6[13:12], PB7[15:14]
GPIOB->PMODE &= ~((0x3U << 2) | (0x3U << 6) | (0x3U << 12) | (0x3U << 14));
// ตั้งค่า PMODE เป็น 01 (General purpose output mode)
GPIOB->PMODE |= ((0x1U << 2) | (0x1U << 6) | (0x1U << 12) | (0x1U << 14));
// เคลียร์บิต POTYPE ให้เป็น 0 (Push-pull) สำหรับ PB1, PB3, PB6, PB7
GPIOB->POTYPE &= ~((1U << 1) | (1U << 3) | (1U << 6) | (1U << 7));
// ปิดไฟ LED ทั้งหมดในตอนเริ่มต้น (เขียนค่า 1 ไปยัง 16 บิตบนของ PBSC เพื่อเคลียร์ขา)
GPIOB->PBSC = (1U << (1 + 16)) | (1U << (3 + 16)) | (1U << (6 + 16)) | (1U << (7 + 16));
while (1) {
// PB1 เปิด (ON)
GPIOB->PBSC = (1U << 1);
delay(400000);
GPIOB->PBSC = (1U << (1 + 16)); // PB1 ปิด (OFF)
// PB3 เปิด (ON)
GPIOB->PBSC = (1U << 3);
delay(400000);
GPIOB->PBSC = (1U << (3 + 16)); // PB3 ปิด (OFF)
// PB6 เปิด (ON)
GPIOB->PBSC = (1U << 6);
delay(400000);
GPIOB->PBSC = (1U << (6 + 16)); // PB6 ปิด (OFF)
// PB7 เปิด (ON)
GPIOB->PBSC = (1U << 7);
delay(400000);
GPIOB->PBSC = (1U << (7 + 16)); // PB7 ปิด (OFF)
}
}ไอเดียการเรียนรู้ & ต่อยอดด้วย AI
จากการวิเคราะห์สถาปัตยกรรมโค้ดและโครงสร้างการทำงาน ผู้เรียนสามารถต่อยอดร่วมกับ UnityMbed AI Copilot ได้ดังนี้:
การควบคุมหลายขาพร้อมกัน (Multi-Pin Control)
ทำความเข้าใจสถานะ HIGH (ON) และ LOW (OFF) รวมถึงวิธีการจัดการและควบคุมหลายขา GPIO พร้อมกันผ่าน Bitwise Operations
ปรับความเร็วแอนิเมชัน (Speed & Fluidity)
แนะนำให้ลองแก้ค่า delay(400000) ในโค้ด เช่น เปลี่ยนเป็น 50000 จะทำให้ลำดับไฟวิ่งดูเนียนตาและรวดเร็วขึ้นอย่างไร
เอฟเฟกต์ไฟวิ่งไป-กลับ (Knight Rider Scanner)
ให้ผู้เรียนลองใช้ AI Prompt เพื่อปรับลูปให้ไฟวิ่งไป-กลับ (PB1 -> PB3 -> PB6 -> PB7 -> PB6 -> PB3 -> PB1)
การกระพริบคู่แบบสมมาตร (Symmetric Pairs)
ลองขอให้ AI เขียนลอจิกสั่งเปิด PB1 และ PB7 พร้อมกัน ตามด้วย PB3 และ PB6 พร้อมกันเพื่อสร้างจังหวะผีเสื้อขยับปีก
คู่มือการ Build และ Flash
เปิดโปรเจกต์ (Open Project): เปิดโฟลเดอร์โปรเจกต์นี้ใน IDE โดยตรง
Build & Flash: เพียงคลิกปุ่ม Build และ Flash บนแถบเครื่องมือของอินเทอร์เฟซ