0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

教你轻松DIY蓝牙遥控平衡小车

lPCU_elecfans 来源:未知 作者:李倩 2018-07-31 11:44 次阅读

【背景描述】

出于业余爱好,以及学习自动化控制PID理论,经过多种选择后决定制作平衡车进行实际操练。刚开始试着用单纯的裸机,完成直立控制,然后慢慢的又增加了屏幕显示,用于参数调整显示,再然后用蓝牙透传进行串口遥控,并且增加用遥控器进行PID参数调增。增加这些功能以后,再进一步逐渐的增加功能,就需要进行在多任务的时间调配上进行更严格分配,每增加一个功能,都需要重新调整在这个上面花费了不少时间。

例如,在屏幕的显示上,由于需要较多时间进行数据端口模拟,耗费大量时间,如果需要增加多个参数显示,相应的屏幕程序就需要更多时间,就会改变整个程序的时间分配,平衡车直立控制就会不稳定,难与调试。由于上面的困扰,并且之前2010年的时候一个偶然机会了解到了RT-Thread实时操作系统,决定试着用操作系统的理念进行编写,可以省去在裸机调试时间分配的困扰。由于裸机我用了STM32F103C8T6芯片只有64KB,我本人懒于修改硬件,尝试修剪RTT,用尽可能少的组件,手动的把3.0.4版本去掉外围,只用内核。

在内核上把平衡车的控制分为直立控制、蓝牙控制、屏幕控制、以及原来的LED控制,后续增加超声波,指南模块等。尽可能使用现成的元件搭建起实物原型,然后再不断增加功能,从扩充的过程中完成控制理论的学习和对实时操作系统的掌握。由于有限的代码空间也进一步锻炼代码的精简训练。

【开发环境】

主控:STM32F103C8T6

编译环境:MDK5.23

RT-Thread版本:RT-Thread 3.0.4内核

【硬件设计】

电池:用的是圆柱锂电池。可以直接用充电宝里面的锂电池,外加三串保护板。做成12V锂电。

主控板:最小系统板

电机驱动模块: 利用了里面的5V电源

LCD模块:12684

电机:

电机用的GB37电机,是一款使用霍尔传感器编码器的测速模块,配有13 线强磁码盘,A B 双相输出共同利用下,通过计算可得出车轮转一圈时,脉冲数可达30132=780 个,单相也可以达到390 个,精度足够能让平衡小车无所不能。

其实霍尔编码器还是不够精确的,会在快速转动的时候漏掉编码,为此我调试了很久。

遥控器用组成:ARDUINO2560+joystick+hc05蓝牙组成。

超声波模块:

三轴传感器:MPU6050

硬件系统用搭模块的方式组成,之间的连接可以全部用杜邦线连接。

电路原理图由于手工需要的时候接上去的,没有画,其实完全可以自己动手手动连接一下。

总的功能原理图如下:

原理功能图,用的是老图了。基本都是这个原理。器件上,陀螺仪用的是MPU6050。主控:STM32F103CT8最小系统板。

【软件设计】

工程概览:

线程初始化:

主要线程定义:

小车控制线程

蓝牙遥控协议解析:

超声波线程:

目前代码优化不够,还很多用全局变量传递参数。

器件驱动(参考部分开源代码)->直立控制->速度控制->方向控制->无线蓝牙控制(含遥控对控制参数的调整)

【关键代码解析】

我所做的不同是,角度用的是PI控制、速度用PID、方向用了PI,我在角度、速度、方向上都加进了PID控制。程序代码难理解的部分也是PID部分。后期会在进一步改进中模糊控制相应的PID控制参数。根据不同速度、角度判断是否进行积分。这是最耗费时间的。例如目前小车碰到障碍物时,无法前进,速度的积分控制在这时应当停止,目前还未做改进。

以下是控制直立的关键代码。保证每5毫米执行一次,完成角度采集,角度控制,方向控制,速度控制的周期。

int car_run(void) { float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f; unsigned char more=0; long quat[4];// unsigned long sensor_timestamp=0; float Pitch; // short gyro[3], accel[3], sensors;// int stop=0; float angle_out,speed_out,direction_out; float car_zero_angle=-1.78; // static int run_err=0; char numf[20]; dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors, &more); if ((sensors & INV_WXYZ_QUAT))//&&(more<10)    {           q0=quat[0] / q30;           q1=quat[1] / q30;           q2=quat[2] / q30;           q3=quat[3] / q30;                       Pitch  = asin(2 * q1 * q3 - 2 * q0* q2)* 57.3;           sprintf(numf,"A:%2.3f*",Pitch);           sping_english8x8(0 , 2 ,numf) ;       if (Pitch>20||Pitch<-20) stop = 1;           angle_out = AngleControl(Pitch,gyro[1],car_zero_angle,stop);           velocity_proc(&speed_out,&direction_out,speed_set,direction_set,stop);                   MotorOutput(angle_out,speed_out,direction_out,stop);   }     else            {                  if ((sensors & INV_WXYZ_QUAT)&&(more==0))run_err++;              }  return run_err; }

Rt_thread由于资源限制,仅仅用了内核部分,利用了内核的线程调度功能,共创建了三个线程。关键点是在于三个线程的优先级别设置,这也是在设计平衡车对实时要求的一种体现。最关键的是车的平衡,设置为最高优先级,并且MPU6050的硬件要求5MS进行一次读数据。空闲时间之外可以进行蓝牙串口传输的解析工作,把遥控指令传给速度控制进程。

/* init hxlcd thread */ init_thread = rt_thread_create("hxlcd", hxlcd_thread_entry,RT_NULL,256, 15, 20); if (init_thread != RT_NULL) rt_thread_startup(init_thread); /* init car control thread */ init_thread = rt_thread_create("car_run", car_control_thread,RT_NULL, 512, 10, 20); if (init_thread != RT_NULL) rt_thread_startup(init_thread); /* init car Protocol thread */ init_thread = rt_thread_create("car_Pro", car_Protocol_thread, RT_NULL,2024, 11, 20); if (init_thread != RT_NULL) rt_thread_startup(init_thread);

【RT-Thread使用情况介绍】

该小车仅仅使用了RT-Thread内核,原本打算使用设备管理,但是编译后发现代码量大了后决定设备管理也不用。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 蓝牙
    +关注

    关注

    112

    文章

    5427

    浏览量

    165632
  • 平衡小车
    +关注

    关注

    1

    文章

    38

    浏览量

    12452

原文标题:一文教你轻松DIY蓝牙遥控平衡小车——周四RTOS专栏

文章出处:【微信号:elecfans,微信公众号:电子发烧友网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    DIY 制作蓝牙遥控小车

    `大学毕业后,就利用业余时间做一个蓝牙遥控小车,就在网上找资料及购买配件。用STC89S52单片机控制小车, LN298电机驱动模块驱动小车
    发表于 05-05 22:53

    蓝牙平衡小车

    蓝牙控制两轮平衡小车
    发表于 06-09 10:54

    自己diy的自平衡小车玩具

    参照飞思卡尔智能车的方案,diy了一台两轮自平衡小车小车上电后能停在一点不动,收到干扰可以自动平衡。另外我发现,配合速度环,即使重心不在
    发表于 04-19 12:39

    小蛋黄派迷你自平衡小车

    `中秋期间做好的硬件,小车+遥控器;看到网上有位大神做的蛋黄派自平衡小车,很喜欢很可爱;就DIY了这个,硬件做好了,软件我头疼了,依据硬件需
    发表于 09-09 00:07

    STM32主控红外遥控双轮平衡小车设计

    我的STM32主控红外遥控双轮平衡小车 (2015-05-28 17:38:27)[编辑][删除]转载▼ 我的红外遥控双轮平衡
    发表于 08-17 09:26

    最简单DIY的51蓝牙遥控小车设计方案是什么

    51单片机物联网智能小车系列文章目录第一篇:最简单DIY的51蓝牙遥控小车设计方案文章目录51单片机物联网智能
    发表于 12-01 08:13

    51蓝牙遥控小车简介

    51蓝牙遥控小车简介:通过手机上的蓝牙调试器APP与51蓝牙遥控
    发表于 01-05 07:15

    如何通过手机APP和蓝牙模块实现对平衡小车的控制

      大家好,我是小政。本篇文章我将针对蓝牙遥控平衡小车进行详细的讲解,让每位小伙伴能够通过手机APP和蓝牙模块实现对
    发表于 01-21 10:14

    教你怎样去挑选蓝牙遥控小车的元器件

    教你怎样去挑选蓝牙遥控小车的元器件
    发表于 03-01 06:45

    蓝牙遥控小车教程

    遥控小车教程,你可以点击打开学习,有程序,蓝牙控制。
    发表于 06-03 16:16 0次下载

    DIY:iPhone变身遥控小车

    DIY:iPhone变身遥控小车
    发表于 01-12 22:41 21次下载

    蓝牙遥控小车程序

    蓝牙遥控小车程序
    发表于 03-31 17:42 32次下载

    图文结合DIY制作遥控火车

    如何完成自制遥控火车?本文提供详细的图文教程,教你一步步DIY制作遥控火车头模型。下面将会介绍自制遥控火车的主要材料,让你
    的头像 发表于 01-18 18:38 7258次阅读
    图文结合<b class='flag-5'>DIY</b>制作<b class='flag-5'>遥控</b>火车

    基于单片机的蓝牙小车蓝牙遥控的程序

    基于单片机的蓝牙小车蓝牙遥控
    发表于 06-05 10:00 94次下载
    基于单片机的<b class='flag-5'>蓝牙</b><b class='flag-5'>小车</b>带<b class='flag-5'>蓝牙</b><b class='flag-5'>遥控</b>的程序

    最简单DIY的51蓝牙遥控小车设计方案

    51单片机物联网智能小车系列文章目录第一篇:最简单DIY的51蓝牙遥控小车设计方案文章目录51单片机物联网智能
    发表于 11-23 16:22 35次下载
    最简单<b class='flag-5'>DIY</b>的51<b class='flag-5'>蓝牙</b><b class='flag-5'>遥控</b><b class='flag-5'>小车</b>设计方案