/ ************************************************** ****************************************************** *******
我目前正在制造自动驾驶汽车。
它的工作原理如下:绘制GPS信息和磁力计传感器数据。
然后,在收集所有传感器数据后,Arduino决定转向哪种方式。
这是通过计算航向误差来完成的。
*************************************************** ****************************************************** ****** /
/ ************************************************** ****************************************************** *******
我的期望:
运行时,Arduino收集传感器数据。
arduino根据传感器数据确定转弯方向。
当信号发送到电机驱动器时,arduino循环以收集传感器数据。
这必须相对快速地完成,因为只有一个车轮转向轮才能使车辆完全旋转。
*************************************************** ****************************************************** ****** /
单独运行时,Arduino无需停止即可获取磁力计传感器和GPS信息。
但是,当组合代码运行时,Arduino会在一段时间后停止。
此外,在运行电动机时,磁力计的响应似乎也变慢了。 / ***************************************************** ****************************************************** ****
要解决此问题,我在if语句和“ SmallLeftTurn”函数中均具有return函数,以尝试打破似乎卡住的内容。
下面是困扰Arduino的故障代码。
void calcDesiredTurn()
{
//Calculate Where We Need To Turn to Head To Destination.
headingError = targetHeading - currentHeading;
//adjust for compass wrap
if (headingError < -180)
headingError += 360;
if (headingError > 180)
headingError -= 180;
//Calculate Which Way To Turn To Intercept the target Heading.
if (abs(headingError) <= HEADING_TOLERANCE)
{
Straight();
return;
}
else if (headingError < 0)
{
SmallLeftTurn();
}
else if (headingError > 0)
{
SmallRightTurn();
}
else
{
Straight();
}
}
void Straight()
{
RightMotor.setSpeed(50);
LeftMotor.setSpeed(-50);
}
void SmallLeftTurn()
{
LeftMotor.setSpeed(0);
RightMotor.setSpeed(50);
}
void SmallRightTurn()
{
RightMotor.setSpeed(0);
LeftMotor.setSpeed(-50);
}
void Stop()
{
LeftMotor.setSpeed(0);
RightMotor.setSpeed(0);
}
我的空循环是用这种方式构造的。
void loop() {
// put your main code here, to run repeatedly:
if (GPS.newNMEAreceived())
{
Serial.println("GPS NMEA Received");
Serial.println(GPS.lastNMEA());
if (GPS.parse(GPS.lastNMEA()))
GPSDataProcess();
}
//navigate
currentHeading = readCompass();
Serial.println(currentHeading);
calcDesiredTurn();
delay(200);
}