#include <MsTimer2.h>
int distance;
void setup() {
MsTimer2::set(500,IRQ_Timer);
MsTimer2::start();
pinMode(11,OUTPUT);
pinMode(12,INPUT);
}
void loop(){
}
void IRQ_Timer(){
echo();
}
//这个部分关系到停车↓↓
void echo(){
unsigned long p_time=millis();
while(1){
unsigned long c_time=millis();
digitalWrite(11, LOW);
delayMicroseconds(2);
digitalWrite(11, HIGH);
delayMicroseconds(10);
digitalWrite(11, LOW);
distance = pulseIn(12, HIGH)/58.3;
if(c_time>=p_time+5){
break;
}
}
return;
}
以上是arduino的代码。我们想让arduino在指定范围内停车。关系到这个功能的函数是void echo()。问题是,运行这个函数的时间超出了我们的预期,等到它执行完,我们的车已经跑出指定范围了。要如何改动才可以使这个函数运行时间减少,或者是测距的时候和停车的行为协调?
就是停车的时候,刹车距离和反应时间过长
以下是来自chatgpt的内容:
在这个程序中,函数echo()
中存在一个死循环,因此程序会一直等待直到检测到距离。如果这个循环运行的时间超过了你设定的停车范围,那么车辆可能会超出这个范围。
为了解决这个问题,你可以使用定时器来控制echo()
函数的执行时间,从而确保在指定时间范围内完成距离检测。你可以使用MsTimer2
库来创建一个定时器,并在定时器中执行echo()
函数。
另外,为了使车辆在检测到距离后能够在指定范围内停车,你需要考虑反应时间,也就是从检测到距离到实际刹车的时间。你可以根据这个时间计算出车辆需要前进的距离,从而确保车辆能够在指定范围内停车。
以下是修改后的程序:
#include <MsTimer2.h>
int distance;
bool detection_complete;
unsigned long detection_start_time;
const float SOUND_SPEED = 0.034; // 单位:cm/μs
const float CAR_SPEED = 10.0; // 单位:m/s
const float BRAKING_ACCELERATION = 3.0; // 单位:m/s^2
const float SAFETY_DISTANCE = 2.0; // 单位:m
void setup() {
MsTimer2::set(500, timerISR);
MsTimer2::start();
pinMode(11, OUTPUT);
pinMode(12, INPUT);
}
void loop() {
if (detection_complete) {
// 计算停车距离
unsigned long reaction_time = millis() - detection_start_time;
float braking_distance = CAR_SPEED * reaction_time + pow(CAR_SPEED, 2) / (2.0 * BRAKING_ACCELERATION);
// 在安全距离内刹车
if (distance <= (SAFETY_DISTANCE + braking_distance)) {
// 停车操作
}
detection_complete = false;
}
}
void timerISR() {
digitalWrite(11, LOW);
delayMicroseconds(2);
digitalWrite(11, HIGH);
delayMicroseconds(10);
digitalWrite(11, LOW);
unsigned long duration = pulseIn(12, HIGH);
distance = duration * SOUND_SPEED / 2.0;
detection_complete = true;
detection_start_time = millis();
}
在这个程序中,我们使用定时器来控制距离检测的时间。在timerISR()
函数中,我们执行超声波测距操作,并在检测完成后设置detection_complete
标志。在loop()
函数中,我们检测是否完成了检测,并计算反应时间和刹车距离。如果车辆需要在安全距离内刹车,则执行停车操作。
请注意,我在这个代码中只是列出了用于计算停车距离的基本公式,实际情况可能更加复杂,需要进一步优化计算方法和刹车控制。另外,你还需要根据你的具体需求调整上述参数的值,以确保程序可以正确工作。