#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 if (pos > 90) {veerRight();} // if current pos of sensor is greater than 90-degrees, it means the object is on the left hand side so veer right}//-------------------------------------------------------------------------------------------------------------------------------------int readPing() { // read the ultrasonic sensor distance delay(70); unsigned int uS = sonar.ping(); int cm = uS/US_ROUNDTRIP_CM; return cm;}//-------------------------------------------------------------------------------------------------------------------------------------void checkForward() { if (motorSet=="FORWARD") {motor1.run(FORWARD); motor2.run(FORWARD); } } // make sure motors are going forward//-------------------------------------------------------------------------------------------------------------------------------------void checkBackward() { if (motorSet=="BACKWARD") {motor1.run(BACKWARD); motor2.run(BACKWARD); } } // make sure motors are going backward//-------------------------------------------------------------------------------------------------------------------------------------// In some cases, the Motor Drive Shield may just stop if the supply voltage is too low (due to using only four NiMH AA cells).// The above functions simply remind the Shield that if it's supposed to go forward, then make sure it is going forward and vice versa.//-------------------------------------------------------------------------------------------------------------------------------------void moveStop() {motor1.run(RELEASE); motor2.run(RELEASE);} // stop the motors.//-------------------------------------------------------------------------------------------------------------------------------------void moveForward() { motorSet = "FORWARD"; motor1.run(FORWARD); // turn it on going forward motor2.run(FORWARD); // turn it on going forward for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // slowly bring the speed up to avoid loading down the batteries too quickly { motor1.setSpeed(speedSet+MAX_SPEED_OFFSET); motor2.setSpeed(speedSet); delay(5); }}//-------------------------------------------------------------------------------------------------------------------------------------void moveBackward() { motorSet = "BACKWARD"; motor1.run(BACKWARD); // turn it on going forward motor2.run(BACKWARD); // turn it on going forward for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // slowly bring the speed up to avoid loading down the batteries too quickly { motor1.setSpeed(speedSet+MAX_SPEED_OFFSET); motor2.setSpeed(speedSet); delay(5); }} //-------------------------------------------------------------------------------------------------------------------------------------void turnRight() { motorSet = "RIGHT"; motor1.run(FORWARD); // turn motor 1 forward motor2.run(BACKWARD); // turn motor 2 backward delay(400); // run motors this way for 400ms motorSet = "FORWARD"; motor1.run(FORWARD); // set both motors back to forward motor2.run(FORWARD); } //-------------------------------------------------------------------------------------------------------------------------------------void turnLeft() { motorSet = "LEFT"; motor1.run(BACKWARD); // turn motor 1 backward motor2.run(FORWARD); // turn motor 2 forward delay(400); // run motors this way for 400ms motorSet = "FORWARD"; motor1.run(FORWARD); // turn it on going forward motor2.run(FORWARD); // turn it on going forward} //-------------------------------------------------------------------------------------------------------------------------------------void veerRight() {motor2.run(BACKWARD); delay(400); motor2.run(FORWARD);} // veering right? set right motor backwards for 400ms//-------------------------------------------------------------------------------------------------------------------------------------void veerLeft() {motor1.run(BACKWARD); delay(400); motor1.run(FORWARD);} // veering left? set left motor backwards for 400ms
đang được dịch, vui lòng đợi..