Nội Dung Bài Viết
Tổng quan
Trong nhiều trường hợp, chúng ta giao tiếp ESP8266 với Arduino thông qua lệnh AT. Nhưng có một số trường hợp yêu cầu giao tiếp cả hai thiết bị và gửi và / hoặc nhận số lượng lớn thanh ghi. Mặc dù có các giao thức như I2c, và SPI với Libraries đã được cài đặt trong Arduino. Chúng ta sẽ sử dụng giao thức Modbus RTU cho các thiết bị giám sát và kiểm soát vì nó dễ thực hiện, an toàn, nhanh chóng và dễ kiểm tra các lỗi.
Đối với thử nghiệm này, chúng tôi dùng Arduino MEGA 2560 R3 và Module ESP8266 12E giao tiếp qua modbus RTU được kết nối thông qua 3-wire, điện áp TTL từ 0 đến 5v .
Cấu hình Arduino
Arduino mega 2560 được cấu hình như một modbus master, sử dụng cổng Serial thứ hai (Serial1) của bo Arduiono.
Cấu hình ESP8266
Esp8266 được cấu hình như một modbus slave. Modbus hoạt động thông qua một cổng Serial ảo được tạo ra với thư viện SoftwareSerial.
Kiểm tra
Bài kiểm tra rất đơn giản, chúng ta sử dụng 2 thanh ghi để xác minh việc đọc và viết của cả hai thiết bị.
Arduino Master & ESP8266 Slave Modbus RTU (TTL 0-5 v)
Arduino IDE Code – Arduino
Arduino có một nút nhấn kết nối giữa pin 7 và GND được cấu hình đầu vào pullup, Arduino đọc trạng thái của pin 7 và dán giá trị vào Holding Register [4] .
Thực hiện đọc liên tục Holding Register [5] và in giá trị trong Serial terminal.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | * * Modified by Trialcommand * More Tutorials: * Website http://trialcommand.com * In English: http://en.trialcommand.com */ #include <ModbusMaster232.h> ///#include <SoftwareSerial.h> // Modbus RTU pins D7(13),D8(15) RX,TX // Instantiate ModbusMaster object as slave ID 1 ModbusMaster232 node(1); void setup() { pinMode(7, INPUT_PULLUP); Serial.begin(9600); delay(100); node.begin(9600); // Modbus RTU delay(100); Serial.println("Connected "); Serial.println("Modbus RTU Master Online"); } void loop() { Serial.print("- Arduino Mega 2560 (Master Modbus RTU) -"); node.writeSingleRegister(4,digitalRead(7)); Serial.print("[4] "); Serial.print(digitalRead(7)); delay(20); Serial.print(" "); node.readHoldingRegisters(5, 1); Serial.print("[5] "); Serial.println(node.getResponseBuffer(0)); delay(20); node.clearResponseBuffer(); } |
Bài viết các bạn có thể tham khảo:
- Tổng hợp một số sách ebook Arduino hay (English)
- Arduino Development Cookbook by Cornel Amariei
- Ebook 20 dự án Arduino không thể tin (Unbelievable)
Arduino IDE Code – ESP8266
ESP8266 sẽ đọc Holding Register [4] và kích hoạt pin 14 (D5) như là một đầu ra bật tắt led.
Dán vào Holding Register [5] một số nguyên với giá trị ngẫu nhiên từ 1 đến 9999.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | /* Trialcommand * More Tutorials: * Website http://trialcommand.com * In English: http://en.trialcommand.com * En Español: http://en.trialcommand.com */ #include <modbus.h> #include <modbusDevice.h> #include <modbusRegBank.h> #include <modbusSlave.h> #include // Modbus RTU pins D7(13),D8(15) RX,TX //SoftwareSerial swSer(13, 15, false, 256); modbusDevice regBank; modbusSlave slave; void setup() { pinMode(14, OUTPUT); //Assign the modbus device ID. regBank.setId(1); // Holding registers regBank.add(40005); regBank.add(40006); slave._device = ®Bank; Serial.begin(9600); delay(100); // Initialize the serial port for coms at 9600 baud slave.setBaud(9600); delay(100); Serial.println("Connected "); Serial.println("Modbus RTU Slave Online"); } void loop() { Serial.print("- ESP8266 12E (Slave Modbus RTU) -"); Serial.print(" [5] "); Serial.print(regBank.get(40005)); int value= regBank.get(40005); digitalWrite(14,value ); delay(20); Serial.print(" "); int value1 = random(1, 9999); Serial.print(" [6] "); Serial.println(value1); regBank.set(40006,value1); delay(20); slave.run(); } |
Kết nối
Giao tiếp TTL (0-5v), serial1 của arduino mega 2560 pins (Tx1 -18) (Rx1 – 19) được kết nối với Serial ESP8266 được tạo ra từ softwareserial D7 (13) TX, D8 (15) RX.
ESP8266 12E NodeMCU
Arduino MEGA 2560 R3
Chúng tôi đề nghị dùng tốc độ 9600 baud cho hiệu suất tốt, vì SoftwareSeriel không phải là UART chính của ESP8266, ở tốc độ cao có thể có lỗi bit.
Kết luận
- Đây là một giải pháp tuyệt để giao tiếp với HMI, PLC, Meter, PAC, SCADA và / hoặc các bộ điều khiển công nghiệp khác dễ dàng.
- Một lợi ích lớn là modbus là cơ sở truyền một số lượng lớn thanh ghi, cần lưu ý rằng nó cho phép 16-bit integer registers
Donwloads Libraries
- Arduino Master Modbus RTU Library
- ESP8266 Slave Modbus RTU Library
- SoftwareSerial for ESP8266 Library
- Phần mềm RealTerm
Bài viết tham khảo từ trang web: en.trialcommand.com