一个使用Nucleo_F411RE开发履带坦克底盘的工程,代码不断完善中
Dependencies: Encoder HCSR04 LED MOTOR RemoteIR
Fork of mbed-os-example-mbed5-blinky by
main.cpp
00001 #include "mbed.h" 00002 #include "rtos.h" 00003 00004 #include "LED.h" //LED控制的头文件 00005 #include "ReceiverIR.h" //红外接收的头文件 00006 #include "HCSR04.h" //超声波模块的头文件 00007 #include "motodriver.h" 00008 #include "encoder.h" 00009 00010 // 变量 00011 int ir_bitcount, ir_decoded; 00012 00013 // IO口定义声明 00014 LED user_led(PA_5); 00015 Serial pc(PA_2,PA_3); 00016 ReceiverIR ir_rx(PB_12); // 声明一个红外接接口,这里用PB12,这里可以使用一个通用的IO口就可以,不需要专门的IO口 00017 HCSR04 sr04(PC_0, PC_1); // 声明两个IO口连接SR04模块,PC_0->ECHO PC1->TRIG 00018 Motor motor1(PA_8,PA_9); // 声明两个IO口连接电机1驱动模块,必须具有PWM功能的IO 00019 Motor motor2(PA_11,PA_10); // 声明两个IO口连接电机2驱动模块,必须具有PWM功能的IO 00020 Encoder encoder1(PB_14,PB_13,true); 00021 00022 // Thread 线程 00023 Thread thread_led; 00024 Thread thread_ir; 00025 Thread thread_sr04; 00026 00027 // Timer 00028 Timer sr04_timer; 00029 00030 // 线程实现函数 00031 void led_thread(); 00032 void ir_thread(); 00033 void sr04_thread(); 00034 00035 // main() runs in its own thread in the OS 00036 int main() 00037 { 00038 // 初始化 00039 user_led.LED_Off(); 00040 00041 pc.baud(115200); 00042 pc.printf("\r\n*** Nucleo_F411RE_OS_Robot ***"); 00043 pc.printf("\r\n*** Hello World! ***"); 00044 00045 // 延时一下 00046 wait(1.0); 00047 00048 // 启动线程 00049 thread_led.start(led_thread); 00050 thread_ir.start(ir_thread); 00051 thread_sr04.start(sr04_thread); 00052 00053 while (true) 00054 { 00055 //pc.printf("pos: %d, speed %f \r\n",encoder1.getPosition(), encoder1.getSpeed()); 00056 switch(ir_decoded) 00057 { 00058 case 0xb9://forward 00059 motor1.Speed(0.5); 00060 motor2.Speed(0.5); 00061 break; 00062 case 0xbf://stop 00063 motor1.Stop(); 00064 motor2.Stop(); 00065 break; 00066 case 0xea://backward 00067 motor1.Speed(-0.5); 00068 motor2.Speed(-0.5); 00069 break; 00070 case 0xbb://turn_left 00071 motor1.Speed(-0.5); 00072 motor2.Speed(0.5); 00073 break; 00074 case 0xbc://turn_right 00075 motor1.Speed(0.5); 00076 motor2.Speed(-0.5); 00077 break; 00078 default: 00079 break; 00080 } 00081 Thread::wait(1); 00082 } 00083 } 00084 00085 /*************************************************/ 00086 // LED线程 1秒钟闪烁一次 00087 void led_thread() 00088 { 00089 while(true) 00090 { 00091 Thread::wait(1000); 00092 user_led.LED_Troggle(); 00093 } 00094 } 00095 00096 // 红外接收线程 00097 void ir_thread() 00098 { 00099 // 和红外接收有关的变量 00100 RemoteIR::Format format; 00101 uint8_t buf[32]; 00102 00103 while(true) 00104 { 00105 if (ir_rx.getState() == ReceiverIR::Received) 00106 { 00107 ir_bitcount = ir_rx.getData(&format, buf, sizeof(buf) * 8); 00108 if (ir_bitcount>0) 00109 { 00110 ir_decoded=buf[3]; 00111 pc.printf("\r\n ir_receive_code: %x",ir_decoded); 00112 } 00113 pc.printf("."); 00114 } 00115 } 00116 } 00117 00118 // SR04超声波测距模块线程 00119 void sr04_thread() 00120 { 00121 while(true) 00122 { 00123 sr04_timer.reset(); 00124 sr04_timer.start(); 00125 sr04.startMeasurement(); 00126 while(!sr04.isNewDataReady()) { 00127 // wait for new data 00128 // waiting time depends on the distance 00129 } 00130 //pc.printf("\r\n Distance: %5.1f mm", sr04.getDistance_mm()); 00131 sr04_timer.stop(); 00132 Thread::wait(500 - sr04_timer.read_ms()); // time the loop 00133 } 00134 }
Generated on Tue Jul 19 2022 16:20:30 by 1.7.2