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

Dependencies:   Encoder HCSR04 LED MOTOR RemoteIR

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

main.cpp

Committer:
adaphoto
Date:
2018-06-19
Revision:
72:522b60fd1a99
Parent:
29:0b58d21e87d6

File content as of revision 72:522b60fd1a99:

#include "mbed.h"
#include "rtos.h"

#include "LED.h"        //LED控制的头文件
#include "ReceiverIR.h" //红外接收的头文件
#include "HCSR04.h"     //超声波模块的头文件
#include "motodriver.h"
#include "encoder.h"

// 变量
int     ir_bitcount, ir_decoded;

// IO口定义声明
LED           user_led(PA_5);
Serial        pc(PA_2,PA_3);
ReceiverIR    ir_rx(PB_12);        // 声明一个红外接接口,这里用PB12,这里可以使用一个通用的IO口就可以,不需要专门的IO口
HCSR04        sr04(PC_0, PC_1);    // 声明两个IO口连接SR04模块,PC_0->ECHO PC1->TRIG
Motor         motor1(PA_8,PA_9);   // 声明两个IO口连接电机1驱动模块,必须具有PWM功能的IO
Motor         motor2(PA_11,PA_10); // 声明两个IO口连接电机2驱动模块,必须具有PWM功能的IO
Encoder       encoder1(PB_14,PB_13,true);

// Thread 线程
Thread thread_led;
Thread thread_ir;
Thread thread_sr04;

// Timer
Timer sr04_timer;

// 线程实现函数
void led_thread();
void ir_thread();
void sr04_thread();

// main() runs in its own thread in the OS
int main() 
{
    // 初始化
    user_led.LED_Off();
    
    pc.baud(115200);
    pc.printf("\r\n*** Nucleo_F411RE_OS_Robot ***");
    pc.printf("\r\n***      Hello World!      ***");
    
    // 延时一下
    wait(1.0);
    
    // 启动线程
    thread_led.start(led_thread);
    thread_ir.start(ir_thread);
    thread_sr04.start(sr04_thread);
    
    while (true) 
    {
        //pc.printf("pos: %d, speed %f \r\n",encoder1.getPosition(), encoder1.getSpeed());
        switch(ir_decoded)
        {
            case 0xb9://forward
                motor1.Speed(0.5);
                motor2.Speed(0.5);
                break;
            case 0xbf://stop
                motor1.Stop();
                motor2.Stop();
                break;
            case 0xea://backward
                motor1.Speed(-0.5);
                motor2.Speed(-0.5);
                break;
            case 0xbb://turn_left
                motor1.Speed(-0.5);
                motor2.Speed(0.5);
                break;
            case 0xbc://turn_right
                motor1.Speed(0.5);
                motor2.Speed(-0.5);
                break;
            default:
            break;
        }
        Thread::wait(1);
    }
}

/*************************************************/
// LED线程 1秒钟闪烁一次
void led_thread() 
{
    while(true)
    {
        Thread::wait(1000);
        user_led.LED_Troggle();
    }
}

// 红外接收线程
void ir_thread()
{
    // 和红外接收有关的变量
    RemoteIR::Format format;
    uint8_t buf[32];
    
    while(true)
    {
        if (ir_rx.getState() == ReceiverIR::Received) 
        {
            ir_bitcount = ir_rx.getData(&format, buf, sizeof(buf) * 8);
            if (ir_bitcount>0) 
            {
                ir_decoded=buf[3];
                pc.printf("\r\n ir_receive_code: %x",ir_decoded);
            }
            pc.printf(".");
        } 
    }
}

// SR04超声波测距模块线程
void sr04_thread()
{
    while(true)
    {
        sr04_timer.reset();
        sr04_timer.start();
        sr04.startMeasurement();
        while(!sr04.isNewDataReady()) {
          // wait for new data
          // waiting time depends on the distance
        }
        //pc.printf("\r\n Distance: %5.1f mm", sr04.getDistance_mm());
        sr04_timer.stop();
        Thread::wait(500 - sr04_timer.read_ms()); // time the loop
    }
}