一个使用Nucleo_F411RE开发履带坦克底盘的工程,代码不断完善中

Dependencies:   Encoder HCSR04 LED MOTOR RemoteIR

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
adaphoto
Date:
Tue Jun 19 12:25:02 2018 +0000
Revision:
70:b4f1647683ff
Parent:
29:0b58d21e87d6
??????

Who changed what in which revision?

UserRevisionLine numberNew 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 }