矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 11898|回复: 29

【参赛】智能小车的制作

[复制链接]
     
发表于 2020-2-9 13:33:01 | 显示全部楼层 |阅读模式
    一直想做个智能小车,小车具备智能避障、自主定位等功能。然后在此基础上扩展功能,成为具有家庭安防报警功能的机器人。去年下半年就开始陆续购置了部分配件,动手制作。由于之前的功课准备不足,事先也未作详细的设计,多数模块都是一次不成功,然后推倒重来才基本完成,有的甚至改变了三、四次方案,因此制作过程时间拖的很长,至今为止才基本实现了智能避障的功能,自主定位的功能尚未实现,眼瞅本次大赛截止期临近,为了能参加本次大赛,只好暂告一段落,先将制作过程作个小结,同时也欢迎各位提出批评和建议,以便我进一步改进。
    下图为智能小车的全貌;
car_91.jpg

    下图为智能小车的近景:
car_90.jpg

    这是从另一个角度观察智能小车:
car_92.jpg

    智能小车的制作可分为电机控制及行走部分、电池及充放电管理部分、单片机主控部分、传感器信号灯部分、自主定位控制部分和物联网云服务部分等六大模块。下面是整个智能小车的逻辑框图:
car_00.jpg


    由于自主定位控制部分和物联网云服务部分尚未制作完成,目前暂时介绍前四个部分的制作过程。

一、电机控制及行走部分

    这个智能小车是利用了一个废旧点钞机外壳改制的。网购了一套智能小车配件,包括两个小车轮及配套电机、一个万向轮和一块有机玻璃底板,将两个驱动轮和一个万向轮安装好,就实现了小车行走的基本功能(详见下图);
car_30.jpg

    电机控制部分则使用了一块DFRobot四路直流电机驱动扩展板,这块控制板是参与某论坛评测活动获得的。
car_24.jpg


    这块控制板可以单独控制四个电机的转速和旋转方向,并具有过载和短路自动保护功能,目前我仅使用了其中的两路来控制两个驱动轮;
car_08.jpg

    在测试过程中发现这种万向轮极不灵活,也许是驱动电机动力太小、而万向轮转动架摩擦力太大的缘故,驱动轮根本控制不了小车行走方向,受万向轮初始的方位影响,小车多数情况是在原地打转,不受驱动轮的调节,无法满足要求。为了解决这个问题,我在网上搜索和比较了多款万向轮和门窗滑轮,因为没有实物感受,没有发现合适的。最后选中了一款铰接式窗帘滑轮,是尼龙制品,觉得用来改制比较合适(详见下图):
car_wx_0.jpg

    拆下铰接的钢轴,将尼龙架调向装回,一侧安装滑轮,另一侧作固定座,然后拆了一个鼠标的滚轮作轮子,自制了一个万向轮(详见下图):
car_wx_1.jpg

    用这个自制的万向轮替换了原来的万向轮,经过测试,基本上达到了目的,驱动轮可以正常控制行走的方向了。
car_wx_2.jpg


二、电池及充放电管理部分

    电池及充放电管理部分的制作是我费时最多的,最初设计是拆了一个旧充电宝,用其中的六节18650锂电池三并两串为电机提供7.4V的电源(见下图):
pow_21.jpg

    单片机控制电路的电源则是由两节带保护板的锂电池并联提供,通过充电宝的管理芯片升压为5V。锂电池被安装在机架的侧面(见下图)。
pow_22.jpg

    当时没有找到合适的7.4V锂电池充电保护板,只有之前买的3.7V锂电池充电保护板,因此专门设计了继电器转换电路,充电时将三并两串锂电池组转换为六并,以便使用3.7V的充电保护板,不充电时则转换为三并两串,输出7.4V。
    充电电路是一个220V的小变压器,次级经整流滤波后输出的电压约10V左右,另外拆了一个车充,利用其转换电路将10V转换成5V供充电,下面是初次制作的充电控制板:
pow_01.jpg

    下图为初次制作的充电控制板的反面,全靠飞线连接:
pow_02.jpg

    这是利用了一块旧的单面PCB板改造的,由于单面PCB板的焊盘容易脱落,元件脚与PCB板连接不可靠,造成飞线连接经常出现接触不良的现象,为此只好专用去打样了一块PCB板,同时将电源控制板与电机驱动板组合在一起,下面是焊接好元件及连线的PCB板正反面:
pow_11.jpg

    为了适应电机大电流,减少PCB板连线的电阻,在PCB板的背面还特地添加了飞线:
pow_12.jpg

    经过多次测试发现两个问题:一是充电线路提供的5V电源无法同时对带保护板的锂电池充电,需要分别充电;另外就是拆机的旧锂电池性能很差,每次充足电之后仅能行走十多分钟,远不能满足实际应用的需要,因此这个方案是失败的。
    改进的电源方案是取消原来的两组电源,用单组7.4V的电源供电,然后通过降压至5V提供给控制电路。为此专门买了8节18650锂电池和两串充放电保护板,同时将电源控制板也进行了改造,用了一块7805三端稳压块提供5V电源。
car_95.jpg

三、单片机主控部分

    单片机使用的是STM32G431RB开发板(详见下图),主频为170MHz,可以基本满足智能小车控制的需要。
car_11.jpg

    主控部分担负的任务主要是:
    1、通过DS1307日历模块获得时间及日期数据,根据预定的时间安排执行相应的任务,如巡航、定点警戒等,预定的任务数据保存在一块AT24C32Flash芯片内;
    2、控制智能小车的行走,通过行走检测的超声波测距传感器来检测前方的障碍物,同时还通过碰撞板获得碰撞信号,控制小车后退并转向(详见下图);
car_20.jpg

    3、发出灯光信息和声音信息,提供人机交互操作界面(屏幕显示和按键输入),声音信息准备采用语音模块JQ8400,这个模块可以生成需要的语音,而且还可以将生成的语音进行组合,最典型的例子就是语音报数,目前这个语音模块尚未进行调试;
    4、驱动前后空间探测的超声波测距传感器和红外人体传感器,获取环境信息(后期还将扩展可燃气体传感器和红外测温传感器等);
    5、通过三维磁强计来获得方向信息,通过固定的蓝牙发射装置和前后空间探测的距离来确定所处的位置达到定位目的;
    6、通过QYF-OV7670摄像头模块获取图像数据,进行图像动态对比,目前摄像头模块也尚未进行调试;
    7、后期还考虑通过物联网模块发送环境数据及报警信息。

四、传感器信号灯部分

    目前已经安装的传感器主要就是两个超声波测距探头和两个红外人体检测探头,两个传感器背靠背安装,前后同时探测。整个传感器组件通过舵机控制左右转动,实现360度周边检测。
    信号灯是由红、蓝、黄、绿四色LED组成,每种颜色各两个LED,八个LED分别布置在四周,基本做到在任何位置都可以看到信号。
    传感器信号灯组件通过一段不锈钢管升高到离地80cm左右,以便红外人体传感器探测。下图是傍晚室内拍摄的效果图:
sens_22.jpg

    传感器信号灯组件的制作也花费了不少时间,开始是用洞洞板制作,飞线连接。整个组件用两块洞洞板组成,上层的洞洞板主要有10个LED灯及限流电阻和两个超声波传感器插座,下层的洞洞板主要提供两个红外人体传感器插座以及所有信号线连接排座,上下两层洞洞板通过三根硬铜线支撑,这三根硬铜线分别作为5V、3.3V及公共地线,整个组件放在一个椭圆形塑料盒中。
    下图为下层的洞洞板,连接两个红外人体传感器模块:
sens_01.jpg

    两层洞洞板通过三根硬铜线连接,四色LED灯布置在四周,中间两颗白色的LED灯是充电指示灯:
sens_03.jpg

    由于组件体积小,连接环节多,洞洞板焊接后经常出现接触不良。为了确保使用过程中可靠连接,又专门去打样了一块PCB板,重新制作了一个传感器信号灯组件,下图为打样回来的PCB板:
sens_10.jpg

    这是重新制作的组件,没有了飞线,调试简单多了,使用也更可靠。
sens_12.jpg

    下图是组件最后的安装过程
sens_13.jpg

    整个组件通过排针与底板连接,可以随时拔插检查维修:
sens_14.jpg

    组件的底座固定在舵机的轴上,舵机则固定在不锈钢管上。
sens_21.jpg


五、自主定位控制部分介绍

    自主定位控制部分准备使用三维磁强计来辨别方向,在固定位置安装蓝牙发射装置,智能小车根据接收到的蓝牙信息来判断所处的位置。
    手头上正好有一块IKS-01A3传感器评估板,此板集成了温湿度传感器、压力传感器、三维磁强计、3轴加速度计和陀螺仪等传感器,除了能检测温湿度、气压外,还可以检测方位、三轴位置(正反立、侧立等),目前可以使用其中的磁强传感器来检测方位,以后还可以利用陀螺仪来检测小车的三轴位置。下图就是这块传感器评估板:
IKS0A3_2.jpg

    目前此部分尚未开始制作。


六、物联网云服务部分及进一步的设想

    这个部分目前也尚未动手制作,初步是准备利用Wifi连接互联网,通过云服务来传递信息,实现远程控制。
    另外需要扩展的部分是语音识别,通过语音识别模块做到能“听”懂固定的短语内容并作出相应的反映,后期还争取做到能通过声纹来识别固定的人员。












     
 楼主| 发表于 2020-2-9 13:55:11 | 显示全部楼层
    由于单片机的项目文件压缩后仍有667M,无法上传到论坛中,这里先介绍部分模块的代码,若有感兴趣的坛友可通过短消息联系。

    这里先介绍超声波测距模块的代码,整个智能小车共使用了三个超声波测距探头,为了节约资源,我没有使用传统的驱动方法,而是采用了定时器对全局变量进行计数,周期为10微秒。程序在对超声波探头发出Trig信号后,先等待Echo信号,一旦收到Echo信号便将定时器的全局变量清零,待Echo信号结束后立即通过全局变量的值换算出距离,这种算法可以用一个定时器为多个超声波探头进行驱动,下面是驱动代码:

/******************************************************************************************
* 函数名称: SR04_ranging(void)
* 功能说明: 进行超声波测距,返回测得的结果(厘米)
* 输    入: 无
* 输    出: 传感器16位的距离值(CM),前后检测传感器数据存放在SR[x][id]数组中
******************************************************************************************/
uint16_t SR04_ranging(void)
{
    uint16_t sum;
        uint8_t i;

        sum = 0;
        for(i=0; i<5; i++){
                //发送启动信号(Trig=1)
        HAL_GPIO_WritePin(SR2_Trig_GPIO_Port,SR2_Trig_Pin,GPIO_PIN_SET);
        Delay(15);   //延时约40us(LCD5110函数)
               
                LCD_write_ASCII(0,3,1,(uint8_t *)"Trig Comple!  ");
                HAL_GPIO_WritePin(SR2_Trig_GPIO_Port,SR2_Trig_Pin,GPIO_PIN_RESET);

                LCD_write_ASCII(0,3,1,(uint8_t *)"Wait Echo Read");
                //等待回波信号(Echo=0时循环等待,Echo=1时开始计时)
                while(HAL_GPIO_ReadPin(SR2_Echo_GPIO_Port,SR2_Echo_Pin)==0);

                LCD_write_ASCII(0,3,1,(uint8_t *)"Wait Echo!    ");
                SR_10us = 0;
                while(HAL_GPIO_ReadPin(SR2_Echo_GPIO_Port,SR2_Echo_Pin)==1);
                //累计五次测量结果
                sum += SR_10us;
                HAL_Delay(1);
        }
        SR[0][SRId] = sum*17/500 + 1;     //返回数值的单位为厘米


        sum = 0;
        for(i=0; i<5; i++){
                //发送启动信号(Trig=1)
        HAL_GPIO_WritePin(SR3_Trig_GPIO_Port,SR3_Trig_Pin,GPIO_PIN_SET);
        Delay(15);   //延时约40us(LCD5110函数)
               
//                LCD_write_ASCII(0,3,1,(uint8_t *)"Trig Comple!  ");
                HAL_GPIO_WritePin(SR3_Trig_GPIO_Port,SR3_Trig_Pin,GPIO_PIN_RESET);

//                LCD_write_ASCII(0,3,1,(uint8_t *)"Wait Echo Read");
                //等待回波信号(Echo=0时循环等待,Echo=1时开始计时)
                while(HAL_GPIO_ReadPin(SR3_Echo_GPIO_Port,SR3_Echo_Pin)==0);

//                LCD_write_ASCII(0,3,1,(uint8_t *)"Wait Echo!    ");
                SR_10us = 0;
                while(HAL_GPIO_ReadPin(SR3_Echo_GPIO_Port,SR3_Echo_Pin)==1);
                //累计五次测量结果
                sum += SR_10us;
                HAL_Delay(1);
        }
        SR[1][SRId] = sum*17/500 + 1;     //返回数值的单位为厘米

    sum = 0;
        for(i=0; i<5; i++){
                //发送启动信号(Trig=1)
        HAL_GPIO_WritePin(SR1_Trig_GPIO_Port,SR1_Trig_Pin,GPIO_PIN_SET);
        Delay(15);   //延时约40us(LCD5110函数)

                HAL_GPIO_WritePin(SR1_Trig_GPIO_Port,SR1_Trig_Pin,GPIO_PIN_RESET);

                //等待回波信号(Echo=0时循环等待,Echo=1时开始计时)
                while(HAL_GPIO_ReadPin(SR1_Echo_GPIO_Port,SR1_Echo_Pin)==0);
                SR_10us = 0;
                while(HAL_GPIO_ReadPin(SR1_Echo_GPIO_Port,SR1_Echo_Pin)==1);

                //累计五次测量结果
                sum += SR_10us;
                HAL_Delay(1);
        }
        return sum*17/500 + 1;     //返回数值的单位为厘米(10us*0.17/5)

}

回复 支持 1 反对 0

使用道具 举报

     
发表于 2020-2-9 13:40:10 | 显示全部楼层
楼主大才啊,用验钞机改的
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-2-9 13:57:17 | 显示全部楼层
pc128 发表于 2020-2-9 13:40
楼主大才啊,用验钞机改的

开始准备自己做一个小车底盘,但没有合适的材料,后来发现用这个验钞机改制正合适。
回复 支持 反对

使用道具 举报

     
发表于 2020-2-9 14:17:32 | 显示全部楼层
楼主是大材,是个大工程
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-2-9 15:16:11 | 显示全部楼层
权修 发表于 2020-2-9 14:17
楼主是大材,是个大工程

确实是个大工程,花费半年多时间还只是基本完成,还有很多需要完善的。
回复 支持 反对

使用道具 举报

     
发表于 2020-2-9 16:42:56 | 显示全部楼层
hujj 发表于 2020-2-9 15:16
确实是个大工程,花费半年多时间还只是基本完成,还有很多需要完善的。

看了还得要遍程这是自己遍的还是有现成的值接写入呢?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-2-9 17:15:05 | 显示全部楼层
权修 发表于 2020-2-9 16:42
看了还得要遍程这是自己遍的还是有现成的值接写入呢?

自己编程,单片机编程很有趣的。
回复 支持 反对

使用道具 举报

     
发表于 2020-2-26 00:46:29 | 显示全部楼层
这个技术含量高,不错
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-2-26 07:40:55 | 显示全部楼层
whyljh3333 发表于 2020-2-26 00:46
这个技术含量高,不错

谢谢夸奖!目前仅完成了自动避障行走,还不能智能定位行走,即还不能有目的地到达指定位置,准备在住宅的不同位置布置蓝牙,小车根据所接收到的蓝牙信息以及3D磁场确定的方向来确定所处的位置。这个功能目前还在调试过程中。
回复 支持 反对

使用道具 举报

     
发表于 2020-4-14 16:59:41 | 显示全部楼层
这个牛---必须要收藏学习--有可能的话自己也动手试试
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-4-14 22:11:18 | 显示全部楼层
565758238 发表于 2020-4-14 16:59
这个牛---必须要收藏学习--有可能的话自己也动手试试

这个项目确实有点难度,至今尚未全部完成,自主定位、自动充电、Wifi联网、声音识别等功能模块尚未开始。
回复 支持 反对

使用道具 举报

     
发表于 2020-5-25 16:43:06 | 显示全部楼层
这个不错,值得学习。
回复 支持 反对

使用道具 举报

     
发表于 2020-6-1 19:44:21 来自手机 | 显示全部楼层
这种小车很难定位,我搞了扫地机半途而废,原因是定位困难,不能准确打扫特定地方,跑起来很乱,想过很多方案都不行,最近才发现了一种360度激光扫描模块能实现整个房间扫描定位,但是模块300以上太贵没买!
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-6-2 09:52:35 | 显示全部楼层
分立元件 发表于 2020-6-1 19:44
这种小车很难定位,我搞了扫地机半途而废,原因是定位困难,不能准确打扫特定地方,跑起来很乱,想过很多方 ...

     是啊,磁力计定方向不难,超声波测距也容易,通过在适当的地方布置蓝牙装置来确定大致位置也可以做到,但要精确定位实现自主行走则比较困难,目前我还在实验中。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-26 02:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表