Mục lục:

IO Expander cho ESP32, ESP8266 và Arduino: 24 bước
IO Expander cho ESP32, ESP8266 và Arduino: 24 bước

Video: IO Expander cho ESP32, ESP8266 và Arduino: 24 bước

Video: IO Expander cho ESP32, ESP8266 và Arduino: 24 bước
Video: ESP8266 giao tiếp với Arduino : Tạo 1 web server điều khiển led. 2024, Tháng mười một
Anonim
Image
Image
Giới thiệu
Giới thiệu

Bạn có muốn mở rộng IO của ESP32, ESP8266 hoặc Arduino của mình không? Và bạn đã nghĩ đến khả năng có 16 GPIO mới có thể được điều khiển bằng bus I2C chưa? Hôm nay, tôi sẽ giới thiệu với các bạn về bộ mở rộng GPIO MCP23016. Ngoài ra, tôi sẽ chỉ cho bạn cách giao tiếp một bộ vi điều khiển với MCP23016. Tôi cũng sẽ nói về việc tạo một chương trình mà chúng tôi sẽ chỉ sử dụng 2 chân của bộ vi điều khiển này để giao tiếp với bộ mở rộng. Chúng tôi sẽ sử dụng chúng để điều khiển đèn LED và nút.

Bước 1: Giới thiệu

Thiết bị MCP23016 cung cấp 16 bit để mở rộng GPIO sử dụng bus I2C. Mỗi bit có thể được cấu hình riêng lẻ (đầu vào hoặc đầu ra).

MCP23016 bao gồm nhiều cài đặt 8 bit để lựa chọn đầu vào, đầu ra và phân cực.

Bộ mở rộng cung cấp một giải pháp đơn giản khi IO cần thiết cho công tắc, cảm biến, nút và đèn LED, trong số các ví dụ khác.

Bước 2: Đặc điểm

16 chân Đầu vào / Đầu ra (16 tiêu chuẩn đầu vào)

Tần số xung nhịp bus I2C nhanh (0-400 kbits / s)

Ba chân địa chỉ phần cứng cho phép sử dụng tối đa tám thiết bị

Máy ghi chụp cổng ngắt

Thanh ghi đảo ngược cực để thiết lập cực của dữ liệu cổng đầu vào

Tương thích với hầu hết các bộ vi điều khiển

Bước 3: ESP01 có thể có 128 GPIO

ESP01 có thể có 128 GPIO!
ESP01 có thể có 128 GPIO!

Một ví dụ cho thấy tầm quan trọng của bộ mở rộng này là việc sử dụng nó với ESP01, có thể được kết nối với tối đa tám bộ mở rộng chỉ với hai IOS, đạt 128 GPIO.

Bước 4: MCP23016

MCP23016
MCP23016

Ở đây, chúng ta có giản đồ của bộ mở rộng, có hai nhóm tám bit. Điều này tạo nên tổng cộng 16 cổng. Ngoài một chân ngắt, nó có chân CLK, kết nối tụ điện và điện trở, được kết nối bên trong trong một cổng logic. Đây là để hình thành đồng hồ, sử dụng ý tưởng của một bộ dao động tinh thể, cần xung nhịp 1MHz. Chân TP dùng để đo đồng hồ. Các chân A0, A1 và A2 là địa chỉ nhị phân.

Bước 5: ĐỒNG HỒ

CÁI ĐỒNG HỒ
CÁI ĐỒNG HỒ
CÁI ĐỒNG HỒ
CÁI ĐỒNG HỒ

Do đó, MCP23016 sử dụng mạch RC bên ngoài để xác định tốc độ của Đồng hồ bên trong. Cần có xung nhịp bên trong 1 MHz (thông thường) để thiết bị hoạt động bình thường. Đồng hồ bên trong có thể được đo trên chân TP. Các giá trị được đề xuất cho REXT và CEXT được hiển thị bên dưới.

Bước 6: Địa chỉ

Để xác định địa chỉ của MCP23016, chúng tôi sử dụng các chân A0, A1 và A2. Chỉ cần để chúng ở mức CAO hoặc THẤP cho việc thay đổi địa chỉ.

Địa chỉ sẽ được hình thành như sau:

MCP_Address = 20 + (A0 A1 A2)

Trong đó A0 A1 A2 có thể nhận các giá trị CAO / THẤP, điều này tạo thành một số nhị phân từ 0 đến 7.

Ví dụ:

A0> GND, A1> GND, A2> GND (nghĩa là 000, sau đó 20 + 0 = 20)

Hoặc cái gì đó khác, A0> CAO, A1> GND, A2> CAO (nghĩa là 101, sau đó 20 + 5 = 25)

Bước 7: Lệnh

Lệnh
Lệnh

Dưới đây là một bảng với các lệnh để giao tiếp. Hãy sử dụng GP0 và GP1, cũng như IODIR0 và IODIR1.

Bước 8: Danh mục:

GP0 / GP1 - Thanh ghi cổng dữ liệu

Có hai thanh ghi cung cấp quyền truy cập vào hai cổng GPIO.

Việc đọc thanh ghi cung cấp trạng thái của các chân trên cổng đó.

Bit = 1> Bit CAO = 0> THẤP

OLAT0 / OLAT1 - Đầu ra các ĐĂNG KÝ LACTCH

Có hai thanh ghi cung cấp quyền truy cập vào các cổng đầu ra của hai cổng.

IPOL0 / IPOL1 - Thanh ghi phân cực đầu vào

Các thanh ghi này cho phép người dùng cấu hình phân cực của dữ liệu cổng đầu vào (GP0 và GP1).

IODIR0 / IODIR1

Có hai thanh ghi điều khiển chế độ pin. (Đầu vào hoặc Đầu ra)

Bit = 1> INPUT Bit = 0> OUTPUT

INTCAP0 / INTCAP1 - Thanh ghi chụp ngắt

Đây là những thanh ghi chứa giá trị của cổng đã tạo ra ngắt.

IOCON0 / IOCON1 - Thanh ghi điều khiển mở rộng I / O

Điều này kiểm soát chức năng của MCP23016.

Đặt bit 0 (IARES> Độ phân giải hoạt động ngắt) kiểm soát tần số lấy mẫu của các chân cổng GP.

Bit0 = 0> (mặc định) Thời gian phát hiện hoạt động cổng tối đa là 32ms (tiêu thụ điện năng thấp)

Bit0 = 1> thời gian phát hiện hoạt động tối đa trên cổng là 200usec (tiêu thụ điện năng cao hơn)

Bước 9: Cấu trúc giao tiếp

Cấu trúc giao tiếp
Cấu trúc giao tiếp

Tôi hiển thị ở đây lớp Wire, là giao tiếp I2C trong Arduino cốt lõi của chúng tôi, cũng cho phép trình mở rộng hoạt động với Arduino Uno và Mega. Tuy nhiên, sau này đã có một số IO. Ở đây chúng ta xử lý các địa chỉ của chip, điều khiển truy cập, là mã của các thanh ghi, cũng như dữ liệu.

Bước 10: Chương trình

Chương trình
Chương trình

Chương trình của chúng tôi bao gồm giao tiếp ESP32 với MCP23016 để có nhiều GPIO hơn để sử dụng. Sau đó, chúng ta sẽ có một nút và một số đèn LED được kết nối với MCP23016. Chúng tôi sẽ kiểm soát tất cả chúng chỉ bằng cách sử dụng bus I2C. Do đó, chỉ có hai chân ESP32 sẽ được sử dụng. Bạn có thể xem mạch hình ảnh bên dưới trong video.

Bước 11: ESP01

ESP01
ESP01

Ở đây, tôi hiển thị Sơ đồ chân của ESP01.

Bước 12: Gắn ESP01

Gắn ESP01
Gắn ESP01

Trong ví dụ này, chúng ta có GPIO0 được kết nối trong SDA và GPIO2 được kết nối trong SCL. Chúng tôi cũng có một bảng chuyển tiếp, một còi và một đèn LED. Ở cổng khác, trong GP1.0, chúng ta có thêm một đèn LED có điện trở.

Bước 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Ở đây, chúng tôi có Sơ đồ chân của NodeMCU ESP-12E.

Bước 14: Gắn NodeMCU ESP-12E

Gắn NodeMCU ESP-12E
Gắn NodeMCU ESP-12E

Trong trường hợp này, sự khác biệt duy nhất so với ví dụ đầu tiên là bạn đã kết nối D1 và D2 trong SDA và SCL tương ứng.

Bước 15: WiFi NodeMCU-32S ESP-WROOM-32

WiFi NodeMCU-32S ESP-WROOM-32
WiFi NodeMCU-32S ESP-WROOM-32

Đây là sơ đồ của WiFi NodeMCU-32S ESP-WROOM-32.

Bước 16: Gắn WiFi NodeMCU-32S ESP-WROOM-32

Node Gắn WiFi NodeMCU-32S ESP-WROOM-32
Node Gắn WiFi NodeMCU-32S ESP-WROOM-32

Lần này, sự khác biệt chính so với hai ví dụ còn lại là nút và ba đèn LED nhấp nháy. Ở đây, SDA được kết nối với GPIO19, trong khi SCL được kết nối với GPIO23.

Bước 17: Thư viện và biến

Đầu tiên, chúng tôi sẽ bao gồm Wire.h, chịu trách nhiệm giao tiếp i2c, cũng như đặt địa chỉ i2c của MCP23016. Tôi hiển thị một số lệnh, thậm chí một số lệnh mà chúng tôi không sử dụng trong dự án này.

#include // chỉ định sử dụng thư viện Wire.h. // endereço I2C do MCP23016 #define MCPAddress 0x20 // COMMAND BYTE ĐỂ ĐĂNG KÝ MỐI QUAN HỆ: Bảng: 1-3 của Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // CỔNG DỮ LIỆU ĐĂNG KÝ 0 #define GP1 0 ĐĂNG KÝ CỔNG 1 #define OLAT0 0x02 // ĐĂNG KÝ XẾP HẠNG NGUỒN 0 #define OLAT1 0x03 // ĐĂNG KÝ XẾP HẠNG 1 #define IPOL0 0x04 // ĐĂNG KÝ CỔNG CHÍNH SÁCH ĐẦU VÀO 0 #define IPOL1 0x05 // ĐĂNG KÝ CHÍNH SÁCH 1/0 0x05 // ĐĂNG KÝ CHÍNH SÁCH 1/0 / ĐĂNG KÝ HƯỚNG I / O 0 #define IODIR1 0x07 // ĐĂNG KÝ HƯỚNG I / O 1 #define INTCAP0 0x08 // ĐĂNG KÝ CAPTURE INTERRUPT 0 #define INTCAP1 0x09 // ĐĂNG KÝ GIAO THỨC TÍCH HỢP 1 #define IOCON0 0x0A // I / O ĐĂNG KÝ 0 #define IOCON1 0x0B // ĐĂNG KÝ ĐIỀU KHIỂN MỞ RỘNG I / O 1

Bước 18: Thiết lập

Ở đây chúng ta có các chức năng để khởi tạo bốn loại vi điều khiển khác nhau. Chúng tôi cũng kiểm tra tần số, thiết lập GPIO và thiết lập các chân. Trong Vòng lặp, chúng tôi kiểm tra trạng thái của nút.

void setup () {Serial.begin (9600); chậm trễ (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // gật gù ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // thường xuyên // configura o GPIO0 como OUTPUT (todos os pinos) configPort (IODIR0, OUTPUT); // configura o GPIO1 como INPUT o GP1.0 e como OUTPUT os outros GP1 configPort (IODIR1, 0x01); // seta todos os pinos do GPIO0 como THẤP writeBlockData (GP0, B00000000); // seta todos os pinos do GPIO1 como THẤP writeBlockData (GP1, B00000000); } void loop () {// verifyfica e o botão GP foi pressionado checkButton (GP1); } // kết thúc vòng lặp

Bước 19: Định cấu hình

Trong bước này, chúng tôi cấu hình chế độ của các chân GPIO và xác định chế độ của các cổng.

// configura o GPIO (GP0 ou GP1) // como parametro passamos: // port: GP0 ou GP1 // custom: INPUT para todos as portas do GP trabalharem como entrada // OUTPUT para todos as portas do GP trabalharem como saida / / tùy chỉnh um valor de 0-255 indicando o modo das portas (1 = INPUT, 0 = OUTPUT) // ví dụ: 0x01 ou B00000001 ou 1: indica que apenas o GPX.0 trabalhará como entrada, o restando como saida void configurePort (uint8_t port, uint8_t custom) {if (custom == INPUT) {writeBlockData (port, 0xFF); } else if (custom == OUTPUT) {writeBlockData (port, 0x00); } else {writeBlockData (port, custom); }}

Bước 20: WriteBlockData & CheckButton

Ở đây, chúng tôi gửi dữ liệu đến MCP23016 thông qua bus i2c, kiểm tra trạng thái của nút và chỉ ra bước tiếp theo trong khi tính đến điều kiện có được nhấn hay không.

// envia dados para o MCP23016 através do barramento i2c // cmd: COMANDO (registerrador) // data: dados (0-255) void writeBlockData (uint8_t cmd, uint8_t data) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (dữ liệu); Wire.endTransmission (); chậm trễ (10); }

// verifyfica se o botão foi pressionado // parametro GP: GP0 ou GP1 void checkButton (uint8_t GP) {// faz a leitura do pino 0 no GP fornecido uint8_t btn = readPin (0, GP); // se botão pressionado, seta para HIGH as portas GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado THẤP else {writeBlockData (GP0, B00000000); }}

Bước 21: ReadPin & ValueFromPin

Ở đây chúng ta xử lý việc đọc một chân cụ thể và giá trị bit trở về vị trí mong muốn.

// faz a leitura de um pino específico // pin: pino desejado (0-7) // gp: GP0 ou GP1 // retorno: 0 ou 1 uint8_t readPin (uint8_t pin, uint8_t gp) {uint8_t statusGP = 0; Wire.beginTransmission (MCPAddress); Wire.write (gp); Wire.endTransmission (); Wire.requestFrom (MCPAddress, 1); // ler do chip 1 byte statusGP = Wire.read (); trả về giá trịFromPin (pin, trạng tháiGP); } // retorna o valor do bit na posição desejada // pin: posição do bit (0-7) // statusGP: valor lido do GP (0-255) uint8_t valueFromPin (uint8_t pin, uint8_t statusGP) {return (statusGP & (0x0001 << pin)) == 0? 0: 1; }

Bước 22: Chương trình ESP8266

Từ đây, chúng ta sẽ thấy chương trình chúng ta đã sử dụng trong ESP-01 và trong nodeMCU ESP-12E được tạo ra như thế nào, cho phép chúng ta hiểu sự khác biệt giữa chúng là tối thiểu như thế nào.

Chúng tôi sẽ chỉ sửa đổi dòng của phương thức khởi tạo giao tiếp i2c, là phương thức bắt đầu của đối tượng Wire.

Chỉ cần bỏ ghi chú dòng theo bảng mà chúng ta sẽ biên dịch.

// Wire.begin (D2, D1); // gật gù ESP8266 // Wire.begin (0, 2); // ESP-01

Cài đặt

Lưu ý rằng trình xây dựng vẫn được nhận xét. Do đó, hãy bỏ ghi chú theo bảng của bạn (ESP-01 hoặc nodeMCU ESP12-E).

void setup () {Serial.begin (9600); chậm trễ (1000); // Wire.begin (D2, D1); // gật gù ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // thường xuyên // configura o GPIO0 como OUTPUT (todos os pinos) configPort (IODIR0, OUTPUT); // configura o GPIO1 como OUTPUT (todos os pinos) configPort (IODIR1, OUTPUT); // seta todos os pinos do GPIO0 como THẤP writeBlockData (GP0, B00000000); // seta todos os pinos do GPIO1 como THẤP writeBlockData (GP1, B00000001); }

Vòng

Trong vòng lặp, chúng tôi chuyển đổi các chân sau mỗi 1 giây. Do đó, khi chân của GP0 được bật, các chân của GP1 sẽ tắt. Khi chân0 của GP1 được bật, các chân GP0 sẽ tắt.

void loop () {// seta o pino 7 do GP0 como CAO e os demais como THẤP writeBlockData (GP0, B10000000); // seta todos os pinos do GPIO1 como THẤP writeBlockData (GP1, B00000000); chậm trễ (1000); // seta todos os pinos do GPIO0 como THẤP writeBlockData (GP0, B00000000); // seta o pino 0 do GP1 como CAO e os demais como THẤP writeBlockData (GP1, B00000001); chậm trễ (1000); } // kết thúc vòng lặp

Bước 23: QUAN TRỌNG

Các biến và thư viện được sử dụng giống như các biến và thư viện của chương trình chúng tôi đã làm cho ESP32, cũng như các phương thức configPort và writeBlockData.

Bước 24: Tập tin

Tải xuống các tệp:

PDF

INO (ESP8266)

INO (ESP32)

Đề xuất: