0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 基于单片机的数字出租车计价器
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:4分
🧿 选题指导, 项目分享:
1 简介
现今,数字仪表正在逐步取代各个部门的模拟仪表,无论是电表还是出租车费用表。主要原因是模拟仪表的机械部件在长时间使用后容易磨损,并且不如数字仪表那么精确。
基于Arduino单片机的数字出租车计价器,使用Arduino制作数字出租车计价器的原型。该项目计算出租车车轮行驶的速度和距离,并连续显示在1602 LCD显示屏上。根据行驶距离,按下按钮时会产生票价。
2 主要器件
- Arduino UNO开发板
- LCD(16x2)
- 按钮
- 电位计-10k
- ULN2003电机驱动器IC
- LM393速度传感器模块(FC-03)
- RC智能车底盘带速度编码器
- 电池9V
- 面包板
- 连接线
3 实现效果
4 硬件说明
红外线槽式光学LM-393速度传感器模块
这是一种槽型模块,可用于测量编码器轮的旋转速度。该速度传感器模块基于槽型光学中断器工作,也称为光源传感器。该模块需要3.3V至5V的电压并产生数字输出。因此它可以与任何微控制器连接。
红外光传感器由光源(IR-LED)和光电晶体管传感器组成。两者之间都有一个小间隙。当物体放置在IR LED和光电晶体管的间隙之间时,它将中断光束,导致光电晶体管停止通过电流。
因此,使用该传感器,使用可以连接到电动机的开槽盘(编码器轮),并且当轮与电动机一起旋转时,它中断IR LED和光电晶体管之间的光束,使得输出接通和断开(产生脉冲)。
这样,当源和传感器之间存在中断时(当任何物体置于其间时),它会产生高电平输出,并且当没有物体放置时产生低电平输出。在模块中,我们有一个LED指示光学中断引起的。
该模块配有LM393比较器IC,用于在OUTPUT产生精确的HIGH和LOW信号。因此,该模块有时称为LM393速度传感器。
电路原理图
RC车载底盘安装速度传感器
速度传感器安装时,编码器轮位于传感器间隙之间。在我的机箱中,有一个用于放置传感器的特殊孔。见下图
速度传感器模块和Arduino之间的连接
按钮和电位器的连接
按钮通过一只下拉电阻连接到Arduino的引脚3,用于在按下按钮时生成票价。
电位器用于向Arduino的引脚A0提供模拟输入电压,以改变车轮的速度。
5 软件设计
测量速度和行驶距离来计算票价
要测量旋转速度,我们需要知道编码器轮中存在的槽数。我有一个带20个插槽的编码器轮。当它们旋转一个完整的旋转时,我们在输出端有20个脉冲。因此,为了计算速度,我们需要每秒产生的脉冲数。
例如,如果一秒内有40个脉冲,那么
Speed = Noo. Of pulses / No. of slots = 40/20 = 2RPS (Revolution per second)
以RPM(每分钟转数)计算速度乘以60。
Speed in RPM = 2 X 60 = 120 RPM (Revolutions per Minute)
测量距离:测量车轮行驶的距离非常简单。在计算距离之前,应该知道车轮的周长。
Circumference of the wheel = π*d
其中d是车轮的直径。
π的值是3.14。
我有一个直径6.60厘米的轮子(RC车轮),所以周长是(20.7厘米)。
因此,要计算行进距离,只需将检测到的脉冲数乘以圆周即可。
Distance Travelled = Circumference of Wheel x (No. of Pulses / No. of slots)
因此当周长20.7cm的轮子需要20个脉冲,即编码器轮的一次旋转时,轮子行进的距离由
Distance travelled = 20.7 x (20/20) = 20.7cm
为了计算距离,以米为单位将距离以cm值除以100。
注意:这是一个小型的RC车轮,实时车比这个车轮更大。所以我假设本教程中轮子的周长为230cm。
基于行驶距离计算票价:
要得到总票价金额,请将行驶距离乘以票价(金额/米)。
假设每米收费5卢比。因此,如果车轮行驶20米,那么票价将是20 * 5 = 100卢比。
所以现在让我们得到组件并构建电路。
6 部分核心代码
使用的ISR:当引脚2(连接到速度传感器)发生上升沿中断(低到高)时,调用ISR1- count() ISR函数。
void timerIsr()
{
detachInterrupt(digitalPinToInterrupt(2));
Timer1.detachInterrupt();
lcd.clear();
float speed = (counter / 20.0)* 60.0;
float rotations = 230*( rotation / 20);
rotationinm = rotations/100;
lcd.setCursor(0,0);
lcd.print("Dist(m):");
lcd.print(rotationinm);
lcd.setCursor(0,1);
lcd.print("Speed(RPM):");
lcd.print(speed);
counter=0;
int analogip = analogRead(A0);
int motorspeed = map(analogip,0,1023,0,255);
analogWrite(5,motorspeed);
Timer1.attachInterrupt( timerIsr );
attachInterrupt(digitalPinToInterrupt(2), count, RISING);
}