Chip ESP32 gồm có 48 chân (pin) cùng với nhiều chức năng. Không phải tất cả các chân đều ‘lòi’ ra trong ngoài ở tất cả các board phát triển ESP32, một số chân thì không thể sử dụng được.
Có nhiều câu hỏi về cách sử dụng GPIO của ESP32. Chân gì nên sử dụng? Chân gì nên tránh sử dụng trong các dự án của bạn? Bài viết này là một hướng dẫn tham khảo đơn giản và dễ làm theo cho các GPIO của ESP32.
Hình dưới đây minh họa sơ đồ chân của ESP-WROOM-32. Bạn có thể sử dụng nó làm tài liệu tham khảo nếu bạn đang sử dụng chip trần ESP32 để tạo bảng tùy chỉnh:
Lưu ý: không phải tất cả các GPIO đều có thể truy cập được trong các board phát triển, nhưng mỗi GPIO cụ thể lại hoạt động theo cùng một cách, bất kể là bạn đang sử dụng loại board phát triển nào. Nếu bạn mới bắt đầu với ESP32, bạn nên đọc bài viết: Làm quen với ESP32 Development Board
ESP32 Peripherals
Các ngoại vi (peripheral) của ESP32 gồm có:
- 18 Analog-to-Digital Converter (ADC) channels
- 3 SPI interfaces
- 3 UART interfaces
- 2 I2C interfaces
- 16 PWM output channels
- 2 Digital-to-Analog Converters (DAC)
- 2 I2S interfaces
- 10 Capacitive sensing GPIOs
Chức năng ADC (bộ chuyển đổi tương tự sang kỹ thuật số) và DAC (bộ chuyển đổi kỹ thuật số sang tương tự) được gán cho các chân tĩnh cụ thể. Tuy nhiên, bạn có thể quyết định chân nào là UART, I2C, SPI, PWM, v.v. – chỉ cần gán chúng bằng code. Điều này có được là nhờ chức năng ghép kênh của chip ESP32.
Mặc dù bạn có thể định nghĩa các thuộc tính của chân trên phần mềm, có những chân được gán theo mặc định như trong hình sau (đây là một ví dụ cho board mạch ESP32 DEVKIT V1 DOIT 36 chân – vị trí chân có thể thay đổi tùy thuộc vào nhà sản xuất).
Ngoài ra, có những chân với các tính năng cụ thể làm cho chúng phù hợp hoặc không phù hợp với một dự án. Bảng sau đây cho thấy những chân nào sử dụng làm input, output là tốt nhất và những chân nào bạn cần thận trọng.
Các chân được đánh dấu màu xanh lá cây là sử dụng OK. Các chân dụng được đánh dấu màu vàng là sử dụng OK, nhưng bạn cần chú ý vì chúng có thể có những hành vi không mong muốn lúc khởi động (boot). Các chân được đánh dấu màu đỏ không được khuyến khích sử dụng làm input hoặc output.
Tiếp tục đọc để biết thêm chi tiết và phân tích sâu về các GPIO của ESP32 và các chức năng của chúng.
Chân chỉ làm Input
GPIO 34 đến 39 là chân GPI – Input only. Các chân này không có điện trở nội kéo lên (internal pull-up resistor) hoặc kéo xuống (internal pull-down resistor). Chúng không thể được sử dụng làm output, vì vậy các chân này chỉ sử dụng làm input:
- GPIO 34
- GPIO 35
- GPIO 36
- GPIO 39
SPI flash được tích hợp trên ESP-WROOM-32
GPIO 6 đến GPIO 11 được đưa ra ngoài ở một số board phát triển ESP32. Tuy nhiên, các chân này được kết nối với bộ nhớ SPI flash tích hợp trên chip ESP-WROOM-32 và không được khuyến khích sử dụng cho các mục đích khác. Vì vậy, đừng sử dụng các chân này trong dự án của bạn:
- GPIO 6 (SCK/CLK)
- GPIO 7 (SDO/SD0)
- GPIO 8 (SDI/SD1)
- GPIO 9 (SHD/SD2)
- GPIO 10 (SWP/SD3)
- GPIO 11 (CSC/CMD)
Capacitive touch GPIOs
ESP32 có 10 GPIO cảm biến chạm điện dung (internal capacitive touch sensor). Chúng có thể cảm nhận được sự biến thiên của bất cứ thứ gì chứa điện tích, như da người. Vì vậy, họ có thể phát hiện các biến thiên gây ra khi chạm ngón tay vào các GPIO. Các chân này có thể dễ dàng tích hợp vào các miếng đệm điện dung và thay thế các nút cơ học. Những chân cảm ứng điện dung cũng có thể được dùng để đánh thức ESP32 khỏi chế độ ngủ sâu (deep sleep).
Các cảm biến tiếp xúc nội được kết nối với các GPIO như sau:
- T0 (GPIO 4)
- T1 (GPIO 0)
- T2 (GPIO 2)
- T3 (GPIO 15)
- T4 (GPIO 13)
- T5 (GPIO 12)
- T6 (GPIO 14)
- T7 (GPIO 27)
- T8 (GPIO 33)
- T9 (GPIO 32)
Analog to Digital Converter (ADC)
ESP32 có 18 kênh (channel) ADC input 12 bit (trong khi ESP8266 chỉ có 1 ADC 10 bit). Đây là các GPIO có thể được sử dụng làm ADC và các kênh tương ứng:
- ADC1_CH0 (GPIO 36)
- ADC1_CH1 (GPIO 37)
- ADC1_CH2 (GPIO 38)
- ADC1_CH3 (GPIO 39)
- ADC1_CH4 (GPIO 32)
- ADC1_CH5 (GPIO 33)
- ADC1_CH6 (GPIO 34)
- ADC1_CH7 (GPIO 35)
- ADC2_CH0 (GPIO 4)
- ADC2_CH1 (GPIO 0)
- ADC2_CH2 (GPIO 2)
- ADC2_CH3 (GPIO 15)
- ADC2_CH4 (GPIO 13)
- ADC2_CH5 (GPIO 12)
- ADC2_CH6 (GPIO 14)
- ADC2_CH7 (GPIO 27)
- ADC2_CH8 (GPIO 25)
- ADC2_CH9 (GPIO 26)
Lưu ý: những chân ADC2 không thể sử dụng khi Wi-Fi đang được xài. Nên nếu bạn đang sử dụng Wi-Fi và bạn có vấn đề với việc lấy giá trị từ một ADC2 GPIO, bạn nên cân nhắc đến việc sử dụng một ADC1 GPIO thay thế. Điều này có thể giải quyết được vấn đề.
Những kênh ADC input có độ phân giải (resolution) 12 bit. Điều này có nghĩa là bạn có thể lấy giá trị đọc analog trong phạm vi từ 0 đến 4095, với 0 tương ứng với 0V và 4095 tương ứng với 3.3V. Bạn cũng có thể cài đặt độ phân giải của những kênh này trên code.
Các chân ESP32 ADC không có hành vi tuyến tính (linear behavior). Bạn có lẽ sẽ không thể phân biệt được giữa 0 và 0.1V, hoặc giữa 3.2 và 3.3V. Bạn cần phải nhớ kĩ điều này khi sử dụng các chân ADC. Bạn sẽ có được một hành vi tương tự như hình dưới đây.
Digital to Analog Converter (DAC)
Có 2 kênh DAC 8 bit trên ESP32 để chuyển đổi tín hiệu kỹ thuật số (digital) thành output tín hiệu điện áp tương tự (analog voltage signal). Đây là các kênh DAC:
- DAC1 (GPIO25)
- DAC2 (GPIO26)
GPIO RTC
Có hỗ trợ GPIO RTC trên ESP32. Các GPIO được chuyển đến hệ thống con (subsystem) công suất thấp RTC được sử dụng khi ESP32 đang ở chế độ ngủ sâu (deep sleep). Các GPIO RTC này có thể được sử dụng để đánh thức ESP32 khỏi chế độ ngủ sâu khi bộ đồng xử lý (co-processor) công suất cực thấp (Ultra Low Power – ULP) đang chạy. Các GPIO sau có thể được sử dụng làm nguồn đánh thức ngoại (external wake up source).
- RTC_GPIO0 (GPIO36)
- RTC_GPIO3 (GPIO39)
- RTC_GPIO4 (GPIO34)
- RTC_GPIO5 (GPIO35)
- RTC_GPIO6 (GPIO25)
- RTC_GPIO7 (GPIO26)
- RTC_GPIO8 (GPIO33)
- RTC_GPIO9 (GPIO32)
- RTC_GPIO10 (GPIO4)
- RTC_GPIO11 (GPIO0)
- RTC_GPIO12 (GPIO2)
- RTC_GPIO13 (GPIO15)
- RTC_GPIO14 (GPIO13)
- RTC_GPIO15 (GPIO12)
- RTC_GPIO16 (GPIO14)
- RTC_GPIO17 (GPIO27)
PWM
Bộ điều khiển ESP32 LED PWM có 16 kênh độc lập có thể được cấu hình để tạo tín hiệu PWM với các đặc tính khác nhau. Tất cả các chân có thể hoạt động như đầu ra đều có thể được sử dụng làm chân PWM (GPIO từ 34 đến 39 không thể tạo PWM).
Để đặt tín hiệu PWM, bạn cần xác định các thông số này trong mã:
- Tần số của tín hiệu (signal’s frequency)
- Chu kỳ nhiệm vụ (duty cycle)
- Kênh PWM (PWM channel)
- GPIO mà bạn muốn xuất tín hiệu.
I2C
ESP32 có hai kênh I2C và bất kỳ chân nào cũng có thể được đặt làm SDA hoặc SCL. Khi sử dụng ESP32 bằng Arduino IDE, các chân I2C mặc định là:
- GPIO 21 (SDA)
- GPIO 22 (SCL)
Nếu bạn muốn sử dụng các chân khác khi sử dụng thư viện Wire, bạn chỉ cần gọi:
Wire.begin(SDA, SCL);
SPI
Theo mặc định, ánh xạ chân (pin mapping) của SPI là:
SPI | MOSI | MISO | CLK | CS |
VSPI | GPIO 23 | GPIO 19 | GPIO 18 | GPIO 5 |
HSPI | GPIO 13 | GPIO 12 | GPIO 14 | GPIO 15 |
Interrupt
Tất cả GPIO đều có thể cấu hình thành ngắt (interrupt)
Strapping Pins
Chip ESP32 có các chân strapping sau:
- GPIO 0
- GPIO 2
- GPIO 4
- GPIO 5 (phải HIGH trong khi khởi động)
- GPIO 12 (phải LOW trong khi khởi động)
- GPIO 15 (phải HIGH trong khi khởi động)
Chúng được dùng để đưa ESP32 qua chế độ bootloader hoặc flash. Trên hầu hết các board mạch phát triển có USB/Serial tích hợp, bạn không cần phải lo lắng về trạng thái của các chân này. Board mạch đặt các chân ở trạng thái phù hợp cho chế độ flash hoặc boot.
Tuy nhiên, nếu bạn kết nối thiết bị ngoại vi (peripheral) với các chân đó, bạn có thể gặp sự cố khi cố gắng upload code mới, flash ESP32 với firmware mới hoặc reset board mạch. Nếu bạn có một số thiết bị ngoại vi được kết nối với những chân strapping này, bạn sẽ gặp sự cố khi upload code hoặc flash ESP32, đó có thể là bởi vì các thiết bị ngoại vi đó đang ngăn cản ESP32 nhảy vào đúng chế độ. Đọc thêm tài liệu Boot Mode Selection documentation để hướng dẫn bạn cách chọn chế độ boot đúng. Sau khi reset, flash hoặc boot, các chân đó sẽ hoạt động như dự định.
Chân HIGH khi Boot
Một số GPIO thay đổi trạng thái của nó thành HIGH hoặc xuất tín hiệu PWM khi boot hoặc reset. Điều này có nghĩa là nếu bạn có những output được kết nối với những GPIO này, bạn có thể nhận được kết quả không mong muốn khi ESP32 reset hoặc boot.
- GPIO 1
- GPIO 3
- GPIO 5
- GPIO 6 đến GPIO 11 (được kết nối với bộ nhớ flash SPI tích hợp ESP32 – không khuyến khích sử dụng).
- GPIO 14
- GPIO 15
Enable (EN)
Enable (EN) là chân kích hoạt của bộ điều chỉnh (regulator) 3.3V. Nó được kéo lên (pull-up), vì vậy hãy nối đất (Ground) nếu muốn vô hiệu hóa bộ điều chỉnh 3.3V. Do đó bạn có thể kết nối chân này với một nút bấm để làm nút khởi động cho ESP32 của mình, nếu cần thiết.
GPIO current drawn
Dòng điện tối đa tuyệt đối được rút ra trên mỗi GPIO là 40mA theo phần “Recommended Operating Conditions” trong datasheet ESP32.
Cảm biến hiệu ứng Hall (từ trường)
ESP32 có tích hợp cảm biến hiệu ứng Hall giúp phát hiện những thay đổi của từ trường xung quanh nó.
Tóm tắt
Chúng tôi hy vọng bạn cảm thấy hướng dẫn tham khảo GPIO của ESP32 này hữu ích. Nếu bạn có thêm mẹo hay nào về ESP32 GPIO, hãy chia sẻ bằng cách viết bình luận xuống bên dưới.
Nếu bạn chỉ mới bắt đầu với ESP32, chúng tôi giới thiệu một số tài liệu tuyệt vời khác để học:
Liên kết ngoài:
(Nguồn: randomnerdtutorials.com)
Pingback: Lập trình ESP32 PWM với Arduino IDE (Analog Output) - Tạ Lục Gia Hoàng
Pingback: Lập trình ESP32 ADC – Đọc giá trị Analog với Arduino IDE - Tạ Lục Gia Hoàng