一个使用Nucleo_F411RE开发履带坦克底盘的工程,代码不断完善中
Dependencies: Encoder HCSR04 LED MOTOR RemoteIR
Fork of mbed-os-example-mbed5-blinky by
main.cpp@70:b4f1647683ff, 2018-06-19 (annotated)
- Committer:
- adaphoto
- Date:
- Tue Jun 19 12:25:02 2018 +0000
- Revision:
- 70:b4f1647683ff
- Parent:
- 29:0b58d21e87d6
??????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jonathan Austin |
0:2757d7abb7d9 | 1 | #include "mbed.h" |
Jonathan Austin |
0:2757d7abb7d9 | 2 | |
adaphoto | 70:b4f1647683ff | 3 | #include "LED.h" //LED灯头文件 |
adaphoto | 70:b4f1647683ff | 4 | #include "ReceiverIR.h" //红外接收头文件 |
adaphoto | 70:b4f1647683ff | 5 | #include "motodriver.h" //电机控制头文件 |
adaphoto | 70:b4f1647683ff | 6 | #include "HCSR04.h" //超声波模块的头文件 |
adaphoto | 70:b4f1647683ff | 7 | |
adaphoto | 70:b4f1647683ff | 8 | // 声明变量 |
adaphoto | 70:b4f1647683ff | 9 | int bitcount, decoded; |
adaphoto | 70:b4f1647683ff | 10 | char sr04_alart; |
adaphoto | 70:b4f1647683ff | 11 | int encoder_countA=0; |
adaphoto | 70:b4f1647683ff | 12 | |
adaphoto | 70:b4f1647683ff | 13 | // 声明IO口 |
adaphoto | 70:b4f1647683ff | 14 | LED user_led(PA_5); //LED的IO口 |
adaphoto | 70:b4f1647683ff | 15 | Serial pc(PA_2,PA_3); //串口的IO口 |
adaphoto | 70:b4f1647683ff | 16 | ReceiverIR ir_rx(PB_12); //红外接收管的IO口,可以是普通的IO口 |
adaphoto | 70:b4f1647683ff | 17 | Motor motor1(PA_8,PA_9); //电机控制的IO口,需要具备PWM功能的IO口 |
adaphoto | 70:b4f1647683ff | 18 | Motor motor2(PA_11,PA_10);//电机控制的IO口,需要具备PWM功能的IO口 |
adaphoto | 70:b4f1647683ff | 19 | HCSR04 sr04(PC_0, PC_1); //超声波测距模块的IO口,可以是普通的IO口 |
adaphoto | 70:b4f1647683ff | 20 | |
adaphoto | 70:b4f1647683ff | 21 | InterruptIn encoderA(PB_14); |
adaphoto | 70:b4f1647683ff | 22 | DigitalIn encoderB(PB_13); |
adaphoto | 70:b4f1647683ff | 23 | |
adaphoto | 70:b4f1647683ff | 24 | // 声明线程 |
adaphoto | 70:b4f1647683ff | 25 | Thread thread_ir; |
adaphoto | 70:b4f1647683ff | 26 | Thread thread_sr04; |
adaphoto | 70:b4f1647683ff | 27 | |
adaphoto | 70:b4f1647683ff | 28 | // Timer |
adaphoto | 70:b4f1647683ff | 29 | Timer sr04_timer; |
adaphoto | 70:b4f1647683ff | 30 | |
adaphoto | 70:b4f1647683ff | 31 | // 声明线程实现函数 |
adaphoto | 70:b4f1647683ff | 32 | void ir_thread(); |
adaphoto | 70:b4f1647683ff | 33 | void sr04_thread(); |
adaphoto | 70:b4f1647683ff | 34 | |
adaphoto | 70:b4f1647683ff | 35 | void encoderA_counter(void) |
adaphoto | 70:b4f1647683ff | 36 | { |
adaphoto | 70:b4f1647683ff | 37 | if (encoderB == 1) |
adaphoto | 70:b4f1647683ff | 38 | { |
adaphoto | 70:b4f1647683ff | 39 | encoder_countA+=1; |
adaphoto | 70:b4f1647683ff | 40 | } |
adaphoto | 70:b4f1647683ff | 41 | else |
adaphoto | 70:b4f1647683ff | 42 | { |
adaphoto | 70:b4f1647683ff | 43 | encoder_countA-=1; |
adaphoto | 70:b4f1647683ff | 44 | } |
adaphoto | 70:b4f1647683ff | 45 | } |
adaphoto | 70:b4f1647683ff | 46 | |
adaphoto | 70:b4f1647683ff | 47 | void encoderA_reset(void) |
adaphoto | 70:b4f1647683ff | 48 | { |
adaphoto | 70:b4f1647683ff | 49 | encoder_countA=0; |
adaphoto | 70:b4f1647683ff | 50 | } |
Jonathan Austin |
0:2757d7abb7d9 | 51 | |
Jonathan Austin |
1:846c97078558 | 52 | // main() runs in its own thread in the OS |
adaphoto | 70:b4f1647683ff | 53 | int main() |
adaphoto | 70:b4f1647683ff | 54 | { |
adaphoto | 70:b4f1647683ff | 55 | // 设置串口波特率为115200 |
adaphoto | 70:b4f1647683ff | 56 | pc.baud(115200); |
adaphoto | 70:b4f1647683ff | 57 | pc.printf("\r\n*** RTOS Robot Hello World! ***\n\r"); |
adaphoto | 70:b4f1647683ff | 58 | |
adaphoto | 70:b4f1647683ff | 59 | encoderA.fall(&encoderA_counter); //interrupt A rise-trig |
adaphoto | 70:b4f1647683ff | 60 | |
adaphoto | 70:b4f1647683ff | 61 | // 启动线程 |
adaphoto | 70:b4f1647683ff | 62 | thread_ir.start(ir_thread); |
adaphoto | 70:b4f1647683ff | 63 | thread_sr04.start(sr04_thread); |
adaphoto | 70:b4f1647683ff | 64 | |
adaphoto | 70:b4f1647683ff | 65 | while (true) |
adaphoto | 70:b4f1647683ff | 66 | { |
adaphoto | 70:b4f1647683ff | 67 | user_led.LED_Troggle(); |
adaphoto | 70:b4f1647683ff | 68 | pc.printf("\r\n encoderA: %d", encoder_countA); |
adaphoto | 70:b4f1647683ff | 69 | |
adaphoto | 70:b4f1647683ff | 70 | if (sr04_alart == 1) |
adaphoto | 70:b4f1647683ff | 71 | { |
adaphoto | 70:b4f1647683ff | 72 | motor1.Stop(); |
adaphoto | 70:b4f1647683ff | 73 | motor2.Stop(); |
adaphoto | 70:b4f1647683ff | 74 | } |
adaphoto | 70:b4f1647683ff | 75 | else |
adaphoto | 70:b4f1647683ff | 76 | { |
adaphoto | 70:b4f1647683ff | 77 | if (decoded == 0xb9) |
adaphoto | 70:b4f1647683ff | 78 | { |
adaphoto | 70:b4f1647683ff | 79 | motor1.Speed(0.5); |
adaphoto | 70:b4f1647683ff | 80 | motor2.Speed(0.5); |
adaphoto | 70:b4f1647683ff | 81 | } |
adaphoto | 70:b4f1647683ff | 82 | else if (decoded == 0xbf) |
adaphoto | 70:b4f1647683ff | 83 | { |
adaphoto | 70:b4f1647683ff | 84 | motor1.Stop(); |
adaphoto | 70:b4f1647683ff | 85 | motor2.Stop(); |
adaphoto | 70:b4f1647683ff | 86 | } |
adaphoto | 70:b4f1647683ff | 87 | else if (decoded == 0xea) |
adaphoto | 70:b4f1647683ff | 88 | { |
adaphoto | 70:b4f1647683ff | 89 | motor1.Speed(-0.5); |
adaphoto | 70:b4f1647683ff | 90 | motor2.Speed(-0.5); |
adaphoto | 70:b4f1647683ff | 91 | } |
adaphoto | 70:b4f1647683ff | 92 | else if (decoded == 0xbb) |
adaphoto | 70:b4f1647683ff | 93 | { |
adaphoto | 70:b4f1647683ff | 94 | motor1.Speed(-0.5); |
adaphoto | 70:b4f1647683ff | 95 | motor2.Speed(0.5); |
adaphoto | 70:b4f1647683ff | 96 | } |
adaphoto | 70:b4f1647683ff | 97 | else if (decoded == 0xbc) |
adaphoto | 70:b4f1647683ff | 98 | { |
adaphoto | 70:b4f1647683ff | 99 | motor1.Speed(0.5); |
adaphoto | 70:b4f1647683ff | 100 | motor2.Speed(-0.5); |
adaphoto | 70:b4f1647683ff | 101 | } |
adaphoto | 70:b4f1647683ff | 102 | } |
adaphoto | 70:b4f1647683ff | 103 | wait(0.1); |
Jonathan Austin |
0:2757d7abb7d9 | 104 | } |
Jonathan Austin |
0:2757d7abb7d9 | 105 | } |
Jonathan Austin |
1:846c97078558 | 106 | |
adaphoto | 70:b4f1647683ff | 107 | /*****************************************************************/ |
adaphoto | 70:b4f1647683ff | 108 | void ir_thread() |
adaphoto | 70:b4f1647683ff | 109 | { |
adaphoto | 70:b4f1647683ff | 110 | // 和红外接收有关的变量 |
adaphoto | 70:b4f1647683ff | 111 | RemoteIR::Format format; |
adaphoto | 70:b4f1647683ff | 112 | uint8_t buf[32]; |
adaphoto | 70:b4f1647683ff | 113 | //double DC=0.5; |
adaphoto | 70:b4f1647683ff | 114 | |
adaphoto | 70:b4f1647683ff | 115 | while(true) |
adaphoto | 70:b4f1647683ff | 116 | { |
adaphoto | 70:b4f1647683ff | 117 | if (ir_rx.getState() == ReceiverIR::Received) |
adaphoto | 70:b4f1647683ff | 118 | { |
adaphoto | 70:b4f1647683ff | 119 | bitcount = ir_rx.getData(&format, buf, sizeof(buf) * 8); |
adaphoto | 70:b4f1647683ff | 120 | if (bitcount>0) |
adaphoto | 70:b4f1647683ff | 121 | { |
adaphoto | 70:b4f1647683ff | 122 | decoded=buf[3]; |
adaphoto | 70:b4f1647683ff | 123 | pc.printf("\r\nDecoded: %x ", buf[3]); |
adaphoto | 70:b4f1647683ff | 124 | } |
adaphoto | 70:b4f1647683ff | 125 | pc.printf("."); |
adaphoto | 70:b4f1647683ff | 126 | } |
adaphoto | 70:b4f1647683ff | 127 | } |
adaphoto | 70:b4f1647683ff | 128 | } |
adaphoto | 70:b4f1647683ff | 129 | |
adaphoto | 70:b4f1647683ff | 130 | void sr04_thread() |
adaphoto | 70:b4f1647683ff | 131 | { |
adaphoto | 70:b4f1647683ff | 132 | while(true) |
adaphoto | 70:b4f1647683ff | 133 | { |
adaphoto | 70:b4f1647683ff | 134 | sr04_timer.reset(); |
adaphoto | 70:b4f1647683ff | 135 | sr04_timer.start(); |
adaphoto | 70:b4f1647683ff | 136 | sr04.startMeasurement(); |
adaphoto | 70:b4f1647683ff | 137 | while(!sr04.isNewDataReady()) { |
adaphoto | 70:b4f1647683ff | 138 | // wait for new data |
adaphoto | 70:b4f1647683ff | 139 | // waiting time depends on the distance |
adaphoto | 70:b4f1647683ff | 140 | } |
adaphoto | 70:b4f1647683ff | 141 | //pc.printf("\r\nDistance: %5.1f mm", sr04.getDistance_mm()); |
adaphoto | 70:b4f1647683ff | 142 | sr04_timer.stop(); |
adaphoto | 70:b4f1647683ff | 143 | |
adaphoto | 70:b4f1647683ff | 144 | if (sr04.getDistance_mm() < 400.0) |
adaphoto | 70:b4f1647683ff | 145 | { |
adaphoto | 70:b4f1647683ff | 146 | sr04_alart = 1; |
adaphoto | 70:b4f1647683ff | 147 | } |
adaphoto | 70:b4f1647683ff | 148 | else |
adaphoto | 70:b4f1647683ff | 149 | { |
adaphoto | 70:b4f1647683ff | 150 | sr04_alart = 0; |
adaphoto | 70:b4f1647683ff | 151 | } |
adaphoto | 70:b4f1647683ff | 152 | Thread::wait(200 - sr04_timer.read_ms()); // time the loop |
adaphoto | 70:b4f1647683ff | 153 | } |
adaphoto | 70:b4f1647683ff | 154 | } |