这段代码应该让机器人向前行驶直到它有8英寸的物体。根据三个传感器中的哪一个检测到物体,机器人将向左或向右转动。我得到了代码,所以我决定在我继续测试每个部分。代码的共同部分是当右侧传感器检测到物体时使机器人向左转的部分。有了它,out评论出机器人以我编码的速度向前移动,但当注释掉的部分被取消注释时,机器人在一个圆圈中移动,其间有小的暂停(即使有3秒的延迟被注释掉)。有人能告诉我什么是错的,我该如何解决?
#include<SoftwareSerial.h> // Import the serial Library
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
// Select which 'port' M1, M2, M3 or M4. In this case, M1
Adafruit_DCMotor *FL= AFMS.getMotor(1); //Front left motor
Adafruit_DCMotor *FR= AFMS.getMotor(4); //Front right motor
int left_trig = 8;
int left_echo = 9;
int mid_trig = 5;
int mid_echo = 6;
int right_trig = 3;
int right_echo = 4;
void setup() {
Serial.begin(9600);
AFMS.begin(); // create with the default frequency 1.6KHz
//This establishes the sensors as inputs and outputs
pinMode(left_trig,OUTPUT);
pinMode(left_echo,INPUT);
pinMode (mid_trig,OUTPUT);
pinMode(mid_echo,INPUT);
pinMode (right_trig,OUTPUT);
pinMode(right_echo,INPUT);
FL->setSpeed(150);
FL->run(FORWARD);
FL->run(RELEASE);
FR->setSpeed(150);
FR->run(BACKWARD);
FR->run(RELEASE);
}
void loop() {
long duration1, duration2, duration3, inches1, inches2, inches3;
digitalWrite(left_trig, LOW);
delayMicroseconds(2);
digitalWrite(left_trig, HIGH);
delayMicroseconds(10);
duration1 = pulseIn(left_echo,HIGH);
// pinMode (mid_trig,OUTPUT);
digitalWrite(mid_trig, LOW);
delayMicroseconds(2);
digitalWrite(mid_trig, HIGH);
delayMicroseconds(10);
duration2 = pulseIn(mid_echo, HIGH);
// pinMode (right_trig,OUTPUT);
digitalWrite(right_trig, LOW);
delayMicroseconds(2);
digitalWrite(right_trig, HIGH);
delayMicroseconds(10);
duration3 = pulseIn(right_echo, HIGH);
// convert the time into inches
inches1 = microsecondsToInches(duration1);
inches2 = microsecondsToInches(duration2);
inches3 = microsecondsToInches(duration3);
Serial.print(inches1);
Serial.print("in,\t");
Serial.print(inches2);
Serial.print("in,\t");
Serial.print(inches3);
Serial.print("in");
Serial.println();
delay(300);
FL->setSpeed(150);
FL->run(FORWARD);
FR->setSpeed(150);
FR->run(BACKWARD);
// if(inches1<=8)
//{
//FL->setSpeed(150);
// FL->run(FORWARD);
// FR->setSpeed(150);
// FR->run(FORWARD);
//
//}
}
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}
答案 0 :(得分:0)
使用if语句和块取消注释如果inches1小于或等于8,则代码将通过循环并首先命中代码以向前运行,然后if语句和代码转向然后重复,直接执行等待转过来没有等待直接等待转弯。
上面的代码if语句告诉你的机器人前进也需要有条件。只有在没有检测到对象时才允许它运行。有很多方法可以实现这一目标。可能是你有一个if - else if对于每个传感器然后前进代码在最后的else中,如果它们都没有跳过。或者你可以做出所有距离都大于某个阈值的第一个条件。