// ******************** Arduino Mã cho xe RC ********************** **********
#include// Thư viện này là cần thiết để giao tiếp I2C (lá chắn động cơ sử dụng này)
#include// Thư viện cho động cơ adafruit khiên
#include "tiện ích / Adafruit_MS_PWMServoDriver.h" // cần thiết cho lá chắn động cơ, tập tin được tìm thấy trong thư mục thư viện của Adafruit_MotorShield.h
#include// Gọi thư viện SPI để bạn có thể giao tiếp với nRF24L01 +
#include// nRF2401 libarary tìm thấy tại https://github.com/tmrh20/RF24/
#include// nRF2401 libarary tìm thấy tại https://github.com/tmrh20/RF24/ // Tạo đối tượng lá chắn động cơ với các địa chỉ I2C mặc định Adafruit_MotorShield AFMS = Adafruit_MotorShield (); // tạo một đối tượng cho mỗi động cơ và gán nó vào một cổng trên lá chắn Adafruit_DCMotor * M1 = AFMS.getMotor (1); Adafruit_DCMotor * M2 = AFMS.getMotor (2); Adafruit_DCMotor * M3 = AFMS.getMotor (3); Adafruit_DCMotor * M4 = AFMS.getMotor (4); const int pinCE = 9; // Pin này được sử dụng để thiết lập các nRF24 về chế độ chờ (0) hoặc chế độ hoạt động (1) const int pinCSN = 10; // Pin này được sử dụng để báo cho nRF24 liệu truyền thông SPI là một lệnh hoặc nhắn // Bộ điều khiển sẽ gửi một "gói" để kiểm soát tốc độ và hướng của xe. Các byte đầu tiên và cuối cùng chỉ là khởi đầu và kết thúc của gói // Các byte thứ hai và thứ ba đại diện cho tốc độ và hướng của xe. Các byte thứ hai là cho về phía trước và ngược // byte thứ ba là cho đúng và hướng trái byte bArray [] = {255, 125, 125, 254}; // Mảng này giữ tốc độ và hướng gói RF24 wirelessSPI (pinCE, pinCSN); // Khai báo đối tượng từ thư viện nRF24 (Tạo SPI không dây của bạn) const uint64_t pAddress = 0xB00B1E5000LL; // Tạo một địa chỉ đường ống cho 2 nút để giao tiếp trên, địa chỉ của tôi rõ vụng :-) int sCount = 0; // biến để theo dõi đếm thời gian để dừng động cơ, nếu giao tiếp bị mất này sẽ tắt động cơ khoảng trống setup () { AFMS.begin (); // Bắt đối tượng lá chắn động cơ, tạo ra với tần số mặc định 1.6KHz wirelessSPI.begin (); // Bắt đầu module nRF24 wirelessSPI.setAutoAck (1); // Bảo đảm autoACK được kích hoạt, điều này có nghĩa là gửi rec thừa nhận gói tin để nói xmit rằng nó đã nhận được gói tin không có vấn đề wirelessSPI.enableAckPayload (); // Cho phép tải trọng tùy chọn hoặc tin nhắn trên gói ack, mặc dù chúng ta không sử dụng này wirelessSPI.setRetries (5,10); // Định nghĩa hành vi thử lại gói: arg đầu tiên là sự chậm trễ giữa các lần thử lại ở 250us x 5 và tối đa không. các thử lại wirelessSPI.openReadingPipe (1, pAddress); // mở ống o cho recieving meassages với địa chỉ ống wirelessSPI.startListening (); // Bắt đầu nghe thông điệp, bởi vì chúng tôi là người nhận motorStop (); // đảm bảo động cơ khi dừng để bắt đầu } trống loop () { if (wirelessSPI.available ()) {// kiểm tra xem nếu một gói dữ liệu có sẵn từ máy phát wirelessSPI.read (bArray, 4); // đọc 4 byte dữ liệu và lưu trữ nó trong mảng nếu (verifyPacket) {// xác minh nó là một gói tin hợp lệ để điều khiển xe setMotorSpeed (bArray [1], bArray [2]); // có được về phía trước / sau và bên phải / trái tốc độ sCount = 0; // reset count } else { // làm một cái gì đó ở đây, nếu một gói tin xấu đã được nhận được } } chậm trễ (1); // chậm trễ ngắn trước khi đi vòng lại sCount ++; // tăng số lần lặp if (sCount> 60) {motorStop (); } // Nếu chúng tôi không nhận được một gói tin từ bộ điều khiển } // hàm này đảm bảo một gói tin là hợp lệ bằng cách kiểm tra nó có bắt đầu và kết thúc đúng byte // nó cũng kiểm tra xem nếu phía trước / sau và bên phải / trái tốc độ có giá trị bool verifyPacket () { if (bArray [0] == 255 & bArray [3] == 254 & bArray [1] <251 & bArray [2] <251) return true; khác return false; } // chức năng này được sử dụng để thiết lập các hướng và tốc độ dựa trên hai byte từ bộ điều khiển // 125 phương tiện dừng lại, trên 125 nghĩa là đúng hay chuyển tiếp, dưới 125 phương tiện trái hoặc ngược trống setMotorSpeed (int upDown, int leftRight) { int lR = 0; // trái và phải biến hướng, không là dừng int BF = 0; // về phía trước và biến hướng lạc hậu, không có dừng lại nếu (leftRight == 125) {// nếu đúng sự thật không rẽ trái hoặc phải (stop) lR = 0; } else if (leftRight> 125) {// nếu điều này là đúng sự thật đúng biến lR = 1; leftRight = leftRight - 125; // quy mô biến 0-125 } else {// khác này là một trái lR = 2; } if (upDown == 125) {// nếu sự thật không có phía trước hoặc quay trở lại (stop) BF = 0; } else if ( upDown> 125) {// nếu điều này là đúng đi về phía trước BF = 1; upDown = upDown - 125; // quy mô biến 0-125 } else {// này là đi ngược BF = 2; } // Chúng tôi đã hướng bây giờ thiết lập tốc độ // quy mô lần lượt, và trở lại / về phía trước nếu (lR == 0 && BF == 0) {// dừng tất cả các động cơ nếu không phía trước / sau và bên phải / trái hướng motorStop (); } else if (BF == 1) {// Tới phía trước nếu (lR == 0) {// đi thẳng về phía trước goForward (scaleSpeed (lên xuống)); // Gửi về phía trước
đang được dịch, vui lòng đợi..