如今,数字电表正在取代各个领域的模拟电表,无论是电表还是出租车计价器。造成这种情况的主要原因是模拟仪表的机械零件长时间使用会磨损,并且其精度不如数字仪表。
一个很好的例子是模拟速度计和里程表,它们被用在旧摩托车中以测量速度和行驶距离。它们有一个称为小齿轮和齿条的特殊部件,其中的电缆用于在车轮旋转时旋转速度计的销。长时间使用会磨损,还需要更换和维护。
在数字电表中,代替了使用机械部件,一些传感器(如光遮断器或霍尔传感器)用于计算速度和距离。这比模拟仪表更准确,并且不需要任何长时间的维护。我们之前使用不同的传感器构建了许多数字速度计项目:
- 使用Arduino和Processing Android App的DIY车速表
- 使用PIC单片机的数字车速表和里程表电路
- 使用LM393传感器(H206)进行移动机器人的速度,距离和角度测量
今天,在本教程中,我们将使用Arduino制作数字出租车收费表的原型。该项目计算滑行车轮的速度和距离,并将其连续显示在16x2 LCD显示屏上。并且,当我们按下按钮时,它会根据行进的距离生成票价。
下图显示了数字出租车计价器项目的完整设置
该原型机具有一个RC汽车底盘,该底盘带有一个速度传感器模块和一个与电机相连的编码轮。一旦测量了速度,我们就可以测量行驶的距离并通过按下按钮来找到票价金额。我们可以使用电位计来设置轮子的速度。要了解有关将LM-393速度传感器模块与Arduino结合使用的更多信息,请点击链接。让我们来简单介绍一下速度传感器模块。
红外缝隙光学LM-393速度传感器模块
这是一个插槽型模块,可用于测量编码器轮的旋转速度。该速度传感器模块基于插槽型光断路器(也称为光源传感器)工作。该模块需要3.3V至5V的电压,并产生数字输出。因此它可以与任何微控制器接口。
红外传感器由光源(IR-LED)和光电晶体管传感器组成。两者之间都留有很小的间隙。将物体放置在IR LED和光电晶体管的间隙之间时,它将中断光束,从而使光电晶体管停止通过电流。
因此,使用此传感器时,可以使用开槽盘(编码器轮),该盘可以安装到电动机上,并且当轮随着电动机旋转时,它会中断IR LED和光电晶体管之间的光束,从而使输出开和关(产生脉冲)。
因此,当信号源和传感器之间存在中断时(当在两者之间放置任何对象时),它将产生HIGH输出;而当没有放置对象时,它将产生LOW输出。在模块中,我们有一个LED指示引起的光学中断。
该模块随附LM393比较器IC,用于在OUTPUT处产生准确的HIGH和LOW信号。因此,该模块有时称为LM393速度传感器。
测量速度和行进距离以计算票价
要测量旋转速度,我们需要知道编码器轮中存在的插槽数。我有一个带有20个插槽的编码器轮。当它们旋转一整圈时,输出端有20个脉冲。因此,要计算速度,我们需要每秒产生的脉冲数。
例如
如果在一秒钟内有40个脉冲,则
速度= Noo。脉冲数/插槽数= 40/20 = 2RPS(每秒转数)
为了以RPM(每分钟转数)计算速度,请乘以60。
RPM速度= 2 X 60 = 120 RPM(每分钟转数)
测量距离
测量车轮行进的距离非常简单。在计算距离之前,应先知道车轮的周长。
车轮周长= π* d
d是砂轮直径。
π的值为3.14。
我有一个直径为6.60厘米的轮子(RC车轮),所以周长为(20.7厘米)。
因此,要计算行进距离,只需将检测到的脉冲数乘以周长即可。
行进距离=车轮周长x(脉冲数/槽数)
因此,当周长20.7cm的车轮需要20个脉冲(即编码器车轮旋转一圈)时,车轮的行进距离可计算为
行进距离= 20.7 x(20/20)= 20.7厘米
为了计算以米为单位的距离,请将以厘米为单位的距离除以100。
注意: 这是小型RC车轮,实时汽车的车轮要比此更大。因此,在本教程中,我假设车轮的周长为230厘米。
根据行进距离计算票价
要获得总票价,请将行进距离乘以票价(金额/米)。
Timer1.initialize(1000000); Timer1.attachInterrupt(timerIsr);
接下来附加两个外部中断。第一个中断将Arduino引脚2用作中断引脚,并在引脚2检测到RISING(从低到高)时调用ISR(计数)。此引脚2连接到速度传感器模块的D0输出。
第二个将Arduino引脚3用作中断引脚,并在引脚3上检测到HIGH时调用ISR(generatefare)。该引脚通过下拉电阻连接到按钮。
attachInterrupt(digitalPinToInterrupt(2),count,RISING); attachInterrupt(digitalPinToInterrupt(3),generatefare ,HIGH);
5.接下来,让我们看看在这里使用的ISR:
ISR1- count()当引脚2(连接到速度传感器)发生上升(从低到高)时,将调用ISR。
void count()// ISR用于来自速度传感器的计数 { counter ++; //将计数器值增加 一圈++;//将旋转值增加一个 延迟(10); }
ISR2- timerIsr()每隔一秒钟调用一次ISR,并执行ISR内部的那些行。
void timerIsr() { detachInterrupt(digitalPinToInterrupt(2)); Timer1.detachInterrupt(); lcd.clear(); 浮球速度=(计数器/ 20.0)* 60.0; 浮点旋转= 230 *(旋转/ 20); rotationinm =旋转数/ 100; lcd.setCursor(0,0); lcd.print(“ Dist(m):”); lcd.print(rotationinm); lcd.setCursor(0,1); lcd.print(“ Speed(RPM):”); lcd.print(速度); 计数器= 0; int Analogip = AnalogRead(A0); int motorspeed = map(analogip,0,1023,0,255); AnalogWrite(5,motorspeed); Timer1.attachInterrupt(timerIsr); attachInterrupt(digitalPinToInterrupt(2),count,RISING); }
该函数包含实际上首先分离Timer1和中断pin2的行,因为我们在ISR中包含LCD打印语句。
为了在RPM中计算SPEED,我们使用以下代码,其中20.0是编码器轮中预设的插槽数。
浮球速度=(计数器/ 20.0)* 60.0;
为了计算距离,使用下面的代码:
浮点旋转= 230 *(旋转/ 20);
这里的车轮周长假定为230厘米(因为这对于实时汽车来说是正常的)
接下来,将距离除以100以m为单位转换距离
rotationinm =旋转数/ 100;
之后,我们在液晶显示屏上显示速度和距离
lcd.setCursor(0,0); lcd.print(“ Dist(m):”); lcd.print(rotationinm); lcd.setCursor(0,1); lcd.print(“ Speed(RPM):”); lcd.print(速度);
重要说明:我们必须将计数器重置为0,因为我们需要获取每秒检测到的脉冲数,因此我们使用此行
计数器= 0;
接下来读取的模拟销A0并将其转换成数字值(0到1023),并进一步对PWM输出映射这些值来0-255(设定马达的速度)和最后用写那些PWM值 analogWrite 连接到ULN2003功能电机IC。
int Analogip = AnalogRead(A0); int motorspeed = map(analogip,0,1023,0,255); AnalogWrite(5,motorspeed);
ISR3:generatefare() ISR用于根据行进距离生成票价。当检测到中断引脚3为高电平(按下按钮时)时,调用此ISR。此功能将引脚2处的中断与计时器中断分离开,然后清除LCD。
无效generatefare () { detachInterrupt(digitalPinToInterrupt(2)); 固定在2 Timer1.detachInterrupt(); lcd.clear(); lcd.setCursor(0,0); lcd.print(“ FARE Rs:”); 浮动卢比= rotationinm * 5; lcd.print(卢比); lcd.setCursor(0,1); lcd.print(“每米5卢比”); }
之后,将行进的距离乘以5(我将5表示为INR 5 /米)。您可以根据自己的意愿进行更改。
浮动卢比= rotationinm * 5;
计算完数值后,将其显示在与Arduino连接的LCD显示屏上。
lcd.setCursor(0,0); lcd.print(“ FARE Rs:”); lcd.print(卢比); lcd.setCursor(0,1); lcd.print(“每米5卢比”);
完整的代码和演示视频如下。
您可以通过提高准确性,健壮性并添加更多功能(例如android应用,数字支付等)来进一步改进此原型,并将其开发为产品。