Mục lục:
- Bước 1: Giới thiệu
- Bước 2: Đặc điểm
- Bước 3: ESP01 có thể có 128 GPIO
- Bước 4: MCP23016
- Bước 5: ĐỒNG HỒ
- Bước 6: Địa chỉ
- Bước 7: Lệnh
- Bước 8: Danh mục:
- Bước 9: Cấu trúc giao tiếp
- Bước 10: Chương trình
- Bước 11: ESP01
- Bước 12: Gắn ESP01
- Bước 13: NodeMCU ESP-12E
- Bước 14: Gắn NodeMCU ESP-12E
- Bước 15: WiFi NodeMCU-32S ESP-WROOM-32
- Bước 16: Gắn WiFi NodeMCU-32S ESP-WROOM-32
- Bước 17: Thư viện và biến
- Bước 18: Thiết lập
- Bước 19: Định cấu hình
- Bước 20: WriteBlockData & CheckButton
- Bước 21: ReadPin & ValueFromPin
- Bước 22: Chương trình ESP8266
- Bước 23: QUAN TRỌNG
- Bước 24: Tập tin
Video: IO Expander cho ESP32, ESP8266 và Arduino: 24 bước
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:35
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
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
Ở đâ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Ồ
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
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
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 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
Ở đây, tôi hiển thị Sơ đồ chân của ESP01.
Bước 12: 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
Ở đây, chúng tôi có Sơ đồ chân của NodeMCU ESP-12E.
Bước 14: 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
Đây là sơ đồ của WiFi NodeMCU-32S ESP-WROOM-32.
Bước 16: 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:
INO (ESP8266)
INO (ESP32)
Đề xuất:
Một bản hack bàn di chuột tuyệt vời cho máy tính xách tay cho các dự án Arduino !: 18 bước (có hình ảnh)
Một bản hack bàn di chuột tuyệt vời dành cho máy tính xách tay dành cho các dự án Arduino!: Một thời gian trước, khi tôi đang mày mò với bàn di chuột PS / 2 với vi điều khiển Arduino, tôi phát hiện ra rằng hai trong số các kết nối tích hợp của nó có thể được sử dụng làm đầu vào kỹ thuật số. Trong Có thể hướng dẫn này, chúng ta hãy tìm hiểu cách chúng ta có thể sử dụng tiện ích của bàn di chuột PS / 2
Cảm biến nhiệt độ cho Arduino Được áp dụng cho COVID 19: 12 Bước (có Hình ảnh)
Cảm biến nhiệt độ cho Arduino Áp dụng cho COVID 19: Cảm biến nhiệt độ cho Arduino là yếu tố cơ bản khi chúng ta muốn đo nhiệt độ của bộ xử lý của cơ thể con người. Cảm biến nhiệt độ với Arduino phải tiếp xúc hoặc gần để nhận và đo mức nhiệt. Đó là cách t
Xây dựng Quản gia / Xe / Xe tăng cho Robot ESP8266 được điều khiển từ xa trị giá $ 15 cho Ios và Android: 4 bước
Xây dựng một Quản gia / Xe / Xe tăng cho Robot ESP8266 được điều khiển từ xa trị giá $ 15 cho Ios và Android: Bạn có ghét đi vào bếp để vẽ một món ăn nhẹ không? Hoặc để có được một thức uống mới? Tất cả điều này có thể được khắc phục với người quản gia điều khiển từ xa trị giá 15 đô la đơn giản này
Sử dụng 1 đầu vào tương tự cho 6 nút cho Arduino: 6 bước
Sử dụng 1 Đầu vào Analog cho 6 Nút cho Arduino: Tôi thường tự hỏi làm cách nào để có thêm Đầu vào Kỹ thuật số cho Arduino của mình. Gần đây tôi nghĩ rằng tôi có thể sử dụng một trong các Đầu vào Analog để mang lại nhiều đầu vào kỹ thuật số. Tôi đã tìm kiếm nhanh và tìm thấy nơi mọi người đang
Mod 3.3V cho cảm biến siêu âm (chuẩn bị HC-SR04 cho 3.3V Logic trên ESP32 / ESP8266, Photon hạt, v.v.): 4 bước
3.3V Mod cho cảm biến siêu âm (chuẩn bị HC-SR04 cho 3.3V Logic trên ESP32 / ESP8266, Particle Photon, v.v.): TL; DR: Trên cảm biến, cắt dấu vết vào chân Echo, sau đó kết nối lại bằng cách sử dụng bộ chia điện áp (Echo trace - > 2.7kΩ - > Echo pin - > 4.7kΩ - > GND). Chỉnh sửa: Đã có một số tranh luận về việc liệu ESP8266 có thực sự chịu được 5V trên GPIO trong