一个使用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 14:32:54 2018 +0000
Revision:
72:522b60fd1a99
Parent:
29:0b58d21e87d6
??MBED OS?Nucleo_F411RE??????????????????????????

Who changed what in which revision?

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