1

我正在使用 Arduino Uno 构建一个非常简单的机器人,它向前移动,当它感应到任何物体(使用距离传感器HC-SR04)时,它会停止移动。机器人底座是 4 个轮子,每个轮子都附有直流电机。我使用引脚 1、2、3、4 分别控制电机 1、2、3、4。引脚 7、8 用于距离传感器的 Echo 和 Trig 引脚HC-SR04

为此,我编写了以下代码

#define m1p1 1
#define m1p2 2
#define m2p1 3
#define m2p2 4

#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin
#define LEDPin 13 // Onboard LED

int maximumRange = 200; // Maximum range needed
int minimumRange = 4; // Minimum range needed
long duration, distance; // Duration used to calculate distance

void setup()
{
  Serial.begin(9600);
  pinMode(m1p1, OUTPUT);
  pinMode(m1p2, OUTPUT);
  pinMode(m2p1, OUTPUT);
  pinMode(m2p2, OUTPUT);

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)

}

void loop()
{
 //Code to run motors forward
 digitalWrite(m1p1, LOW);
 digitalWrite(m1p2, HIGH);
 digitalWrite(m2p1, HIGH);
 digitalWrite(m2p2, LOW);

 //Code of distance sensor
 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/58.2;

 if (distance >= maximumRange || distance <= minimumRange){
  Serial.println("-1");

  //Code to stop motors
  digitalWrite(m1p1, LOW);
  digitalWrite(m1p2, LOW);
  digitalWrite(m2p1, LOW);
  digitalWrite(m2p2, LOW);
 }
 else {
 /* Send the distance to the computer using Serial protocol, and
   turn LED OFF to indicate successful reading. 
 */
 Serial.println(distance);
 digitalWrite(LEDPin, LOW); 
}

//Delay 50ms before next reading.
delay(50);

}

我认为问题在于包含Serial.begin(9600),因为当我删除此行时,所有电机都正常运行,机器人正向运行,但是当我写下这行时,只有 2 个电机运行平稳,2 个电机运行运行非常缓慢(几乎看起来它们没有运行),因此机器人不会向前移动,而是连续转动。

谁能告诉可能是什么问题以及如何解决。

4

2 回答 2

2

如串行文档的第一段所述,串行端口使用引脚 0 和 1:

http://arduino.cc/en/reference/serial

因此,对于您的电机,您应该选择其他一些引脚。

于 2013-09-05T16:50:51.707 回答
1

来自http://arduino.cc/en/Main/arduinoBoardUno

此外,一些引脚具有特殊功能:

串行:0(RX)和 1(TX)。用于接收 (RX) 和发送 (TX) TTL 串行数据。这些引脚连接到 ATmega8U2 USB-to-TTL 串行芯片的相应引脚。

Serial使用引脚 0 和 1。因此,您不能同时将它们用于其他目的。我建议您使用其他引脚来驱动您的电机(例如 2 到 5)。

于 2013-09-05T16:51:29.203 回答