Arduino mã cho các RC xe ***#include Thư viện này là cần thiết để giao tiếp I2C (motor shield sử dụng này)#include Thư viện cho lá chắn motor adafruit#include "utility/Adafruit_MS_PWMServoDriver.h" //needed cho motor shield, 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, vì vậy 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 vận động lá chắn với mặc định I2C địa chỉ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 nRF24 để chế độ chờ (0) hoặc chế độ hoạt động (1)const int pinCSN = 10; Pin này được sử dụng để nói với nRF24 liệu giao tiếp SPI là một lệnh hoặc tin nhắn Bộ điều khiển sẽ gửi một gói tin"" để kiểm soát tốc độ và hướng của xe. Các byte đầu tiên và cuối cùng chỉ báo hiệu sự bắt đầu và kết thúc của các góiCá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à về phía trước và ngượcCác byte thứ ba là đường bên phải và tráibyte bArray [] = {255, 125, 125, 254}; Mảng này giữ gói dữ liệu tốc độ và hướngRF24 wirelessSPI (pinCE, pinCSN); Khai báo các đố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 ra một đường ống địa chỉ cho các nút 2 để giao tiếp trên, địa chỉ của tôi spells boobies :-)int sCount = 0; Tây-Tây Nam và để theo dõi các bộ đếm thời gian để dừng động cơ, nếu thông tin bị mất này sẽ tắt động cơvoid setup() {} AFMS.begin(); Bắt đầu vận động lá chắn đối tượng, tạo ra với tần số mặc định 1.6KHz wirelessSPI.begin(); Bắt đầu các mô-đun nRF24 wirelessSPI.setAutoAck(1); Đảm bảo autoACK được kích hoạt, điều này có nghĩa là thừa nhận rec gửi gói tin nói với xmit rằng nó đã gói không có vấn đề wirelessSPI.enableAckPayload(); Cho phép tùy chọn tải trọng hoặc thư về gói dữ liệu ack, mặc dù chúng tôi không sử dụng điều này wirelessSPI.setRetries(5,10); Xác định gói thử lại hành vi: arg đầu tiên là sự chậm trễ giữa retries tại 250us x 5 và tối đa không. của retries wirelessSPI.openReadingPipe(1,pAddress); mở ống o cho nhận được meassages bằng ống địa chỉ wirelessSPI.startListening(); Bắt đầu nghe cho tin nhắn, bởi vì chúng tôi là reciever motorStop(); đảm bảo cơ là lúc dừng lại để bắt đầu}void loop() {} if(wirelessSPI.Available()) {//check để 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 if(verifyPacket) {//verify nó là một gói dữ liệu hợp lệ để kiểm soát xe hơi setMotorSpeed (bArray [1], bArray[2]); có được tốc độ chuyển tiếp / lạc hậu và bên phải / trái sCount = 0; thiết lập lại tính } khác {} làm một cái gì đó ở đây nếu nhận được một gói tin xấu } } Delay(1); sự chậm trễ ngắn trước việc lặp lại sCount ++; tăng tính vòng lặp if(sCount > 60) {motorStop();} //if chúng tôi không nhận được một gói dữ liệu từ bộ điều khiển}Chức năng này đảm bảo một gói là hợp lệ bằng cách kiểm tra này có chính xác bắt đầu và kết thúc bytenó cũng kiểm tra xem tốc độ chuyển tiếp / lạc hậu và bên phải / trái có hợp lệbool verifyPacket() {} Nếu (bArray [0] == 255 & bArray [3] == 254 & bArray [1] < 251 & bArray [2] < 251) return true; khác trả về false;}Chức năng này được sử dụng để thiết lập hướng và tốc độ dựa trên hai byte từ bộ điều khiển125 có nghĩa là dừng lại, ở trên có nghĩa là 125 ngay hoặc về phía trước, bên dưới bên trái có nghĩa là 125 hoặc ngược{} void setMotorSpeed (int upDown, trái/phải int) int lR = 0; trái và bên phải hướng biến, zero là dừng lại int bF = 0; hướng về phía trước và lạc hậu biến, zero là dừng lại if(leftRight == 125) {//if thật sự không có rẽ trái hoặc phải (ngừng) lR = 0; } Nếu khác (trái/phải > 125) {//if điều này là thực sự rẽ phải lR = 1; trái/phải = trái/phải - 125; thay đổi quy mô từ 0 đến 125 } khác {//else đây là một trái lR = 2; } if(upDown == 125) {//if đúng không chuyển tiếp hoặc quay trở lại (stop) bF = 0; } khác nếu (upDown > 125) {//if điều này là đúng đi tiếp bF = 1; upDown = upDown - 125; thay đổi quy mô từ 0 đến 125 } khác {//this là đi ngược trở lại bF = 2; } Chúng tôi đã hướng bây giờ thiết lập tốc độ quy mô biến và trở lại / chuyển tiếp Nếu (lR == 0 & & bF == 0) {//stop tất cả động cơ nếu không có hướng chuyển tiếp / lạc hậu và bên phải / trái motorStop(); } Nếu khác (bF == 1) {//Go tiếp if(LR == 0) {//go thẳng về phía trước goForward(scaleSpeed(upDown)); Gửi chuyển tiếp
đang được dịch, vui lòng đợi..
