Arduino Uno Avoidance Robot:两台电机中的一台不工作

时间:2014-01-16 08:14:23

标签: arduino

我正在尝试将Arduino避免机器人编码为学习项目。当我运行以下代码时,只有一个电机(左侧)工作。如果我注释掉使用checkDistance()函数的if语句并且只是循环forward()函数,那么两个电机都可以正常工作。我正在使用Adafruit Motorshield v1.2,我相信这是马达:Link。我已尝试直接通过USB供电,也通过外部电源(4 x AAs),并遇到同样的问题。任何指针将不胜感激。谢谢!

#include <AFMotor.h>
#define trigPin 3
#define echoPin 2

AF_DCMotor left_motor(2, MOTOR12_64KHZ); // create motor #1, 64KHz pwm
AF_DCMotor right_motor(1, MOTOR12_64KHZ); // motor #2\

int maxDistance = 30;
//int minDistance = 0;

void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  left_motor.setSpeed(255); 
  right_motor.setSpeed(255);
}

void forward(int delayTime) { 
  left_motor.run(FORWARD);
  right_motor.run(FORWARD);
  delay(delayTime);
}

void backward(int delayTime) { 
  left_motor.run(BACKWARD);
  right_motor.run(BACKWARD);
  delay(delayTime);
}

void stop(int delayTime) {
  left_motor.run(RELEASE);
  right_motor.run(RELEASE);
  delay(delayTime);
}

void right(int delayTime) {
  left_motor.run(FORWARD);
  right_motor.run(BACKWARD);
  delay(delayTime);
}

void left(int delayTime) {
  left_motor.run(BACKWARD);
  right_motor.run(FORWARD);
  delay(delayTime);
}

int checkDistance(){
  long duration, distance;
  /* The following trigPin/echoPin cycle is used to determine the
  distance of the nearest object by bouncing soundwaves off of it. */ 

  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2); 

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); 

  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);

  //Calculate the distance (in cm) based on the speed of sound.
  distance = duration/59.1;
  return distance;
}

void loop() {
  int currentDistance = checkDistance();
  Serial.print(currentDistance);
  if (currentDistance >= maxDistance){
    Serial.println(" cm. No immediate obstacles detected. Moving forward.");
    forward(2000);
    stop(1000);
  } 
  else {
    Serial.println(" cm. Obstacle detected. Changing direction.");
    right(1500);
    stop(1000);
  }
}

1 个答案:

答案 0 :(得分:0)

如果我试图调试这个,我会首先测试每个电机功能,而不需要传感器进行任何逻辑检查。 (例如,当左,右,后等两个轮子在循环()中被调用时,两个轮子都会转向正确的方向。这将使人们确信它不是布线或其他硬件问题。如果它们不起作用,那么将其分类就可以为你提供一个起点。

如果它们有效,那么它必须是传感器的值,对吗?您是如何确定maxDistance值的?如果它太高,那么这一行:

if (currentDistance >= maxDistance){

可能永远不会评估为真。你有一些日志语句,所以你对currentDistance的价值有所了解。当您将物体放置在离传感器不同的距离时,它似乎反映了准确的值吗?

无论如何......有些想法。