#include "mbed.h"
DigitalOut triggerRight(p9);
DigitalIn echoRight(p10);
DigitalOut triggerLeft(p13);
DigitalIn echoLeft(p14);
//DigitalOut myled(LED1); //monitor trigger
//DigitalOut myled2(LED2); //monitor echo
PwmOut steering(p21);
PwmOut velocity(p22);
int distanceRight = 0, distanceLeft = 0;
int correctionRight = 0, correctionLeft = 0;
Timer sonarRight, sonarLeft;
float vo=0;
// Velocity expects -1 (reverse) to +1 (forward)
void Velocity(float v) {
v=v+1;
if (v>=0 && v<=2) {
if (vo>=1 && v<1) { //
velocity.pulsewidth(0.0014); // this is required to
wait(0.1); //
velocity.pulsewidth(0.0015); // move into reverse
wait(0.1); //
} //
velocity.pulsewidth(v/2000+0.001);
vo=v;
}
}
// Steering expects -1 (left) to +1 (right)
void Steering(float s) {
s=s+1;
if (s>=0 && s<=2) {
steering.pulsewidth(s/2000+0.001);
}
}
void us_right() {
sonarRight.reset();
sonarRight.start();
while (echoRight==2) {};
sonarRight.stop();
correctionRight = sonarLeft.read_us();
triggerRight = 1;
sonarRight.reset();
wait_us(10.0);
triggerRight = 0;
while (echoRight==0) {};
// myled2=echoRight;
sonarRight.start();
while (echoRight==1) {};
sonarRight.stop();
distanceRight = ((sonarRight.read_us()-correctionRight)/58.0);
printf("Distance from Right is: %d cm \n\r",distanceRight);
}
void us_left() {
sonarLeft.reset();
sonarLeft.start();
while (echoLeft==2) {};
sonarLeft.stop();
correctionLeft = sonarLeft.read_us();
triggerLeft = 1;
sonarLeft.reset();
wait_us(10.0);
triggerLeft = 0;
while (echoLeft==0) {};
// myled2=echoLeft;
sonarLeft.start();
while (echoLeft==1) {};
sonarLeft.stop();
distanceLeft = (sonarLeft.read_us()-correctionLeft)/58.0;
printf("Distance from Left is: %d cm \n\r",distanceLeft);
}
int main() {
while(true) {
us_right();
us_left();
}
if (distanceLeft < 10 || distanceRight < 10) {
if (distanceLeft < distanceRight) {
for(int i=0; i>-100; i--) { // Go left
Steering(i/100.0);
wait(0.1);
}
}
if (distanceLeft > distanceRight) {
for(int i=0; i>100; i++) { // Go Right
Steering(i/100.0);
wait(0.1);
}
}
}
wait(0.2);
}
答案 0 :(得分:0)
您需要使用某种机制来创建新线程或进程。您的实现是顺序的,没有任何操作可以告诉代码并发运行。
你应该看看一些线程库(例如pthreads,或者如果你有权访问c ++ 11,那里有线程功能)或者如何创建新进程以及某些消息传递接口这些过程。
答案 1 :(得分:0)
Create two threads, one for each ultrasonic sensor:
void read_left_sensor() {
while (1) {
// do the reading
wait(0.5f);
}
}
int main() {
Thread left_thread;
left_thread.start(&read_left_sensor);
Thread right_thread;
right_thread.start(&read_right_sensor);
while (1) {
// put your control code for the vehicle here
wait(0.1f);
}
}
You can use global variables to write to when reading the sensor, and read them in your main loop. The memory is shared.
答案 2 :(得分:0)
你的第一个问题是你已经将代码置于无限while(true)循环之外。以后的代码永远不会运行。但也许你知道这一点。
int main() {
while(true) {
us_right();
us_left();
} // <- Loops back to the start of while()
// You Never pass this point!!!
if (distanceLeft < 10 || distanceRight < 10) {
// Do stuff etc.
}
wait(0.2);
}
但是,我认为你期望us_right()和us_left()完全同时发生。您无法在顺序环境中执行此操作。
Jan Jongboom建议你可以使用Threads是正确的。这允许&#39; OS&#39;为每段代码指定运行时间。但它仍然不是真正平行的。每个函数(类都是不同的东西)都有机会运行。一个将运行,当它完成(或在等待期间)时,另一个函数将有机会运行。
当您使用mbed时,我建议您的项目是 MBED OS 5项目 (您在开始新项目时选择此项)。否则,您将需要使用RTOS库。有一个使用线程的眨眼示例应该很好地总结。 Here is more info
线程对没有经验的人来说可能是危险的。所以坚持一个简单的实现开始。确保您了解您的行为/原因/方式。
旁白:从硬件角度来看,并行运行超声波传感器实际上并不理想。它们都以相同的频率广播,并且可以互相听到。同时触发它们,它们互相干扰。
想象一下,两个人在一个封闭的房间里大喊大叫。如果他们轮流,他们所说的将是显而易见的。如果他们同时大声喊叫,那将非常困难!
实际上,不能并行运行可能是一件好事。