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

Dependencies:   Encoder HCSR04 LED MOTOR RemoteIR

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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }