一个使用Nucleo_F411RE开发履带坦克底盘的工程,代码不断完善中
Dependencies: Encoder HCSR04 LED MOTOR RemoteIR
Fork of mbed-os-example-mbed5-blinky by
main.cpp@72:522b60fd1a99, 2018-06-19 (annotated)
- Committer:
- adaphoto
- Date:
- Tue Jun 19 14:32:54 2018 +0000
- Revision:
- 72:522b60fd1a99
- Parent:
- 29:0b58d21e87d6
??MBED OS?Nucleo_F411RE??????????????????????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jonathan Austin |
0:2757d7abb7d9 | 1 | #include "mbed.h" |
adaphoto | 72:522b60fd1a99 | 2 | #include "rtos.h" |
adaphoto | 72:522b60fd1a99 | 3 | |
adaphoto | 72:522b60fd1a99 | 4 | #include "LED.h" //LED控制的头文件 |
adaphoto | 72:522b60fd1a99 | 5 | #include "ReceiverIR.h" //红外接收的头文件 |
adaphoto | 72:522b60fd1a99 | 6 | #include "HCSR04.h" //超声波模块的头文件 |
adaphoto | 72:522b60fd1a99 | 7 | #include "motodriver.h" |
adaphoto | 72:522b60fd1a99 | 8 | #include "encoder.h" |
adaphoto | 72:522b60fd1a99 | 9 | |
adaphoto | 72:522b60fd1a99 | 10 | // 变量 |
adaphoto | 72:522b60fd1a99 | 11 | int ir_bitcount, ir_decoded; |
Jonathan Austin |
0:2757d7abb7d9 | 12 | |
adaphoto | 72:522b60fd1a99 | 13 | // IO口定义声明 |
adaphoto | 72:522b60fd1a99 | 14 | LED user_led(PA_5); |
adaphoto | 72:522b60fd1a99 | 15 | Serial pc(PA_2,PA_3); |
adaphoto | 72:522b60fd1a99 | 16 | ReceiverIR ir_rx(PB_12); // 声明一个红外接接口,这里用PB12,这里可以使用一个通用的IO口就可以,不需要专门的IO口 |
adaphoto | 72:522b60fd1a99 | 17 | HCSR04 sr04(PC_0, PC_1); // 声明两个IO口连接SR04模块,PC_0->ECHO PC1->TRIG |
adaphoto | 72:522b60fd1a99 | 18 | Motor motor1(PA_8,PA_9); // 声明两个IO口连接电机1驱动模块,必须具有PWM功能的IO |
adaphoto | 72:522b60fd1a99 | 19 | Motor motor2(PA_11,PA_10); // 声明两个IO口连接电机2驱动模块,必须具有PWM功能的IO |
adaphoto | 72:522b60fd1a99 | 20 | Encoder encoder1(PB_14,PB_13,true); |
adaphoto | 72:522b60fd1a99 | 21 | |
adaphoto | 72:522b60fd1a99 | 22 | // Thread 线程 |
adaphoto | 72:522b60fd1a99 | 23 | Thread thread_led; |
adaphoto | 72:522b60fd1a99 | 24 | Thread thread_ir; |
adaphoto | 72:522b60fd1a99 | 25 | Thread thread_sr04; |
adaphoto | 72:522b60fd1a99 | 26 | |
adaphoto | 72:522b60fd1a99 | 27 | // Timer |
adaphoto | 72:522b60fd1a99 | 28 | Timer sr04_timer; |
adaphoto | 72:522b60fd1a99 | 29 | |
adaphoto | 72:522b60fd1a99 | 30 | // 线程实现函数 |
adaphoto | 72:522b60fd1a99 | 31 | void led_thread(); |
adaphoto | 72:522b60fd1a99 | 32 | void ir_thread(); |
adaphoto | 72:522b60fd1a99 | 33 | void sr04_thread(); |
Jonathan Austin |
0:2757d7abb7d9 | 34 | |
Jonathan Austin |
1:846c97078558 | 35 | // main() runs in its own thread in the OS |
adaphoto | 72:522b60fd1a99 | 36 | int main() |
adaphoto | 72:522b60fd1a99 | 37 | { |
adaphoto | 72:522b60fd1a99 | 38 | // 初始化 |
adaphoto | 72:522b60fd1a99 | 39 | user_led.LED_Off(); |
adaphoto | 72:522b60fd1a99 | 40 | |
adaphoto | 72:522b60fd1a99 | 41 | pc.baud(115200); |
adaphoto | 72:522b60fd1a99 | 42 | pc.printf("\r\n*** Nucleo_F411RE_OS_Robot ***"); |
adaphoto | 72:522b60fd1a99 | 43 | pc.printf("\r\n*** Hello World! ***"); |
adaphoto | 72:522b60fd1a99 | 44 | |
adaphoto | 72:522b60fd1a99 | 45 | // 延时一下 |
adaphoto | 72:522b60fd1a99 | 46 | wait(1.0); |
adaphoto | 72:522b60fd1a99 | 47 | |
adaphoto | 72:522b60fd1a99 | 48 | // 启动线程 |
adaphoto | 72:522b60fd1a99 | 49 | thread_led.start(led_thread); |
adaphoto | 72:522b60fd1a99 | 50 | thread_ir.start(ir_thread); |
adaphoto | 72:522b60fd1a99 | 51 | thread_sr04.start(sr04_thread); |
adaphoto | 72:522b60fd1a99 | 52 | |
adaphoto | 72:522b60fd1a99 | 53 | while (true) |
adaphoto | 72:522b60fd1a99 | 54 | { |
adaphoto | 72:522b60fd1a99 | 55 | //pc.printf("pos: %d, speed %f \r\n",encoder1.getPosition(), encoder1.getSpeed()); |
adaphoto | 72:522b60fd1a99 | 56 | switch(ir_decoded) |
adaphoto | 72:522b60fd1a99 | 57 | { |
adaphoto | 72:522b60fd1a99 | 58 | case 0xb9://forward |
adaphoto | 72:522b60fd1a99 | 59 | motor1.Speed(0.5); |
adaphoto | 72:522b60fd1a99 | 60 | motor2.Speed(0.5); |
adaphoto | 72:522b60fd1a99 | 61 | break; |
adaphoto | 72:522b60fd1a99 | 62 | case 0xbf://stop |
adaphoto | 72:522b60fd1a99 | 63 | motor1.Stop(); |
adaphoto | 72:522b60fd1a99 | 64 | motor2.Stop(); |
adaphoto | 72:522b60fd1a99 | 65 | break; |
adaphoto | 72:522b60fd1a99 | 66 | case 0xea://backward |
adaphoto | 72:522b60fd1a99 | 67 | motor1.Speed(-0.5); |
adaphoto | 72:522b60fd1a99 | 68 | motor2.Speed(-0.5); |
adaphoto | 72:522b60fd1a99 | 69 | break; |
adaphoto | 72:522b60fd1a99 | 70 | case 0xbb://turn_left |
adaphoto | 72:522b60fd1a99 | 71 | motor1.Speed(-0.5); |
adaphoto | 72:522b60fd1a99 | 72 | motor2.Speed(0.5); |
adaphoto | 72:522b60fd1a99 | 73 | break; |
adaphoto | 72:522b60fd1a99 | 74 | case 0xbc://turn_right |
adaphoto | 72:522b60fd1a99 | 75 | motor1.Speed(0.5); |
adaphoto | 72:522b60fd1a99 | 76 | motor2.Speed(-0.5); |
adaphoto | 72:522b60fd1a99 | 77 | break; |
adaphoto | 72:522b60fd1a99 | 78 | default: |
adaphoto | 72:522b60fd1a99 | 79 | break; |
adaphoto | 72:522b60fd1a99 | 80 | } |
adaphoto | 72:522b60fd1a99 | 81 | Thread::wait(1); |
Jonathan Austin |
0:2757d7abb7d9 | 82 | } |
Jonathan Austin |
0:2757d7abb7d9 | 83 | } |
Jonathan Austin |
1:846c97078558 | 84 | |
adaphoto | 72:522b60fd1a99 | 85 | /*************************************************/ |
adaphoto | 72:522b60fd1a99 | 86 | // LED线程 1秒钟闪烁一次 |
adaphoto | 72:522b60fd1a99 | 87 | void led_thread() |
adaphoto | 72:522b60fd1a99 | 88 | { |
adaphoto | 72:522b60fd1a99 | 89 | while(true) |
adaphoto | 72:522b60fd1a99 | 90 | { |
adaphoto | 72:522b60fd1a99 | 91 | Thread::wait(1000); |
adaphoto | 72:522b60fd1a99 | 92 | user_led.LED_Troggle(); |
adaphoto | 72:522b60fd1a99 | 93 | } |
adaphoto | 72:522b60fd1a99 | 94 | } |
adaphoto | 72:522b60fd1a99 | 95 | |
adaphoto | 72:522b60fd1a99 | 96 | // 红外接收线程 |
adaphoto | 72:522b60fd1a99 | 97 | void ir_thread() |
adaphoto | 72:522b60fd1a99 | 98 | { |
adaphoto | 72:522b60fd1a99 | 99 | // 和红外接收有关的变量 |
adaphoto | 72:522b60fd1a99 | 100 | RemoteIR::Format format; |
adaphoto | 72:522b60fd1a99 | 101 | uint8_t buf[32]; |
adaphoto | 72:522b60fd1a99 | 102 | |
adaphoto | 72:522b60fd1a99 | 103 | while(true) |
adaphoto | 72:522b60fd1a99 | 104 | { |
adaphoto | 72:522b60fd1a99 | 105 | if (ir_rx.getState() == ReceiverIR::Received) |
adaphoto | 72:522b60fd1a99 | 106 | { |
adaphoto | 72:522b60fd1a99 | 107 | ir_bitcount = ir_rx.getData(&format, buf, sizeof(buf) * 8); |
adaphoto | 72:522b60fd1a99 | 108 | if (ir_bitcount>0) |
adaphoto | 72:522b60fd1a99 | 109 | { |
adaphoto | 72:522b60fd1a99 | 110 | ir_decoded=buf[3]; |
adaphoto | 72:522b60fd1a99 | 111 | pc.printf("\r\n ir_receive_code: %x",ir_decoded); |
adaphoto | 72:522b60fd1a99 | 112 | } |
adaphoto | 72:522b60fd1a99 | 113 | pc.printf("."); |
adaphoto | 72:522b60fd1a99 | 114 | } |
adaphoto | 72:522b60fd1a99 | 115 | } |
adaphoto | 72:522b60fd1a99 | 116 | } |
adaphoto | 72:522b60fd1a99 | 117 | |
adaphoto | 72:522b60fd1a99 | 118 | // SR04超声波测距模块线程 |
adaphoto | 72:522b60fd1a99 | 119 | void sr04_thread() |
adaphoto | 72:522b60fd1a99 | 120 | { |
adaphoto | 72:522b60fd1a99 | 121 | while(true) |
adaphoto | 72:522b60fd1a99 | 122 | { |
adaphoto | 72:522b60fd1a99 | 123 | sr04_timer.reset(); |
adaphoto | 72:522b60fd1a99 | 124 | sr04_timer.start(); |
adaphoto | 72:522b60fd1a99 | 125 | sr04.startMeasurement(); |
adaphoto | 72:522b60fd1a99 | 126 | while(!sr04.isNewDataReady()) { |
adaphoto | 72:522b60fd1a99 | 127 | // wait for new data |
adaphoto | 72:522b60fd1a99 | 128 | // waiting time depends on the distance |
adaphoto | 72:522b60fd1a99 | 129 | } |
adaphoto | 72:522b60fd1a99 | 130 | //pc.printf("\r\n Distance: %5.1f mm", sr04.getDistance_mm()); |
adaphoto | 72:522b60fd1a99 | 131 | sr04_timer.stop(); |
adaphoto | 72:522b60fd1a99 | 132 | Thread::wait(500 - sr04_timer.read_ms()); // time the loop |
adaphoto | 72:522b60fd1a99 | 133 | } |
adaphoto | 72:522b60fd1a99 | 134 | } |