一个使用Nucleo_F411RE开发履带坦克底盘的工程,代码不断完善中
Dependencies: Encoder HCSR04 LED MOTOR RemoteIR
Fork of mbed-os-example-mbed5-blinky by
Diff: main.cpp
- Revision:
- 70:b4f1647683ff
- Parent:
- 29:0b58d21e87d6
diff -r 1ff487e9be56 -r b4f1647683ff main.cpp --- a/main.cpp Fri Jun 15 11:00:02 2018 +0100 +++ b/main.cpp Tue Jun 19 12:25:02 2018 +0000 @@ -1,12 +1,154 @@ #include "mbed.h" -DigitalOut led1(LED1); +#include "LED.h" //LED灯头文件 +#include "ReceiverIR.h" //红外接收头文件 +#include "motodriver.h" //电机控制头文件 +#include "HCSR04.h" //超声波模块的头文件 + +// 声明变量 +int bitcount, decoded; +char sr04_alart; +int encoder_countA=0; + +// 声明IO口 +LED user_led(PA_5); //LED的IO口 +Serial pc(PA_2,PA_3); //串口的IO口 +ReceiverIR ir_rx(PB_12); //红外接收管的IO口,可以是普通的IO口 +Motor motor1(PA_8,PA_9); //电机控制的IO口,需要具备PWM功能的IO口 +Motor motor2(PA_11,PA_10);//电机控制的IO口,需要具备PWM功能的IO口 +HCSR04 sr04(PC_0, PC_1); //超声波测距模块的IO口,可以是普通的IO口 + +InterruptIn encoderA(PB_14); +DigitalIn encoderB(PB_13); + +// 声明线程 +Thread thread_ir; +Thread thread_sr04; + +// Timer +Timer sr04_timer; + +// 声明线程实现函数 +void ir_thread(); +void sr04_thread(); + +void encoderA_counter(void) +{ + if (encoderB == 1) + { + encoder_countA+=1; + } + else + { + encoder_countA-=1; + } +} + +void encoderA_reset(void) +{ + encoder_countA=0; + } // main() runs in its own thread in the OS -int main() { - while (true) { - led1 = !led1; - wait(0.5); +int main() +{ + // 设置串口波特率为115200 + pc.baud(115200); + pc.printf("\r\n*** RTOS Robot Hello World! ***\n\r"); + + encoderA.fall(&encoderA_counter); //interrupt A rise-trig + + // 启动线程 + thread_ir.start(ir_thread); + thread_sr04.start(sr04_thread); + + while (true) + { + user_led.LED_Troggle(); + pc.printf("\r\n encoderA: %d", encoder_countA); + + if (sr04_alart == 1) + { + motor1.Stop(); + motor2.Stop(); + } + else + { + if (decoded == 0xb9) + { + motor1.Speed(0.5); + motor2.Speed(0.5); + } + else if (decoded == 0xbf) + { + motor1.Stop(); + motor2.Stop(); + } + else if (decoded == 0xea) + { + motor1.Speed(-0.5); + motor2.Speed(-0.5); + } + else if (decoded == 0xbb) + { + motor1.Speed(-0.5); + motor2.Speed(0.5); + } + else if (decoded == 0xbc) + { + motor1.Speed(0.5); + motor2.Speed(-0.5); + } + } + wait(0.1); } } +/*****************************************************************/ +void ir_thread() +{ + // 和红外接收有关的变量 + RemoteIR::Format format; + uint8_t buf[32]; + //double DC=0.5; + + while(true) + { + if (ir_rx.getState() == ReceiverIR::Received) + { + bitcount = ir_rx.getData(&format, buf, sizeof(buf) * 8); + if (bitcount>0) + { + decoded=buf[3]; + pc.printf("\r\nDecoded: %x ", buf[3]); + } + pc.printf("."); + } + } +} + +void sr04_thread() +{ + while(true) + { + sr04_timer.reset(); + sr04_timer.start(); + sr04.startMeasurement(); + while(!sr04.isNewDataReady()) { + // wait for new data + // waiting time depends on the distance + } + //pc.printf("\r\nDistance: %5.1f mm", sr04.getDistance_mm()); + sr04_timer.stop(); + + if (sr04.getDistance_mm() < 400.0) + { + sr04_alart = 1; + } + else + { + sr04_alart = 0; + } + Thread::wait(200 - sr04_timer.read_ms()); // time the loop + } +} \ No newline at end of file