1. Tải và cài đặt thư viện bcm2835
- Bước 1: Vào thư mục Desktop:
cd /home/pi/Desktop/
- Bước 2: Tạo một thư mục Programming:
mkdir Programming
- Bước 3: Vào thư mục Programming:
cd Programming
- Bước 4: download thư viện “bcm2835-1.49”
wget http://www.airSpayce.com/mikem/bcm2835/bcm2835-1.49.tar.gz
- Bước 5: giải nén file “bcm2835-1.49.tar.gz”
tar –zxvf bcm2835-1.49.tar.gz
- Bước 6: vào thư mục vừa giải nén xong “bcm2835-1.49”
cd bcm2835-1.49
- Bước 7: Chạy configure:
sudo ./configure
- Bước 8: chạy makefile cho thư viện:
make
- Bước 9: Cài đặt makefile vừa tạo ra:
sudo make install
2. Lập trình output ra LED cơ bản.
Phần này hướng dẫn cách lập trình GPIO để điều khiển nhấp nháy đèn Led.
- Bước 1: Thoát khỏi thư mục “bcm2835-1.49” và tao một thư mục “blink”:
cd ..
mkdir blink
- Bước 2: Vào thư mục blink vừa được tạo và tạo một chương trình có tên là“$blink.c”:
cd /blink
sudo nano blink.c
Chương trình blink.c
#include <bcm2835.h>
// Blinks on RPi Plug P1 pin 11 (which is GPIO pin 17)
#define PIN RPI_V2_GPIO_P1_11
int main(int argc, char **argv)
{
// If you call this, it will not actually access the GPIO
// Use for testing
// bcm2835_set_debug(1);
if (!bcm2835_init())
return 1;
// Set the pin to be an output
bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);
// Blink
while (1)
{
// Turn it on
bcm2835_gpio_write(PIN, HIGH);
// wait a bit
bcm2835_delay(500);
// turn it off
bcm2835_gpio_write(PIN, LOW);
// wait a bit
bcm2835_delay(500);
}
bcm2835_close();
return 0;
}
- Bước 3: biên dịch chương trình “c” sẽ tạo ra file “blink”
gcc –o blink blink.c -l bcm2835
- Bước 4: Chạy file vừa được biên dịch xong :
sudo ./blink
3. Lập trình Input chân GPIO
- Các bước thực hiện tạo file.c cũng như quy trình biên dịch giống như trong phần 2 lập trình Output ra LED(nháy LED).
- Bước 1: Tạo một thư mục có tên là input
mkdir input
- Bước 2: Vào thư mục input và tạo một chương trình có tên là “input.c”
cd /input
sudo nano input.c
Chương trình input.c
#include <bcm2835.h>
#include <stdio.h>
// Input on RPi pin GPIO 15
#define PIN RPI_GPIO_P1_15
int main(int argc, char **argv)
{
// If you call this, it will not actually access the GPIO
// Use for testing
// bcm2835_set_debug(1);
if (!bcm2835_init())
return 1;
// Set RPI pin P1-15 to be an input
bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_INPT);
// with a pullup
bcm2835_gpio_set_pud(PIN, BCM2835_GPIO_PUD_UP);
// Blink
while (1)
{
// Read some data
uint8_t value = bcm2835_gpio_lev(PIN);
printf("read from pin 15: %d\n", value);
// wait a bit
delay(500);
}
bcm2835_close();
return 0;
}
- Bước 3: biên dịch chương trình “blink.c” sẽ tạo ra file “blink”
gcc –o input input.c -l bcm2835
- Bước 4: Chạy file vừa được biên dịch xong :
LẬP TRÌNH ĐIỀU KHIỂN LED 7 THANH
Mình sẽ hướng dẫn cách sử dụng GPIO để điều khiển Led 7 thanh, một ứng dụng rất quen thuộc với người học và làm điện tử.
1. Cấu tạo và cách tạo mã ra led 7 thanh
1.1. Cấu tạo
Cấu tạo leb 7 thanh
Led 7 thanh gồm 8 led đơn được nối với nhau tương ứng 7 đoạn và 1 dấu chấm.
Nhìn vào sơ đồ nguyên lý ta thấy 8 led đơn được nối chung với nhau. Nếu các chân Anode(cực dương) được nối chung với nhau và nối với dương nguồn thì ta được led 7 thanh loại Anode chung.Tương tự led 7 thanh loại Cathode các chân được nối chung với nhau và nối với âm nguồn.
1.2. Tạo mã led 7 thanh
Ở đây ta tìm hiểu cách tạo mã led 7 thanh loại Anode . Loại Cathode cũng tương tự. Vì led 7 thanh loại Anode được nối chung cực dương nên led sẽ sáng tương ứng bit đầu vào mức logic 0 và led sẽ tắt tương ứng mức logic 1 (5V).
Như vậy ta sẽ có bảng mã như sau:
// Tạo mảng gồm 10 phần tử để chứa mã các chữ số từ 0->9 vừa tạo ra ở trên
uint8_t chuso[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
2. Lập trình hiển thị ra LED 7 thanh
- Các bước thực hiện việc tạo chương trình và biên dịch giống như các bước thực hiện ở bài 3 trong output và input GPIO.
- Bước 1: Tạo một thư mục có tên là led7thanh
mkdir led7thanh
- Bước 2: Vào thư mục led7thanh và tạo một chương trình có tên là “led7thanh.c”
$cd /led7thanh$sudo nano led7thanh.c
Chương trình hiển thị ra LED 7 thanh
#include <bcm2835.h>#define PINA RPI_V2_GPIO_P1_11#define PINB RPI_V2_GPIO_P1_12#define PINC RPI_V2_GPIO_P1_13#define PIND RPI_V2_GPIO_P1_15#define PINE RPI_V2_GPIO_P1_16#define PINF RPI_V2_GPIO_P1_18#define PING RPI_V2_GPIO_P1_22#define PINH RPI_V2_GPIO_P1_29//0xC0 = 0b1100 0000
uint8_t chuso[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
int main(int argc, char **argv)
{
if (!bcm2835_init())
return 1;
// Set the pin to be an output
bcm2835_gpio_fsel(PINA, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(PINB, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(PINC, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(PIND, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(PINE, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(PINF, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(PING, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(PINH, BCM2835_GPIO_FSEL_OUTP);
// Display to LED 7 segment
while (1)
{
//Display number 0
bcm2835_gpio_write(PINA, HIGH);
bcm2835_gpio_write(PINB, HIGH);
bcm2835_gpio_write(PINC, LOW);
bcm2835_gpio_write(PIND, LOW);
bcm2835_gpio_write(PINE, LOW);
bcm2835_gpio_write(PINF, LOW);
bcm2835_gpio_write(PING, LOW);
bcm2835_gpio_write(PINH, LOW);
//Delay 2s
bcm2835_delay(2000);
//Display number 1
bcm2835_gpio_write(PINA, HIGH);
bcm2835_gpio_write(PINB, HIGH);
bcm2835_gpio_write(PINC, HIGH);
bcm2835_gpio_write(PIND, HIGH);
bcm2835_gpio_write(PINE, HIGH);
bcm2835_gpio_write(PINF, LOW);
bcm2835_gpio_write(PING, LOW);
//Delay 2s
bcm2835_delay(2000);
}
bcm2835_close();
return 0;
}