Lập Trình GPIO Bằng C: Điều Khiển LED Nhấp Nháy (Blink)
Trong bài viết này, chúng ta sẽ khám phá cách cơ bản để sử dụng các chân GPIO (General Purpose Input/Output) trên các máy tính bảng đơn (SBC) như Raspberry Pi hoặc Orange Pi, thông qua thư viện WiringOP và ngôn ngữ lập trình C. Chúng ta sẽ thực hiện ví dụ kinh điển “Hello World” trong thế giới phần cứng: làm cho một đèn LED nhấp nháy.
Tìm Hiểu Chung Về Điều Khiển GPIO
Để điều khiển các chân GPIO, có hai phương pháp chính được sử dụng phổ biến:
- Sử dụng ngôn ngữ C: Phương pháp này thường mang lại hiệu suất cao hơn và kiểm soát sâu hơn về phần cứng. Trong hướng dẫn này, chúng ta sẽ tập trung vào việc sử dụng thư viện WiringOP (dựa trên WiringPi) cho ngôn ngữ C.
- Sử dụng ngôn ngữ Python: Python cung cấp một cú pháp đơn giản, dễ học, và thư viện GPIO cho Python cũng rất mạnh mẽ, phù hợp cho các dự án nhanh chóng hoặc khi bạn muốn tập trung vào logic hơn là hiệu suất.
Lưu ý quan trọng: Các kiến thức và ví dụ trong bài viết này hoàn toàn có thể áp dụng cho nhiều loại SBC khác nhau, bao gồm Raspberry Pi, Orange Pi và các bo mạch tương tự có hỗ trợ thư viện WiringPi/WiringOP.
Ví Dụ Thực Tế: Làm Nhấp Nháy Đèn LED
Chúng ta sẽ thực hiện chương trình “Blink” để làm một đèn LED nhấp nháy. Đèn LED sẽ được kết nối với chân GPIO1, tương ứng với chân vật lý số 12 và được ánh xạ thành WiringPi Pin 1 trong thư viện WiringOP. Để hiểu rõ hơn về cách ánh xạ chân, bạn có thể tham khảo hình ảnh sơ đồ chân dưới đây:

Các Bước Thực Hiện
Hãy cùng đi qua từng bước để cài đặt, lập trình và chạy chương trình điều khiển LED nhấp nháy.
1. Chuẩn Bị Môi Trường
Đầu tiên, chúng ta cần tạo một thư mục để chứa các chương trình GPIO và một thư mục con riêng cho ví dụ “Blink” này. Sau đó, di chuyển vào thư mục đó:
mkdir -p programs_gpio/blink
cd programs_gpio/blink
2. Viết Chương Trình C
Tiếp theo, chúng ta sẽ tạo một tệp mã nguồn C có tên blink.c và mở nó bằng trình soạn thảo nano:
sudo nano blink.c
Nhập đoạn mã sau vào tệp blink.c:
#include <wiringPi.h> // Bao gồm thư viện WiringPi
#define PIN_LED 1 // Định nghĩa chân LED là WiringPi Pin 1
#define DELAY_TIME 1000 // Thời gian trễ 1 giây (1000 mili giây)
int main (void)
{
// Khởi tạo thư viện WiringPi (sử dụng sơ đồ chân WiringPi)
wiringPiSetup();
// Cấu hình chân PIN_LED là chân đầu ra
pinMode(PIN_LED, OUTPUT);
// Vòng lặp vô hạn để LED nhấp nháy
while(1)
{
digitalWrite(PIN_LED, HIGH); // Bật LED (cung cấp điện áp cao)
delay(DELAY_TIME); // Chờ DELAY_TIME
digitalWrite(PIN_LED, LOW); // Tắt LED (cung cấp điện áp thấp)
delay(DELAY_TIME); // Chờ DELAY_TIME
}
return 0; // Chương trình không bao giờ đến đây trong vòng lặp vô hạn
}
Giải thích mã:
#include <wiringPi.h>: Khai báo để sử dụng các hàm của thư viện WiringPi.#define PIN_LED 1: Định nghĩa một hằng sốPIN_LEDvới giá trị1, tương ứng với WiringPi Pin 1.#define DELAY_TIME 1000: Định nghĩa thời gian trễ là 1000 mili giây (1 giây).wiringPiSetup(): Hàm khởi tạo thư viện WiringPi, cần được gọi một lần trước khi sử dụng các hàm khác.pinMode(PIN_LED, OUTPUT): Thiết lập chânPIN_LEDở chế độ đầu ra.digitalWrite(PIN_LED, HIGH): Đặt chânPIN_LEDlên mức cao (HIGH), làm đèn LED sáng.digitalWrite(PIN_LED, LOW): Đặt chânPIN_LEDxuống mức thấp (LOW), làm đèn LED tắt.delay(DELAY_TIME): Tạm dừng chương trình trongDELAY_TIMEmili giây.
Sau khi nhập mã, lưu tệp và thoát trình soạn thảo nano bằng cách nhấn Ctrl + X, sau đó Y để xác nhận lưu, và Enter.
3. Biên Dịch Chương Trình
Sử dụng trình biên dịch gcc để biên dịch mã nguồn C thành một tệp thực thi. Đảm bảo bạn đã cài đặt gcc và thư viện WiringPi (ví dụ: sudo apt-get install wiringpi).
gcc -o blink blink.c -lwiringPi
Lệnh này sẽ tạo ra một tệp thực thi có tên blink từ mã nguồn blink.c và liên kết với thư viện WiringPi (-lwiringPi).
4. Chạy Chương Trình
Cuối cùng, chạy chương trình đã biên dịch. Vì chương trình này tương tác trực tiếp với phần cứng, bạn cần chạy nó với quyền sudo:
sudo ./blink
Khi chương trình chạy, bạn sẽ thấy đèn LED được kết nối với chân WiringPi Pin 1 (GPIO1, chân vật lý 12) bắt đầu nhấp nháy liên tục, bật và tắt mỗi giây. Để dừng chương trình, bạn có thể nhấn Ctrl + C trong terminal.
Chúc mừng! Bạn đã thành công trong việc điều khiển đầu ra kỹ thuật số (LED) trên SBC của mình bằng ngôn ngữ C và thư viện WiringOP. Đây là bước đầu tiên quan trọng để khám phá thế giới lập trình nhúng và điều khiển phần cứng.