聚丰项目 > 智能遥控小车

智能遥控小车

小车是电子大赛常用的装备,采用舵机转向,两个电机调速驱动的四轮小车,以前都是用ti’或stm32f1的板子做的,用RISC-V架构的芯片做一个小车的控制器应该没问题。这里利用AB32VG1开发板做核心控制元件,用无线串口通信,实现小车的遥控。

OK起飞芜湖 OK起飞芜湖

分享
1 喜欢这个项目
团队介绍

OK起飞芜湖 OK起飞芜湖

团队成员

OK起飞芜湖 学生

分享
项目简介
小车是电子大赛常用的装备,采用舵机转向,两个电机调速驱动的四轮小车,以前都是用ti’或stm32f1的板子做的,用RISC-V架构的芯片做一个小车的控制器应该没问题。这里利用AB32VG1开发板做核心控制元件,用无线串口通信,实现小车的遥控。
硬件说明

硬件部分主要包括以下三部分:

(1) 主控装置AB32VG1开发板

(2) 驱动装置:四路(两路)电机驱动模块

3遥控通信HC-HID


软件说明

1.AB32VG1开发板

1)开发平台:RT-Thread Studio

2)组态配置

比例阀主要是采用PWM电流驱动,采用闭环控制可以提高控制精度,所以组态配置中使能PWM信号和ADC0通道。此外,在PWM信号上叠加震颤能提高比例阀的动态响应,降低滞环,所以使能了硬件定时器timer。

 

3)主要代码 

①舵机控制

   int sg(int argc, char *argv[])

{

 

 

    period1 = 10000000;   /* 周期为10ms,单位为纳秒ns */

    pulse1 = 0;          /* PWM脉冲宽度值,单位为纳秒ns */

 

    /* 设置LED引脚脚模式为输出 */

    rt_pin_mode(SG_PIN_NUM, PIN_MODE_OUTPUT);

    /* 拉高LED引脚 */

    rt_pin_write(SG_PIN_NUM, PIN_HIGH);

 

    /* 查找设备 */

    pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);

    if (pwm_dev == RT_NULL)

    {

        rt_kprintf("steering gear control run failed! can't find %s device!\n", PWM_DEV_NAME);

        return RT_ERROR;

    }

 

    /* 设置PWM周期和脉冲宽度默认值 */

    rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period1, pulse1);

    /* 使能设备 */

    rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);

 

 

    if(argc <2)

    {

        /* 0度到180度,然后由180度到0度,循环运行5个周期 */

        t1 = 50;

        while (--t1)

        {

            rt_thread_mdelay(1000);

            rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period1, period1-500000);

            rt_thread_mdelay(5000);

            rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period1, period1-2500000);

        }

    }

    else

    {

        /*msh输入的字符转换为数值*/

        pulse1 = Ascii2Hex(argv[1],strlen(argv[1]));

 

        /* 计算舵机目标位置所需要的高电平脉冲宽度 */

        t1 = 2000000/180*pulse1;

        pulse1 = period1-500000-t1; //pwm设定的占空比为低电平宽度,舵机控制使用高电平宽度控制旋转角度

 

        /* 设置PWM周期和脉冲宽度 */

        rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period1, pulse1);

    }

}

 

void set_ang(uint8_t ang)  //period-500000 对应,  period-2500000 对应180°90°对中,

{static rt_uint32_t ang_pulse;

    ang_pulse=1500000+ang/90*100000;

    pulse1=period1-ang_pulse;

    rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period1, pulse1);

 

}

②行走电机驱动

int main(void)

{

    uint8_t pin = rt_pin_get("PE.1");

 

    rt_pin_mode(pin, PIN_MODE_OUTPUT);

 

    uint8_t pin_dir1 = rt_pin_get("PA.0");  //电机方向控制

    uint8_t pin_dir2 = rt_pin_get("PA.1");  //电机方向控制

    rt_pin_mode(pin_dir1, PIN_MODE_OUTPUT);

    rt_pin_mode(pin_dir2, PIN_MODE_OUTPUT);

 

    rt_kprintf("Hello, world\n");

    thread_serial1();

    while (1)

    {

        rt_pin_write(pin, PIN_LOW);

        rt_thread_mdelay(500);

        rt_pin_write(pin, PIN_HIGH);

        rt_thread_mdelay(500);

        sg(0,"100000");

        rt_thread_mdelay(1000);

        tr(0,"2500000");

 

        if(rec_ok==1) //收到命令

            {

             rec_ok=0;

             if(rec_buf[1]=='L')// 左转角度

                 {ang_l=(rec_buf[2]-0x30)*10 +(rec_buf[3]-0x30);}

             rt_kprintf("ang_l%d",ang_l);

             if(rec_buf[4]=='R')// 右转角度

                 {ang_r=(rec_buf[5]-0x30)*10+(rec_buf[6]-0x30);}

             rt_kprintf("ang_r%d",ang_r);

             if(rec_buf[7]=='F')// 前进

                 {

                 rt_pin_write(pin_dir1, PIN_LOW);

                 rt_pin_write(pin_dir2, PIN_LOW);

                 }

             if(rec_buf[7]=='N')// 空挡

                 {

                 rt_pin_write(pin_dir1, PIN_HIGH);

                 rt_pin_write(pin_dir2, PIN_HIGH);

                  }

             if(rec_buf[7]=='R')// 后退

                 {

                 rt_pin_write(pin_dir1, PIN_LOW);

                 rt_pin_write(pin_dir2, PIN_HIGH);

                  }

             if(rec_buf[7]=='T')// 刹车

                 {speed=0;

                 rt_pin_write(pin_dir1, PIN_HIGH);

                 rt_pin_write(pin_dir2, PIN_LOW);

                 }

             speed=(rec_buf[8]-0x30)*10+(rec_buf[9]-0x30);

             rt_kprintf("apeedl%d",speed);

             clear_buf();

pwm_out(speed,speed);

             if (ang_l>ang_r)

                 set_ang(-ang_l);

             else {

                 set_ang(-ang_r);

                   }

            }

    }

}

图片3.png

演示效果

通过串口调试助手发送小车控制命令,小车能实现前进、后退、左转、右转动作,也能控制小车的速度。


附件

(0.36 MB)下载

评论区(0 )