#define TRIG_PIN A4 / / Pin A4 trên lá chắn Motor Drive hàn với bộ cảm biến siêu âm#define ECHO_PIN A5 / / Pin A5 trên lá chắn Motor Drive hàn với bộ cảm biến siêu âm#define MAX_DISTANCE 200 / / bộ tối đa cảm biến sử dụng được đo khoảng cách đến 200cm#define MAX_SPEED 180 / / thiết lập tốc độ của DC lực kéo cơ 180/256 hoặc khoảng 70% của tốc độ cao - để có được quyền lực cống.#define MAX_SPEED_OFFSET 10 / / điều này bộ bù đắp cho phép cho sự khác biệt giữa hai DC lực kéo cơ#define COLL_DIST 10 / / thiết lập khoảng cách lúc đó điểm dừng robot và đảo ngược để 10cm#define TURN_DIST COLL_DIST + 10 / / bộ khoảng cách lúc đó robot veers ra khỏi đối tượng (không đảo ngược) đến 20 cm (10 + 10)NewPing sóng siêu âm (TRIG_PIN, ECHO_PIN, MAX_DISTANCE); thiết lập thư viện cảm biến để sử dụng các chân chính xác để đo khoảng cách.AF_DCMotor motor1 (1, MOTOR12_1KHZ); tạo động cơ #1 sử dụng M1 đầu ra trên lá chắn Motor Drive, thiết lập để 1kHz PWM tần sốAF_DCMotor motor2 (4, MOTOR12_1KHZ); tạo động cơ #2, bằng cách sử dụng sản lượng M2, thiết lập để 1kHz PWM tần sốServo myservo; tạo đối tượng servo để điều khiển một servo int pos = 0; Điều này thiết lập biến để sử dụng trong bài học (mã) int maxDist = 0; int maxAngle = 0; int maxRight = 0; int maxLeft = 0; int maxFront = 0;khóa học int = 0;int curDist = 0;Chuỗi motorSet = "";int speedSet = 0;//-------------------------------------------- SETUP LOOP ----------------------------------------------------------------------------khoảng trống setup() {} myservo.attach(9); gắn các servo trên pin 9 (SERVO_2 trên lá chắn Motor Drive để đối tượng servo myservo.write(90); nói với các servo để vị trí ở 90-độ tức là. hướng về phía trước. Delay(2000); sự chậm trễ trong hai giây checkPath(); chạy thường xuyên CheckPath để tìm con đường tốt nhất để bắt đầu đi du lịch motorSet = "Chuyển tiếp"; thiết lập giám đốc chỉ số biến để chuyển tiếp myservo.write(90); đảm bảo rằng servo vẫn hướng về phía trước moveForward(); chạy các chức năng để làm cho robot di chuyển về phía trước}//------------------------------------------------------------------------------------------------------------------------------------//---------------------------------------------MAIN LOOP ------------------------------------------------------------------------------khoảng trống loop() {} checkForward(); kiểm tra xem nếu robot là nghĩa vụ phải di chuyển về phía trước, các động cơ ổ đĩa được thiết lập để di chuyển về phía trước - điều này cần thiết để khắc phục một số vấn đề với chỉ sử dụng pin AA NiMH 4 checkPath(); thiết lập các cảm biến siêu âm để quét cho bất cứ trở ngại có thể}//-------------------------------------------------------------------------------------------------------------------------------------khoảng trống checkPath() {} int curLeft = 0; int curFront = 0; int curRight = 0; int curDist = 0; myservo.write(144); thiết lập servo phải đối mặt với 54-độ trái từ chuyển tiếp Delay(120); chờ đợi 120milliseconds cho servo để đạt được vị trí cho (pos = 144; pos > = 36; pos-= 18) / / vòng lặp để quét các servo (& cảm biến) từ 144-độ trái đến 36-độ phải lúc khoảng 18-độ. { myservo.write(POS); cho biết điện để đi đến vị trí biến 'pos' Delay(90); chờ đợi 90ms cho servo để có được vị trí checkForward(); kiểm tra các robot là vẫn di chuyển về phía trước curDist = readPing(); nhận được khoảng cách hiện tại đến bất kỳ đối tượng ở phía trước của cảm biến Nếu (curDist < COLL_DIST) {/ / nếu khoảng cách hiện tại đến đối tượng là ít hơn khoảng cách va chạm checkCourse(); chạy các chức năng checkCourse phá vỡ; nhảy ra khỏi vòng lặp này } Nếu (curDist < TURN_DIST) {/ / nếu khoảng cách hiện tại là ít hơn khoảng cách lần lượt changePath(); chạy các chức năng changePath } Nếu (curDist > curDist) {maxAngle = pos;} Nếu (pos > 90 & & curDist > curLeft) {curLeft = curDist;} Nếu (pos == 90 & & curDist > curFront) {curFront = curDist;} Nếu (pos < 90 & & curDist > curRight) {curRight = curDist;} } maxLeft = curLeft; maxRight = curRight; maxFront = curFront;}//-------------------------------------------------------------------------------------------------------------------------------------làm mất hiệu lực setCourse() {/ / thiết lập hướng cho du lịch dựa trên một khoảng cách rất cơ bản đồ, chỉ đơn giản là hướng có các khoảng cách lớn nhất để và đối tượng - chuyển ngay hay trái? Nếu (maxAngle < 90) {turnRight();} Nếu (maxAngle > 90) {turnLeft();} maxLeft = 0; maxRight = 0; maxFront = 0;}//-------------------------------------------------------------------------------------------------------------------------------------làm mất hiệu lực checkCourse() {/ / chúng tôi về để nhấn một cái gì đó rất di chuyển ngược trở lại, dừng lại, tìm thấy đường dẫn có sản phẩm nào ở đâu. moveBackward(); Delay(500); moveStop(); setCourse();}//-------------------------------------------------------------------------------------------------------------------------------------khoảng trống changePath() {} Nếu (pos < 90) {veerLeft();} / / nếu hiện tại pos của cảm biến là ít hơn 90 độ, nó có nghĩa là đối tượng là bên tay phải để veer trái Nếu (pos > 90) {veerRight();} / / nếu hiện tại pos của cảm biến lớn hơn 90 độ, nó có nghĩa là đối tượng là tay trái bên vì vậy veer ngay}//-------------------------------------------------------------------------------------------------------------------------------------int readPing() {/ / xem khoảng cách cảm biến siêu âm Delay(70); unsigned int chúng tôi = sonar.ping(); int cm = chúng tôi / US_ROUNDTRIP_CM; trở về cm;}//-------------------------------------------------------------------------------------------------------------------------------------làm mất hiệu lực checkForward() {nếu (motorSet == "Chuyển tiếp") {motor1.run(FORWARD); motor2.run(FORWARD);}} / / đảm bảo rằng động cơ đang đi về phía trước//-------------------------------------------------------------------------------------------------------------------------------------làm mất hiệu lực checkBackward() {nếu (motorSet == "BACKWARD") {motor1.run(BACKWARD); motor2.run(BACKWARD);}} / / đảm bảo rằng động cơ sẽ quay trở lại//-------------------------------------------------------------------------------------------------------------------------------------Trong một số trường hợp, lá chắn Motor Drive có thể chỉ dừng lại nếu cung cấp điện áp quá thấp (do sử dụng chỉ có bốn tế bào NiMH AA).Các chức năng trên chỉ đơn giản là nhắc nhở lá chắn nếu nó là nghĩa vụ phải đi về phía trước, sau đó hãy chắc chắn rằng nó đi về phía trước và ngược lại.//-------------------------------------------------------------------------------------------------------------------------------------làm mất hiệu lực moveStop() {motor1.run(RELEASE); motor2.run(RELEASE);} / / ngăn chặn các động cơ.//-------------------------------------------------------------------------------------------------------------------------------------khoảng trống moveForward() {} motorSet = "Chuyển tiếp"; motor1.Run(Forward); bật nó đi về phía trước motor2.Run(Forward); bật nó đi về phía trước cho (speedSet = 0; speedSet < MAX_SPEED; speedSet = 2) / / chậm mang lại tốc độ để tránh tải xuống pin quá nhanh { motor1.setSpeed(speedSet+MAX_SPEED_OFFSET); motor2.setSpeed(speedSet); Delay(5); }}//-------------------------------------------------------------------------------------------------------------------------------------khoảng trống moveBackward() {} motorSet = "BACKWARD"; motor1.Run(BACKWARD); bật nó đi về phía trước motor2.Run(BACKWARD); bật nó đi về phía trước cho (speedSet = 0; speedSet < MAX_SPEED; speedSet = 2) / / chậm mang lại tốc độ để tránh tải xuống pin quá nhanh { motor1.setSpeed(speedSet+MAX_SPEED_OFFSET); motor2.setSpeed(speedSet); Delay(5); }} //-------------------------------------------------------------------------------------------------------------------------------------khoảng trống turnRight() {} motorSet = "Quyền"; motor1.Run(Forward); chuyển về phía trước 1 động cơ motor2.Run(BACKWARD); biến động cơ 2 lạc hậu Delay(400); động cơ chạy bằng cách này để 400ms motorSet = "Chuyển tiếp"; motor1.Run(Forward); Đặt cả hai động cơ trở lại để chuyển tiếp motor2.Run(Forward); } //-------------------------------------------------------------------------------------------------------------------------------------khoảng trống turnLeft() {} motorSet = "Trái"; motor1.Run(BACKWARD); biến 1 động cơ lạc hậu motor2.Run(Forward); biến động cơ 2 chuyển tiếp Delay(400); động cơ chạy bằng cách này để 400ms motorSet = "Chuyển tiếp"; motor1.Run(Forward); bật nó đi về phía trước motor2.Run(Forward); bật nó đi về phía trước} //-------------------------------------------------------------------------------------------------------------------------------------làm mất hiệu lực veerRight() {motor2.run(BACKWARD); delay(400); motor2.run(FORWARD);} / / êm ngay? Đặt động cơ bên phải ngược cho 400ms//-------------------------------------------------------------------------------------------------------------------------------------làm mất hiệu lực veerLeft() {motor1.run(BACKWARD); delay(400); motor1.run(FORWARD);} / / men trái? Đặt động cơ bên trái ngược cho 400ms
đang được dịch, vui lòng đợi..
