BÀI 2: ĐIỀU KHIỂN GPIO ESP8266 NONOS SDK VỚI CHỨC NĂNG OUTPUT


GPIO (General Perpose Input/Output) là chức năng cơ bản hay còn là chức năng nên tiếp cận đầu tiên đối với một người muốn học một loại vi điều khiển nào đó. Sỡ dĩ GPIO nên tiếp cận đầu tiên bởi nó là chức năng dễ hiểu, dễ thực hiện và nó giúp kiểm tra được chương trình hay phần cứng của chúng ta có đang hoạt động tốt hay không. Ngoài ra, bài học đầu tiên diễn ra suôn sẻ thì sẽ đem lại nhiều hứng thú cho việc học/thực hành những bài học tiếp theo đúng không nào?

Ở Bài học trước, mình đã hướng dẫn các bạn chuẩn bị một số thứ cần thiết để có thể học lập trình ESP8266 với ESP8266 NONOS SDK. Trong bài viết này mình sẽ hướng dẫn các bạn tiếp cận với chức năng GPIO của ESP8266. Thông qua bài học này, chúng ta có thể điều khiển được Led đơn, Relay hay có thể áp dụng chức năng này vào những giao thức nào đó để truyền nhận dữ liệu (UART, I2C, ...).

KIẾN THỨC CẦN THIẾT
GPIO (General Perpose Input/Output) là chức năng thường dùng với mục đích ngõ vào hoặc ngõ ra (đọc hoặc xuất dữ liệu). Dữ liệu của ngõ vào/ngõ ra ở dạng nhị phân tương ứng với hai mức đó là 0 hoặc 1.
Với trạng thái mức 1 (HIGH) chân GPIO sẽ được nối với chân VCC (Nguồn cung cấp cho ESP8266 - 3V3) và ngược lại, trạng thái 0 (LOW) thì chân của vi điều khiển này sẽ được nối xuống GND (0V).
sơ đồ chân của Board ESp8266 đang sử dụng. Trong bài học này mình sử dụng loại D1 mini có sơ đồ như sau:
Hình 1. Sơ đồ chân của Board ESP8266 D1 Mini

THỰC HÀNH
Như các bạn có thể thấy ở hình 1, một chân của ESP8266 có thể sử dụng được nhiều chức năng, ví dụ: chân D1 (GPIO5 và SCL - giao thức I2C). Vì vậy, khi sử dụng chân nào thì chúng ta cần nói cho ESP8266 biết rằng mình muốn nó bật/tắt chân đó. Cũng như là phải nói cho nó biết mình ngứa chỗ nào thì nó mới biết đường gãi đúng không nào :D.

Với ESP8266 NONOS SDK, nhà sản xuất đã hỗ trợ cho người dùng các hàm (function) để có thể thao tác với ESP8266 một cách nhanh chóng và đơn giản. Với bài học này, các bạn cần xem tài liệu 2C-ESP8266_Non_OS_SDK_API_Reference__EN trang 165 / 180 phần 7 - Peripheral-Related Drivers.

Hình 2. Các chức năng tích hợp trong chân của ESP8266

Các bước để thao tác với điều khiển một chân ESP8266 ở chức năng ngõ ra (OUTPUT):
  1. Xác định chân muốn sử dụng.
  2. Lựa chọn chức năng sử dụng cho chân vừa chọn. Trong bài này, chúng ta sẽ chọn chức năng GPIO.
  3. Cấu hình chân vừa chọn là ngõ ra (OUTPUT) hay ngõ vào (INPUT). Trong bài này, chúng ta sẽ chọn chức năng ngõ ra - OUTPUT.
  4. Điều khiển chân vừa chọn (Thiết lập chân nối với VCC hay GND).
Bước 1: Xác định chân muốn sử dụng
Đa số các chân của ESP8266 đều hỗ trợ chức năng GPIO. Để lựa chọn được một chân GPIO phục vụ cho project, các bạn cần tham khảo hình 1 và hình 2. 

Bước 2: Lựa chọn chức năng muốn sử dụng
Sau khi chọn được chân mong muốn, chúng ta cần phải khai báo - nói cho ESP8266 biết các bạn muốn nó làm sao thì làm miễn sao chân đó phục vụ đúng chức năng các bạn yêu cầu. Trong bài này, chúng ta sẽ sử dụng chức năng GPIO. Để làm được điều này, chúng ta cần phải biết câu lệnh:
PIN_FUNC_SELECT(PIN_NAME, FUNC)
Với :
PIN_NAME là tên chân muốn sử dụng (cột Inst Name ở hình 2) kết hợp với chuỗi "PERIPHS_IO_MUX_".
FUNC là chức năng mong muốn (cột Function 0, 1, 2, 3, 4 ở hình 2) kết hợp với chuỗi "FUNC".
Ví dụ: PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);

Bước 3 + 4: Cấu hình chân là ngõ ra và điều khiển chân đã chọn (chức năng GPIO)
Để thực hiện được thao tác này, API của NONOS SDK đã hỗ trợ chúng ta hàm:
gpio_output_set(uint32 set_mask, uint32 clear_mask,
       uint32 enable_mask, uint32 disable_mask);
với:
uint32 set_mask : Nếu giá trị nhập vào là 1 => chân ở mức cao (3V3 - VCC).
uint32 clear_mask : Nếu giá trị nhập vào là 1 => chân sẽ ở mức thấp (0 - GND).
uint32 enable_mask : Là bit sử dụng chức năng output cho chân X (GPIOx tương ứng với Bitx).
uint32 disable_mask : Là bit sử dụng chức năng input cho chân X (GPIOx tương ứng với Bitx).
Ví dụ:
gpio_output_set(BIT12, 0, BIT12, 0); // Chân GPIO12 ở mức cao (VCC – 3V3).
gpio_output_set(0, BIT12, BIT12, 0);// Chân GPIO12 ở mức thấp (GND – 0).

Ngoài ra, chúng ta có thể sử dụng hàm dưới đây để điều khiển chức năng OUTPUT của ESP8266 một cách nhanh chóng.
GPIO_OUTPUT_SET(gpio_no, bit_value);
Với:
gpio_no là chân cần GPIO cần điều khiển (Xem ở cột GPIO hình 2 - tương ứng với chân GPIO đã chọn).
bit_value là trạng thái mong muốn (Nếu là 1 => chân sẽ được nối với VCC và ngược lại).
Ví dụ: GPIO_OUTPUT_SET(12, 0); // GPIO12 as output low

CODE MẪU
void ICACHE_FLASH_ATTR
user_init(void)
{
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);    // cau hinh chon chuc nang cho chan GPIO12
    //  blink led
    while(1){
        gpio_output_set(BIT12, 0, BIT12, 0);    // cau hinh output, chan gpio 12 noi vcc
        os_delay_us(50000);
        os_delay_us(50000);
        os_delay_us(50000);
        os_delay_us(50000);
        os_delay_us(50000);
        os_delay_us(50000);
        gpio_output_set(0, BIT12, BIT12, 0);    // cau hinh output, chan gpio 12 noi GND
        os_delay_us(50000);
        os_delay_us(50000);
        os_delay_us(50000);
        os_delay_us(50000);
        os_delay_us(50000);
        os_delay_us(50000);
    }
}
os_timer_t blinkled_timer;
bool led_stt = false;
void controll_led(){
    led_stt = !led_stt;
    if (led_stt == true){
        gpio_output_set(BIT12, 0, BIT12, 0);
    }
    else{
        gpio_output_set(0, BIT12, BIT12, 0);
    }
}

void ICACHE_FLASH_ATTR
user_init(void)
{
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
    os_timer_setfn(&blinkled_timer, (os_timer_func_t *) controll_led, NULL);
    os_timer_arm(&blinkled_timer, 500, true);
}
SCHEMATIC

VIDEO HƯỚNG DẪN

Nhận xét

  1. Mình đang test với sdk mới nhất mà nạp không thấy chạy bạn ạ.

    Trả lờiXóa

Đăng nhận xét

Bài đăng phổ biến từ blog này

Dòng điện, điện áp 1 chiều và các định luật cơ bản

Dòng điện 1 chiều (DC) là gì ?

Các cách mắc điện trở

Dòng điện xoay chiều

Biến áp, Triết áp, Phân loại điện trở