目录
摘要:随着现代物联网行业的发展,越来越多的智能产品已经出现在人们的生活中。智能型产品在指定的环境中,不用人为控制,就可以按照预先设计的模式,完成指定的动作,可广泛运用于人们的日常生活。本次设计的基于PID算法的智能小车,采用STM32F103作为小车的控制核心,采用红外循迹模块,通过红外的发送与接收判断路线,从而实现循迹的功能。本设计的创新在于:采用PID算法对车轮速度进行调整,使其可在不同摩擦,不同坡度的地形具有更加稳定的速度;同时,该小车还配备蓝牙模块,在有效范围内,可通过手机APP对小车进行遥控,随时调整小车行驶的速度与方向。
关键词:嵌入式;红外循迹;自动爬坡;STM32;PID算法
智能机器人的应用在世界上越来越广泛,逐步发展到各个领域。移动机器人属于智能机器人的一个重要分支,目前世界各国都越来越重视对移动机器人的研究,在军事侦察、地质勘测等人工作业难度较大,风险较高的领域以及对恶劣环境的监测工作中都有广泛的应用前景【1】。本文设计的基于PID算法的爬坡循迹的智能小车就属于智能移动机器人的范畴,能够通过红外传感器检测路线,通过PID算法调整速度,通过蓝牙控制小车,从而实现稳定速度的爬坡循迹、蓝牙遥控等功能。
该智能小车主要参照2020年TI杯大学生电子设计竞赛题目“坡道行驶电动小车”进行设计与实现。要求小车能沿着指定路线在坡道上自动循迹骑线行驶,小车必须独立运行,车外不能使用任何设备(包括电源)。小车(含电池)重量小于1.5kg,外形尺寸在地面投影不大于25cm×25cm。坡道用长、宽约1m的细木工板制作,允许板上有木质本色及自然木纹。木工板表面铺设画有1cm×lcm黑白间隔的纸条(以下简称为标记线)作为路线指示:标记线起始段为直线,平行于木板两边;标记线在坡顶转向90°,转弯半径20cm;标记线平行坡顶距离≥30cm,距坡顶距离≤20cm;标记线总长度为1m。停车标记为宽1cm长 5cm的黑色线条,垂直于坡顶标记线。小车坡度角示意及行驶线路顶视图如图1所示。

图1 小车坡度角及路线示意图
具体要求:
本文参考大学生电子竞赛“坡道行驶电动小车”的要求设计并制作了基于PID算法的爬坡循迹智能小车,该智能小车配备的传感器包括红外传感器、编码器、蓝牙无线传感器。
由红外传感器检测路线,经由STM32F103单片机处理,通过对电机驱动模块的输出控制各个电机的旋转情况,做到循线行驶。由编码器检测电机的实际转速,并反馈到单片机,运用增量式PID算法运算后,对电机驱动模块输出PWM,实现稳定控速。由蓝牙传感器接收手机端APP发送的数据,并反馈到单片机,对电机驱动模块控制,实现遥控小车。
该智能小车系统采用STM32F103C8T6单片机作为控制核心,主要包含的控制系统有红外传感器、编码器、直流电机、PWM输出等。由单片机和以上各个系统组成该智能小车系统。在完善硬件系统后,通过设计软件框架协调好每个硬件模块,使其正常工作并实现各自需要实现的功能,以组合成整个智能小车系统的功能。其控制系统框图如图2所示。

图2 控制系统框图
该智能小车的硬件系统主要包括以下部分:12V航模电池、红外循迹模块、HC-05蓝牙模块、TB6612FNG稳压驱动模块、霍尔编码器电机,硬件设计的主要部分连接图如图3所示。

图3 硬件连接图
该智能小车的控制核心模块,选用的是STM32F103单片机,配合编程软件Keil μVision,对供电烧写模块、时钟模块、电源电路、复位电路、红外接收模块、蓝牙模块以及电机驱动模块等进行程序的操控。STM32F103系列芯片具体电路如图4所示。

图4 STM32F103芯片电路图
根据系统需求,需配备5V、12V的直流稳压电源。其中5V用于STM32单片机、红外模块、蓝牙模块以及编码器供电,12V用于TB6612电机驱动模块供电。由于该系统选择的TB6612驱动模块自带5V稳压电路,可输出5V电压,故不需要再选择5V电源或外接5V稳压模块,只需要一个12V电源即可满足整个智能小车系统的供电需求。
本次的智能小车在电源上选用3S-3500mah大容量12V航模电池,电池尺寸为106*42*20mm,重量约187g。该航模电池放电性能为5C持续放电,在满电状态下,可输出12.6V电压,作为该智能小车的主电源较为合适。
该智能小车系统的循迹功能是基于一块五路循迹模块实现的。该红外循迹模块工作电压为5V,共含五对红外发射与接收管,每对红外发射与接收管可检测其下方路面的黑白线情况。其工作原理:单片机产生38KHz信号对红外线发射管进行调制发射,发射出去的红外线遇到障碍物时及时反射回来,红外线接收管对反射回来的信号进行解调,并输出TTL电平【2】。控制智能小车沿着地面的黑色轨道行驶。其工作原理:因黑、白线对光的反射系数不同,当光线照射到地面并反射时,根据接收到的反射光强弱来判定是否是黑线【3】,进而控制智能小车的运动路径。
根据红外接收管是否接收到反射回来的红外光,该模块对应的LED灯及OUT引脚的输出电平信号不同:检测到红外信号,LED亮,OUT输出高电平;没有检测到红外信号,LED灭,OUT输出低电平,由此即可判断路面的黑白线。
在该系统上,共使用到其中三对红外发射与接收管,其中VCC接5V,GND接地,三个OUT输出分别接单片机的PB12、PB13、PB14。
本设计采用四轮四驱动小车,即四个轮子的电机都有驱动能力。电机的转速由输出的PWM波决定,理论上可实现零速度到最大速度之间任意的转速。智能小车系统选择直流电机,力量大、调速范围广、驱动简单,四个直流电机共同工作更能很好的驱动小车在平面或坡道上行驶。
该小车转向方案共有两种:同向差速和反向差速。四个轮子中,左前轮和左后轮统一速度,右前轮和右后轮统一速度,即同向的车轮电机一直保持输出相同的PWM波。需要转弯时,可使左轮和右轮保持同一转向或是相反转向,输出不同的PWM波控制左右轮不同的速度,产生差速,即可使小车转向。具体使用同向差速还是反向差速,可视具体需要转向的角度决定:需要转大角度弯,可加大差速(速度有正负),左右轮反向;需要转小弯,可减小差速,左右轮同向。
该系统的电机驱动电路主要在于两块TB6612电机驱动模块。一块电机驱动模块可驱动两个直流电机,且该TB6612驱动包含电源输出电路和5V稳压电路,即可输出电源输入的电压和5V的稳定电压。该模块在小车系统上右举足轻重的地位,使整个系统只需要一个12V电源即可驱动所有电机及其他传感器模块。该模块主电路如图5所示。

图5 TB6612驱动原理图
该模块含有指定的直流编码器电机输出口,可直接与编码器电机连接。以电机A为例,1~5对应编码器电机的接口分别为:电机输出2、编码器电源5V、编码器B相、编码器A相、编码器地、电机输出1。电路如图6所示。

图6 TB6612电机连接原理图
实际电路连接中,编码器的A、B相是输出相,应该连接单片机由单片机捕获,以获得实际转速。在该模块上另含一排输出口,同样包含编码器A、B相的输出。输入部分主要包括PWM输入和两个方向使能输入(IN1、IN2),另含一个STBY口作为以上输入口的使能,为1时使能。输入输出电路如图7所示。

图7 TB6612输入输出原理图
该小车系统另设计了一套无线遥控方案,可用于某些非必要情况下对小车的状态进行调节和控制。该方案是基于HC-05无线蓝牙模块实现的。
HC-05蓝牙串口通信模块是新一代基于Bluetooth Specification V4.0 BLE蓝牙协议的数传模块。无线工作频段为2.4GHZ ISM,调制方式是GFSK。模块最大发射功率为4dBm,接收灵敏度-93dBm,空旷环境下可实现80m远距离通信。模块与单片机和手机连接如图8所示。

图8 HC-05与单片机和手机连接图
循迹作为该小车实现的一个主要功能,在主程序上占十分重要的位置。循迹过程的程序编写大致如下:首先需要初始化各模块,主要涉及到红外、编码器、电机等使用到的系统资源的配置,然后持续检测红外循迹模块上各个红外接收管输出的OUT引脚的电平,即判断对应地面的黑白线情况。如果中间的红外的OUT引脚输出为低电平,左右OUT引脚为高电平,即中间检测到黑线,左右检测到白线,则调用对应电机的前进函数,驱动小车前进;如果左红外OUT引脚输出为低电平,即左边检测到黑线,则调用左转函数,驱动小车左转;如果右红外OUT引脚输出为低电平,即右边检测到黑线,则调用右转函数,驱动小车右转;如果三个红外OUT全部检测到低电平,则表示到达终点线,调用停止函数,使小车停止。程序流程图如图9所示。

图9 主程序循迹流程图
PID算法调速作为该小车系统设计的一大创新点,可以在不同摩擦,不同坡度的路面上(首先得保证车轮与路面不打滑)按照设定的期望速度行驶。
该设计的原理是,通过闭环控制系统控制小车的速度,再通过编码器A、B相测量小车行驶过程中的脉冲数,在固定时间内检测到的脉冲数的值经过计算得到电机的实际速度,然后将计算的速度与上一次测量的速度进行比较,采用PID算法控制单片机输出PWM脉冲到电机驱动模块PWM端,以此控制电机转速【4】。该算法的公式为:

该程序设计的主要过程大致如下:首先初始化编码器、电机等使用到的资源配置,首先按照给定的期望速度,将其用PID算法转换为PWM的占空比,输出到电机,然后使用定时器定时检测对应编码器的A、B相输出,得到编码器的脉冲数,转换为实际速度,再调用PID算法,与上一次的速度比较运算后,输出PWM到对应电机,不断执行上述操作,使得实际速度不断接近并稳定在期望速度,使电机具有稳定且准确的速度。该算法流程图如图10所示。

图10 PID算法调速流程图
小车实物图如图11所示。
图11 小车实物图
本次控制系统的设计是基于Keil μVision5编译环境,因为C语言相对于其他汇编软件编程比较简单,所以使用C语言完成程序编写。调试中,在设定不同时间的情况下调整坡度,记录小车实际运行时间和小车循迹情况。
经过测试,该小车可在0~30o坡度内,在5~10s自设定的时间内以较为稳定的速度完成爬坡循迹任务,时间误差少于0.7s。
本文设计的智能小车以循迹为主要功能,系统中采用的红外传感器具有灵敏度高、体积小的特点,也更易于安装。另有PID算法实时对速度进行调节,可使小车在不同场景下有着更加稳定且准确的速度。该系统中STM32单片机与电机驱动模块相结合,不仅减少了智能小车的制造成本,同时也保证了整个系统的稳定性,也使得编程更容实现。通过对智能小车的循迹系统的设计与研发,大大提高了小车的实用价值,可以应于现代物流、无人驾驶汽车、无人工厂、服务型机器人等诸多领域。
[1]洪一明,钱庆丰等.基于STM32的智能小车循迹避障测距的设计[J].安徽理工大学,2022.
[2]卢威.智能小车避障系统的设计与实现[D].南昌:南昌大学,2012.
[3]袁新娜.基于多传感器信息融合技术的智能小车避障系统研究[D].太原:中北大学,2010.
[4]孙建康,王帅等.基于模糊PID控制的智能循迹小车设计[D].天津职业技术师范大学,2021.
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n
我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型